diff --git a/.bazelversion b/.bazelversion index 0062ac97180..5e3254243a3 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -5.0.0 +6.1.2 diff --git a/.github/workflows/go-tests-other-os.yml b/.github/workflows/go-tests-other-os.yml index 5660b2cc3fa..74dd3639704 100644 --- a/.github/workflows/go-tests-other-os.yml +++ b/.github/workflows/go-tests-other-os.yml @@ -15,7 +15,7 @@ jobs: - name: Set up Go 1.20 uses: actions/setup-go@v4 with: - go-version: 1.20.0 + go-version: '1.20' id: go - name: Check out code @@ -50,7 +50,7 @@ jobs: - name: Set up Go 1.20 uses: actions/setup-go@v4 with: - go-version: 1.20.0 + go-version: '1.20' id: go - name: Check out code diff --git a/.github/workflows/go-tests.yml b/.github/workflows/go-tests.yml index 064c0896e14..e790554c625 100644 --- a/.github/workflows/go-tests.yml +++ b/.github/workflows/go-tests.yml @@ -23,7 +23,7 @@ jobs: - name: Set up Go 1.20 uses: actions/setup-go@v4 with: - go-version: 1.20.0 + go-version: '1.20' id: go - name: Check out code diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index 8190d8c08fa..51d1fea9697 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -58,10 +58,8 @@ jobs: id: cache-extractor with: path: | - ruby/extractor/target/release/autobuilder - ruby/extractor/target/release/autobuilder.exe - ruby/extractor/target/release/extractor - ruby/extractor/target/release/extractor.exe + ruby/extractor/target/release/codeql-extractor-ruby + ruby/extractor/target/release/codeql-extractor-ruby.exe ruby/extractor/ql/lib/codeql/ruby/ast/internal/TreeSitter.qll key: ${{ runner.os }}-${{ steps.os_version.outputs.version }}-ruby-extractor-${{ hashFiles('ruby/extractor/rust-toolchain.toml', 'ruby/extractor/Cargo.lock') }}--${{ hashFiles('ruby/extractor/**/*.rs') }} - uses: actions/cache@v3 @@ -88,15 +86,13 @@ jobs: run: | cd extractor cross build --release - mv target/x86_64-unknown-linux-gnu/release/extractor target/release/ - mv target/x86_64-unknown-linux-gnu/release/autobuilder target/release/ - mv target/x86_64-unknown-linux-gnu/release/generator target/release/ + mv target/x86_64-unknown-linux-gnu/release/codeql-extractor-ruby target/release/ - name: Release build (windows and macos) if: steps.cache-extractor.outputs.cache-hit != 'true' && runner.os != 'Linux' run: cd extractor && cargo build --release - name: Generate dbscheme if: ${{ matrix.os == 'ubuntu-latest' && steps.cache-extractor.outputs.cache-hit != 'true'}} - run: extractor/target/release/generator --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll + run: extractor/target/release/codeql-extractor-ruby generate --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll - uses: actions/upload-artifact@v3 if: ${{ matrix.os == 'ubuntu-latest' }} with: @@ -111,10 +107,8 @@ jobs: with: name: extractor-${{ matrix.os }} path: | - ruby/extractor/target/release/autobuilder - ruby/extractor/target/release/autobuilder.exe - ruby/extractor/target/release/extractor - ruby/extractor/target/release/extractor.exe + ruby/extractor/target/release/codeql-extractor-ruby + ruby/extractor/target/release/codeql-extractor-ruby.exe retention-days: 1 compile-queries: runs-on: ubuntu-latest-xl @@ -172,13 +166,10 @@ jobs: mkdir -p ruby cp -r codeql-extractor.yml tools ql/lib/ruby.dbscheme.stats ruby/ mkdir -p ruby/tools/{linux64,osx64,win64} - cp linux64/autobuilder ruby/tools/linux64/autobuilder - cp osx64/autobuilder ruby/tools/osx64/autobuilder - cp win64/autobuilder.exe ruby/tools/win64/autobuilder.exe - cp linux64/extractor ruby/tools/linux64/extractor - cp osx64/extractor ruby/tools/osx64/extractor - cp win64/extractor.exe ruby/tools/win64/extractor.exe - chmod +x ruby/tools/{linux64,osx64}/{autobuilder,extractor} + cp linux64/codeql-extractor-ruby ruby/tools/linux64/extractor + cp osx64/codeql-extractor-ruby ruby/tools/osx64/extractor + cp win64/codeql-extractor-ruby.exe ruby/tools/win64/extractor.exe + chmod +x ruby/tools/{linux64,osx64}/extractor zip -rq codeql-ruby.zip ruby - uses: actions/upload-artifact@v3 with: diff --git a/cpp/ql/examples/queries.xml b/cpp/ql/examples/queries.xml deleted file mode 100644 index 99f4a7278c2..00000000000 --- a/cpp/ql/examples/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 4e1da3c6bf9..f77a14c328f 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.7.1 + +No user-facing changes. + ## 0.7.0 ### Breaking Changes diff --git a/cpp/ql/lib/change-notes/released/0.7.1.md b/cpp/ql/lib/change-notes/released/0.7.1.md new file mode 100644 index 00000000000..86973d36042 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.7.1.md @@ -0,0 +1,3 @@ +## 0.7.1 + +No user-facing changes. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index c761f3e7ab4..e007a9aec3e 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.7.0 +lastReleaseVersion: 0.7.1 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 88b6567342a..77b0c4bbb6d 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 0.7.0 +version: 0.7.1 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll index 865d7b4d6ce..f34554d6eea 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll @@ -361,3 +361,52 @@ module MergePathGraph< } } } + +/** + * Constructs a `PathGraph` from three `PathGraph`s by disjoint union. + */ +module MergePathGraph3< + PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3, + PathGraphSig Graph1, PathGraphSig Graph2, PathGraphSig Graph3> +{ + private module MergedInner = MergePathGraph; + + private module Merged = + MergePathGraph; + + /** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */ + class PathNode instanceof Merged::PathNode { + /** Gets this as a projection on the first given `PathGraph`. */ + PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() } + + /** Gets this as a projection on the second given `PathGraph`. */ + PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() } + + /** Gets this as a projection on the third given `PathGraph`. */ + PathNode3 asPathNode3() { result = super.asPathNode2() } + + /** Gets a textual representation of this element. */ + string toString() { result = super.toString() } + + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + Node getNode() { result = super.getNode() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PathGraph = Merged::PathGraph; +} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll index 6ea97954bdf..cd8e992c980 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll @@ -3031,6 +3031,17 @@ module Impl { this instanceof PathNodeSinkGroup } + private string ppType() { + this instanceof PathNodeSink and result = "" + or + this.(PathNodeMid).getAp() instanceof AccessPathNil and result = "" + or + exists(DataFlowType t | t = this.(PathNodeMid).getAp().getHead().getContainerType() | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { this instanceof PathNodeSink and result = "" or @@ -3046,14 +3057,14 @@ module Impl { } /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -3998,14 +4009,14 @@ module Impl { */ class PartialPathNode extends TPartialPathNode { /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -4046,6 +4057,19 @@ module Impl { */ int getSinkDistance() { result = distSink(this.getNodeEx().getEnclosingCallable()) } + private string ppType() { + this instanceof PartialPathNodeRev and result = "" + or + this.(PartialPathNodeFwd).getAp() instanceof PartialAccessPathNil and result = "" + or + exists(DataFlowType t | + t = this.(PartialPathNodeFwd).getAp().(PartialAccessPathCons).getType() + | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { exists(string s | s = this.(PartialPathNodeFwd).getAp().toString() or diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll index 865d7b4d6ce..f34554d6eea 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll @@ -361,3 +361,52 @@ module MergePathGraph< } } } + +/** + * Constructs a `PathGraph` from three `PathGraph`s by disjoint union. + */ +module MergePathGraph3< + PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3, + PathGraphSig Graph1, PathGraphSig Graph2, PathGraphSig Graph3> +{ + private module MergedInner = MergePathGraph; + + private module Merged = + MergePathGraph; + + /** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */ + class PathNode instanceof Merged::PathNode { + /** Gets this as a projection on the first given `PathGraph`. */ + PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() } + + /** Gets this as a projection on the second given `PathGraph`. */ + PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() } + + /** Gets this as a projection on the third given `PathGraph`. */ + PathNode3 asPathNode3() { result = super.asPathNode2() } + + /** Gets a textual representation of this element. */ + string toString() { result = super.toString() } + + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + Node getNode() { result = super.getNode() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PathGraph = Merged::PathGraph; +} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll index 6ea97954bdf..cd8e992c980 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll @@ -3031,6 +3031,17 @@ module Impl { this instanceof PathNodeSinkGroup } + private string ppType() { + this instanceof PathNodeSink and result = "" + or + this.(PathNodeMid).getAp() instanceof AccessPathNil and result = "" + or + exists(DataFlowType t | t = this.(PathNodeMid).getAp().getHead().getContainerType() | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { this instanceof PathNodeSink and result = "" or @@ -3046,14 +3057,14 @@ module Impl { } /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -3998,14 +4009,14 @@ module Impl { */ class PartialPathNode extends TPartialPathNode { /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -4046,6 +4057,19 @@ module Impl { */ int getSinkDistance() { result = distSink(this.getNodeEx().getEnclosingCallable()) } + private string ppType() { + this instanceof PartialPathNodeRev and result = "" + or + this.(PartialPathNodeFwd).getAp() instanceof PartialAccessPathNil and result = "" + or + exists(DataFlowType t | + t = this.(PartialPathNodeFwd).getAp().(PartialAccessPathCons).getType() + | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { exists(string s | s = this.(PartialPathNodeFwd).getAp().toString() or diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index 30fdf102b6b..6d17e85863f 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -897,23 +897,6 @@ private class MyConsistencyConfiguration extends Consistency::ConsistencyConfigu } } -/** - * Gets the basic block of `node`. - */ -IRBlock getBasicBlock(Node node) { - node.asInstruction().getBlock() = result - or - node.asOperand().getUse().getBlock() = result - or - node.(SsaPhiNode).getPhiNode().getBasicBlock() = result - or - node.(RawIndirectOperand).getOperand().getUse().getBlock() = result - or - node.(RawIndirectInstruction).getInstruction().getBlock() = result - or - result = getBasicBlock(node.(PostUpdateNode).getPreUpdateNode()) -} - /** * A local flow relation that includes both local steps, read steps and * argument-to-return flow through summarized functions. @@ -999,7 +982,8 @@ private int countNumberOfBranchesUsingParameter(SwitchInstruction switch, Parame // we pick the one with the highest edge count. result = max(SsaPhiNode phi | - switch.getSuccessor(caseOrDefaultEdge()).getBlock().dominanceFrontier() = getBasicBlock(phi) and + switch.getSuccessor(caseOrDefaultEdge()).getBlock().dominanceFrontier() = + phi.getBasicBlock() and phi.getSourceVariable() = sv | strictcount(phi.getAnInput()) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll index 714e5bd3b49..8a3568497cc 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll @@ -160,6 +160,28 @@ class Node extends TIRDataFlowNode { /** Gets the operands corresponding to this node, if any. */ Operand asOperand() { result = this.(OperandNode).getOperand() } + /** + * Holds if this node is at index `i` in basic block `block`. + * + * Note: Phi nodes are considered to be at index `-1`. + */ + final predicate hasIndexInBlock(IRBlock block, int i) { + this.asInstruction() = block.getInstruction(i) + or + this.asOperand().getUse() = block.getInstruction(i) + or + this.(SsaPhiNode).getPhiNode().getBasicBlock() = block and i = -1 + or + this.(RawIndirectOperand).getOperand().getUse() = block.getInstruction(i) + or + this.(RawIndirectInstruction).getInstruction() = block.getInstruction(i) + or + this.(PostUpdateNode).getPreUpdateNode().hasIndexInBlock(block, i) + } + + /** Gets the basic block of this node, if any. */ + final IRBlock getBasicBlock() { this.hasIndexInBlock(result, _) } + /** * Gets the non-conversion expression corresponding to this node, if any. * This predicate only has a result on nodes that represent the value of @@ -530,7 +552,7 @@ class SsaPhiNode extends Node, TSsaPhiNode { */ final Node getAnInput(boolean fromBackEdge) { localFlowStep(result, this) and - if phi.getBasicBlock().dominates(getBasicBlock(result)) + if phi.getBasicBlock().dominates(result.getBasicBlock()) then fromBackEdge = true else fromBackEdge = false } @@ -1887,7 +1909,7 @@ module BarrierGuard { e = value.getAnInstruction().getConvertedResultExpression() and result.getConvertedExpr() = e and guardChecks(g, value.getAnInstruction().getConvertedResultExpression(), edge) and - g.controls(getBasicBlock(result), edge) + g.controls(result.getBasicBlock(), edge) ) } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternalsCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternalsCommon.qll index 84cdefe7823..dca2b3850ba 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternalsCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternalsCommon.qll @@ -26,12 +26,17 @@ predicate ignoreOperand(Operand operand) { predicate ignoreInstruction(Instruction instr) { DataFlowImplCommon::forceCachingInSameStage() and ( + instr instanceof CallSideEffectInstruction or + instr instanceof CallReadSideEffectInstruction or + instr instanceof ExitFunctionInstruction or + instr instanceof EnterFunctionInstruction or instr instanceof WriteSideEffectInstruction or instr instanceof PhiInstruction or instr instanceof ReadSideEffectInstruction or instr instanceof ChiInstruction or instr instanceof InitializeIndirectionInstruction or instr instanceof AliasedDefinitionInstruction or + instr instanceof AliasedUseInstruction or instr instanceof InitializeNonLocalInstruction or instr instanceof ReturnIndirectionInstruction ) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll index 576b4f9adf1..571b0a12f49 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll @@ -6,7 +6,7 @@ private import IRFunctionBaseInternal private newtype TIRFunction = TFunctionIRFunction(Language::Function func) { IRConstruction::Raw::functionHasIR(func) } or - TVarInitIRFunction(Language::GlobalVariable var) { IRConstruction::Raw::varHasIRFunc(var) } + TVarInitIRFunction(Language::Variable var) { IRConstruction::Raw::varHasIRFunc(var) } /** * The IR for a function. This base class contains only the predicates that are the same between all diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll index 2c674e11626..8b3e90547e0 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll @@ -37,7 +37,13 @@ module Raw { predicate functionHasIR(Function func) { exists(getTranslatedFunction(func)) } cached - predicate varHasIRFunc(GlobalOrNamespaceVariable var) { + predicate varHasIRFunc(Variable var) { + ( + var instanceof GlobalOrNamespaceVariable + or + not var.isFromUninstantiatedTemplate(_) and + var instanceof StaticInitializedStaticLocalVariable + ) and var.hasInitializer() and ( not var.getType().isDeeplyConst() @@ -75,9 +81,10 @@ module Raw { } cached - predicate hasDynamicInitializationFlag(Function func, StaticLocalVariable var, CppType type) { + predicate hasDynamicInitializationFlag( + Function func, RuntimeInitializedStaticLocalVariable var, CppType type + ) { var.getFunction() = func and - var.hasDynamicInitialization() and type = getBoolType() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index 473b23e8b8d..9cabd7e2af3 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -180,7 +180,7 @@ abstract class TranslatedSideEffects extends TranslatedElement { /** DEPRECATED: Alias for getAst */ deprecated override Locatable getAST() { result = getAst() } - final override Declaration getFunction() { result = getExpr().getEnclosingDeclaration() } + final override Declaration getFunction() { result = getEnclosingDeclaration(getExpr()) } final override TranslatedElement getChild(int i) { result = diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll index 2953c9eeb1f..29b931e0ab6 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll @@ -28,7 +28,11 @@ abstract class TranslatedCondition extends TranslatedElement { final Expr getExpr() { result = expr } - final override Function getFunction() { result = expr.getEnclosingFunction() } + final override Declaration getFunction() { + result = getEnclosingFunction(expr) or + result = getEnclosingVariable(expr).(GlobalOrNamespaceVariable) or + result = getEnclosingVariable(expr).(StaticInitializedStaticLocalVariable) + } final Type getResultType() { result = expr.getUnspecifiedType() } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll index 2b2acfb94a3..2b959f21df4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll @@ -28,9 +28,14 @@ abstract class TranslatedDeclarationEntry extends TranslatedElement, TTranslated TranslatedDeclarationEntry() { this = TTranslatedDeclarationEntry(entry) } - final override Function getFunction() { - exists(DeclStmt stmt | - stmt = entry.getStmt() and + final override Declaration getFunction() { + exists(DeclStmt stmt | stmt = entry.getStmt() | + result = entry.getDeclaration().(StaticInitializedStaticLocalVariable) + or + result = entry.getDeclaration().(GlobalOrNamespaceVariable) + or + not entry.getDeclaration() instanceof StaticInitializedStaticLocalVariable and + not entry.getDeclaration() instanceof GlobalOrNamespaceVariable and result = stmt.getEnclosingFunction() ) } @@ -237,7 +242,7 @@ class TranslatedStaticLocalVariableInitialization extends TranslatedElement, final override LocalVariable getVariable() { result = var } - final override Function getFunction() { result = var.getFunction() } + final override Declaration getFunction() { result = var.getFunction() } } TranslatedConditionDecl getTranslatedConditionDecl(ConditionDeclExpr expr) { @@ -264,7 +269,7 @@ class TranslatedConditionDecl extends TranslatedLocalVariableDeclaration, TTrans /** DEPRECATED: Alias for getAst */ deprecated override Locatable getAST() { result = getAst() } - override Function getFunction() { result = conditionDeclExpr.getEnclosingFunction() } + override Declaration getFunction() { result = getEnclosingFunction(conditionDeclExpr) } override LocalVariable getVariable() { result = conditionDeclExpr.getVariable() } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index c92fd197db1..0731656a93c 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -62,15 +62,6 @@ private predicate ignoreExprAndDescendants(Expr expr) { // constant value. isIRConstant(getRealParent(expr)) or - // Only translate the initializer of a static local if it uses run-time data. - // Otherwise the initializer does not run in function scope. - exists(Initializer init, StaticStorageDurationVariable var | - init = var.getInitializer() and - not var.hasDynamicInitialization() and - expr = init.getExpr().getFullyConverted() and - not var instanceof GlobalOrNamespaceVariable - ) - or // Ignore descendants of `__assume` expressions, since we translated these to `NoOp`. getRealParent(expr) instanceof AssumeExpr or @@ -118,8 +109,8 @@ private predicate ignoreExprOnly(Expr expr) { // should not be translated. exists(NewOrNewArrayExpr new | expr = new.getAllocatorCall().getArgument(0)) or - not translateFunction(expr.getEnclosingFunction()) and - not Raw::varHasIRFunc(expr.getEnclosingVariable()) + not translateFunction(getEnclosingFunction(expr)) and + not Raw::varHasIRFunc(getEnclosingVariable(expr)) or // We do not yet translate destructors properly, so for now we ignore the // destructor call. We do, however, translate the expression being @@ -438,6 +429,17 @@ predicate hasTranslatedSyntheticTemporaryObject(Expr expr) { not expr.hasLValueToRValueConversion() } +class StaticInitializedStaticLocalVariable extends StaticLocalVariable { + StaticInitializedStaticLocalVariable() { + this.hasInitializer() and + not this.hasDynamicInitialization() + } +} + +class RuntimeInitializedStaticLocalVariable extends StaticLocalVariable { + RuntimeInitializedStaticLocalVariable() { this.hasDynamicInitialization() } +} + /** * Holds if the specified `DeclarationEntry` needs an IR translation. An IR translation is only * necessary for automatic local variables, or for static local variables with dynamic @@ -453,7 +455,7 @@ private predicate translateDeclarationEntry(IRDeclarationEntry entry) { not var.isStatic() or // Ignore static variables unless they have a dynamic initializer. - var.(StaticLocalVariable).hasDynamicInitialization() + var instanceof RuntimeInitializedStaticLocalVariable ) ) } @@ -755,7 +757,7 @@ newtype TTranslatedElement = } or // The side effect that initializes newly-allocated memory. TTranslatedAllocationSideEffect(AllocationExpr expr) { not ignoreSideEffects(expr) } or - TTranslatedGlobalOrNamespaceVarInit(GlobalOrNamespaceVariable var) { Raw::varHasIRFunc(var) } + TTranslatedStaticStorageDurationVarInit(Variable var) { Raw::varHasIRFunc(var) } /** * Gets the index of the first explicitly initialized element in `initList` @@ -1043,6 +1045,6 @@ abstract class TranslatedRootElement extends TranslatedElement { TranslatedRootElement() { this instanceof TTranslatedFunction or - this instanceof TTranslatedGlobalOrNamespaceVarInit + this instanceof TTranslatedStaticStorageDurationVarInit } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 8e228d55279..3080848b153 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -79,7 +79,7 @@ abstract class TranslatedExpr extends TranslatedElement { /** DEPRECATED: Alias for getAst */ deprecated override Locatable getAST() { result = this.getAst() } - final override Declaration getFunction() { result = expr.getEnclosingDeclaration() } + final override Declaration getFunction() { result = getEnclosingDeclaration(expr) } /** * Gets the expression from which this `TranslatedExpr` is generated. @@ -90,12 +90,57 @@ abstract class TranslatedExpr extends TranslatedElement { * Gets the `TranslatedFunction` containing this expression. */ final TranslatedRootElement getEnclosingFunction() { - result = getTranslatedFunction(expr.getEnclosingFunction()) + result = getTranslatedFunction(getEnclosingFunction(expr)) or - result = getTranslatedVarInit(expr.getEnclosingVariable()) + result = getTranslatedVarInit(getEnclosingVariable(expr)) } } +Function getEnclosingFunction(Expr e) { + not exists(getEnclosingVariable(e)) and + result = e.getEnclosingFunction() +} + +Declaration getEnclosingDeclaration0(Expr e) { + result = getEnclosingDeclaration0(e.getParentWithConversions()) + or + exists(Initializer i, Variable v | + i.getExpr().getFullyConverted() = e and + v = i.getDeclaration() + | + if v instanceof StaticInitializedStaticLocalVariable or v instanceof GlobalOrNamespaceVariable + then result = v + else result = e.getEnclosingDeclaration() + ) +} + +Declaration getEnclosingDeclaration(Expr e) { + result = getEnclosingDeclaration0(e) + or + not exists(getEnclosingDeclaration0(e)) and + result = e.getEnclosingDeclaration() +} + +Variable getEnclosingVariable0(Expr e) { + result = getEnclosingVariable0(e.getParentWithConversions()) + or + exists(Initializer i, Variable v | + i.getExpr().getFullyConverted() = e and + v = i.getDeclaration() + | + if v instanceof StaticInitializedStaticLocalVariable or v instanceof GlobalOrNamespaceVariable + then result = v + else result = e.getEnclosingVariable() + ) +} + +Variable getEnclosingVariable(Expr e) { + result = getEnclosingVariable0(e) + or + not exists(getEnclosingVariable0(e)) and + result = e.getEnclosingVariable() +} + /** * The IR translation of the "core" part of an expression. This is the part of * the expression that produces the result value of the expression, before any @@ -843,10 +888,21 @@ class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess { override IRVariable getInstructionVariable(InstructionTag tag) { tag = OnlyInstructionTag() and - result = getIRUserVariable(expr.getEnclosingDeclaration(), expr.getTarget()) + exists(Declaration d, Variable v | + accessHasEnclosingDeclarationAndVariable(d, v, expr) and + result = getIRUserVariable(d, v) + ) } } +pragma[nomagic] +private predicate accessHasEnclosingDeclarationAndVariable( + Declaration d, Variable v, VariableAccess va +) { + d = getEnclosingDeclaration(va) and + v = va.getTarget() +} + class TranslatedFieldAccess extends TranslatedVariableAccess { override FieldAccess expr; @@ -2000,7 +2056,7 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { tag = OnlyInstructionTag() and operandTag instanceof UnaryOperandTag and - result = getTranslatedFunction(expr.getEnclosingFunction()).getInitializeThisInstruction() + result = getTranslatedFunction(getEnclosingFunction(expr)).getInitializeThisInstruction() } final override Field getInstructionField(InstructionTag tag) { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll index d29d8c80cf5..d02cb716fe5 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -322,11 +322,13 @@ class TranslatedFunction extends TranslatedRootElement, TTranslatedFunction { ( var instanceof GlobalOrNamespaceVariable or + var instanceof StaticLocalVariable + or var instanceof MemberVariable and not var instanceof Field ) and exists(VariableAccess access | access.getTarget() = var and - access.getEnclosingFunction() = func + getEnclosingFunction(access) = func ) or var.(LocalScopeVariable).getFunction() = func diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll index 5a4f7977ac8..ea09270dfbf 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll @@ -1,4 +1,5 @@ import semmle.code.cpp.ir.implementation.raw.internal.TranslatedElement +private import TranslatedExpr private import cpp private import semmle.code.cpp.ir.implementation.IRType private import semmle.code.cpp.ir.implementation.Opcode @@ -8,16 +9,16 @@ private import TranslatedInitialization private import InstructionTag private import semmle.code.cpp.ir.internal.IRUtilities -class TranslatedGlobalOrNamespaceVarInit extends TranslatedRootElement, - TTranslatedGlobalOrNamespaceVarInit, InitializationContext +class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement, + TTranslatedStaticStorageDurationVarInit, InitializationContext { - GlobalOrNamespaceVariable var; + Variable var; - TranslatedGlobalOrNamespaceVarInit() { this = TTranslatedGlobalOrNamespaceVarInit(var) } + TranslatedStaticStorageDurationVarInit() { this = TTranslatedStaticStorageDurationVarInit(var) } override string toString() { result = var.toString() } - final override GlobalOrNamespaceVariable getAst() { result = var } + final override Variable getAst() { result = var } final override Declaration getFunction() { result = var } @@ -111,11 +112,13 @@ class TranslatedGlobalOrNamespaceVarInit extends TranslatedRootElement, ( varUsed instanceof GlobalOrNamespaceVariable or + varUsed instanceof StaticLocalVariable + or varUsed instanceof MemberVariable and not varUsed instanceof Field ) and exists(VariableAccess access | access.getTarget() = varUsed and - access.getEnclosingVariable() = var + getEnclosingVariable(access) = var ) or var = varUsed @@ -128,6 +131,4 @@ class TranslatedGlobalOrNamespaceVarInit extends TranslatedRootElement, } } -TranslatedGlobalOrNamespaceVarInit getTranslatedVarInit(GlobalOrNamespaceVariable var) { - result.getAst() = var -} +TranslatedStaticStorageDurationVarInit getTranslatedVarInit(Variable var) { result.getAst() = var } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll index 5e50c834d67..716d4d35c20 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -138,8 +138,9 @@ abstract class TranslatedInitialization extends TranslatedElement, TTranslatedIn final override string toString() { result = "init: " + expr.toString() } final override Declaration getFunction() { - result = expr.getEnclosingFunction() or - result = expr.getEnclosingVariable().(GlobalOrNamespaceVariable) + result = getEnclosingFunction(expr) or + result = getEnclosingVariable(expr).(GlobalOrNamespaceVariable) or + result = getEnclosingVariable(expr).(StaticInitializedStaticLocalVariable) } final override Locatable getAst() { result = expr } @@ -159,7 +160,7 @@ abstract class TranslatedInitialization extends TranslatedElement, TTranslatedIn final InitializationContext getContext() { result = getParent() } final TranslatedFunction getEnclosingFunction() { - result = getTranslatedFunction(expr.getEnclosingFunction()) + result = getTranslatedFunction(this.getFunction()) } } @@ -493,8 +494,9 @@ abstract class TranslatedFieldInitialization extends TranslatedElement { deprecated override Locatable getAST() { result = getAst() } final override Declaration getFunction() { - result = ast.getEnclosingFunction() or - result = ast.getEnclosingVariable().(GlobalOrNamespaceVariable) + result = getEnclosingFunction(ast) or + result = getEnclosingVariable(ast).(GlobalOrNamespaceVariable) or + result = getEnclosingVariable(ast).(StaticInitializedStaticLocalVariable) } final override Instruction getFirstInstruction() { result = getInstruction(getFieldAddressTag()) } @@ -651,9 +653,11 @@ abstract class TranslatedElementInitialization extends TranslatedElement { deprecated override Locatable getAST() { result = getAst() } final override Declaration getFunction() { - result = initList.getEnclosingFunction() + result = getEnclosingFunction(initList) or - result = initList.getEnclosingVariable().(GlobalOrNamespaceVariable) + result = getEnclosingVariable(initList).(GlobalOrNamespaceVariable) + or + result = getEnclosingVariable(initList).(StaticInitializedStaticLocalVariable) } final override Instruction getFirstInstruction() { result = getInstruction(getElementIndexTag()) } @@ -852,7 +856,7 @@ abstract class TranslatedStructorCallFromStructor extends TranslatedElement, Str result = getStructorCall() } - final override Function getFunction() { result = call.getEnclosingFunction() } + final override Function getFunction() { result = getEnclosingFunction(call) } final override Instruction getChildSuccessor(TranslatedElement child) { child = getStructorCall() and @@ -989,7 +993,7 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr override TranslatedElement getChild(int id) { none() } - override Function getFunction() { result = getParent().getFunction() } + override Declaration getFunction() { result = this.getParent().getFunction() } override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguage.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguage.qll index 6e6c632ae3d..681e2838ffb 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguage.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguage.qll @@ -47,7 +47,7 @@ class Variable = Cpp::Variable; class AutomaticVariable = Cpp::StackVariable; -class StaticVariable = Cpp::Variable; +class StaticVariable = Cpp::StaticStorageDurationVariable; class GlobalVariable = Cpp::GlobalOrNamespaceVariable; diff --git a/cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguageDebug.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguageDebug.qll index 9c90adfb54b..33ce23134fc 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguageDebug.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguageDebug.qll @@ -1,3 +1,9 @@ +private import cpp private import semmle.code.cpp.Print as Print -predicate getIdentityString = Print::getIdentityString/1; +string getIdentityString(Declaration decl) { + if decl instanceof StaticLocalVariable + then + exists(StaticLocalVariable v | v = decl | result = v.getType().toString() + " " + v.getName()) + else result = Print::getIdentityString(decl) +} diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/SimpleRangeAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/SimpleRangeAnalysis.qll index 04cb8a5a3fa..3716625656c 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/SimpleRangeAnalysis.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/SimpleRangeAnalysis.qll @@ -8,6 +8,8 @@ private import semmle.code.cpp.ir.IR private import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticBound private import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticExprSpecific private import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.RangeAnalysis +private import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.RangeAnalysisImpl +private import semmle.code.cpp.rangeanalysis.RangeAnalysisUtils /** * Gets the lower bound of the expression. @@ -22,8 +24,10 @@ private import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.Rang * `lowerBound(expr.getFullyConverted())` */ float lowerBound(Expr expr) { - exists(Instruction i, SemBound b | i.getAst() = expr and b instanceof SemZeroBound | - semBounded(getSemanticExpr(i), b, result, false, _) + exists(Instruction i, ConstantBounds::SemBound b | + i.getAst() = expr and b instanceof ConstantBounds::SemZeroBound + | + ConstantStage::semBounded(getSemanticExpr(i), b, result, false, _) ) } @@ -40,8 +44,10 @@ float lowerBound(Expr expr) { * `upperBound(expr.getFullyConverted())` */ float upperBound(Expr expr) { - exists(Instruction i, SemBound b | i.getAst() = expr and b instanceof SemZeroBound | - semBounded(getSemanticExpr(i), b, result, true, _) + exists(Instruction i, ConstantBounds::SemBound b | + i.getAst() = expr and b instanceof ConstantBounds::SemZeroBound + | + ConstantStage::semBounded(getSemanticExpr(i), b, result, true, _) ) } @@ -90,7 +96,15 @@ predicate defMightOverflow(RangeSsaDefinition def, StackVariable v) { * does not consider the possibility that the expression might overflow * due to a conversion. */ -predicate exprMightOverflowNegatively(Expr expr) { none() } +predicate exprMightOverflowNegatively(Expr expr) { + lowerBound(expr) < exprMinVal(expr) + or + exists(SemanticExprConfig::Expr semExpr | + semExpr.getUnconverted().getAst() = expr and + ConstantStage::potentiallyOverflowingExpr(false, semExpr) and + not ConstantStage::initialBounded(semExpr, _, _, false, _, _, _) + ) +} /** * Holds if the expression might overflow negatively. Conversions @@ -108,7 +122,15 @@ predicate convertedExprMightOverflowNegatively(Expr expr) { * does not consider the possibility that the expression might overflow * due to a conversion. */ -predicate exprMightOverflowPositively(Expr expr) { none() } +predicate exprMightOverflowPositively(Expr expr) { + upperBound(expr) > exprMaxVal(expr) + or + exists(SemanticExprConfig::Expr semExpr | + semExpr.getUnconverted().getAst() = expr and + ConstantStage::potentiallyOverflowingExpr(true, semExpr) and + not ConstantStage::initialBounded(semExpr, _, _, true, _, _, _) + ) +} /** * Holds if the expression might overflow positively. Conversions diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/FloatDelta.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/FloatDelta.qll index 1dfcc445208..8767c53aa19 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/FloatDelta.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/FloatDelta.qll @@ -1,4 +1,5 @@ private import RangeAnalysisStage +private import RangeAnalysisImpl module FloatDelta implements DeltaSig { class Delta = float; @@ -18,3 +19,36 @@ module FloatDelta implements DeltaSig { bindingset[f] Delta fromFloat(float f) { result = f } } + +module FloatOverflow implements OverflowSig { + predicate semExprDoesNotOverflow(boolean positively, SemExpr expr) { + exists(float lb, float ub, float delta | + typeBounds(expr.getSemType(), lb, ub) and + ConstantStage::initialBounded(expr, any(ConstantBounds::SemZeroBound b), delta, positively, _, + _, _) + | + positively = true and delta < ub + or + positively = false and delta > lb + ) + } + + additional predicate typeBounds(SemType t, float lb, float ub) { + exists(SemIntegerType integralType, float limit | + integralType = t and limit = 2.pow(8 * integralType.getByteSize()) + | + if integralType instanceof SemBooleanType + then lb = 0 and ub = 1 + else + if integralType.isSigned() + then ( + lb = -(limit / 2) and ub = (limit / 2) - 1 + ) else ( + lb = 0 and ub = limit - 1 + ) + ) + or + // This covers all floating point types. The range is (-Inf, +Inf). + t instanceof SemFloatingPointType and lb = -(1.0 / 0.0) and ub = 1.0 / 0.0 + } +} diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysis.qll index 5d15aa30fb4..1749cef13b2 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysis.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysis.qll @@ -1,2 +1,3 @@ -import RangeAnalysisImpl import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticBound +private import RangeAnalysisImpl as Impl +import Impl::Public diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisSpecific.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisConstantSpecific.qll similarity index 98% rename from cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisSpecific.qll rename to cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisConstantSpecific.qll index 2ddc20c8a33..42edb904c3f 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisSpecific.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisConstantSpecific.qll @@ -6,7 +6,7 @@ private import semmle.code.cpp.rangeanalysis.new.internal.semantic.Semantic private import RangeAnalysisStage private import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.FloatDelta -module CppLangImpl implements LangSig { +module CppLangImplConstant implements LangSig { /** * Holds if the specified expression should be excluded from the result of `ssaRead()`. * diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisImpl.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisImpl.qll index dd3a0f2e878..a5c129f638f 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisImpl.qll @@ -1,5 +1,6 @@ private import RangeAnalysisStage -private import RangeAnalysisSpecific +private import RangeAnalysisConstantSpecific +private import RangeAnalysisRelativeSpecific private import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.FloatDelta private import RangeUtils private import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticBound as SemanticBound @@ -28,7 +29,7 @@ module ConstantBounds implements BoundSig { } } -private module RelativeBounds implements BoundSig { +module RelativeBounds implements BoundSig { class SemBound instanceof SemanticBound::SemBound { SemBound() { not this instanceof SemanticBound::SemZeroBound } @@ -46,11 +47,13 @@ private module RelativeBounds implements BoundSig { } } -private module ConstantStage = - RangeStage>; +module ConstantStage = + RangeStage>; -private module RelativeStage = - RangeStage>; +module RelativeStage = + RangeStage>; private newtype TSemReason = TSemNoReason() or @@ -60,48 +63,52 @@ private newtype TSemReason = guard = any(RelativeStage::SemCondReason reason).getCond() } -/** - * A reason for an inferred bound. This can either be `CondReason` if the bound - * is due to a specific condition, or `NoReason` if the bound is inferred - * without going through a bounding condition. - */ -abstract class SemReason extends TSemReason { - /** Gets a textual representation of this reason. */ - abstract string toString(); -} - -/** - * A reason for an inferred bound that indicates that the bound is inferred - * without going through a bounding condition. - */ -class SemNoReason extends SemReason, TSemNoReason { - override string toString() { result = "NoReason" } -} - -/** A reason for an inferred bound pointing to a condition. */ -class SemCondReason extends SemReason, TSemCondReason { - /** Gets the condition that is the reason for the bound. */ - SemGuard getCond() { this = TSemCondReason(result) } - - override string toString() { result = getCond().toString() } -} - -private ConstantStage::SemReason constantReason(SemReason reason) { +ConstantStage::SemReason constantReason(SemReason reason) { result instanceof ConstantStage::SemNoReason and reason instanceof SemNoReason or result.(ConstantStage::SemCondReason).getCond() = reason.(SemCondReason).getCond() } -private RelativeStage::SemReason relativeReason(SemReason reason) { +RelativeStage::SemReason relativeReason(SemReason reason) { result instanceof RelativeStage::SemNoReason and reason instanceof SemNoReason or result.(RelativeStage::SemCondReason).getCond() = reason.(SemCondReason).getCond() } -predicate semBounded( - SemExpr e, SemanticBound::SemBound b, float delta, boolean upper, SemReason reason -) { - ConstantStage::semBounded(e, b, delta, upper, constantReason(reason)) - or - RelativeStage::semBounded(e, b, delta, upper, relativeReason(reason)) +import Public + +module Public { + predicate semBounded( + SemExpr e, SemanticBound::SemBound b, float delta, boolean upper, SemReason reason + ) { + ConstantStage::semBounded(e, b, delta, upper, constantReason(reason)) + or + RelativeStage::semBounded(e, b, delta, upper, relativeReason(reason)) + } + + /** + * A reason for an inferred bound. This can either be `CondReason` if the bound + * is due to a specific condition, or `NoReason` if the bound is inferred + * without going through a bounding condition. + */ + abstract class SemReason extends TSemReason { + /** Gets a textual representation of this reason. */ + abstract string toString(); + } + + /** + * A reason for an inferred bound that indicates that the bound is inferred + * without going through a bounding condition. + */ + class SemNoReason extends SemReason, TSemNoReason { + override string toString() { result = "NoReason" } + } + + /** A reason for an inferred bound pointing to a condition. */ + class SemCondReason extends SemReason, TSemCondReason { + /** Gets the condition that is the reason for the bound. */ + SemGuard getCond() { this = TSemCondReason(result) } + + override string toString() { result = getCond().toString() } + } } diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisRelativeSpecific.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisRelativeSpecific.qll new file mode 100644 index 00000000000..7643c4aadb9 --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisRelativeSpecific.qll @@ -0,0 +1,126 @@ +/** + * C++-specific implementation of range analysis. + */ + +private import semmle.code.cpp.rangeanalysis.new.internal.semantic.Semantic +private import RangeAnalysisStage +private import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.FloatDelta +private import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.IntDelta +private import RangeAnalysisImpl +private import semmle.code.cpp.rangeanalysis.RangeAnalysisUtils + +module CppLangImplRelative implements LangSig { + /** + * Holds if the specified expression should be excluded from the result of `ssaRead()`. + * + * This predicate is to keep the results identical to the original Java implementation. It should be + * removed once we have the new implementation matching the old results exactly. + */ + predicate ignoreSsaReadCopy(SemExpr e) { none() } + + /** + * Ignore the bound on this expression. + * + * This predicate is to keep the results identical to the original Java implementation. It should be + * removed once we have the new implementation matching the old results exactly. + */ + predicate ignoreExprBound(SemExpr e) { + exists(boolean upper, float delta, ConstantBounds::SemZeroBound b, float lb, float ub | + ConstantStage::semBounded(e, b, delta, upper, _) and + typeBounds(e.getSemType(), lb, ub) and + ( + upper = false and + delta < lb + or + upper = true and + delta > ub + ) + ) + } + + private predicate typeBounds(SemType t, float lb, float ub) { + exists(SemIntegerType integralType, float limit | + integralType = t and limit = 2.pow(8 * integralType.getByteSize()) + | + if integralType instanceof SemBooleanType + then lb = 0 and ub = 1 + else + if integralType.isSigned() + then ( + lb = -(limit / 2) and ub = (limit / 2) - 1 + ) else ( + lb = 0 and ub = limit - 1 + ) + ) + or + // This covers all floating point types. The range is (-Inf, +Inf). + t instanceof SemFloatingPointType and lb = -(1.0 / 0.0) and ub = 1.0 / 0.0 + } + + /** + * Ignore any inferred zero lower bound on this expression. + * + * This predicate is to keep the results identical to the original Java implementation. It should be + * removed once we have the new implementation matching the old results exactly. + */ + predicate ignoreZeroLowerBound(SemExpr e) { none() } + + /** + * Holds if the specified expression should be excluded from the result of `ssaRead()`. + * + * This predicate is to keep the results identical to the original Java implementation. It should be + * removed once we have the new implementation matching the old results exactly. + */ + predicate ignoreSsaReadArithmeticExpr(SemExpr e) { none() } + + /** + * Holds if the specified variable should be excluded from the result of `ssaRead()`. + * + * This predicate is to keep the results identical to the original Java implementation. It should be + * removed once we have the new implementation matching the old results exactly. + */ + predicate ignoreSsaReadAssignment(SemSsaVariable v) { none() } + + /** + * Adds additional results to `ssaRead()` that are specific to Java. + * + * This predicate handles propagation of offsets for post-increment and post-decrement expressions + * in exactly the same way as the old Java implementation. Once the new implementation matches the + * old one, we should remove this predicate and propagate deltas for all similar patterns, whether + * or not they come from a post-increment/decrement expression. + */ + SemExpr specificSsaRead(SemSsaVariable v, float delta) { none() } + + /** + * Holds if `e >= bound` (if `upper = false`) or `e <= bound` (if `upper = true`). + */ + predicate hasConstantBound(SemExpr e, float bound, boolean upper) { none() } + + /** + * Holds if `e >= bound + delta` (if `upper = false`) or `e <= bound + delta` (if `upper = true`). + */ + predicate hasBound(SemExpr e, SemExpr bound, float delta, boolean upper) { none() } + + /** + * Holds if the value of `dest` is known to be `src + delta`. + */ + predicate additionalValueFlowStep(SemExpr dest, SemExpr src, float delta) { none() } + + /** + * Gets the type that range analysis should use to track the result of the specified expression, + * if a type other than the original type of the expression is to be used. + * + * This predicate is commonly used in languages that support immutable "boxed" types that are + * actually references but whose values can be tracked as the type contained in the box. + */ + SemType getAlternateType(SemExpr e) { none() } + + /** + * Gets the type that range analysis should use to track the result of the specified source + * variable, if a type other than the original type of the expression is to be used. + * + * This predicate is commonly used in languages that support immutable "boxed" types that are + * actually references but whose values can be tracked as the type contained in the box. + */ + SemType getAlternateTypeForSsaVariable(SemSsaVariable var) { none() } +} diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisStage.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisStage.qll index 2cdf7b1e233..de93b7bdff3 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisStage.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisStage.qll @@ -73,6 +73,7 @@ import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticCFG import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticType import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticOpcode private import ConstantAnalysis +private import Sign import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticLocation /** @@ -240,11 +241,19 @@ signature module BoundSig { } } -module RangeStage Bounds, LangSig LangParam, UtilSig UtilParam> { +signature module OverflowSig { + predicate semExprDoesNotOverflow(boolean positively, SemExpr expr); +} + +module RangeStage< + DeltaSig D, BoundSig Bounds, OverflowSig OverflowParam, LangSig LangParam, + UtilSig UtilParam> +{ private import Bounds private import LangParam private import UtilParam private import D + private import OverflowParam /** * An expression that does conversion, boxing, or unboxing @@ -920,6 +929,81 @@ module RangeStage Bounds, LangSig LangParam, UtilSig< bounded(cast.getOperand(), b, delta, upper, fromBackEdge, origdelta, reason) } + predicate bounded( + SemExpr e, SemBound b, D::Delta delta, boolean upper, boolean fromBackEdge, D::Delta origdelta, + SemReason reason + ) { + initialBounded(e, b, delta, upper, fromBackEdge, origdelta, reason) and + ( + semExprDoesNotOverflow(upper.booleanNot(), e) + or + not potentiallyOverflowingExpr(upper.booleanNot(), e) + or + exists(D::Delta otherDelta | + initialBounded(e, _, otherDelta, upper.booleanNot(), _, _, _) and + ( + upper = true and D::toFloat(otherDelta) >= 0 + or + upper = false and D::toFloat(otherDelta) <= 0 + ) + ) + ) + } + + predicate potentiallyOverflowingExpr(boolean positively, SemExpr expr) { + ( + expr.getOpcode() instanceof Opcode::Add or + expr.getOpcode() instanceof Opcode::PointerAdd + ) and + ( + positively = true and + ( + pragma[only_bind_out](semExprSign(expr.(SemBinaryExpr).getLeftOperand())) = TPos() and + pragma[only_bind_out](semExprSign(expr.(SemBinaryExpr).getRightOperand())) = TPos() + ) + or + positively = false and + ( + pragma[only_bind_out](semExprSign(expr.(SemBinaryExpr).getLeftOperand())) = TNeg() and + pragma[only_bind_out](semExprSign(expr.(SemBinaryExpr).getRightOperand())) = TNeg() + ) + ) + or + ( + expr.getOpcode() instanceof Opcode::Sub or + expr.getOpcode() instanceof Opcode::PointerSub + ) and + ( + positively = true and + ( + pragma[only_bind_out](semExprSign(expr.(SemBinaryExpr).getLeftOperand())) = TPos() and + pragma[only_bind_out](semExprSign(expr.(SemBinaryExpr).getRightOperand())) = TNeg() + ) + or + positively = false and + ( + pragma[only_bind_out](semExprSign(expr.(SemBinaryExpr).getLeftOperand())) = TNeg() and + pragma[only_bind_out](semExprSign(expr.(SemBinaryExpr).getRightOperand())) = TPos() + ) + ) + or + positively in [true, false] and + ( + expr.getOpcode() instanceof Opcode::Mul or + expr.getOpcode() instanceof Opcode::ShiftLeft + ) + or + positively = false and + ( + expr.getOpcode() instanceof Opcode::Negate or + expr.getOpcode() instanceof Opcode::SubOne or + expr.(SemDivExpr).getSemType() instanceof SemFloatingPointType + ) + or + positively = true and + expr.getOpcode() instanceof Opcode::AddOne + } + /** * Computes a normal form of `x` where -0.0 has changed to +0.0. This can be * needed on the lesser side of a floating-point comparison or on both sides of @@ -934,7 +1018,7 @@ module RangeStage Bounds, LangSig LangParam, UtilSig< * - `upper = true` : `e <= b + delta` * - `upper = false` : `e >= b + delta` */ - private predicate bounded( + predicate initialBounded( SemExpr e, SemBound b, D::Delta delta, boolean upper, boolean fromBackEdge, D::Delta origdelta, SemReason reason ) { diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeUtils.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeUtils.qll index 7eeed5d7975..32510409ae2 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeUtils.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeUtils.qll @@ -3,7 +3,7 @@ */ private import semmle.code.cpp.rangeanalysis.new.internal.semantic.Semantic -private import RangeAnalysisSpecific +private import RangeAnalysisRelativeSpecific private import RangeAnalysisStage as Range private import ConstantAnalysis diff --git a/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll b/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll index b8c5d67dc05..ad7a72262f5 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll @@ -314,9 +314,8 @@ class FreadBA extends BufferAccess { * but not: * &buffer[ix] */ -class ArrayExprBA extends BufferAccess { +class ArrayExprBA extends BufferAccess, ArrayExpr { ArrayExprBA() { - exists(this.(ArrayExpr).getArrayOffset().getValue().toInt()) and not exists(AddressOfExpr aoe | aoe.getAChild() = this) and // exclude accesses in macro implementation of `strcmp`, // which are carefully controlled but can look dangerous. diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 53995a93a1f..1314e6d7553 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.6.1 + +### New Queries + +* A new query `cpp/double-free` has been added. The query finds possible cases of deallocating the same pointer twice. The precision of the query has been set to "medium". +* The query `cpp/use-after-free` has been modernized and assigned the precision "medium". The query finds cases of where a pointer is dereferenced after its memory has been deallocated. + ## 0.6.0 ### New Queries diff --git a/cpp/ql/src/Critical/DoubleFree.cpp b/cpp/ql/src/Critical/DoubleFree.cpp new file mode 100644 index 00000000000..92b12ea5bcb --- /dev/null +++ b/cpp/ql/src/Critical/DoubleFree.cpp @@ -0,0 +1,10 @@ +int* f() { + int *buff = malloc(SIZE*sizeof(int)); + do_stuff(buff); + free(buff); + int *new_buffer = malloc(SIZE*sizeof(int)); + free(buff); // BAD: If new_buffer is assigned the same address as buff, + // the memory allocator will free the new buffer memory region, + // leading to use-after-free problems and memory corruption. + return new_buffer; +} diff --git a/cpp/ql/src/Critical/DoubleFree.qhelp b/cpp/ql/src/Critical/DoubleFree.qhelp new file mode 100644 index 00000000000..0b38858eae4 --- /dev/null +++ b/cpp/ql/src/Critical/DoubleFree.qhelp @@ -0,0 +1,33 @@ + + + + + +

+Deallocating memory more than once can lead to a double-free vulnerability. This can be exploited to +corrupt the allocator's internal data structures, which can lead to denial-of-service attacks by crashing +the program, or security vulnerabilities, by allowing an attacker to overwrite arbitrary memory locations. +

+ +
+ +

+Ensure that all execution paths deallocate the allocated memory at most once. If possible, reassign +the pointer to a null value after deallocating it. This will prevent double-free vulnerabilities since +most deallocation functions will perform a null-pointer check before attempting to deallocate the memory. +

+ +
+ + + + +
  • +OWASP: +Doubly freeing memory. +
  • + +
    +
    diff --git a/cpp/ql/src/Critical/DoubleFree.ql b/cpp/ql/src/Critical/DoubleFree.ql new file mode 100644 index 00000000000..734e32ea75f --- /dev/null +++ b/cpp/ql/src/Critical/DoubleFree.ql @@ -0,0 +1,49 @@ +/** + * @name Potential double free + * @description Freeing a resource more than once can lead to undefined behavior and cause memory corruption. + * @kind path-problem + * @precision medium + * @id cpp/double-free + * @problem.severity warning + * @security-severity 9.3 + * @tags reliability + * security + * external/cwe/cwe-415 + */ + +import cpp +import semmle.code.cpp.dataflow.new.DataFlow +import FlowAfterFree +import DoubleFree::PathGraph + +predicate isFree(DataFlow::Node n, Expr e) { isFree(n, e, _) } + +/** + * `dealloc1` is a deallocation expression and `e` is an expression such + * that is deallocated by a deallocation expression, and the `(dealloc1, e)` pair + * should be excluded by the `FlowFromFree` library. + * + * Note that `e` is not necessarily the expression deallocated by `dealloc1`. It will + * be bound to the second deallocation as identified by the `FlowFromFree` library. + */ +bindingset[dealloc1, e] +predicate isExcludeFreePair(DeallocationExpr dealloc1, Expr e) { + exists(DeallocationExpr dealloc2 | isFree(_, e, dealloc2) | + dealloc1.(FunctionCall).getTarget().hasGlobalName("MmFreePagesFromMdl") and + // From https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-mmfreepagesfrommdl: + // "After calling MmFreePagesFromMdl, the caller must also call ExFreePool + // to release the memory that was allocated for the MDL structure." + isExFreePoolCall(dealloc2, _) + ) +} + +module DoubleFree = FlowFromFree; + +from DoubleFree::PathNode source, DoubleFree::PathNode sink, DeallocationExpr dealloc, Expr e2 +where + DoubleFree::flowPath(source, sink) and + isFree(source.getNode(), _, dealloc) and + isFree(sink.getNode(), e2) +select sink.getNode(), source, sink, + "Memory pointed to by '" + e2.toString() + "' may already have been freed by $@.", dealloc, + dealloc.toString() diff --git a/cpp/ql/src/Critical/FlowAfterFree.qll b/cpp/ql/src/Critical/FlowAfterFree.qll new file mode 100644 index 00000000000..0e04b294d70 --- /dev/null +++ b/cpp/ql/src/Critical/FlowAfterFree.qll @@ -0,0 +1,129 @@ +import cpp +import semmle.code.cpp.dataflow.new.DataFlow +private import semmle.code.cpp.ir.IR + +/** + * Signature for a predicate that holds if `n.asExpr() = e` and `n` is a sink in + * the `FlowFromFreeConfig` module. + */ +private signature predicate isSinkSig(DataFlow::Node n, Expr e); + +/** + * Holds if `dealloc` is a deallocation expression and `e` is an expression such + * that `isFree(_, e)` holds for some `isFree` predicate satisfying `isSinkSig`, + * and this source-sink pair should be excluded from the analysis. + */ +bindingset[dealloc, e] +private signature predicate isExcludedSig(DeallocationExpr dealloc, Expr e); + +/** + * Holds if `(b1, i1)` strictly post-dominates `(b2, i2)` + */ +bindingset[i1, i2] +predicate strictlyPostDominates(IRBlock b1, int i1, IRBlock b2, int i2) { + b1 = b2 and + i1 > i2 + or + b1.strictlyPostDominates(b2) +} + +/** + * Holds if `(b1, i1)` strictly dominates `(b2, i2)` + */ +bindingset[i1, i2] +predicate strictlyDominates(IRBlock b1, int i1, IRBlock b2, int i2) { + b1 = b2 and + i1 < i2 + or + b1.strictlyDominates(b2) +} + +/** + * Constructs a `FlowFromFreeConfig` module that can be used to find flow between + * a pointer being freed by some deallocation function, and a user-specified sink. + * + * In order to reduce false positives, the set of sinks is restricted to only those + * that satisfy at least one of the following two criteria: + * 1. The source dominates the sink, or + * 2. The sink post-dominates the source. + */ +module FlowFromFree { + module FlowFromFreeConfig implements DataFlow::StateConfigSig { + class FlowState instanceof Expr { + FlowState() { isFree(_, this, _) } + + string toString() { result = super.toString() } + } + + predicate isSource(DataFlow::Node node, FlowState state) { isFree(node, state, _) } + + pragma[inline] + predicate isSink(DataFlow::Node sink, FlowState state) { + exists( + Expr e, DataFlow::Node source, IRBlock b1, int i1, IRBlock b2, int i2, + DeallocationExpr dealloc + | + isASink(sink, e) and + isFree(source, state, dealloc) and + e != state and + source.hasIndexInBlock(b1, i1) and + sink.hasIndexInBlock(b2, i2) and + not isExcluded(dealloc, e) + | + strictlyDominates(b1, i1, b2, i2) + or + strictlyPostDominates(b2, i2, b1, i1) + ) + } + + predicate isBarrierIn(DataFlow::Node n) { + n.asIndirectExpr() = any(AddressOfExpr aoe) + or + n.asIndirectExpr() = any(Call call).getAnArgument() + or + exists(Expr e | + n.asIndirectExpr() = e.(PointerDereferenceExpr).getOperand() or + n.asIndirectExpr() = e.(ArrayExpr).getArrayBase() + | + e = any(StoreInstruction store).getDestinationAddress().getUnconvertedResultExpression() + ) + } + + predicate isBarrier(DataFlow::Node n, FlowState state) { none() } + + predicate isAdditionalFlowStep( + DataFlow::Node n1, FlowState state1, DataFlow::Node n2, FlowState state2 + ) { + none() + } + } + + import DataFlow::GlobalWithState +} + +/** + * Holds if `n` is a dataflow node such that `n.asExpr() = e` and `e` + * is being freed by a deallocation expression `dealloc`. + */ +predicate isFree(DataFlow::Node n, Expr e, DeallocationExpr dealloc) { + e = dealloc.getFreedExpr() and + e = n.asExpr() and + // Ignore realloc functions + not exists(dealloc.(FunctionCall).getTarget().(AllocationFunction).getReallocPtrArg()) +} + +/** + * Holds if `fc` is a function call that is the result of expanding + * the `ExFreePool` macro. + */ +predicate isExFreePoolCall(FunctionCall fc, Expr e) { + e = fc.getArgument(0) and + ( + exists(MacroInvocation mi | + mi.getMacroName() = "ExFreePool" and + mi.getExpr() = fc + ) + or + fc.getTarget().hasGlobalName("ExFreePool") + ) +} diff --git a/cpp/ql/src/Critical/MissingCheckScanf.ql b/cpp/ql/src/Critical/MissingCheckScanf.ql index bca946641f9..a5e1de0d0b3 100644 --- a/cpp/ql/src/Critical/MissingCheckScanf.ql +++ b/cpp/ql/src/Critical/MissingCheckScanf.ql @@ -16,160 +16,133 @@ import cpp import semmle.code.cpp.commons.Scanf import semmle.code.cpp.controlflow.Guards -import semmle.code.cpp.ir.dataflow.DataFlow +import semmle.code.cpp.dataflow.new.DataFlow::DataFlow import semmle.code.cpp.ir.IR import semmle.code.cpp.ir.ValueNumbering -/** - * Holds if `call` is a `scanf`-like function that may write to `output` at index `index`. - * - * Furthermore, `instr` is the instruction that defines the address of the `index`'th argument - * of `call`, and `vn` is the value number of `instr.` - */ -predicate isSource(ScanfFunctionCall call, int index, Instruction instr, ValueNumber vn, Expr output) { - output = call.getOutputArgument(index).getFullyConverted() and - instr.getConvertedResultExpression() = output and - vn.getAnInstruction() = instr +/** Holds if `n` reaches an argument to a call to a `scanf`-like function. */ +pragma[nomagic] +predicate revFlow0(Node n) { + isSink(_, _, n, _) + or + exists(Node succ | revFlow0(succ) | localFlowStep(n, succ)) } /** - * Holds if `instr` is control-flow reachable in 0 or more steps from - * a call to a `scanf`-like function. + * Holds if `n` represents an uninitialized stack-allocated variable, or a + * newly (and presumed uninitialized) heap allocation. */ +predicate isUninitialized(Node n) { + exists(n.asUninitialized()) or + n.asIndirectExpr(1) instanceof AllocationExpr +} + pragma[nomagic] -predicate fwdFlow0(Instruction instr) { - isSource(_, _, instr, _, _) - or - exists(Instruction prev | - fwdFlow0(prev) and - prev.getASuccessor() = instr +predicate fwdFlow0(Node n) { + revFlow0(n) and + ( + isUninitialized(n) + or + exists(Node prev | + fwdFlow0(prev) and + localFlowStep(prev, n) + ) ) } -/** - * Holds if `instr` is part of the IR translation of `access` that - * is not an expression being deallocated, and `instr` has value - * number `vn`. - */ -predicate isSink(Instruction instr, Access access, ValueNumber vn) { - instr.getAst() = access and - not any(DeallocationExpr dealloc).getFreedExpr() = access and - vn.getAnInstruction() = instr +predicate isSink(ScanfFunctionCall call, int index, Node n, Expr input) { + input = call.getOutputArgument(index) and + n.asIndirectExpr() = input } /** - * Holds if `instr` is part of a path from a call to a `scanf`-like function + * Holds if `call` is a `scanf`-like call and `output` is the `index`'th + * argument that has not been previously initialized. + */ +predicate isRelevantScanfCall(ScanfFunctionCall call, int index, Expr output) { + exists(Node n | fwdFlow0(n) and isSink(call, index, n, output)) +} + +/** + * Holds if `call` is a `scanf`-like function that may write to `output` at + * index `index` and `n` is the dataflow node that represents the data after + * it has been written to by `call`. + */ +predicate isSource(ScanfFunctionCall call, int index, Node n, Expr output) { + isRelevantScanfCall(call, index, output) and + output = call.getOutputArgument(index) and + n.asDefiningArgument() = output +} + +/** + * Holds if `n` is reachable from an output argument of a relevant call to + * a `scanf`-like function. + */ +pragma[nomagic] +predicate fwdFlow(Node n) { + isSource(_, _, n, _) + or + exists(Node prev | + fwdFlow(prev) and + localFlowStep(prev, n) and + not isSanitizerOut(prev) + ) +} + +/** Holds if `n` should not have outgoing flow. */ +predicate isSanitizerOut(Node n) { + // We disable flow out of sinks to reduce result duplication + isSink(n, _) + or + // If the node is being passed to a function it may be + // modified, and thus it's safe to later read the value. + exists(n.asIndirectArgument()) +} + +/** + * Holds if `n` is a node such that `n.asExpr() = e` and `e` is not an + * argument of a deallocation expression. + */ +predicate isSink(Node n, Expr e) { + n.asExpr() = e and + not any(DeallocationExpr dealloc).getFreedExpr() = e +} + +/** + * Holds if `n` is part of a path from a call to a `scanf`-like function * to a use of the written variable. */ pragma[nomagic] -predicate revFlow0(Instruction instr) { - fwdFlow0(instr) and +predicate revFlow(Node n) { + fwdFlow(n) and ( - isSink(instr, _, _) + isSink(n, _) or - exists(Instruction succ | revFlow0(succ) | instr.getASuccessor() = succ) - ) -} - -/** - * Holds if `instr` is part of a path from a call to a `scanf`-like function - * that writes to a variable with value number `vn`, without passing through - * redefinitions of the variable. - */ -pragma[nomagic] -private predicate fwdFlow(Instruction instr, ValueNumber vn) { - revFlow0(instr) and - ( - isSource(_, _, instr, vn, _) - or - exists(Instruction prev | - fwdFlow(prev, vn) and - prev.getASuccessor() = instr and - not isBarrier(instr, vn) + exists(Node succ | + revFlow(succ) and + localFlowStep(n, succ) and + not isSanitizerOut(n) ) ) } -/** - * Holds if `instr` is part of a path from a call to a `scanf`-like function - * that writes to a variable with value number `vn`, without passing through - * redefinitions of the variable. - * - * Note: This predicate only holds for the `(intr, vn)` pairs that are also - * control-flow reachable from an argument to a `scanf`-like function call. - */ -pragma[nomagic] -predicate revFlow(Instruction instr, ValueNumber vn) { - fwdFlow(instr, pragma[only_bind_out](vn)) and - ( - isSink(instr, _, vn) - or - exists(Instruction succ | revFlow(succ, vn) | - instr.getASuccessor() = succ and - not isBarrier(succ, vn) - ) - ) +/** A local flow step, restricted to relevant dataflow nodes. */ +private predicate step(Node n1, Node n2) { + revFlow(n1) and + revFlow(n2) and + localFlowStep(n1, n2) } -/** - * A type that bundles together a reachable instruction with the appropriate - * value number (i.e., the value number that's transferred from the source - * to the sink). - */ -newtype TNode = MkNode(Instruction instr, ValueNumber vn) { revFlow(instr, vn) } - -class Node extends MkNode { - ValueNumber vn; - Instruction instr; - - Node() { this = MkNode(instr, vn) } - - final string toString() { result = instr.toString() } - - final Node getASuccessor() { result = MkNode(pragma[only_bind_out](instr.getASuccessor()), vn) } - - final Location getLocation() { result = instr.getLocation() } -} - -/** - * Holds if `instr` is an instruction with value number `vn` that is - * used in a store operation, or is overwritten by another call to - * a `scanf`-like function. - */ -private predicate isBarrier(Instruction instr, ValueNumber vn) { - // We only need to compute barriers for instructions that we - // managed to hit during the initial flow stage. - revFlow0(pragma[only_bind_into](instr)) and - valueNumber(instr) = vn and - exists(Expr e | instr.getAst() = e | - instr = any(StoreInstruction s).getDestinationAddress() - or - isSource(_, _, _, _, [e, e.getParent().(AddressOfExpr)]) - ) -} - -/** Holds if `n1` steps to `n2` in a single step. */ -predicate isSuccessor(Node n1, Node n2) { n1.getASuccessor() = n2 } - -predicate hasFlow(Node n1, Node n2) = fastTC(isSuccessor/2)(n1, n2) - -Node getNode(Instruction instr, ValueNumber vn) { result = MkNode(instr, vn) } +predicate hasFlow(Node n1, Node n2) = fastTC(step/2)(n1, n2) /** * Holds if `source` is the `index`'th argument to the `scanf`-like call `call`, and `sink` is - * an instruction that is part of the translation of `access` which is a transitive - * control-flow successor of `call`. - * - * Furthermore, `source` and `sink` have identical global value numbers. + * a dataflow node that represents the expression `e`. */ -predicate hasFlow( - Instruction source, ScanfFunctionCall call, int index, Instruction sink, Access access -) { - exists(ValueNumber vn | - isSource(call, index, source, vn, _) and - hasFlow(getNode(source, pragma[only_bind_into](vn)), getNode(sink, pragma[only_bind_into](vn))) and - isSink(sink, access, vn) - ) +predicate hasFlow(Node source, ScanfFunctionCall call, int index, Node sink, Expr e) { + isSource(call, index, source, _) and + hasFlow(source, sink) and + isSink(sink, e) } /** @@ -177,7 +150,7 @@ predicate hasFlow( * success in writing the output argument at index `index`. */ int getMinimumGuardConstant(ScanfFunctionCall call, int index) { - isSource(call, index, _, _, _) and + isSource(call, index, _, _) and result = index + 1 - count(ScanfFormatLiteral f, int n | @@ -191,7 +164,7 @@ int getMinimumGuardConstant(ScanfFunctionCall call, int index) { * Holds the access to `e` isn't guarded by a check that ensures that `call` returned * at least `minGuard`. */ -predicate hasNonGuardedAccess(ScanfFunctionCall call, Access e, int minGuard) { +predicate hasNonGuardedAccess(ScanfFunctionCall call, Expr e, int minGuard) { exists(int index | hasFlow(_, call, index, _, e) and minGuard = getMinimumGuardConstant(call, index) @@ -211,7 +184,7 @@ BasicBlock blockGuardedBy(int value, string op, ScanfFunctionCall call) { exists(GuardCondition g, Expr left, Expr right | right = g.getAChild() and value = left.getValue().toInt() and - DataFlow::localExprFlow(call, right) + localExprFlow(call, right) | g.ensuresEq(left, right, 0, result, true) and op = "==" or @@ -221,9 +194,9 @@ BasicBlock blockGuardedBy(int value, string op, ScanfFunctionCall call) { ) } -from ScanfFunctionCall call, Access access, int minGuard -where hasNonGuardedAccess(call, access, minGuard) -select access, +from ScanfFunctionCall call, Expr e, int minGuard +where hasNonGuardedAccess(call, e, minGuard) +select e, "This variable is read, but may not have been written. " + "It should be guarded by a check that the $@ returns at least " + minGuard + ".", call, call.toString() diff --git a/cpp/ql/src/Critical/UseAfterFree.ql b/cpp/ql/src/Critical/UseAfterFree.ql index 3c67c99ef3c..17e83780b71 100644 --- a/cpp/ql/src/Critical/UseAfterFree.ql +++ b/cpp/ql/src/Critical/UseAfterFree.ql @@ -1,7 +1,8 @@ /** * @name Potential use after free * @description An allocated memory block is used after it has been freed. Behavior in such cases is undefined and can cause memory corruption. - * @kind problem + * @kind path-problem + * @precision medium * @id cpp/use-after-free * @problem.severity warning * @security-severity 9.3 @@ -11,56 +12,159 @@ */ import cpp -import semmle.code.cpp.controlflow.StackVariableReachability +import semmle.code.cpp.dataflow.new.DataFlow +import semmle.code.cpp.ir.IR +import FlowAfterFree +import UseAfterFree::PathGraph -/** `e` is an expression that frees the memory pointed to by `v`. */ -predicate isFreeExpr(Expr e, StackVariable v) { - exists(VariableAccess va | va.getTarget() = v | - exists(FunctionCall fc | fc = e | - fc.getTarget().hasGlobalOrStdName("free") and - va = fc.getArgument(0) - ) - or - e.(DeleteExpr).getExpr() = va - or - e.(DeleteArrayExpr).getExpr() = va +/** + * Holds if `call` is a call to a function that obviously + * doesn't dereference its `i`'th argument. + */ +private predicate externalCallNeverDereferences(FormattingFunctionCall call, int arg) { + exists(int formatArg | + pragma[only_bind_out](call.getFormatArgument(formatArg)) = + pragma[only_bind_out](call.getArgument(arg)) and + call.getFormat().(FormatLiteral).getConvSpec(formatArg) != "%s" ) } -/** `e` is an expression that (may) dereference `v`. */ -predicate isDerefExpr(Expr e, StackVariable v) { - v.getAnAccess() = e and dereferenced(e) - or - isDerefByCallExpr(_, _, e, v) +predicate isUse0(DataFlow::Node n, Expr e) { + e = n.asExpr() and + not isFree(_, e, _) and + ( + e = any(PointerDereferenceExpr pde).getOperand() + or + e = any(PointerFieldAccess pfa).getQualifier() + or + e = any(ArrayExpr ae).getArrayBase() + or + e = any(Call call).getQualifier() + or + // Assume any function without a body will dereference the pointer + exists(int i, Call call, Function f | + n.asExpr() = call.getArgument(i) and + f = call.getTarget() and + not f.hasEntryPoint() and + // Exclude known functions we know won't dereference the pointer. + // For example, a call such as `printf("%p", myPointer)`. + not externalCallNeverDereferences(call, i) + ) + ) } -/** - * `va` is passed by value as (part of) the `i`th argument in - * call `c`. The target function is either a library function - * or a source code function that dereferences the relevant - * parameter. - */ -predicate isDerefByCallExpr(Call c, int i, VariableAccess va, StackVariable v) { - v.getAnAccess() = va and - va = c.getAnArgumentSubExpr(i) and - not c.passesByReference(i, va) and - (c.getTarget().hasEntryPoint() implies isDerefExpr(_, c.getTarget().getParameter(i))) -} +module ParameterSinks { + import semmle.code.cpp.ir.ValueNumbering -class UseAfterFreeReachability extends StackVariableReachability { - UseAfterFreeReachability() { this = "UseAfterFree" } + predicate flowsToUse(DataFlow::Node n) { + isUse0(n, _) + or + exists(DataFlow::Node succ | + flowsToUse(succ) and + DataFlow::localFlowStep(n, succ) + ) + } - override predicate isSource(ControlFlowNode node, StackVariable v) { isFreeExpr(node, v) } + private predicate flowsFromParam(DataFlow::Node n) { + flowsToUse(n) and + ( + n.asParameter().getUnspecifiedType() instanceof PointerType + or + exists(DataFlow::Node prev | + flowsFromParam(prev) and + DataFlow::localFlowStep(prev, n) + ) + ) + } - override predicate isSink(ControlFlowNode node, StackVariable v) { isDerefExpr(node, v) } + private predicate step(DataFlow::Node n1, DataFlow::Node n2) { + flowsFromParam(n1) and + flowsFromParam(n2) and + DataFlow::localFlowStep(n1, n2) + } - override predicate isBarrier(ControlFlowNode node, StackVariable v) { - definitionBarrier(v, node) or - isFreeExpr(node, v) + private predicate paramToUse(DataFlow::Node n1, DataFlow::Node n2) = fastTC(step/2)(n1, n2) + + private predicate hasFlow( + DataFlow::Node source, InitializeParameterInstruction init, DataFlow::Node sink + ) { + pragma[only_bind_out](source.asParameter()) = pragma[only_bind_out](init.getParameter()) and + paramToUse(source, sink) and + isUse0(sink, _) + } + + private InitializeParameterInstruction getAnAlwaysDereferencedParameter0() { + exists(DataFlow::Node source, DataFlow::Node sink, IRBlock b1, int i1, IRBlock b2, int i2 | + hasFlow(pragma[only_bind_into](source), result, pragma[only_bind_into](sink)) and + source.hasIndexInBlock(b1, pragma[only_bind_into](i1)) and + sink.hasIndexInBlock(b2, pragma[only_bind_into](i2)) and + strictlyPostDominates(b2, i2, b1, i1) + ) + } + + private CallInstruction getAnAlwaysReachedCallInstruction(IRFunction f) { + result.getBlock().postDominates(f.getEntryBlock()) + } + + pragma[nomagic] + predicate callHasTargetAndArgument(Function f, int i, CallInstruction call, Instruction argument) { + call.getStaticCallTarget() = f and + call.getArgument(i) = argument + } + + pragma[nomagic] + predicate initializeParameterInFunction(Function f, int i, InitializeParameterInstruction init) { + pragma[only_bind_out](init.getEnclosingFunction()) = f and + init.hasIndex(i) + } + + InitializeParameterInstruction getAnAlwaysDereferencedParameter() { + result = getAnAlwaysDereferencedParameter0() + or + exists( + CallInstruction call, int i, InitializeParameterInstruction p, Instruction argument, + Function f + | + callHasTargetAndArgument(f, i, call, argument) and + initializeParameterInFunction(f, i, p) and + p = getAnAlwaysDereferencedParameter() and + result = + pragma[only_bind_out](pragma[only_bind_into](valueNumber(argument)).getAnInstruction()) and + call = getAnAlwaysReachedCallInstruction(_) + ) } } -from UseAfterFreeReachability r, StackVariable v, Expr free, Expr e -where r.reaches(free, v, e) -select e, "Memory pointed to by '" + v.getName().toString() + "' may have $@.", free, - "been previously freed" +predicate isUse(DataFlow::Node n, Expr e) { + isUse0(n, e) + or + exists(CallInstruction call, int i, InitializeParameterInstruction init | + n.asOperand().getDef().getUnconvertedResultExpression() = e and + init = ParameterSinks::getAnAlwaysDereferencedParameter() and + call.getArgumentOperand(i) = n.asOperand() and + init.hasIndex(i) and + init.getEnclosingFunction() = call.getStaticCallTarget() + ) +} + +/** + * `dealloc1` is a deallocation expression, `e` is an expression that dereferences a + * pointer, and the `(dealloc1, e)` pair should be excluded by the `FlowFromFree` library. + */ +bindingset[dealloc1, e] +predicate isExcludeFreeUsePair(DeallocationExpr dealloc1, Expr e) { + // From https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-mmfreepagesfrommdl: + // "After calling MmFreePagesFromMdl, the caller must also call ExFreePool + // to release the memory that was allocated for the MDL structure." + dealloc1.(FunctionCall).getTarget().hasGlobalName("MmFreePagesFromMdl") and + isExFreePoolCall(_, e) +} + +module UseAfterFree = FlowFromFree; + +from UseAfterFree::PathNode source, UseAfterFree::PathNode sink, DeallocationExpr dealloc +where + UseAfterFree::flowPath(source, sink) and + isFree(source.getNode(), _, dealloc) +select sink.getNode(), source, sink, "Memory may have been previously freed by $@.", dealloc, + dealloc.toString() diff --git a/cpp/ql/src/change-notes/released/0.6.1.md b/cpp/ql/src/change-notes/released/0.6.1.md new file mode 100644 index 00000000000..23973b106a7 --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.6.1.md @@ -0,0 +1,6 @@ +## 0.6.1 + +### New Queries + +* A new query `cpp/double-free` has been added. The query finds possible cases of deallocating the same pointer twice. The precision of the query has been set to "medium". +* The query `cpp/use-after-free` has been modernized and assigned the precision "medium". The query finds cases of where a pointer is dereferenced after its memory has been deallocated. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index a3f820f884d..80fb0899f64 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.0 +lastReleaseVersion: 0.6.1 diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-415/DoubleFree.ql b/cpp/ql/src/experimental/Security/CWE/CWE-415/DoubleFree.ql index 9b9684f12e2..09e44c13fc7 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-415/DoubleFree.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-415/DoubleFree.ql @@ -2,7 +2,7 @@ * @name Errors When Double Free * @description Freeing a previously allocated resource twice can lead to various vulnerabilities in the program. * @kind problem - * @id cpp/double-free + * @id cpp/experimental-double-free * @problem.severity warning * @precision medium * @tags security diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index b002a6797e1..afcfda4c1d3 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 0.6.0 +version: 0.6.1 groups: - cpp - queries diff --git a/cpp/ql/src/queries.xml b/cpp/ql/src/queries.xml deleted file mode 100644 index 99f4a7278c2..00000000000 --- a/cpp/ql/src/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/pointer-deref/InvalidPointerDeref.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/pointer-deref/InvalidPointerDeref.expected index 1b6be088de2..338def9dfe0 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/pointer-deref/InvalidPointerDeref.expected +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/pointer-deref/InvalidPointerDeref.expected @@ -575,6 +575,129 @@ edges | test.cpp:213:6:213:6 | q | test.cpp:213:5:213:13 | Store: ... = ... | | test.cpp:213:6:213:6 | q | test.cpp:213:5:213:13 | Store: ... = ... | | test.cpp:221:17:221:22 | call to malloc | test.cpp:222:5:222:5 | p | +| test.cpp:231:18:231:30 | new[] | test.cpp:232:3:232:9 | newname | +| test.cpp:232:3:232:9 | newname | test.cpp:232:3:232:16 | access to array | +| test.cpp:232:3:232:16 | access to array | test.cpp:232:3:232:20 | Store: ... = ... | +| test.cpp:238:20:238:32 | new[] | test.cpp:239:5:239:11 | newname | +| test.cpp:239:5:239:11 | newname | test.cpp:239:5:239:18 | access to array | +| test.cpp:239:5:239:18 | access to array | test.cpp:239:5:239:22 | Store: ... = ... | +| test.cpp:248:24:248:30 | call to realloc | test.cpp:249:9:249:9 | p | +| test.cpp:248:24:248:30 | call to realloc | test.cpp:250:22:250:22 | p | +| test.cpp:248:24:248:30 | call to realloc | test.cpp:254:9:254:9 | p | +| test.cpp:254:9:254:9 | p | test.cpp:254:9:254:12 | access to array | +| test.cpp:254:9:254:12 | access to array | test.cpp:254:9:254:16 | Store: ... = ... | +| test.cpp:260:13:260:24 | new[] | test.cpp:261:14:261:15 | xs | +| test.cpp:261:14:261:15 | xs | test.cpp:261:14:261:21 | ... + ... | +| test.cpp:261:14:261:15 | xs | test.cpp:261:14:261:21 | ... + ... | +| test.cpp:261:14:261:15 | xs | test.cpp:261:14:261:21 | ... + ... | +| test.cpp:261:14:261:15 | xs | test.cpp:261:14:261:21 | ... + ... | +| test.cpp:261:14:261:15 | xs | test.cpp:262:26:262:28 | end | +| test.cpp:261:14:261:15 | xs | test.cpp:262:26:262:28 | end | +| test.cpp:261:14:261:15 | xs | test.cpp:262:31:262:31 | x | +| test.cpp:261:14:261:15 | xs | test.cpp:262:31:262:33 | ... ++ | +| test.cpp:261:14:261:15 | xs | test.cpp:262:31:262:33 | ... ++ | +| test.cpp:261:14:261:15 | xs | test.cpp:264:14:264:14 | x | +| test.cpp:261:14:261:15 | xs | test.cpp:264:14:264:14 | x | +| test.cpp:261:14:261:21 | ... + ... | test.cpp:261:14:261:21 | ... + ... | +| test.cpp:261:14:261:21 | ... + ... | test.cpp:261:14:261:21 | ... + ... | +| test.cpp:261:14:261:21 | ... + ... | test.cpp:262:26:262:28 | end | +| test.cpp:261:14:261:21 | ... + ... | test.cpp:262:26:262:28 | end | +| test.cpp:261:14:261:21 | ... + ... | test.cpp:262:26:262:28 | end | +| test.cpp:261:14:261:21 | ... + ... | test.cpp:262:26:262:28 | end | +| test.cpp:261:14:261:21 | ... + ... | test.cpp:264:13:264:14 | Load: * ... | +| test.cpp:261:14:261:21 | ... + ... | test.cpp:264:13:264:14 | Load: * ... | +| test.cpp:261:14:261:21 | ... + ... | test.cpp:264:13:264:14 | Load: * ... | +| test.cpp:261:14:261:21 | ... + ... | test.cpp:264:13:264:14 | Load: * ... | +| test.cpp:262:21:262:21 | x | test.cpp:264:13:264:14 | Load: * ... | +| test.cpp:262:26:262:28 | end | test.cpp:262:26:262:28 | end | +| test.cpp:262:26:262:28 | end | test.cpp:262:26:262:28 | end | +| test.cpp:262:26:262:28 | end | test.cpp:264:13:264:14 | Load: * ... | +| test.cpp:262:26:262:28 | end | test.cpp:264:13:264:14 | Load: * ... | +| test.cpp:262:31:262:31 | x | test.cpp:264:13:264:14 | Load: * ... | +| test.cpp:262:31:262:33 | ... ++ | test.cpp:262:21:262:21 | x | +| test.cpp:262:31:262:33 | ... ++ | test.cpp:262:21:262:21 | x | +| test.cpp:262:31:262:33 | ... ++ | test.cpp:262:31:262:31 | x | +| test.cpp:262:31:262:33 | ... ++ | test.cpp:262:31:262:31 | x | +| test.cpp:262:31:262:33 | ... ++ | test.cpp:264:14:264:14 | x | +| test.cpp:262:31:262:33 | ... ++ | test.cpp:264:14:264:14 | x | +| test.cpp:262:31:262:33 | ... ++ | test.cpp:264:14:264:14 | x | +| test.cpp:262:31:262:33 | ... ++ | test.cpp:264:14:264:14 | x | +| test.cpp:264:14:264:14 | x | test.cpp:262:31:262:31 | x | +| test.cpp:264:14:264:14 | x | test.cpp:264:13:264:14 | Load: * ... | +| test.cpp:264:14:264:14 | x | test.cpp:264:13:264:14 | Load: * ... | +| test.cpp:270:13:270:24 | new[] | test.cpp:271:14:271:15 | xs | +| test.cpp:270:13:270:24 | new[] | test.cpp:272:31:272:31 | x | +| test.cpp:271:14:271:15 | xs | test.cpp:271:14:271:21 | ... + ... | +| test.cpp:271:14:271:15 | xs | test.cpp:271:14:271:21 | ... + ... | +| test.cpp:271:14:271:15 | xs | test.cpp:271:14:271:21 | ... + ... | +| test.cpp:271:14:271:15 | xs | test.cpp:271:14:271:21 | ... + ... | +| test.cpp:271:14:271:15 | xs | test.cpp:272:26:272:28 | end | +| test.cpp:271:14:271:15 | xs | test.cpp:272:26:272:28 | end | +| test.cpp:271:14:271:15 | xs | test.cpp:272:31:272:31 | x | +| test.cpp:271:14:271:15 | xs | test.cpp:272:31:272:33 | ... ++ | +| test.cpp:271:14:271:15 | xs | test.cpp:272:31:272:33 | ... ++ | +| test.cpp:271:14:271:15 | xs | test.cpp:274:5:274:6 | * ... | +| test.cpp:271:14:271:15 | xs | test.cpp:274:6:274:6 | x | +| test.cpp:271:14:271:15 | xs | test.cpp:274:6:274:6 | x | +| test.cpp:271:14:271:21 | ... + ... | test.cpp:271:14:271:21 | ... + ... | +| test.cpp:271:14:271:21 | ... + ... | test.cpp:271:14:271:21 | ... + ... | +| test.cpp:271:14:271:21 | ... + ... | test.cpp:272:26:272:28 | end | +| test.cpp:271:14:271:21 | ... + ... | test.cpp:272:26:272:28 | end | +| test.cpp:271:14:271:21 | ... + ... | test.cpp:272:26:272:28 | end | +| test.cpp:271:14:271:21 | ... + ... | test.cpp:272:26:272:28 | end | +| test.cpp:271:14:271:21 | ... + ... | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:271:14:271:21 | ... + ... | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:271:14:271:21 | ... + ... | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:271:14:271:21 | ... + ... | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:272:21:272:21 | x | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:272:26:272:28 | end | test.cpp:272:26:272:28 | end | +| test.cpp:272:26:272:28 | end | test.cpp:272:26:272:28 | end | +| test.cpp:272:26:272:28 | end | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:272:26:272:28 | end | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:272:31:272:31 | x | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:272:31:272:33 | ... ++ | test.cpp:272:21:272:21 | x | +| test.cpp:272:31:272:33 | ... ++ | test.cpp:272:21:272:21 | x | +| test.cpp:272:31:272:33 | ... ++ | test.cpp:272:31:272:31 | x | +| test.cpp:272:31:272:33 | ... ++ | test.cpp:272:31:272:31 | x | +| test.cpp:272:31:272:33 | ... ++ | test.cpp:274:5:274:6 | * ... | +| test.cpp:272:31:272:33 | ... ++ | test.cpp:274:5:274:6 | * ... | +| test.cpp:272:31:272:33 | ... ++ | test.cpp:274:6:274:6 | x | +| test.cpp:272:31:272:33 | ... ++ | test.cpp:274:6:274:6 | x | +| test.cpp:272:31:272:33 | ... ++ | test.cpp:274:6:274:6 | x | +| test.cpp:272:31:272:33 | ... ++ | test.cpp:274:6:274:6 | x | +| test.cpp:274:5:274:6 | * ... | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:274:6:274:6 | x | test.cpp:272:31:272:31 | x | +| test.cpp:274:6:274:6 | x | test.cpp:274:5:274:6 | * ... | +| test.cpp:274:6:274:6 | x | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:274:6:274:6 | x | test.cpp:274:5:274:10 | Store: ... = ... | +| test.cpp:280:13:280:24 | new[] | test.cpp:281:14:281:15 | xs | +| test.cpp:281:14:281:15 | xs | test.cpp:282:30:282:32 | ... ++ | +| test.cpp:281:14:281:15 | xs | test.cpp:282:30:282:32 | ... ++ | +| test.cpp:282:21:282:21 | x | test.cpp:284:13:284:14 | Load: * ... | +| test.cpp:282:30:282:30 | x | test.cpp:284:13:284:14 | Load: * ... | +| test.cpp:282:30:282:32 | ... ++ | test.cpp:282:21:282:21 | x | +| test.cpp:282:30:282:32 | ... ++ | test.cpp:282:21:282:21 | x | +| test.cpp:282:30:282:32 | ... ++ | test.cpp:282:30:282:30 | x | +| test.cpp:282:30:282:32 | ... ++ | test.cpp:282:30:282:30 | x | +| test.cpp:282:30:282:32 | ... ++ | test.cpp:284:14:284:14 | x | +| test.cpp:282:30:282:32 | ... ++ | test.cpp:284:14:284:14 | x | +| test.cpp:284:14:284:14 | x | test.cpp:284:13:284:14 | Load: * ... | +| test.cpp:290:13:290:24 | new[] | test.cpp:291:14:291:15 | xs | +| test.cpp:290:13:290:24 | new[] | test.cpp:292:30:292:30 | x | +| test.cpp:291:14:291:15 | xs | test.cpp:292:30:292:32 | ... ++ | +| test.cpp:291:14:291:15 | xs | test.cpp:292:30:292:32 | ... ++ | +| test.cpp:292:21:292:21 | x | test.cpp:294:5:294:10 | Store: ... = ... | +| test.cpp:292:30:292:30 | x | test.cpp:294:5:294:10 | Store: ... = ... | +| test.cpp:292:30:292:32 | ... ++ | test.cpp:292:21:292:21 | x | +| test.cpp:292:30:292:32 | ... ++ | test.cpp:292:21:292:21 | x | +| test.cpp:292:30:292:32 | ... ++ | test.cpp:292:30:292:30 | x | +| test.cpp:292:30:292:32 | ... ++ | test.cpp:292:30:292:30 | x | +| test.cpp:292:30:292:32 | ... ++ | test.cpp:294:5:294:6 | * ... | +| test.cpp:292:30:292:32 | ... ++ | test.cpp:294:5:294:6 | * ... | +| test.cpp:292:30:292:32 | ... ++ | test.cpp:294:6:294:6 | x | +| test.cpp:292:30:292:32 | ... ++ | test.cpp:294:6:294:6 | x | +| test.cpp:294:5:294:6 | * ... | test.cpp:294:5:294:10 | Store: ... = ... | +| test.cpp:294:6:294:6 | x | test.cpp:294:5:294:10 | Store: ... = ... | #select | test.cpp:6:14:6:15 | Load: * ... | test.cpp:4:15:4:20 | call to malloc | test.cpp:6:14:6:15 | Load: * ... | This read might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:4:15:4:20 | call to malloc | call to malloc | test.cpp:5:19:5:22 | size | size | | test.cpp:8:14:8:21 | Load: * ... | test.cpp:4:15:4:20 | call to malloc | test.cpp:8:14:8:21 | Load: * ... | This read might be out of bounds, as the pointer might be equal to $@ + $@ + 1. | test.cpp:4:15:4:20 | call to malloc | call to malloc | test.cpp:5:19:5:22 | size | size | @@ -593,3 +716,12 @@ edges | test.cpp:171:9:171:14 | Store: ... = ... | test.cpp:143:18:143:23 | call to malloc | test.cpp:171:9:171:14 | Store: ... = ... | This write might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:143:18:143:23 | call to malloc | call to malloc | test.cpp:144:29:144:32 | size | size | | test.cpp:201:5:201:19 | Store: ... = ... | test.cpp:194:23:194:28 | call to malloc | test.cpp:201:5:201:19 | Store: ... = ... | This write might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:194:23:194:28 | call to malloc | call to malloc | test.cpp:195:21:195:23 | len | len | | test.cpp:213:5:213:13 | Store: ... = ... | test.cpp:205:23:205:28 | call to malloc | test.cpp:213:5:213:13 | Store: ... = ... | This write might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:205:23:205:28 | call to malloc | call to malloc | test.cpp:206:21:206:23 | len | len | +| test.cpp:232:3:232:20 | Store: ... = ... | test.cpp:231:18:231:30 | new[] | test.cpp:232:3:232:20 | Store: ... = ... | This write might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:231:18:231:30 | new[] | new[] | test.cpp:232:11:232:15 | index | index | +| test.cpp:239:5:239:22 | Store: ... = ... | test.cpp:238:20:238:32 | new[] | test.cpp:239:5:239:22 | Store: ... = ... | This write might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:238:20:238:32 | new[] | new[] | test.cpp:239:13:239:17 | index | index | +| test.cpp:254:9:254:16 | Store: ... = ... | test.cpp:248:24:248:30 | call to realloc | test.cpp:254:9:254:16 | Store: ... = ... | This write might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:248:24:248:30 | call to realloc | call to realloc | test.cpp:254:11:254:11 | i | i | +| test.cpp:264:13:264:14 | Load: * ... | test.cpp:260:13:260:24 | new[] | test.cpp:264:13:264:14 | Load: * ... | This read might be out of bounds, as the pointer might be equal to $@ + $@ + 1. | test.cpp:260:13:260:24 | new[] | new[] | test.cpp:261:19:261:21 | len | len | +| test.cpp:264:13:264:14 | Load: * ... | test.cpp:260:13:260:24 | new[] | test.cpp:264:13:264:14 | Load: * ... | This read might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:260:13:260:24 | new[] | new[] | test.cpp:261:19:261:21 | len | len | +| test.cpp:274:5:274:10 | Store: ... = ... | test.cpp:270:13:270:24 | new[] | test.cpp:274:5:274:10 | Store: ... = ... | This write might be out of bounds, as the pointer might be equal to $@ + $@ + 1. | test.cpp:270:13:270:24 | new[] | new[] | test.cpp:271:19:271:21 | len | len | +| test.cpp:274:5:274:10 | Store: ... = ... | test.cpp:270:13:270:24 | new[] | test.cpp:274:5:274:10 | Store: ... = ... | This write might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:270:13:270:24 | new[] | new[] | test.cpp:271:19:271:21 | len | len | +| test.cpp:284:13:284:14 | Load: * ... | test.cpp:280:13:280:24 | new[] | test.cpp:284:13:284:14 | Load: * ... | This read might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:280:13:280:24 | new[] | new[] | test.cpp:281:19:281:21 | len | len | +| test.cpp:294:5:294:10 | Store: ... = ... | test.cpp:290:13:290:24 | new[] | test.cpp:294:5:294:10 | Store: ... = ... | This write might be out of bounds, as the pointer might be equal to $@ + $@. | test.cpp:290:13:290:24 | new[] | new[] | test.cpp:291:19:291:21 | len | len | diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/pointer-deref/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/pointer-deref/test.cpp index 2d0ea0e7fa6..3cd2cd9ad3d 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/pointer-deref/test.cpp +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/pointer-deref/test.cpp @@ -222,3 +222,75 @@ void test14(unsigned long n, char *p) { p[n - 1] = 'a'; // GOOD } } + +void test15(unsigned index) { + unsigned size = index + 13; + if(size < index) { + return; + } + int* newname = new int[size]; + newname[index] = 0; // GOOD [FALSE POSITIVE] +} + +void test16(unsigned index) { + unsigned size = index + 13; + if(size >= index) { + int* newname = new int[size]; + newname[index] = 0; // GOOD [FALSE POSITIVE] + } +} + +void *realloc(void *, unsigned); + +void test17(unsigned *p, unsigned x, unsigned k) { + if(k > 0 && p[1] <= p[0]){ + unsigned n = 3*p[0] + k; + p = (unsigned*)realloc(p, n); + p[0] = n; + unsigned i = p[1]; + // The following access is okay because: + // n = 3*p[0] + k >= p[0] + k >= p[1] + k > p[1] = i + // (where p[0] denotes the original value for p[0]) + p[i] = x; // GOOD [FALSE POSITIVE] + } +} + +void test17(unsigned len) +{ + int *xs = new int[len]; + int *end = xs + len; + for (int *x = xs; x <= end; x++) + { + int i = *x; // BAD + } +} + +void test18(unsigned len) +{ + int *xs = new int[len]; + int *end = xs + len; + for (int *x = xs; x <= end; x++) + { + *x = 0; // BAD + } +} + +void test19(unsigned len) +{ + int *xs = new int[len]; + int *end = xs + len; + for (int *x = xs; x < end; x++) + { + int i = *x; // GOOD [FALSE POSITIVE] + } +} + +void test20(unsigned len) +{ + int *xs = new int[len]; + int *end = xs + len; + for (int *x = xs; x < end; x++) + { + *x = 0; // GOOD [FALSE POSITIVE] + } +} \ No newline at end of file diff --git a/cpp/ql/test/library-tests/attributes/type_attributes/type_attributes.expected b/cpp/ql/test/library-tests/attributes/type_attributes/type_attributes.expected index 7002f036019..19a65b83ba4 100644 --- a/cpp/ql/test/library-tests/attributes/type_attributes/type_attributes.expected +++ b/cpp/ql/test/library-tests/attributes/type_attributes/type_attributes.expected @@ -1,7 +1,7 @@ | file://:0:0:0:0 | short __attribute((__may_alias__)) | type_attributes.c:25:30:25:42 | may_alias | | type_attributes.c:5:36:5:51 | my_packed_struct | type_attributes.c:5:23:5:32 | packed | -| type_attributes.c:10:54:10:54 | union | type_attributes.c:10:30:10:50 | transparent_union | -| type_attributes.c:16:54:16:54 | union | type_attributes.c:16:30:16:50 | transparent_union | +| type_attributes.c:10:54:10:54 | (unnamed class/struct/union) | type_attributes.c:10:30:10:50 | transparent_union | +| type_attributes.c:16:54:16:54 | (unnamed class/struct/union) | type_attributes.c:16:30:16:50 | transparent_union | | type_attributes.c:21:37:21:45 | unusedInt | type_attributes.c:21:24:21:29 | unused | | type_attributes.c:23:13:23:18 | depInt | type_attributes.c:23:36:23:45 | deprecated | | type_attributes_ms.cpp:1:29:1:29 | X | type_attributes_ms.cpp:1:19:1:26 | novtable | diff --git a/cpp/ql/test/library-tests/constants/constants/aggregates.expected b/cpp/ql/test/library-tests/constants/constants/aggregates.expected index 9c1e212c637..176230b73d7 100644 --- a/cpp/ql/test/library-tests/constants/constants/aggregates.expected +++ b/cpp/ql/test/library-tests/constants/constants/aggregates.expected @@ -1,4 +1,4 @@ +| (unnamed class/struct/union) | | float[3] | | float[3][3] | | foo[1] | -| struct | diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 98f4aba0494..3cd0c9b4dc3 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -14377,6 +14377,37 @@ ir.cpp: # 1885| Type = [ClassTemplateInstantiation,Struct] Bar2 # 1885| ValueCategory = lvalue # 1886| getStmt(2): [ReturnStmt] return ... +# 1891| [TopLevelFunction] int test_global_template_int() +# 1891| : +# 1891| getEntryPoint(): [BlockStmt] { ... } +# 1892| getStmt(0): [DeclStmt] declaration +# 1892| getDeclarationEntry(0): [VariableDeclarationEntry] definition of local_int +# 1892| Type = [IntType] int +# 1892| getVariable().getInitializer(): [Initializer] initializer for local_int +# 1892| getExpr(): [VariableAccess] global_template +# 1892| Type = [IntType] int +# 1892| ValueCategory = prvalue(load) +# 1893| getStmt(1): [DeclStmt] declaration +# 1893| getDeclarationEntry(0): [VariableDeclarationEntry] definition of local_char +# 1893| Type = [PlainCharType] char +# 1893| getVariable().getInitializer(): [Initializer] initializer for local_char +# 1893| getExpr(): [VariableAccess] global_template +# 1893| Type = [PlainCharType] char +# 1893| ValueCategory = prvalue(load) +# 1894| getStmt(2): [ReturnStmt] return ... +# 1894| getExpr(): [AddExpr] ... + ... +# 1894| Type = [IntType] int +# 1894| ValueCategory = prvalue +# 1894| getLeftOperand(): [VariableAccess] local_int +# 1894| Type = [IntType] int +# 1894| ValueCategory = prvalue(load) +# 1894| getRightOperand(): [VariableAccess] local_char +# 1894| Type = [PlainCharType] char +# 1894| ValueCategory = prvalue(load) +# 1894| getRightOperand().getFullyConverted(): [CStyleCast] (int)... +# 1894| Conversion = [IntegralConversion] integral conversion +# 1894| Type = [IntType] int +# 1894| ValueCategory = prvalue perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/PrintConfig.qll b/cpp/ql/test/library-tests/ir/ir/PrintConfig.qll index bd77d831cb7..6d3db164900 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintConfig.qll +++ b/cpp/ql/test/library-tests/ir/ir/PrintConfig.qll @@ -18,5 +18,7 @@ predicate shouldDumpFunction(Declaration decl) { decl instanceof Function or decl.(GlobalOrNamespaceVariable).hasInitializer() + or + decl.(StaticLocalVariable).hasInitializer() ) } diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 5a8d500fa43..8d478d0f035 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1886,4 +1886,12 @@ namespace missing_declaration_entries { } } +template T global_template = 42; + +int test_global_template_int() { + int local_int = global_template; + char local_char = global_template; + return local_int + (int)local_char; +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index a221025eb88..d6091c27466 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -5754,6 +5754,16 @@ | ir.cpp:1231:5:1231:19 | Load | m1237_15 | | ir.cpp:1231:5:1231:19 | SideEffect | ~m1237_2 | | ir.cpp:1231:25:1231:25 | Address | &:r1231_5 | +| ir.cpp:1232:16:1232:16 | Address | &:r1232_3 | +| ir.cpp:1232:16:1232:16 | SideEffect | ~m1232_6 | +| ir.cpp:1232:20:1232:20 | ChiPartial | partial:m1232_5 | +| ir.cpp:1232:20:1232:20 | ChiTotal | total:m1232_2 | +| ir.cpp:1232:20:1232:20 | StoreValue | r1232_4 | +| ir.cpp:1233:16:1233:16 | Address | &:r1233_3 | +| ir.cpp:1233:16:1233:16 | SideEffect | ~m1233_6 | +| ir.cpp:1233:20:1233:28 | ChiPartial | partial:m1233_5 | +| ir.cpp:1233:20:1233:28 | ChiTotal | total:m1233_2 | +| ir.cpp:1233:20:1233:28 | StoreValue | r1233_4 | | ir.cpp:1234:16:1234:16 | Address | &:r1234_1 | | ir.cpp:1234:16:1234:16 | Address | &:r1234_1 | | ir.cpp:1234:16:1234:16 | Address | &:r1234_4 | @@ -8741,6 +8751,38 @@ | ir.cpp:1885:11:1885:50 | ChiPartial | partial:m1885_4 | | ir.cpp:1885:11:1885:50 | ChiTotal | total:m1883_4 | | ir.cpp:1885:11:1885:50 | SideEffect | ~m1883_4 | +| ir.cpp:1889:24:1889:24 | Address | &:r1889_3 | +| ir.cpp:1889:24:1889:24 | Address | &:r1889_3 | +| ir.cpp:1889:24:1889:24 | SideEffect | ~m1889_6 | +| ir.cpp:1889:24:1889:24 | SideEffect | ~m1889_6 | +| ir.cpp:1889:42:1889:43 | ChiPartial | partial:m1889_5 | +| ir.cpp:1889:42:1889:43 | ChiPartial | partial:m1889_5 | +| ir.cpp:1889:42:1889:43 | ChiTotal | total:m1889_2 | +| ir.cpp:1889:42:1889:43 | ChiTotal | total:m1889_2 | +| ir.cpp:1889:42:1889:43 | StoreValue | r1889_4 | +| ir.cpp:1889:42:1889:43 | StoreValue | r1889_4 | +| ir.cpp:1891:5:1891:28 | Address | &:r1891_5 | +| ir.cpp:1891:5:1891:28 | ChiPartial | partial:m1891_3 | +| ir.cpp:1891:5:1891:28 | ChiTotal | total:m1891_2 | +| ir.cpp:1891:5:1891:28 | Load | m1894_8 | +| ir.cpp:1891:5:1891:28 | SideEffect | m1891_3 | +| ir.cpp:1892:9:1892:17 | Address | &:r1892_1 | +| ir.cpp:1892:21:1892:40 | Address | &:r1892_2 | +| ir.cpp:1892:21:1892:40 | Load | ~m1891_3 | +| ir.cpp:1892:21:1892:40 | StoreValue | r1892_3 | +| ir.cpp:1893:10:1893:19 | Address | &:r1893_1 | +| ir.cpp:1893:23:1893:43 | Address | &:r1893_2 | +| ir.cpp:1893:23:1893:43 | Load | ~m1891_3 | +| ir.cpp:1893:23:1893:43 | StoreValue | r1893_3 | +| ir.cpp:1894:5:1894:39 | Address | &:r1894_1 | +| ir.cpp:1894:12:1894:20 | Address | &:r1894_2 | +| ir.cpp:1894:12:1894:20 | Left | r1894_3 | +| ir.cpp:1894:12:1894:20 | Load | m1892_4 | +| ir.cpp:1894:12:1894:38 | StoreValue | r1894_7 | +| ir.cpp:1894:24:1894:38 | Right | r1894_6 | +| ir.cpp:1894:29:1894:38 | Address | &:r1894_4 | +| ir.cpp:1894:29:1894:38 | Load | m1893_4 | +| ir.cpp:1894:29:1894:38 | Unary | r1894_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | @@ -9030,6 +9072,34 @@ | struct_init.cpp:20:6:20:25 | ChiPartial | partial:m20_3 | | struct_init.cpp:20:6:20:25 | ChiTotal | total:m20_2 | | struct_init.cpp:20:6:20:25 | SideEffect | ~m25_9 | +| struct_init.cpp:21:17:21:28 | Left | r21_3 | +| struct_init.cpp:21:17:21:28 | Left | r21_3 | +| struct_init.cpp:21:17:21:28 | SideEffect | ~m23_10 | +| struct_init.cpp:21:34:24:5 | Right | r21_4 | +| struct_init.cpp:21:34:24:5 | Right | r21_6 | +| struct_init.cpp:21:34:24:5 | Unary | r21_5 | +| struct_init.cpp:21:34:24:5 | Unary | r21_5 | +| struct_init.cpp:21:34:24:5 | Unary | r21_7 | +| struct_init.cpp:21:34:24:5 | Unary | r21_7 | +| struct_init.cpp:22:9:22:25 | Address | &:r22_1 | +| struct_init.cpp:22:9:22:25 | Address | &:r22_6 | +| struct_init.cpp:22:11:22:13 | ChiPartial | partial:m22_4 | +| struct_init.cpp:22:11:22:13 | ChiTotal | total:m21_2 | +| struct_init.cpp:22:11:22:13 | StoreValue | r22_3 | +| struct_init.cpp:22:11:22:13 | Unary | r22_2 | +| struct_init.cpp:22:16:22:23 | ChiPartial | partial:m22_8 | +| struct_init.cpp:22:16:22:23 | ChiTotal | total:m22_5 | +| struct_init.cpp:22:16:22:23 | StoreValue | r22_7 | +| struct_init.cpp:23:9:23:26 | Address | &:r23_1 | +| struct_init.cpp:23:9:23:26 | Address | &:r23_6 | +| struct_init.cpp:23:11:23:13 | ChiPartial | partial:m23_4 | +| struct_init.cpp:23:11:23:13 | ChiTotal | total:m22_9 | +| struct_init.cpp:23:11:23:13 | StoreValue | r23_3 | +| struct_init.cpp:23:11:23:13 | Unary | r23_2 | +| struct_init.cpp:23:16:23:24 | ChiPartial | partial:m23_9 | +| struct_init.cpp:23:16:23:24 | ChiTotal | total:m23_5 | +| struct_init.cpp:23:16:23:24 | StoreValue | r23_8 | +| struct_init.cpp:23:17:23:24 | Unary | r23_7 | | struct_init.cpp:25:5:25:19 | CallTarget | func:r25_1 | | struct_init.cpp:25:5:25:19 | ChiPartial | partial:m25_5 | | struct_init.cpp:25:5:25:19 | ChiTotal | total:m20_4 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index c3293466b9a..abcc5bbe0c7 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -6841,6 +6841,28 @@ ir.cpp: # 1231| v1231_8(void) = AliasedUse : ~m? # 1231| v1231_9(void) = ExitFunction : +# 1232| int a +# 1232| Block 0 +# 1232| v1232_1(void) = EnterFunction : +# 1232| mu1232_2(unknown) = AliasedDefinition : +# 1232| r1232_3(glval) = VariableAddress[a] : +# 1232| r1232_4(int) = Constant[0] : +# 1232| mu1232_5(int) = Store[a] : &:r1232_3, r1232_4 +# 1232| v1232_6(void) = ReturnVoid : +# 1232| v1232_7(void) = AliasedUse : ~m? +# 1232| v1232_8(void) = ExitFunction : + +# 1233| int b +# 1233| Block 0 +# 1233| v1233_1(void) = EnterFunction : +# 1233| mu1233_2(unknown) = AliasedDefinition : +# 1233| r1233_3(glval) = VariableAddress[b] : +# 1233| r1233_4(int) = Constant[4] : +# 1233| mu1233_5(int) = Store[b] : &:r1233_3, r1233_4 +# 1233| v1233_6(void) = ReturnVoid : +# 1233| v1233_7(void) = AliasedUse : ~m? +# 1233| v1233_8(void) = ExitFunction : + # 1240| void staticLocalWithConstructor(char const*) # 1240| Block 0 # 1240| v1240_1(void) = EnterFunction : @@ -10035,6 +10057,54 @@ ir.cpp: # 1883| v1883_5(void) = AliasedUse : ~m? # 1883| v1883_6(void) = ExitFunction : +# 1889| char global_template +# 1889| Block 0 +# 1889| v1889_1(void) = EnterFunction : +# 1889| mu1889_2(unknown) = AliasedDefinition : +# 1889| r1889_3(glval) = VariableAddress[global_template] : +# 1889| r1889_4(char) = Constant[42] : +# 1889| mu1889_5(char) = Store[global_template] : &:r1889_3, r1889_4 +# 1889| v1889_6(void) = ReturnVoid : +# 1889| v1889_7(void) = AliasedUse : ~m? +# 1889| v1889_8(void) = ExitFunction : + +# 1889| int global_template +# 1889| Block 0 +# 1889| v1889_1(void) = EnterFunction : +# 1889| mu1889_2(unknown) = AliasedDefinition : +# 1889| r1889_3(glval) = VariableAddress[global_template] : +# 1889| r1889_4(int) = Constant[42] : +# 1889| mu1889_5(int) = Store[global_template] : &:r1889_3, r1889_4 +# 1889| v1889_6(void) = ReturnVoid : +# 1889| v1889_7(void) = AliasedUse : ~m? +# 1889| v1889_8(void) = ExitFunction : + +# 1891| int test_global_template_int() +# 1891| Block 0 +# 1891| v1891_1(void) = EnterFunction : +# 1891| mu1891_2(unknown) = AliasedDefinition : +# 1891| mu1891_3(unknown) = InitializeNonLocal : +# 1892| r1892_1(glval) = VariableAddress[local_int] : +# 1892| r1892_2(glval) = VariableAddress[global_template] : +# 1892| r1892_3(int) = Load[global_template] : &:r1892_2, ~m? +# 1892| mu1892_4(int) = Store[local_int] : &:r1892_1, r1892_3 +# 1893| r1893_1(glval) = VariableAddress[local_char] : +# 1893| r1893_2(glval) = VariableAddress[global_template] : +# 1893| r1893_3(char) = Load[global_template] : &:r1893_2, ~m? +# 1893| mu1893_4(char) = Store[local_char] : &:r1893_1, r1893_3 +# 1894| r1894_1(glval) = VariableAddress[#return] : +# 1894| r1894_2(glval) = VariableAddress[local_int] : +# 1894| r1894_3(int) = Load[local_int] : &:r1894_2, ~m? +# 1894| r1894_4(glval) = VariableAddress[local_char] : +# 1894| r1894_5(char) = Load[local_char] : &:r1894_4, ~m? +# 1894| r1894_6(int) = Convert : r1894_5 +# 1894| r1894_7(int) = Add : r1894_3, r1894_6 +# 1894| mu1894_8(int) = Store[#return] : &:r1894_1, r1894_7 +# 1891| r1891_4(glval) = VariableAddress[#return] : +# 1891| v1891_5(void) = ReturnValue : &:r1891_4, ~m? +# 1891| v1891_6(void) = AliasedUse : ~m? +# 1891| v1891_7(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 @@ -10320,6 +10390,34 @@ struct_init.cpp: # 20| v20_5(void) = AliasedUse : ~m? # 20| v20_6(void) = ExitFunction : +# 21| Info[] static_infos +# 21| Block 0 +# 21| v21_1(void) = EnterFunction : +# 21| mu21_2(unknown) = AliasedDefinition : +# 21| r21_3(glval) = VariableAddress[static_infos] : +# 21| r21_4(int) = Constant[0] : +# 21| r21_5(glval) = PointerAdd[16] : r21_3, r21_4 +# 22| r22_1(glval) = FieldAddress[name] : r21_5 +# 22| r22_2(glval) = StringConstant["1"] : +# 22| r22_3(char *) = Convert : r22_2 +# 22| mu22_4(char *) = Store[?] : &:r22_1, r22_3 +# 22| r22_5(glval<..(*)(..)>) = FieldAddress[handler] : r21_5 +# 22| r22_6(..(*)(..)) = FunctionAddress[handler1] : +# 22| mu22_7(..(*)(..)) = Store[?] : &:r22_5, r22_6 +# 21| r21_6(int) = Constant[1] : +# 21| r21_7(glval) = PointerAdd[16] : r21_3, r21_6 +# 23| r23_1(glval) = FieldAddress[name] : r21_7 +# 23| r23_2(glval) = StringConstant["2"] : +# 23| r23_3(char *) = Convert : r23_2 +# 23| mu23_4(char *) = Store[?] : &:r23_1, r23_3 +# 23| r23_5(glval<..(*)(..)>) = FieldAddress[handler] : r21_7 +# 23| r23_6(glval<..()(..)>) = FunctionAddress[handler2] : +# 23| r23_7(..(*)(..)) = CopyValue : r23_6 +# 23| mu23_8(..(*)(..)) = Store[?] : &:r23_5, r23_7 +# 21| v21_8(void) = ReturnVoid : +# 21| v21_9(void) = AliasedUse : ~m? +# 21| v21_10(void) = ExitFunction : + # 28| void declare_local_infos() # 28| Block 0 # 28| v28_1(void) = EnterFunction : diff --git a/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.ql b/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.ql index 30ca575b767..6cfb22803bd 100644 --- a/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.ql +++ b/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.ql @@ -3,14 +3,14 @@ import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.ModulusAnaly import semmle.code.cpp.rangeanalysis.new.internal.semantic.Semantic import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.RangeUtils import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.FloatDelta -import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.RangeAnalysisSpecific +import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.RangeAnalysisRelativeSpecific import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.RangeAnalysisImpl import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticExprSpecific import semmle.code.cpp.ir.IR as IR import TestUtilities.InlineExpectationsTest module ModulusAnalysisInstantiated = - ModulusAnalysis>; + ModulusAnalysis>; class ModulusAnalysisTest extends InlineExpectationsTest { ModulusAnalysisTest() { this = "ModulusAnalysisTest" } diff --git a/cpp/ql/test/library-tests/ir/range-analysis/Overflow.expected b/cpp/ql/test/library-tests/ir/range-analysis/Overflow.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/cpp/ql/test/library-tests/ir/range-analysis/Overflow.ql b/cpp/ql/test/library-tests/ir/range-analysis/Overflow.ql new file mode 100644 index 00000000000..e0491e6e0ed --- /dev/null +++ b/cpp/ql/test/library-tests/ir/range-analysis/Overflow.ql @@ -0,0 +1,23 @@ +import cpp +import semmle.code.cpp.rangeanalysis.new.SimpleRangeAnalysis +import TestUtilities.InlineExpectationsTest + +class RangeAnalysisTest extends InlineExpectationsTest { + RangeAnalysisTest() { this = "RangeAnalysisTest" } + + override string getARelevantTag() { result = "overflow" } + + override predicate hasActualResult(Location location, string element, string tag, string value) { + exists(Expr e | + tag = "overflow" and + element = e.toString() and + location = e.getLocation() and + value = + strictconcat(string s | + s = "+" and exprMightOverflowPositively(e) + or + s = "-" and exprMightOverflowNegatively(e) + ) + ) + } +} diff --git a/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp b/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp index 19c9b47d670..eed0a7d7e47 100644 --- a/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp +++ b/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp @@ -8,9 +8,9 @@ int test1(struct List* p) { int count = 0; for (; p; p = p->next) { count = count+1; - range(count); // $ range===count:p+1 range=>=1 + range(count); // $ range===count:p+1 } - range(count); // $ range=>=0 + range(count); return count; } @@ -40,13 +40,13 @@ int test4() { int total = 0; for (i = 0; i < 2; i = i+1) { range(i); // $ range=<=1 range=>=0 - range(total); // $ range=>=0 + range(total); total += i; - range(total); // $ range=<=i+1 range=<=i+1 range=>=0 range=>=i+0 + range(total); // $ range=<=i+1 range=<=i+1 MISSING: range=>=0 range=>=i+0 } - range(total); // $ range=>=0 + range(total); // $ MISSING: range=>=0 range(i); // $ range===2 - range(total + i); // $ range===i+2 range=>=2 range=>=i+0 + range(total + i); // $ range=<=i+2 MISSING: range===i+2 range=>=2 range=>=i+0 return total + i; } @@ -55,13 +55,13 @@ int test5() { int total = 0; for (i = 0; i < 2; i++) { range(i); // $ range=<=1 range=>=0 - range(total); // $ range=>=0 + range(total); // $ MISSING: range=>=0 total += i; - range(total); // $ range=<=i+1 range=>=0 range=>=i+0 + range(total); // $ range=<=i+1 MISSING: range=>=0 range=>=i+0 } - range(total); // $ range=>=0 + range(total); // $ MISSING: range=>=0 range(i); // $ range===2 - range(total + i); // $ range===i+2 range=>=2 range=>=i+0 + range(total + i); // $ range=<=i+2 MISSING: range===i+2 range=>=2 range=>=i+0 return total + i; } @@ -70,9 +70,9 @@ int test6() { int total = 0; for (i = 0; i+2 < 4; i = i+1) { range(i); // $ range=<=1 range=>=0 - range(total); // $ range=>=0 + range(total); // $ MISSING: range=>=0 total += i; - range(total); // $ range=<=i+1 range=>=0 range=>=i+0 + range(total); // $ range=<=i+1 MISSING: range=>=0 range=>=i+0 } return total + i; } @@ -168,19 +168,19 @@ typedef unsigned long long size_type; size_type test12_helper() { static size_type n = 0; - return n++; + return n++; // $ overflow=+ } int test12() { size_type Start = 0; while (Start <= test12_helper()-1) { - range(Start); + range(Start); // $ MISSING:range=>=0 const size_type Length = test12_helper(); - Start += Length + 1; - range(Start); + Start += Length + 1; // $ overflow=+ + range(Start); // $ MISSING:range=>=1 MISSING:range=>=Start+1 MISSING:range=">=call to test12_helper+1" } - range(Start); + range(Start); // $ MISSING:range=>=0 return 1; } @@ -190,13 +190,13 @@ int test13(char c, int i) { unsigned char uc = c; range(uc); unsigned int x = 0; - unsigned int y = x-1; - range(y); // $ range===-1 - int z = i+1; + unsigned int y = x-1; // $ overflow=- + range(y); // $ range===-1 overflow=- + int z = i+1; // $ overflow=+ range(z); // $ range===i+1 - range(c + i + uc + x + y + z); - range((double)(c + i + uc + x + y + z)); - return (double)(c + i + uc + x + y + z); + range(c + i + uc + x + y + z); // $ overflow=+- overflow=+ overflow=- MISSING: range=>=1 + range((double)(c + i + uc + x + y + z)); // $ overflow=+ overflow=+- overflow=- MISSING: range=>=1 + return (double)(c + i + uc + x + y + z); // $ overflow=+- overflow=+ overflow=- } // Regression test for ODASA-6013. @@ -213,8 +213,8 @@ int test14(int x) { range(c0); unsigned short s0 = x; range(s0); - range(x0 + x1 + x2 + x3 + c0 + s0); - return x0 + x1 + x2 + x3 + c0 + s0; + range(x0 + x1 + x2 + x3 + c0 + s0); // $ overflow=+ overflow=+- + return x0 + x1 + x2 + x3 + c0 + s0; // $ overflow=+ overflow=+- } long long test15(long long x) { @@ -243,7 +243,7 @@ int test_unary(int a) { range(b); // $ range=<=11 range=>=0 int c = -a; range(c); // $ range=<=0 range=>=-11 - range(b+c); // $ range=<=11 range=>=-11 + range(b+c); // $ range=<=11 range=>=-11 MISSING:range=">=- ...+0" total += b+c; range(total); // $ range=<=0+11 range=<=19 range=>=0-11 range=>=-19 } @@ -273,7 +273,7 @@ int test_unary(int a) { range(b); // $ range=<=0 range=>=-7 int c = -a; range(c); // $ range=<=7 range=>=0 - range(b+c); // $ range=>=-7 range=<=7 + range(b+c); // $ range=>=-7 range=<=7 MISSING:range="<=- ...+0" total += b+c; range(total); // $ range="<=- ...+7" range="<=- ...+15" range="<=- ...+33" range=">=- ...-7" range=">=- ...-15" range=">=- ...-33" range=<=0+44 range=<=52 range=>=0-44 range=>=-52 } @@ -315,9 +315,9 @@ int test_mult01(int a, int b) { if (3 <= a && a <= 11 && -13 <= b && b <= 23) { range(a); // $ range=<=11 range=>=3 range(b); // $ range=<=23 range=>=-13 - int r = a*b; // -143 .. 253 + int r = a*b; // $ overflow=+- -143 .. 253 range(r); - total += r; + total += r; // $ overflow=+ range(total); // $ MISSING: range=">=... * ...+0" } if (3 <= a && a <= 11 && -13 <= b && b <= 0) { @@ -326,7 +326,7 @@ int test_mult01(int a, int b) { int r = a*b; // -143 .. 0 range(r); // $ range=<=0 range=>=-143 total += r; - range(total); // $ range=<=3+0 range=>=3-143 + range(total); // $ range=>=3-143 } if (3 <= a && a <= 11 && -13 <= b && b <= -7) { range(a); // $ range=<=11 range=>=3 @@ -334,9 +334,9 @@ int test_mult01(int a, int b) { int r = a*b; // -143 .. -21 range(r); // $ range=<=-21 range=>=-143 total += r; - range(total); // $ range=<=3-21 range=>=3-143 range=>=3-286 + range(total); // $ range=>=3-143 range=>=3-286 } - range(total); // $ range=<=3+0 range=>=3-143 range=>=3-286 + range(total); // $ range=>=3-143 range=>=3-286 return total; } @@ -363,9 +363,9 @@ int test_mult02(int a, int b) { if (0 <= a && a <= 11 && -13 <= b && b <= 23) { range(a); // $ range=<=11 range=>=0 range(b); // $ range=<=23 range=>=-13 - int r = a*b; // -143 .. 253 + int r = a*b; // $ overflow=+- -143 .. 253 range(r); - total += r; + total += r; // $ overflow=+ range(total); // $ MISSING: range=">=... * ...+0" } if (0 <= a && a <= 11 && -13 <= b && b <= 0) { @@ -374,7 +374,7 @@ int test_mult02(int a, int b) { int r = a*b; // -143 .. 0 range(r); // $ range=<=0 range=>=-143 total += r; - range(total); // $ range=<=0+0 range=>=0-143 + range(total); // $ range=>=0-143 } if (0 <= a && a <= 11 && -13 <= b && b <= -7) { range(a); // $ range=<=11 range=>=0 @@ -382,9 +382,9 @@ int test_mult02(int a, int b) { int r = a*b; // -143 .. 0 range(r); // $ range=<=0 range=>=-143 total += r; - range(total); // $ range=<=0+0 range=>=0-143 range=>=0-286 + range(total); // $ range=>=0-143 range=>=0-286 } - range(total); // $ range=<=0+0 range=>=0-143 range=>=0-286 + range(total); // $range=>=0-143 range=>=0-286 return total; } @@ -395,7 +395,7 @@ int test_mult03(int a, int b) { if (-17 <= a && a <= 11 && 5 <= b && b <= 23) { range(a); // $ range=<=11 range=>=-17 range(b); // $ range=<=23 range=>=5 - int r = a*b; // -391 .. 253 + int r = a*b; // $ overflow=+- -391 .. 253 range(r); total += r; range(total); @@ -403,33 +403,33 @@ int test_mult03(int a, int b) { if (-17 <= a && a <= 11 && 0 <= b && b <= 23) { range(a); // $ range=<=11 range=>=-17 range(b); // $ range=<=23 range=>=0 - int r = a*b; // -391 .. 253 + int r = a*b; // $ overflow=+- -391 .. 253 range(r); - total += r; + total += r; // $ overflow=+- range(total); } if (-17 <= a && a <= 11 && -13 <= b && b <= 23) { range(a); // $ range=<=11 range=>=-17 range(b); // $ range=<=23 range=>=-13 - int r = a*b; // -391 .. 253 + int r = a*b; // $ overflow=+- -391 .. 25 range(r); - total += r; + total += r; // $ overflow=+- range(total); } if (-17 <= a && a <= 11 && -13 <= b && b <= 0) { range(a); // $ range=<=11 range=>=-17 range(b); // $ range=<=0 range=>=-13 - int r = a*b; // -143 .. 221 + int r = a*b; // $ overflow=+- -143 .. 221 range(r); - total += r; + total += r; // $ overflow=+- range(total); } if (-17 <= a && a <= 11 && -13 <= b && b <= -7) { range(a); // $ range=<=11 range=>=-17 range(b); // $ range=<=-7 range=>=-13 - int r = a*b; // -143 .. 221 + int r = a*b; // $ overflow=+- -143 .. 221 range(r); - total += r; + total += r; // $ overflow=+- range(total); } range(total); @@ -458,9 +458,9 @@ int test_mult04(int a, int b) { if (-17 <= a && a <= 0 && -13 <= b && b <= 23) { range(a); // $ range=<=0 range=>=-17 range(b); // $ range=<=23 range=>=-13 - int r = a*b; // -391 .. 221 + int r = a*b; // $ overflow=+- -391 .. 221 range(r); - total += r; + total += r; // $ overflow=- range(total); // $ MISSING: range="<=... * ...+0" } if (-17 <= a && a <= 0 && -13 <= b && b <= 0) { @@ -469,7 +469,7 @@ int test_mult04(int a, int b) { int r = a*b; // 0 .. 221 range(r); // $ range=<=221 range=>=0 total += r; - range(total); // $ range="<=- ...+221" range=">=- ...+0" + range(total); // $ range="<=- ...+221" } if (-17 <= a && a <= 0 && -13 <= b && b <= -7) { range(a); // $ range=<=0 range=>=-17 @@ -477,9 +477,9 @@ int test_mult04(int a, int b) { int r = a*b; // 0 .. 221 range(r); // $ range=<=221 range=>=0 total += r; - range(total); // $ range=">=- ...+0" range="<=- ...+221" range="<=- ...+442" + range(total); // $ range="<=- ...+221" range="<=- ...+442" } - range(total); // $ range=">=- ...+0" range="<=- ...+221" range="<=- ...+442" + range(total); // $ range="<=- ...+221" range="<=- ...+442" return total; } @@ -506,9 +506,9 @@ int test_mult05(int a, int b) { if (-17 <= a && a <= -2 && -13 <= b && b <= 23) { range(a); // $ range=<=-2 range=>=-17 range(b); // $ range=<=23 range=>=-13 - int r = a*b; // -391 .. 221 + int r = a*b; // $ overflow=+- -391 .. 221 range(r); - total += r; + total += r; // $ overflow=- range(total); // $ MISSING: range="<=... * ...+0" } if (-17 <= a && a <= -2 && -13 <= b && b <= 0) { @@ -517,7 +517,7 @@ int test_mult05(int a, int b) { int r = a*b; // 0 .. 221 range(r); // $ range=<=221 range=>=0 total += r; - range(total); // $ range="<=- ...+221" range=">=- ...+0" + range(total); // $ range="<=- ...+221" } if (-17 <= a && a <= -2 && -13 <= b && b <= -7) { range(a); // $ range=<=-2 range=>=-17 @@ -525,9 +525,9 @@ int test_mult05(int a, int b) { int r = a*b; // 14 .. 221 range(r); // $ range=<=221 range=>=14 total += r; - range(total); // $ range="<=- ...+221" range="<=- ...+442" range=">=- ...+14" + range(total); // $ range="<=- ...+221" range="<=- ...+442" } - range(total); // $ range=">=- ...+0" range="<=- ...+221" range="<=- ...+442" + range(total); // $ range="<=- ...+221" range="<=- ...+442" return total; } @@ -541,7 +541,7 @@ int test16(int x) { while (i < 3) { range(i); // $ range=<=2 range=>=0 i++; - range(i); // $ range="==... = ...:i+1" range=<=3 range=>=1 + range(i); // $ range=<=3 range=>=1 range="==... = ...:i+1" SPURIOUS:range="==... = ...:i+1" } range(d); d = i; @@ -586,7 +586,7 @@ unsigned int test_ternary01(unsigned int x) { (range(x), 500); range(y4); // $ range=<=500 y5 = (x+1) ?: - (range(x), 500); // $ range===-1 + (range(x), 500); // $ overflow=- range===-1 range(y5); // $ range=<=500 y6 = ((unsigned char)(x+1)) ?: (range(x), 5); // $ range=<=299 @@ -598,8 +598,8 @@ unsigned int test_ternary01(unsigned int x) { (range(x), 500); // $ range=<=299 range(y8); // y8 <= 300 } - range(y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8); // $ MISSING: range=">=... = ...:... ? ... : ...+0" range=">=call to range+0" - return y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8; + range(y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8); // $ overflow=+ MISSING: range=">=... = ...:... ? ... : ...+0" range=">=call to range+0" + return y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8; // $ overflow=+ } // Test ternary expression lower bounds. @@ -628,8 +628,8 @@ unsigned int test_ternary02(unsigned int x) { (range(x), 5); // $ range=>=300 range(y5); // y6 >= 0 } - range(y1 + y2 + y3 + y4 + y5); // $ range=">=call to range+207" MISSING: range=">=... = ...:... ? ... : ...+0" range=">=call to range+0" - return y1 + y2 + y3 + y4 + y5; + range(y1 + y2 + y3 + y4 + y5); // $ overflow=+ MISSING: range=">=call to range+207" range=">=... = ...:... ? ... : ...+0" range=">=call to range+0" + return y1 + y2 + y3 + y4 + y5; // $ overflow=+ } // Test the comma expression. @@ -691,9 +691,9 @@ int test_unsigned_mult01(unsigned int a, unsigned b) { range(a); // $ range=<=11 range=>=3 range(b); // $ range=<=23 range=>=0 int r = a*b; // 0 .. 253 - range(r); // $ range=>=0 range=<=253 + range(r);// $ range=>=0 range=<=253 total += r; - range(total); // $ range=>=0 range=<=506 range=">=(unsigned int)...+0" range="<=(unsigned int)...+253" + range(total); // $ range=">=(unsigned int)...+0" range=>=0 range=<=506 range="<=(unsigned int)...+253" } if (3 <= a && a <= 11 && 13 <= b && b <= 23) { range(a); // $ range=<=11 range=>=3 @@ -701,7 +701,7 @@ int test_unsigned_mult01(unsigned int a, unsigned b) { int r = a*b; // 39 .. 253 range(r); // $ range=>=39 range=<=253 total += r; - range(total); // $ range=>=39 range=<=759 range=">=(unsigned int)...+39" range="<=(unsigned int)...+506" range="<=(unsigned int)...+253" + range(total); // $ range=>=39 range=<=759 range="<=(unsigned int)...+253" range="<=(unsigned int)...+506" range=">=(unsigned int)...+39" } range(total); // $ range=>=0 range=<=759 range=">=(unsigned int)...+0" range="<=(unsigned int)...+506" range="<=(unsigned int)...+253" return total; @@ -722,14 +722,14 @@ int test_unsigned_mult02(unsigned b) { int r = 11*b; // 0 .. 253 range(r); // $ range=>=0 range=<=253 total += r; - range(total); // $ range=>=0 range=<=506 range=">=(unsigned int)...+0" range="<=(unsigned int)...+253" + range(total); // $ range=">=(unsigned int)...+0" range=>=0 range="<=(unsigned int)...+253" range=<=506 } if (13 <= b && b <= 23) { range(b); // $ range=<=23 range=>=13 int r = 11*b; // 143 .. 253 range(r); // $ range=>=143 range=<=253 total += r; - range(total); // $ range=>=143 range=<=759 range=">=(unsigned int)...+143" range="<=(unsigned int)...+506" range="<=(unsigned int)...+253" + range(total); // $ range="<=(unsigned int)...+253" range="<=(unsigned int)...+506" range=">=(unsigned int)...+143" range=>=143 range=<=759 } range(total); // $ range=>=0 range=<=759 range=">=(unsigned int)...+0" range="<=(unsigned int)...+506" range="<=(unsigned int)...+253" return total; @@ -751,7 +751,7 @@ unsigned long mult_overflow() { range(x); // $ range===274177 y = 67280421310721UL; range(y); - xy = x * y; + xy = x * y; // $ overflow=+- range(xy); return xy; // BUG: upper bound should be >= 18446744073709551617UL } @@ -760,14 +760,14 @@ unsigned long mult_lower_bound(unsigned int ui, unsigned long ul) { if (ui >= 10) { range(ui); // $ range=>=10 range((unsigned long)ui); // $ range=>=10 - unsigned long result = (unsigned long)ui * ui; - range(result); // $ range=>=100 range=>=100 + unsigned long result = (unsigned long)ui * ui; // $ overflow=+ + range(result); // $ MISSING: range=>=100 return result; // BUG: upper bound should be >= 18446744065119617025 } if (ul >= 10) { range(ul); // $ range=>=10 - unsigned long result = ul * ul; - range(result); // $ range=>=100 + unsigned long result = ul * ul; // $ overflow=+ + range(result); // $ MISSING: range=>=100 return result; // BUG: lower bound should be 0 (overflow is possible) } return 0; @@ -800,13 +800,13 @@ int mul_by_constant(int i, int j) { i = 5 * i; range(i); // $ range=<=10 range=>=-5 - i = i * -3; + i = i * -3; // $ overflow=+- range(i); // -30 .. 15 - i *= 7; + i *= 7; // $ overflow=+- range(i); // -210 .. 105 - i *= -11; + i *= -11; // $ overflow=+- range(i); // -1155 .. 2310 } if (i == -1) { @@ -815,7 +815,7 @@ int mul_by_constant(int i, int j) { i = i * (int)0xffFFffFF; // fully converted literal is -1 range(i); // $ range===1 } - i = i * -1; + i = i * -1; // $ overflow=+- range( i); // -2^31 .. 2^31-1 signed char sc = 1; @@ -873,11 +873,11 @@ void notequal_refinement(short n) { } while (n != 0) { - range(n); // $ range=<=n+0 + range(n); // $ MISSING:range=<=n+0 n--; // 1 .. } - range(n); // $ range=<=n+0 // 0 .. 0 + range(n); // $ MISSING:range=<=n+0 // 0 .. 0 } void notequal_variations(short n, float f) { @@ -888,7 +888,7 @@ void notequal_variations(short n, float f) { } if (n >= 5) { - if (2 * n - 10 == 0) { // Same as `n == 10/2` (modulo overflow) + if (2 * n - 10 == 0) { // $ overflow=+ range(n); // $ range=>=5 MISSING: range===5 return; } @@ -921,7 +921,7 @@ void two_bounds_from_one_test(short ss, unsigned short us) { } if (ss < 0x8001) { // Lower bound removed in `getDefLowerBounds` - range(ss); // $ range=<=32768 MISSING: range=>=-32768 + range(ss); // $ overflow=+ range=<=32768 MISSING: range=>=-32768 } if ((short)us >= 0) { @@ -936,7 +936,7 @@ void two_bounds_from_one_test(short ss, unsigned short us) { range(ss); // -32768 .. 32767 } - if (ss + 1 < sizeof(int)) { + if (ss + 1 < sizeof(int)) { // $ overflow=+ range(ss); // -1 .. 2 } } @@ -1020,7 +1020,7 @@ void test_overflow() { void test_negate_unsigned(unsigned u) { if(10 < u && u < 20) { - range(-u); // underflows + range(-u); // $ overflow=- } } diff --git a/cpp/ql/test/library-tests/ir/range-analysis/test.cpp b/cpp/ql/test/library-tests/ir/range-analysis/test.cpp index f8587c42d67..682b74d2e78 100644 --- a/cpp/ql/test/library-tests/ir/range-analysis/test.cpp +++ b/cpp/ql/test/library-tests/ir/range-analysis/test.cpp @@ -6,17 +6,17 @@ return x; } - if (y - 2 == x && y > 300) { + if (y - 2 == x && y > 300) { // $ overflow=- range(x + y); // $ range=<=802 range=>=600 return x + y; } - if (x != y + 1) { + if (x != y + 1) { // $ overflow=+ range(x); // $ range=<=400 - int sum = x + y; + int sum = x + y; // $ overflow=+- } else { if (y > 300) { - range(x); // $ range=>=302 range=<=400 range===y+1 + range(x); // $ range=>=302 range=<=400 range=<=y+1 MISSING: range===y+1 range(y); // $ range=>=301 range=<=399 range===x-1 int sum = x + y; } @@ -38,10 +38,10 @@ return x; } - if (y == x - 1 && y > 300 && y + 2 == z && z == 350) { + if (y == x - 1 && y > 300 && y + 2 == z && z == 350) { // $ overflow=+ overflow=- range(x); // $ range===349 range===y+1 range===z-1 - range(y); // $ range===348 range===x-1 range===z-2 - range(z); // $ range===350 range===x+1 range===y+2 + range(y); // $ range===348 range=>=x-1 range===z-2 MISSING: range===x-1 + range(z); // $ range===350 range=<=y+2 MISSING: range===x+1 range===y+2 return x + y + z; } } diff --git a/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.ql b/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.ql index 8f95759ec7d..a3cfaa82ed4 100644 --- a/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.ql +++ b/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.ql @@ -3,12 +3,13 @@ import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.SignAnalysis import semmle.code.cpp.rangeanalysis.new.internal.semantic.Semantic import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.RangeUtils import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.FloatDelta -import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.RangeAnalysisSpecific +import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.RangeAnalysisRelativeSpecific import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticExprSpecific import semmle.code.cpp.ir.IR as IR import TestUtilities.InlineExpectationsTest -module SignAnalysisInstantiated = SignAnalysis>; +module SignAnalysisInstantiated = + SignAnalysis>; class SignAnalysisTest extends InlineExpectationsTest { SignAnalysisTest() { this = "SignAnalysisTest" } diff --git a/cpp/ql/test/library-tests/structs/compatible_c/compatible.expected b/cpp/ql/test/library-tests/structs/compatible_c/compatible.expected index 23397167f04..bafb2131e74 100644 --- a/cpp/ql/test/library-tests/structs/compatible_c/compatible.expected +++ b/cpp/ql/test/library-tests/structs/compatible_c/compatible.expected @@ -1,6 +1,6 @@ -| a1.c:6:16:6:16 | struct | 0 members | 2 locations | -1 | | -| a1.c:10:16:10:16 | struct | 1 members | 2 locations | 0 | x | -| a1.c:17:16:17:16 | struct | 1 members | 2 locations | 0 | x | +| a1.c:6:16:6:16 | (unnamed class/struct/union) | 0 members | 2 locations | -1 | | +| a1.c:10:16:10:16 | (unnamed class/struct/union) | 1 members | 2 locations | 0 | x | +| a1.c:17:16:17:16 | (unnamed class/struct/union) | 1 members | 2 locations | 0 | x | | a1.c:24:8:24:10 | Foo | 3 members | 2 locations | 0 | empty | | a1.c:24:8:24:10 | Foo | 3 members | 2 locations | 1 | nonempty | | a1.c:24:8:24:10 | Foo | 3 members | 2 locations | 2 | i | @@ -9,9 +9,9 @@ | a1.c:36:8:36:10 | Bar | 3 members | 2 locations | 0 | empty | | a1.c:36:8:36:10 | Bar | 3 members | 2 locations | 1 | nonempty | | a1.c:36:8:36:10 | Bar | 3 members | 2 locations | 2 | i | -| a2.c:6:16:6:16 | struct | 0 members | 2 locations | -1 | | -| a2.c:10:16:10:16 | struct | 1 members | 2 locations | 0 | x | -| a2.c:17:16:17:16 | struct | 1 members | 2 locations | 0 | x | +| a2.c:6:16:6:16 | (unnamed class/struct/union) | 0 members | 2 locations | -1 | | +| a2.c:10:16:10:16 | (unnamed class/struct/union) | 1 members | 2 locations | 0 | x | +| a2.c:17:16:17:16 | (unnamed class/struct/union) | 1 members | 2 locations | 0 | x | | a2.c:24:8:24:10 | Foo | 3 members | 2 locations | 0 | empty | | a2.c:24:8:24:10 | Foo | 3 members | 2 locations | 1 | nonempty | | a2.c:24:8:24:10 | Foo | 3 members | 2 locations | 2 | i | diff --git a/cpp/ql/test/library-tests/structs/compatible_c/compatible_types.expected b/cpp/ql/test/library-tests/structs/compatible_c/compatible_types.expected index 1151179e58d..45f52c73fd1 100644 --- a/cpp/ql/test/library-tests/structs/compatible_c/compatible_types.expected +++ b/cpp/ql/test/library-tests/structs/compatible_c/compatible_types.expected @@ -1,5 +1,5 @@ -| a1.c:10:16:10:16 | struct | 0 | file://:0:0:0:0 | int | 1 types | -| a1.c:17:16:17:16 | struct | 0 | file://:0:0:0:0 | int | 1 types | +| a1.c:10:16:10:16 | (unnamed class/struct/union) | 0 | file://:0:0:0:0 | int | 1 types | +| a1.c:17:16:17:16 | (unnamed class/struct/union) | 0 | file://:0:0:0:0 | int | 1 types | | a1.c:24:8:24:10 | Foo | 0 | file://:0:0:0:0 | anon_empty_t * | 1 types | | a1.c:24:8:24:10 | Foo | 1 | file://:0:0:0:0 | anon_nonempty_t * | 1 types | | a1.c:24:8:24:10 | Foo | 2 | file://:0:0:0:0 | int | 1 types | @@ -7,8 +7,8 @@ | a1.c:36:8:36:10 | Bar | 0 | file://:0:0:0:0 | Empty * | 1 types | | a1.c:36:8:36:10 | Bar | 1 | file://:0:0:0:0 | NonEmpty * | 1 types | | a1.c:36:8:36:10 | Bar | 2 | file://:0:0:0:0 | int | 1 types | -| a2.c:10:16:10:16 | struct | 0 | file://:0:0:0:0 | int | 1 types | -| a2.c:17:16:17:16 | struct | 0 | file://:0:0:0:0 | int | 1 types | +| a2.c:10:16:10:16 | (unnamed class/struct/union) | 0 | file://:0:0:0:0 | int | 1 types | +| a2.c:17:16:17:16 | (unnamed class/struct/union) | 0 | file://:0:0:0:0 | int | 1 types | | a2.c:24:8:24:10 | Foo | 0 | file://:0:0:0:0 | anon_empty_t * | 1 types | | a2.c:24:8:24:10 | Foo | 1 | file://:0:0:0:0 | anon_nonempty_t * | 1 types | | a2.c:24:8:24:10 | Foo | 2 | file://:0:0:0:0 | int | 1 types | diff --git a/cpp/ql/test/library-tests/syntax-zoo/test.c b/cpp/ql/test/library-tests/syntax-zoo/test.c index 3ca8dc4a78c..370759b6980 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/test.c +++ b/cpp/ql/test/library-tests/syntax-zoo/test.c @@ -233,3 +233,14 @@ void f_if_ternary_1(int b, int x, int y) { if (b ? x : y) { } } + +struct _A +{ + unsigned int x; + const char *y; +} as[]; + +void regression_test(void) +{ + static const void *a[] = {0 ? 0 : as}; +} diff --git a/cpp/ql/test/queries.xml b/cpp/ql/test/queries.xml deleted file mode 100644 index 99f4a7278c2..00000000000 --- a/cpp/ql/test/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/DoubleFree.expected b/cpp/ql/test/query-tests/Critical/MemoryFreed/DoubleFree.expected new file mode 100644 index 00000000000..bfc99021d27 --- /dev/null +++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/DoubleFree.expected @@ -0,0 +1,96 @@ +edges +| test_free.cpp:11:10:11:10 | a | test_free.cpp:14:10:14:10 | a | +| test_free.cpp:11:10:11:10 | a | test_free.cpp:14:10:14:10 | a | +| test_free.cpp:11:10:11:10 | a | test_free.cpp:14:10:14:10 | a | +| test_free.cpp:11:10:11:10 | a | test_free.cpp:14:10:14:10 | a | +| test_free.cpp:30:10:30:10 | a | test_free.cpp:31:27:31:27 | a | +| test_free.cpp:35:10:35:10 | a | test_free.cpp:37:27:37:27 | a | +| test_free.cpp:42:27:42:27 | a | test_free.cpp:46:10:46:10 | a | +| test_free.cpp:42:27:42:27 | a | test_free.cpp:46:10:46:10 | a | +| test_free.cpp:42:27:42:27 | a | test_free.cpp:46:10:46:10 | a | +| test_free.cpp:42:27:42:27 | a | test_free.cpp:46:10:46:10 | a | +| test_free.cpp:44:27:44:27 | a | test_free.cpp:46:10:46:10 | a | +| test_free.cpp:44:27:44:27 | a | test_free.cpp:46:10:46:10 | a | +| test_free.cpp:44:27:44:27 | a | test_free.cpp:46:10:46:10 | a | +| test_free.cpp:44:27:44:27 | a | test_free.cpp:46:10:46:10 | a | +| test_free.cpp:50:27:50:27 | a | test_free.cpp:51:10:51:10 | a | +| test_free.cpp:69:10:69:10 | a | test_free.cpp:72:14:72:14 | a | +| test_free.cpp:69:10:69:10 | a | test_free.cpp:72:14:72:14 | a | +| test_free.cpp:69:10:69:10 | a | test_free.cpp:72:14:72:14 | a | +| test_free.cpp:69:10:69:10 | a | test_free.cpp:72:14:72:14 | a | +| test_free.cpp:101:10:101:10 | a | test_free.cpp:103:10:103:10 | a | +| test_free.cpp:128:10:128:11 | * ... | test_free.cpp:129:10:129:11 | * ... | +| test_free.cpp:152:27:152:27 | a | test_free.cpp:154:10:154:10 | a | +| test_free.cpp:152:27:152:27 | a | test_free.cpp:154:10:154:10 | a | +| test_free.cpp:152:27:152:27 | a | test_free.cpp:154:10:154:10 | a | +| test_free.cpp:152:27:152:27 | a | test_free.cpp:154:10:154:10 | a | +| test_free.cpp:207:10:207:10 | a | test_free.cpp:209:10:209:10 | a | +| test_free.cpp:207:10:207:10 | a | test_free.cpp:209:10:209:10 | a | +| test_free.cpp:207:10:207:10 | a | test_free.cpp:209:10:209:10 | a | +| test_free.cpp:207:10:207:10 | a | test_free.cpp:209:10:209:10 | a | +nodes +| test_free.cpp:11:10:11:10 | a | semmle.label | a | +| test_free.cpp:11:10:11:10 | a | semmle.label | a | +| test_free.cpp:14:10:14:10 | a | semmle.label | a | +| test_free.cpp:14:10:14:10 | a | semmle.label | a | +| test_free.cpp:30:10:30:10 | a | semmle.label | a | +| test_free.cpp:31:27:31:27 | a | semmle.label | a | +| test_free.cpp:35:10:35:10 | a | semmle.label | a | +| test_free.cpp:37:27:37:27 | a | semmle.label | a | +| test_free.cpp:42:27:42:27 | a | semmle.label | a | +| test_free.cpp:42:27:42:27 | a | semmle.label | a | +| test_free.cpp:44:27:44:27 | a | semmle.label | a | +| test_free.cpp:44:27:44:27 | a | semmle.label | a | +| test_free.cpp:46:10:46:10 | a | semmle.label | a | +| test_free.cpp:46:10:46:10 | a | semmle.label | a | +| test_free.cpp:46:10:46:10 | a | semmle.label | a | +| test_free.cpp:46:10:46:10 | a | semmle.label | a | +| test_free.cpp:50:27:50:27 | a | semmle.label | a | +| test_free.cpp:51:10:51:10 | a | semmle.label | a | +| test_free.cpp:69:10:69:10 | a | semmle.label | a | +| test_free.cpp:69:10:69:10 | a | semmle.label | a | +| test_free.cpp:72:14:72:14 | a | semmle.label | a | +| test_free.cpp:72:14:72:14 | a | semmle.label | a | +| test_free.cpp:101:10:101:10 | a | semmle.label | a | +| test_free.cpp:103:10:103:10 | a | semmle.label | a | +| test_free.cpp:128:10:128:11 | * ... | semmle.label | * ... | +| test_free.cpp:129:10:129:11 | * ... | semmle.label | * ... | +| test_free.cpp:152:27:152:27 | a | semmle.label | a | +| test_free.cpp:152:27:152:27 | a | semmle.label | a | +| test_free.cpp:154:10:154:10 | a | semmle.label | a | +| test_free.cpp:154:10:154:10 | a | semmle.label | a | +| test_free.cpp:207:10:207:10 | a | semmle.label | a | +| test_free.cpp:207:10:207:10 | a | semmle.label | a | +| test_free.cpp:209:10:209:10 | a | semmle.label | a | +| test_free.cpp:209:10:209:10 | a | semmle.label | a | +subpaths +#select +| test_free.cpp:14:10:14:10 | a | test_free.cpp:11:10:11:10 | a | test_free.cpp:14:10:14:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:11:5:11:8 | call to free | call to free | +| test_free.cpp:14:10:14:10 | a | test_free.cpp:11:10:11:10 | a | test_free.cpp:14:10:14:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:11:5:11:8 | call to free | call to free | +| test_free.cpp:14:10:14:10 | a | test_free.cpp:11:10:11:10 | a | test_free.cpp:14:10:14:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:11:5:11:8 | call to free | call to free | +| test_free.cpp:14:10:14:10 | a | test_free.cpp:11:10:11:10 | a | test_free.cpp:14:10:14:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:11:5:11:8 | call to free | call to free | +| test_free.cpp:31:27:31:27 | a | test_free.cpp:30:10:30:10 | a | test_free.cpp:31:27:31:27 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:30:5:30:8 | call to free | call to free | +| test_free.cpp:37:27:37:27 | a | test_free.cpp:35:10:35:10 | a | test_free.cpp:37:27:37:27 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:35:5:35:8 | call to free | call to free | +| test_free.cpp:46:10:46:10 | a | test_free.cpp:42:27:42:27 | a | test_free.cpp:46:10:46:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:42:22:42:25 | call to free | call to free | +| test_free.cpp:46:10:46:10 | a | test_free.cpp:42:27:42:27 | a | test_free.cpp:46:10:46:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:42:22:42:25 | call to free | call to free | +| test_free.cpp:46:10:46:10 | a | test_free.cpp:42:27:42:27 | a | test_free.cpp:46:10:46:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:42:22:42:25 | call to free | call to free | +| test_free.cpp:46:10:46:10 | a | test_free.cpp:42:27:42:27 | a | test_free.cpp:46:10:46:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:42:22:42:25 | call to free | call to free | +| test_free.cpp:46:10:46:10 | a | test_free.cpp:44:27:44:27 | a | test_free.cpp:46:10:46:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:44:22:44:25 | call to free | call to free | +| test_free.cpp:46:10:46:10 | a | test_free.cpp:44:27:44:27 | a | test_free.cpp:46:10:46:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:44:22:44:25 | call to free | call to free | +| test_free.cpp:46:10:46:10 | a | test_free.cpp:44:27:44:27 | a | test_free.cpp:46:10:46:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:44:22:44:25 | call to free | call to free | +| test_free.cpp:46:10:46:10 | a | test_free.cpp:44:27:44:27 | a | test_free.cpp:46:10:46:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:44:22:44:25 | call to free | call to free | +| test_free.cpp:51:10:51:10 | a | test_free.cpp:50:27:50:27 | a | test_free.cpp:51:10:51:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:50:22:50:25 | call to free | call to free | +| test_free.cpp:72:14:72:14 | a | test_free.cpp:69:10:69:10 | a | test_free.cpp:72:14:72:14 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:69:5:69:8 | call to free | call to free | +| test_free.cpp:72:14:72:14 | a | test_free.cpp:69:10:69:10 | a | test_free.cpp:72:14:72:14 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:69:5:69:8 | call to free | call to free | +| test_free.cpp:72:14:72:14 | a | test_free.cpp:69:10:69:10 | a | test_free.cpp:72:14:72:14 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:69:5:69:8 | call to free | call to free | +| test_free.cpp:72:14:72:14 | a | test_free.cpp:69:10:69:10 | a | test_free.cpp:72:14:72:14 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:69:5:69:8 | call to free | call to free | +| test_free.cpp:103:10:103:10 | a | test_free.cpp:101:10:101:10 | a | test_free.cpp:103:10:103:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:101:5:101:8 | call to free | call to free | +| test_free.cpp:129:10:129:11 | * ... | test_free.cpp:128:10:128:11 | * ... | test_free.cpp:129:10:129:11 | * ... | Memory pointed to by '* ...' may already have been freed by $@. | test_free.cpp:128:5:128:8 | call to free | call to free | +| test_free.cpp:154:10:154:10 | a | test_free.cpp:152:27:152:27 | a | test_free.cpp:154:10:154:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:152:22:152:25 | call to free | call to free | +| test_free.cpp:154:10:154:10 | a | test_free.cpp:152:27:152:27 | a | test_free.cpp:154:10:154:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:152:22:152:25 | call to free | call to free | +| test_free.cpp:154:10:154:10 | a | test_free.cpp:152:27:152:27 | a | test_free.cpp:154:10:154:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:152:22:152:25 | call to free | call to free | +| test_free.cpp:154:10:154:10 | a | test_free.cpp:152:27:152:27 | a | test_free.cpp:154:10:154:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:152:22:152:25 | call to free | call to free | +| test_free.cpp:209:10:209:10 | a | test_free.cpp:207:10:207:10 | a | test_free.cpp:209:10:209:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:207:5:207:8 | call to free | call to free | +| test_free.cpp:209:10:209:10 | a | test_free.cpp:207:10:207:10 | a | test_free.cpp:209:10:209:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:207:5:207:8 | call to free | call to free | +| test_free.cpp:209:10:209:10 | a | test_free.cpp:207:10:207:10 | a | test_free.cpp:209:10:209:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:207:5:207:8 | call to free | call to free | +| test_free.cpp:209:10:209:10 | a | test_free.cpp:207:10:207:10 | a | test_free.cpp:209:10:209:10 | a | Memory pointed to by 'a' may already have been freed by $@. | test_free.cpp:207:5:207:8 | call to free | call to free | diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/DoubleFree.qlref b/cpp/ql/test/query-tests/Critical/MemoryFreed/DoubleFree.qlref new file mode 100644 index 00000000000..8e68f14ce22 --- /dev/null +++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/DoubleFree.qlref @@ -0,0 +1 @@ +Critical/DoubleFree.ql diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryFreed.expected b/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryFreed.expected index 0fcfcc8a438..4eb9bb35587 100644 --- a/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryFreed.expected +++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryFreed.expected @@ -26,6 +26,72 @@ | test.cpp:128:15:128:16 | v4 | | test.cpp:185:10:185:12 | cpy | | test.cpp:199:10:199:12 | cpy | +| test_free.cpp:11:10:11:10 | a | +| test_free.cpp:14:10:14:10 | a | +| test_free.cpp:16:10:16:10 | a | +| test_free.cpp:18:18:18:18 | a | +| test_free.cpp:23:10:23:10 | a | +| test_free.cpp:25:10:25:10 | a | +| test_free.cpp:26:10:26:10 | b | +| test_free.cpp:30:10:30:10 | a | +| test_free.cpp:31:27:31:27 | a | +| test_free.cpp:35:10:35:10 | a | +| test_free.cpp:37:27:37:27 | a | +| test_free.cpp:42:27:42:27 | a | +| test_free.cpp:44:27:44:27 | a | +| test_free.cpp:46:10:46:10 | a | +| test_free.cpp:50:27:50:27 | a | +| test_free.cpp:51:10:51:10 | a | +| test_free.cpp:55:27:55:27 | a | +| test_free.cpp:57:10:57:10 | a | +| test_free.cpp:61:10:61:10 | a | +| test_free.cpp:63:10:63:10 | b | +| test_free.cpp:69:10:69:10 | a | +| test_free.cpp:72:14:72:14 | a | +| test_free.cpp:83:12:83:12 | a | +| test_free.cpp:85:12:85:12 | a | +| test_free.cpp:90:10:90:10 | a | +| test_free.cpp:95:10:95:10 | a | +| test_free.cpp:101:10:101:10 | a | +| test_free.cpp:102:23:102:23 | a | +| test_free.cpp:103:10:103:10 | a | +| test_free.cpp:104:10:104:10 | b | +| test_free.cpp:107:23:107:23 | a | +| test_free.cpp:112:14:112:14 | a | +| test_free.cpp:114:10:114:10 | b | +| test_free.cpp:118:23:118:23 | a | +| test_free.cpp:119:17:119:17 | b | +| test_free.cpp:121:14:121:14 | a | +| test_free.cpp:126:10:126:11 | * ... | +| test_free.cpp:128:10:128:11 | * ... | +| test_free.cpp:129:10:129:11 | * ... | +| test_free.cpp:131:10:131:13 | access to array | +| test_free.cpp:132:10:132:13 | access to array | +| test_free.cpp:143:27:143:30 | data | +| test_free.cpp:145:14:145:22 | * ... | +| test_free.cpp:148:10:148:17 | list_ptr | +| test_free.cpp:152:27:152:27 | a | +| test_free.cpp:154:10:154:10 | a | +| test_free.cpp:159:14:159:15 | * ... | +| test_free.cpp:162:10:162:10 | a | +| test_free.cpp:167:23:167:23 | a | +| test_free.cpp:173:10:173:10 | a | +| test_free.cpp:181:10:181:10 | a | +| test_free.cpp:183:10:183:10 | a | +| test_free.cpp:185:10:185:10 | a | +| test_free.cpp:188:10:188:10 | a | +| test_free.cpp:193:20:193:20 | a | +| test_free.cpp:199:20:199:20 | a | +| test_free.cpp:205:10:205:10 | a | +| test_free.cpp:207:10:207:10 | a | +| test_free.cpp:209:10:209:10 | a | +| test_free.cpp:213:10:213:10 | a | +| test_free.cpp:216:10:216:10 | a | +| test_free.cpp:220:10:220:10 | a | +| test_free.cpp:227:24:227:45 | memory_descriptor_list | +| test_free.cpp:233:14:233:15 | * ... | +| test_free.cpp:239:14:239:15 | * ... | +| test_free.cpp:245:10:245:11 | * ... | | virtual.cpp:18:10:18:10 | a | | virtual.cpp:19:10:19:10 | c | | virtual.cpp:38:10:38:10 | b | diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryMayNotBeFreed.expected b/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryMayNotBeFreed.expected index e69de29bb2d..fa069b8b46a 100644 --- a/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryMayNotBeFreed.expected +++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryMayNotBeFreed.expected @@ -0,0 +1 @@ +| test_free.cpp:36:22:36:35 | ... = ... | This memory allocation may not be released at $@. | test_free.cpp:38:1:38:1 | return ... | this exit point | diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryNeverFreed.expected b/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryNeverFreed.expected index 71ba526c674..827c207b659 100644 --- a/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryNeverFreed.expected +++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryNeverFreed.expected @@ -11,3 +11,4 @@ | test.cpp:156:3:156:26 | new | This memory is never freed. | | test.cpp:157:3:157:26 | new[] | This memory is never freed. | | test.cpp:169:14:169:19 | call to strdup | This memory is never freed. | +| test_free.cpp:167:15:167:21 | call to realloc | This memory is never freed. | diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/UseAfterFree.expected b/cpp/ql/test/query-tests/Critical/MemoryFreed/UseAfterFree.expected new file mode 100644 index 00000000000..54bad8e6cbc --- /dev/null +++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/UseAfterFree.expected @@ -0,0 +1,100 @@ +edges +| test_free.cpp:11:10:11:10 | a | test_free.cpp:12:5:12:5 | a | +| test_free.cpp:11:10:11:10 | a | test_free.cpp:12:5:12:5 | a | +| test_free.cpp:11:10:11:10 | a | test_free.cpp:13:6:13:6 | a | +| test_free.cpp:11:10:11:10 | a | test_free.cpp:13:6:13:6 | a | +| test_free.cpp:42:27:42:27 | a | test_free.cpp:45:5:45:5 | a | +| test_free.cpp:42:27:42:27 | a | test_free.cpp:45:5:45:5 | a | +| test_free.cpp:44:27:44:27 | a | test_free.cpp:45:5:45:5 | a | +| test_free.cpp:44:27:44:27 | a | test_free.cpp:45:5:45:5 | a | +| test_free.cpp:69:10:69:10 | a | test_free.cpp:71:9:71:9 | a | +| test_free.cpp:69:10:69:10 | a | test_free.cpp:71:9:71:9 | a | +| test_free.cpp:90:10:90:10 | a | test_free.cpp:91:5:91:5 | a | +| test_free.cpp:90:10:90:10 | a | test_free.cpp:91:5:91:5 | a | +| test_free.cpp:95:10:95:10 | a | test_free.cpp:96:9:96:9 | a | +| test_free.cpp:101:10:101:10 | a | test_free.cpp:102:23:102:23 | a | +| test_free.cpp:152:27:152:27 | a | test_free.cpp:153:5:153:5 | a | +| test_free.cpp:152:27:152:27 | a | test_free.cpp:153:5:153:5 | a | +| test_free.cpp:233:14:233:15 | * ... | test_free.cpp:236:9:236:10 | * ... | +| test_free.cpp:233:14:233:15 | * ... | test_free.cpp:236:9:236:10 | * ... | +| test_free.cpp:233:14:233:15 | * ... | test_free.cpp:236:9:236:10 | * ... | +| test_free.cpp:233:14:233:15 | * ... | test_free.cpp:236:9:236:10 | * ... | +| test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:9:241:10 | * ... | +| test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:9:241:10 | * ... | +| test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:9:241:10 | * ... | +| test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:9:241:10 | * ... | +| test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:10:241:10 | b | +| test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:10:241:10 | b | +| test_free.cpp:245:10:245:11 | * ... | test_free.cpp:246:9:246:10 | * ... | +| test_free.cpp:245:10:245:11 | * ... | test_free.cpp:246:9:246:10 | * ... | +| test_free.cpp:245:10:245:11 | * ... | test_free.cpp:246:9:246:10 | * ... | +| test_free.cpp:245:10:245:11 | * ... | test_free.cpp:246:9:246:10 | * ... | +nodes +| test_free.cpp:11:10:11:10 | a | semmle.label | a | +| test_free.cpp:11:10:11:10 | a | semmle.label | a | +| test_free.cpp:12:5:12:5 | a | semmle.label | a | +| test_free.cpp:13:6:13:6 | a | semmle.label | a | +| test_free.cpp:42:27:42:27 | a | semmle.label | a | +| test_free.cpp:42:27:42:27 | a | semmle.label | a | +| test_free.cpp:44:27:44:27 | a | semmle.label | a | +| test_free.cpp:44:27:44:27 | a | semmle.label | a | +| test_free.cpp:45:5:45:5 | a | semmle.label | a | +| test_free.cpp:45:5:45:5 | a | semmle.label | a | +| test_free.cpp:69:10:69:10 | a | semmle.label | a | +| test_free.cpp:69:10:69:10 | a | semmle.label | a | +| test_free.cpp:71:9:71:9 | a | semmle.label | a | +| test_free.cpp:90:10:90:10 | a | semmle.label | a | +| test_free.cpp:90:10:90:10 | a | semmle.label | a | +| test_free.cpp:91:5:91:5 | a | semmle.label | a | +| test_free.cpp:95:10:95:10 | a | semmle.label | a | +| test_free.cpp:96:9:96:9 | a | semmle.label | a | +| test_free.cpp:101:10:101:10 | a | semmle.label | a | +| test_free.cpp:102:23:102:23 | a | semmle.label | a | +| test_free.cpp:152:27:152:27 | a | semmle.label | a | +| test_free.cpp:152:27:152:27 | a | semmle.label | a | +| test_free.cpp:153:5:153:5 | a | semmle.label | a | +| test_free.cpp:233:14:233:15 | * ... | semmle.label | * ... | +| test_free.cpp:233:14:233:15 | * ... | semmle.label | * ... | +| test_free.cpp:236:9:236:10 | * ... | semmle.label | * ... | +| test_free.cpp:236:9:236:10 | * ... | semmle.label | * ... | +| test_free.cpp:239:14:239:15 | * ... | semmle.label | * ... | +| test_free.cpp:239:14:239:15 | * ... | semmle.label | * ... | +| test_free.cpp:241:9:241:10 | * ... | semmle.label | * ... | +| test_free.cpp:241:9:241:10 | * ... | semmle.label | * ... | +| test_free.cpp:241:10:241:10 | b | semmle.label | b | +| test_free.cpp:245:10:245:11 | * ... | semmle.label | * ... | +| test_free.cpp:245:10:245:11 | * ... | semmle.label | * ... | +| test_free.cpp:246:9:246:10 | * ... | semmle.label | * ... | +| test_free.cpp:246:9:246:10 | * ... | semmle.label | * ... | +subpaths +#select +| test_free.cpp:12:5:12:5 | a | test_free.cpp:11:10:11:10 | a | test_free.cpp:12:5:12:5 | a | Memory may have been previously freed by $@. | test_free.cpp:11:5:11:8 | call to free | call to free | +| test_free.cpp:12:5:12:5 | a | test_free.cpp:11:10:11:10 | a | test_free.cpp:12:5:12:5 | a | Memory may have been previously freed by $@. | test_free.cpp:11:5:11:8 | call to free | call to free | +| test_free.cpp:13:6:13:6 | a | test_free.cpp:11:10:11:10 | a | test_free.cpp:13:6:13:6 | a | Memory may have been previously freed by $@. | test_free.cpp:11:5:11:8 | call to free | call to free | +| test_free.cpp:13:6:13:6 | a | test_free.cpp:11:10:11:10 | a | test_free.cpp:13:6:13:6 | a | Memory may have been previously freed by $@. | test_free.cpp:11:5:11:8 | call to free | call to free | +| test_free.cpp:45:5:45:5 | a | test_free.cpp:42:27:42:27 | a | test_free.cpp:45:5:45:5 | a | Memory may have been previously freed by $@. | test_free.cpp:42:22:42:25 | call to free | call to free | +| test_free.cpp:45:5:45:5 | a | test_free.cpp:42:27:42:27 | a | test_free.cpp:45:5:45:5 | a | Memory may have been previously freed by $@. | test_free.cpp:42:22:42:25 | call to free | call to free | +| test_free.cpp:45:5:45:5 | a | test_free.cpp:44:27:44:27 | a | test_free.cpp:45:5:45:5 | a | Memory may have been previously freed by $@. | test_free.cpp:44:22:44:25 | call to free | call to free | +| test_free.cpp:45:5:45:5 | a | test_free.cpp:44:27:44:27 | a | test_free.cpp:45:5:45:5 | a | Memory may have been previously freed by $@. | test_free.cpp:44:22:44:25 | call to free | call to free | +| test_free.cpp:71:9:71:9 | a | test_free.cpp:69:10:69:10 | a | test_free.cpp:71:9:71:9 | a | Memory may have been previously freed by $@. | test_free.cpp:69:5:69:8 | call to free | call to free | +| test_free.cpp:71:9:71:9 | a | test_free.cpp:69:10:69:10 | a | test_free.cpp:71:9:71:9 | a | Memory may have been previously freed by $@. | test_free.cpp:69:5:69:8 | call to free | call to free | +| test_free.cpp:91:5:91:5 | a | test_free.cpp:90:10:90:10 | a | test_free.cpp:91:5:91:5 | a | Memory may have been previously freed by $@. | test_free.cpp:90:5:90:8 | call to free | call to free | +| test_free.cpp:91:5:91:5 | a | test_free.cpp:90:10:90:10 | a | test_free.cpp:91:5:91:5 | a | Memory may have been previously freed by $@. | test_free.cpp:90:5:90:8 | call to free | call to free | +| test_free.cpp:96:9:96:9 | a | test_free.cpp:95:10:95:10 | a | test_free.cpp:96:9:96:9 | a | Memory may have been previously freed by $@. | test_free.cpp:95:5:95:8 | call to free | call to free | +| test_free.cpp:102:23:102:23 | a | test_free.cpp:101:10:101:10 | a | test_free.cpp:102:23:102:23 | a | Memory may have been previously freed by $@. | test_free.cpp:101:5:101:8 | call to free | call to free | +| test_free.cpp:153:5:153:5 | a | test_free.cpp:152:27:152:27 | a | test_free.cpp:153:5:153:5 | a | Memory may have been previously freed by $@. | test_free.cpp:152:22:152:25 | call to free | call to free | +| test_free.cpp:153:5:153:5 | a | test_free.cpp:152:27:152:27 | a | test_free.cpp:153:5:153:5 | a | Memory may have been previously freed by $@. | test_free.cpp:152:22:152:25 | call to free | call to free | +| test_free.cpp:236:9:236:10 | * ... | test_free.cpp:233:14:233:15 | * ... | test_free.cpp:236:9:236:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:233:9:233:12 | call to free | call to free | +| test_free.cpp:236:9:236:10 | * ... | test_free.cpp:233:14:233:15 | * ... | test_free.cpp:236:9:236:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:233:9:233:12 | call to free | call to free | +| test_free.cpp:236:9:236:10 | * ... | test_free.cpp:233:14:233:15 | * ... | test_free.cpp:236:9:236:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:233:9:233:12 | call to free | call to free | +| test_free.cpp:236:9:236:10 | * ... | test_free.cpp:233:14:233:15 | * ... | test_free.cpp:236:9:236:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:233:9:233:12 | call to free | call to free | +| test_free.cpp:241:9:241:10 | * ... | test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:9:241:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:239:9:239:12 | call to free | call to free | +| test_free.cpp:241:9:241:10 | * ... | test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:9:241:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:239:9:239:12 | call to free | call to free | +| test_free.cpp:241:9:241:10 | * ... | test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:9:241:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:239:9:239:12 | call to free | call to free | +| test_free.cpp:241:9:241:10 | * ... | test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:9:241:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:239:9:239:12 | call to free | call to free | +| test_free.cpp:241:10:241:10 | b | test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:10:241:10 | b | Memory may have been previously freed by $@. | test_free.cpp:239:9:239:12 | call to free | call to free | +| test_free.cpp:241:10:241:10 | b | test_free.cpp:239:14:239:15 | * ... | test_free.cpp:241:10:241:10 | b | Memory may have been previously freed by $@. | test_free.cpp:239:9:239:12 | call to free | call to free | +| test_free.cpp:246:9:246:10 | * ... | test_free.cpp:245:10:245:11 | * ... | test_free.cpp:246:9:246:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:245:5:245:8 | call to free | call to free | +| test_free.cpp:246:9:246:10 | * ... | test_free.cpp:245:10:245:11 | * ... | test_free.cpp:246:9:246:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:245:5:245:8 | call to free | call to free | +| test_free.cpp:246:9:246:10 | * ... | test_free.cpp:245:10:245:11 | * ... | test_free.cpp:246:9:246:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:245:5:245:8 | call to free | call to free | +| test_free.cpp:246:9:246:10 | * ... | test_free.cpp:245:10:245:11 | * ... | test_free.cpp:246:9:246:10 | * ... | Memory may have been previously freed by $@. | test_free.cpp:245:5:245:8 | call to free | call to free | diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/UseAfterFree.qlref b/cpp/ql/test/query-tests/Critical/MemoryFreed/UseAfterFree.qlref new file mode 100644 index 00000000000..e299a3055e0 --- /dev/null +++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/UseAfterFree.qlref @@ -0,0 +1 @@ +Critical/UseAfterFree.ql \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/test_free.cpp b/cpp/ql/test/query-tests/Critical/MemoryFreed/test_free.cpp new file mode 100644 index 00000000000..8ea72edd64c --- /dev/null +++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/test_free.cpp @@ -0,0 +1,247 @@ +void *malloc(int); +void free(void *); +bool condition(); +void use(void*); +void *realloc(void*, unsigned long); +int strlen(char*); +int asprintf(char ** strp, const char * fmt, ...); + + +void* test_double_free1(int *a) { + free(a); // GOOD + a[5] = 5; // BAD + *a = 5; // BAD + free(a); // BAD + a = (int*) malloc(8); + free(a); // GOOD + a = (int*) malloc(8); + if (!a) free(a); + return a; +} + +void test_double_free_aliasing(void *a, void* b) { + free(a); // GOOD + a = b; + free(a); // GOOD + free(b); // BAD [NOT DETECTED] +} + +void test_dominance1(void *a) { + free(a); + if (condition()) free(a); // BAD +} + +void test_dominance2(void *a) { + free(a); + if (condition()) a = malloc(10); + if (condition()) free(a); // BAD +} + +void test_post_dominance1(int *a) +{ + if (condition()) free(a); + if (condition()) a[2] = 5; // BAD [NOT DETECTED] + if (condition()) free(a); // BAD [NOT DETECTED] + a[2] = 5; // BAD + free(a); // BAD +} + +void test_post_dominance2(void *a) { + if (condition()) free(a); + free(a); // BAD +} + +void test_post_dominance3(void *a) { + if (condition()) free(a); + a = malloc(10); + free(a); // GOOD +} + +void test_use_after_free6(int *a, int *b) { + free(a); + a=b; + free(b); + if (condition()) a[0] = 5; // BAD [NOT DETECTED] +} + +void test_use_after_free7(int *a) { + a[0] = 42; + free(a); + + if (a[3]) { // BAD + free(a); // BAD + } +} + +class A { +public: + void f(); +}; + +void test_new1() { + A *a = new A(); + delete(a); + a->f(); // BAD [NOT DETECTED] + delete(a); // BAD [NOT DETECTED] +} + +void test_dereference1(A *a) { + a->f(); // GOOD + free(a); + a->f(); // BAD +} + +void* use_after_free(void *a) { + free(a); + use(a); // BAD + return a; // BAD +} + +void test_realloc1(void *a) { + free(a); + void *b = realloc(a, sizeof(a)*3); // BAD [NOT DETECTED by cpp/double-free] + free(a); // BAD + free(b); // GOOD +} +void* test_realloc2(char *a) { + void *b = realloc(a, strlen(a)+3); // GOOD + + // From the man page on return values from realloc and reallocarray: + // "If these functions fail, the original block is left untouched; it is not freed or moved." + if (!b) { + free(a); // GOOD + } + free(b); // GOOD +} + +void test_realloc3(void *a) { + void *b = realloc(a, 100); + if (b) free(b); // GOOD + if (!b) { + free(a); // GOOD + } +} + +void test_ptr_deref(void ** a) { + free(*a); + *a = malloc(10); + free(*a); // GOOD + free(*a); // BAD [NOT DETECTED] + *a = malloc(10); + free(a[0]); // GOOD + free(a[1]); // GOOD +} + +struct list { + struct list *next; + void* data; +}; + +void test_loop1(struct list ** list_ptr) { + struct list *next; + while (*list_ptr) { // GOOD + free((*list_ptr)->data); // GOOD + next = (*list_ptr)->next; // GOOD + free(*list_ptr); // GOOD + *list_ptr = next; // GOOD + } + free(list_ptr); // GOOD +} + +void test_use_after_free8(struct list * a) { + if (condition()) free(a); + a->data = malloc(10); // BAD + free(a); // BAD +} + +void test_loop2(char ** a) { + while (*a) { // GOOD + free(*a); // GOOD + a++; + } + free(a); // GOOD +} + +void* test_realloc4() { + void *a = 0; + void *b = realloc(a, 10); // BAD for cpp/memory-never-freed + if (!b) { return a; } + return b; +} + +void test_sizeof(int *a) { + free(a); + int x = sizeof(a[0]); // GOOD +} + +void call_by_reference(char * &a); +int custom_alloc_func(char ** a); + +void test_reassign(char *a) { + free(a); // GOOD + asprintf(&a, "Hello world"); // GOOD + free(a); //GOOD + call_by_reference(a); // GOOD + free(a); // GOOD + int v; + if (v = custom_alloc_func(&a)) return; + free(a); // GOOD +} + +char* test_return1(char *a) { + int ret = condition(); + if (!ret) free(a); + return (ret ? a : 0); +} + +char* test_return2(char *a) { + int ret = condition(); + if (!ret) free(a); + if (ret) return a; + else return 0; +} + +void test_condition1(char *a) { + free(a); + if (asprintf(&a, "Hello world") || condition()); + free(a); //GOOD + if (condition() || asprintf(&a, "Hello world")); + free(a); // BAD +} + +void test_condition2(char *a) { + free(a); + if (condition()) a = (char*) malloc(10); + else custom_alloc_func(&a); + free(a); // GOOD +} + +void* test_return1(void *a) { + free(a); + return a; +} + +void MmFreePagesFromMdl(void*); +void ExFreePool(void*); +void test_ms_free(void * memory_descriptor_list) { + MmFreePagesFromMdl(memory_descriptor_list); //GOOD + ExFreePool(memory_descriptor_list); // GOOD +} + +void test_loop3(char ** a, char ** b) { + if (*a) { + free(*a); + a++; + } + use(*a); // GOOD [FALSE POSITIVE] + + for (;*b; b++) { + free(*b); + } + use(*b); // GOOD [FALSE POSITIVE] +} + +void test_deref(char **a) { + free(*a); + use(*a); // GOOD [FALSE POSITIVE] +} \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Critical/MissingCheckScanf/MissingCheckScanf.expected b/cpp/ql/test/query-tests/Critical/MissingCheckScanf/MissingCheckScanf.expected index a34e79ace7b..cecdf9fa5cc 100644 --- a/cpp/ql/test/query-tests/Critical/MissingCheckScanf/MissingCheckScanf.expected +++ b/cpp/ql/test/query-tests/Critical/MissingCheckScanf/MissingCheckScanf.expected @@ -1,9 +1,8 @@ | test.cpp:35:7:35:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:34:3:34:7 | call to scanf | call to scanf | -| test.cpp:51:7:51:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:50:3:50:7 | call to scanf | call to scanf | | test.cpp:68:7:68:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:67:3:67:7 | call to scanf | call to scanf | | test.cpp:80:7:80:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:79:3:79:7 | call to scanf | call to scanf | -| test.cpp:90:8:90:8 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:89:3:89:7 | call to scanf | call to scanf | -| test.cpp:98:8:98:8 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:97:3:97:7 | call to scanf | call to scanf | +| test.cpp:90:7:90:8 | * ... | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:89:3:89:7 | call to scanf | call to scanf | +| test.cpp:98:7:98:8 | * ... | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:97:3:97:7 | call to scanf | call to scanf | | test.cpp:108:7:108:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:107:3:107:8 | call to fscanf | call to fscanf | | test.cpp:115:7:115:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:114:3:114:8 | call to sscanf | call to sscanf | | test.cpp:164:8:164:8 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:162:7:162:11 | call to scanf | call to scanf | @@ -12,13 +11,9 @@ | test.cpp:224:8:224:8 | j | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 2. | test.cpp:221:7:221:11 | call to scanf | call to scanf | | test.cpp:248:9:248:9 | d | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 2. | test.cpp:246:25:246:29 | call to scanf | call to scanf | | test.cpp:252:9:252:9 | d | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 2. | test.cpp:250:14:250:18 | call to scanf | call to scanf | -| test.cpp:264:7:264:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:263:3:263:7 | call to scanf | call to scanf | | test.cpp:272:7:272:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:271:3:271:7 | call to scanf | call to scanf | | test.cpp:280:7:280:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:279:3:279:7 | call to scanf | call to scanf | | test.cpp:292:7:292:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:291:3:291:7 | call to scanf | call to scanf | -| test.cpp:302:8:302:12 | ptr_i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:301:3:301:7 | call to scanf | call to scanf | -| test.cpp:310:7:310:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:309:3:309:7 | call to scanf | call to scanf | | test.cpp:404:25:404:25 | u | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:403:6:403:11 | call to sscanf | call to sscanf | | test.cpp:416:7:416:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:413:7:413:11 | call to scanf | call to scanf | | test.cpp:423:7:423:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:420:7:420:11 | call to scanf | call to scanf | -| test.cpp:430:6:430:6 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:429:2:429:6 | call to scanf | call to scanf | diff --git a/cpp/ql/test/query-tests/Critical/MissingCheckScanf/test.cpp b/cpp/ql/test/query-tests/Critical/MissingCheckScanf/test.cpp index 5940ad39529..0d52b516739 100644 --- a/cpp/ql/test/query-tests/Critical/MissingCheckScanf/test.cpp +++ b/cpp/ql/test/query-tests/Critical/MissingCheckScanf/test.cpp @@ -48,7 +48,7 @@ int main() int i = 0; scanf("%d", &i); - use(i); // BAD. Design choice: already initialized variables shouldn't make a difference. + use(i); // GOOD. Design choice: already initialized variables are fine. } { @@ -261,7 +261,7 @@ int main() i = 0; scanf("%d", &i); - use(i); // BAD + use(i); // GOOD } { @@ -269,7 +269,7 @@ int main() set_by_ref(i); scanf("%d", &i); - use(i); // BAD + use(i); // GOOD [FALSE POSITIVE] } { @@ -277,7 +277,7 @@ int main() set_by_ptr(&i); scanf("%d", &i); - use(i); // BAD + use(i); // GOOD [FALSE POSITIVE] } { @@ -299,7 +299,7 @@ int main() int *ptr_i = &i; scanf("%d", &i); - use(*ptr_i); // BAD: may not have written `i` + use(*ptr_i); // BAD [NOT DETECTED]: may not have written `i` } { @@ -307,7 +307,7 @@ int main() int *ptr_i = &i; scanf("%d", ptr_i); - use(i); // BAD: may not have written `*ptr_i` + use(i); // BAD [NOT DETECTED]: may not have written `*ptr_i` } { @@ -427,5 +427,5 @@ void scan_and_write() { void scan_and_static_variable() { static int i; scanf("%d", &i); - use(i); // GOOD [FALSE POSITIVE]: static variables are always 0-initialized + use(i); // GOOD: static variables are always 0-initialized } diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/UseAfterFree.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/UseAfterFree.expected index ba5cf94b5b1..e95af7ceb10 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/UseAfterFree.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/UseAfterFree.expected @@ -1,9 +1,74 @@ -| test.cpp:36:6:36:9 | data | Memory pointed to by 'data' may have $@. | test.cpp:35:2:35:5 | call to free | been previously freed | -| test.cpp:70:7:70:10 | data | Memory pointed to by 'data' may have $@. | test.cpp:67:2:67:5 | call to free | been previously freed | -| test.cpp:107:6:107:9 | data | Memory pointed to by 'data' may have $@. | test.cpp:105:2:105:5 | call to free | been previously freed | -| test.cpp:117:6:117:9 | data | Memory pointed to by 'data' may have $@. | test.cpp:115:2:115:5 | call to free | been previously freed | -| test.cpp:150:2:150:2 | c | Memory pointed to by 'c' may have $@. | test.cpp:149:2:149:10 | delete | been previously freed | -| test.cpp:151:4:151:4 | c | Memory pointed to by 'c' may have $@. | test.cpp:149:2:149:10 | delete | been previously freed | -| test.cpp:170:6:170:9 | data | Memory pointed to by 'data' may have $@. | test.cpp:165:2:165:5 | call to free | been previously freed | -| test.cpp:193:6:193:9 | data | Memory pointed to by 'data' may have $@. | test.cpp:191:3:191:6 | call to free | been previously freed | -| test.cpp:201:6:201:6 | x | Memory pointed to by 'x' may have $@. | test.cpp:200:2:200:9 | delete | been previously freed | +edges +| test.cpp:39:7:39:10 | data | test.cpp:41:6:41:9 | data | +| test.cpp:39:7:39:10 | data | test.cpp:41:6:41:9 | data | +| test.cpp:75:7:75:10 | data | test.cpp:79:7:79:10 | data | +| test.cpp:75:7:75:10 | data | test.cpp:79:7:79:10 | data | +| test.cpp:106:7:106:10 | data | test.cpp:108:6:108:9 | data | +| test.cpp:106:7:106:10 | data | test.cpp:108:6:108:9 | data | +| test.cpp:116:7:116:10 | data | test.cpp:119:6:119:9 | data | +| test.cpp:116:7:116:10 | data | test.cpp:119:6:119:9 | data | +| test.cpp:127:7:127:10 | data | test.cpp:130:6:130:9 | data | +| test.cpp:127:7:127:10 | data | test.cpp:130:6:130:9 | data | +| test.cpp:138:7:138:10 | data | test.cpp:141:6:141:9 | data | +| test.cpp:138:7:138:10 | data | test.cpp:141:6:141:9 | data | +| test.cpp:181:7:181:10 | data | test.cpp:186:6:186:9 | data | +| test.cpp:181:7:181:10 | data | test.cpp:186:6:186:9 | data | +| test.cpp:192:7:192:10 | data | test.cpp:197:6:197:9 | data | +| test.cpp:192:7:192:10 | data | test.cpp:197:6:197:9 | data | +| test.cpp:203:7:203:10 | data | test.cpp:209:6:209:9 | data | +| test.cpp:203:7:203:10 | data | test.cpp:209:6:209:9 | data | +| test.cpp:207:8:207:11 | data | test.cpp:209:6:209:9 | data | +| test.cpp:207:8:207:11 | data | test.cpp:209:6:209:9 | data | +nodes +| test.cpp:39:7:39:10 | data | semmle.label | data | +| test.cpp:39:7:39:10 | data | semmle.label | data | +| test.cpp:41:6:41:9 | data | semmle.label | data | +| test.cpp:75:7:75:10 | data | semmle.label | data | +| test.cpp:75:7:75:10 | data | semmle.label | data | +| test.cpp:79:7:79:10 | data | semmle.label | data | +| test.cpp:106:7:106:10 | data | semmle.label | data | +| test.cpp:106:7:106:10 | data | semmle.label | data | +| test.cpp:108:6:108:9 | data | semmle.label | data | +| test.cpp:116:7:116:10 | data | semmle.label | data | +| test.cpp:116:7:116:10 | data | semmle.label | data | +| test.cpp:119:6:119:9 | data | semmle.label | data | +| test.cpp:127:7:127:10 | data | semmle.label | data | +| test.cpp:127:7:127:10 | data | semmle.label | data | +| test.cpp:130:6:130:9 | data | semmle.label | data | +| test.cpp:138:7:138:10 | data | semmle.label | data | +| test.cpp:138:7:138:10 | data | semmle.label | data | +| test.cpp:141:6:141:9 | data | semmle.label | data | +| test.cpp:181:7:181:10 | data | semmle.label | data | +| test.cpp:181:7:181:10 | data | semmle.label | data | +| test.cpp:186:6:186:9 | data | semmle.label | data | +| test.cpp:192:7:192:10 | data | semmle.label | data | +| test.cpp:192:7:192:10 | data | semmle.label | data | +| test.cpp:197:6:197:9 | data | semmle.label | data | +| test.cpp:203:7:203:10 | data | semmle.label | data | +| test.cpp:203:7:203:10 | data | semmle.label | data | +| test.cpp:207:8:207:11 | data | semmle.label | data | +| test.cpp:207:8:207:11 | data | semmle.label | data | +| test.cpp:209:6:209:9 | data | semmle.label | data | +| test.cpp:209:6:209:9 | data | semmle.label | data | +subpaths +#select +| test.cpp:41:6:41:9 | data | test.cpp:39:7:39:10 | data | test.cpp:41:6:41:9 | data | Memory may have been previously freed by $@. | test.cpp:39:2:39:5 | call to free | call to free | +| test.cpp:41:6:41:9 | data | test.cpp:39:7:39:10 | data | test.cpp:41:6:41:9 | data | Memory may have been previously freed by $@. | test.cpp:39:2:39:5 | call to free | call to free | +| test.cpp:79:7:79:10 | data | test.cpp:75:7:75:10 | data | test.cpp:79:7:79:10 | data | Memory may have been previously freed by $@. | test.cpp:75:2:75:5 | call to free | call to free | +| test.cpp:79:7:79:10 | data | test.cpp:75:7:75:10 | data | test.cpp:79:7:79:10 | data | Memory may have been previously freed by $@. | test.cpp:75:2:75:5 | call to free | call to free | +| test.cpp:108:6:108:9 | data | test.cpp:106:7:106:10 | data | test.cpp:108:6:108:9 | data | Memory may have been previously freed by $@. | test.cpp:106:2:106:5 | call to free | call to free | +| test.cpp:108:6:108:9 | data | test.cpp:106:7:106:10 | data | test.cpp:108:6:108:9 | data | Memory may have been previously freed by $@. | test.cpp:106:2:106:5 | call to free | call to free | +| test.cpp:119:6:119:9 | data | test.cpp:116:7:116:10 | data | test.cpp:119:6:119:9 | data | Memory may have been previously freed by $@. | test.cpp:116:2:116:5 | call to free | call to free | +| test.cpp:119:6:119:9 | data | test.cpp:116:7:116:10 | data | test.cpp:119:6:119:9 | data | Memory may have been previously freed by $@. | test.cpp:116:2:116:5 | call to free | call to free | +| test.cpp:130:6:130:9 | data | test.cpp:127:7:127:10 | data | test.cpp:130:6:130:9 | data | Memory may have been previously freed by $@. | test.cpp:127:2:127:5 | call to free | call to free | +| test.cpp:130:6:130:9 | data | test.cpp:127:7:127:10 | data | test.cpp:130:6:130:9 | data | Memory may have been previously freed by $@. | test.cpp:127:2:127:5 | call to free | call to free | +| test.cpp:141:6:141:9 | data | test.cpp:138:7:138:10 | data | test.cpp:141:6:141:9 | data | Memory may have been previously freed by $@. | test.cpp:138:2:138:5 | call to free | call to free | +| test.cpp:141:6:141:9 | data | test.cpp:138:7:138:10 | data | test.cpp:141:6:141:9 | data | Memory may have been previously freed by $@. | test.cpp:138:2:138:5 | call to free | call to free | +| test.cpp:186:6:186:9 | data | test.cpp:181:7:181:10 | data | test.cpp:186:6:186:9 | data | Memory may have been previously freed by $@. | test.cpp:181:2:181:5 | call to free | call to free | +| test.cpp:186:6:186:9 | data | test.cpp:181:7:181:10 | data | test.cpp:186:6:186:9 | data | Memory may have been previously freed by $@. | test.cpp:181:2:181:5 | call to free | call to free | +| test.cpp:197:6:197:9 | data | test.cpp:192:7:192:10 | data | test.cpp:197:6:197:9 | data | Memory may have been previously freed by $@. | test.cpp:192:2:192:5 | call to free | call to free | +| test.cpp:197:6:197:9 | data | test.cpp:192:7:192:10 | data | test.cpp:197:6:197:9 | data | Memory may have been previously freed by $@. | test.cpp:192:2:192:5 | call to free | call to free | +| test.cpp:209:6:209:9 | data | test.cpp:203:7:203:10 | data | test.cpp:209:6:209:9 | data | Memory may have been previously freed by $@. | test.cpp:203:2:203:5 | call to free | call to free | +| test.cpp:209:6:209:9 | data | test.cpp:203:7:203:10 | data | test.cpp:209:6:209:9 | data | Memory may have been previously freed by $@. | test.cpp:203:2:203:5 | call to free | call to free | +| test.cpp:209:6:209:9 | data | test.cpp:207:8:207:11 | data | test.cpp:209:6:209:9 | data | Memory may have been previously freed by $@. | test.cpp:207:3:207:6 | call to free | call to free | +| test.cpp:209:6:209:9 | data | test.cpp:207:8:207:11 | data | test.cpp:209:6:209:9 | data | Memory may have been previously freed by $@. | test.cpp:207:3:207:6 | call to free | call to free | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/test.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/test.cpp index 7018af457ba..1d15293e3ee 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/test.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/test.cpp @@ -6,14 +6,18 @@ typedef unsigned long size_t; void *malloc(size_t size); void free(void *ptr); -void useExternal(char* data); +void useExternal(...); -void use(char* data) +void use_if_nonzero(char* data) { if (data) useExternal(data); } +void use(char* data) { + useExternal(*data); +} + [[noreturn]] void noReturn(); @@ -31,8 +35,9 @@ void test1() { char* data; data = (char *)malloc(100*sizeof(char)); - use(data); // GOOD + use_if_nonzero(data); // GOOD free(data); + use_if_nonzero(data); // BAD [NOT DETECTED] use(data); // BAD } @@ -42,9 +47,11 @@ void test2() data = (char *)malloc(100*sizeof(char)); free(data); myMalloc(&data); + use_if_nonzero(data); // GOOD use(data); // GOOD free(data); myMalloc2(data); + use_if_nonzero(data); // GOOD use(data); // GOOD } @@ -56,6 +63,7 @@ void test3() data = NULL; if (data) { + use_if_nonzero(data); // GOOD use(data); // GOOD } } @@ -67,6 +75,7 @@ void test4() free(data); if (data) { + use_if_nonzero(data); // BAD [NOT DETECTED] use(data); // BAD } } @@ -85,7 +94,8 @@ char* returnsFreedData(int i) void test5() { char* data = returnsFreedData(1); - use(data); // BAD (NOT REPORTED) + use_if_nonzero(data); // BAD [NOT DETECTED] + use(data); // BAD [NOT DETECTED] } void test6() @@ -94,7 +104,8 @@ void test6() data = (char *)malloc(100*sizeof(char)); data2 = data; free(data); - use(data2); // BAD (NOT REPORTED) + use_if_nonzero(data2); // BAD [NOT DETECTED] + use(data); // BAD } void test7() @@ -104,6 +115,7 @@ void test7() data2 = data; free(data); data2 = NULL; + use_if_nonzero(data); // BAD [NOT DETECTED] use(data); // BAD } @@ -114,6 +126,7 @@ void test8() data = data2; free(data); data2 = NULL; + use_if_nonzero(data); // BAD [NOT DETECTED] use(data); // BAD } @@ -124,13 +137,15 @@ void test9() char *data, *data2; free(data); noReturnWrapper(); - use(data); // GOOD + use_if_nonzero(data); // GOOD + use(data); // GOOD [FALSE POSITIVE] } void test10() { for (char *data; true; data = NULL) { + use_if_nonzero(data); // GOOD use(data); // GOOD free(data); } @@ -140,7 +155,7 @@ class myClass { public: myClass() { } - + void myMethod() { } }; @@ -156,7 +171,8 @@ template T test() T* x; use(x); // GOOD delete x; - use(x); // BAD + use_if_nonzero(x); // BAD [NOT DETECTED] + use(x); // BAD [NOT DETECTED] } void test12(int count) @@ -178,7 +194,7 @@ void test13() { data = NULL; } - use(data); // GOOD + use(data); // GOOD [FALSE POSITIVE] } void test14() @@ -198,7 +214,7 @@ template T test15() T* x; use(x); // GOOD delete x; - use(x); // BAD + use(x); // BAD [NOT DETECTED] } void test15runner(void) { diff --git a/csharp/documentation/library-coverage/coverage.csv b/csharp/documentation/library-coverage/coverage.csv index d31ce58ff81..cb01c5e13ad 100644 --- a/csharp/documentation/library-coverage/coverage.csv +++ b/csharp/documentation/library-coverage/coverage.csv @@ -1,28 +1,28 @@ -package,sink,source,summary,sink:code,sink:encryption-decryptor,sink:encryption-encryptor,sink:encryption-keyprop,sink:encryption-symmetrickey,sink:html,sink:remote,sink:sql,sink:xss,source:file,source:local,source:remote,summary:taint,summary:value -Dapper,55,,,,,,,,,,55,,,,,, -JsonToItemsTaskFactory,,,7,,,,,,,,,,,,,7, -Microsoft.ApplicationBlocks.Data,28,,,,,,,,,,28,,,,,, -Microsoft.CSharp,,,24,,,,,,,,,,,,,24, -Microsoft.EntityFrameworkCore,6,,,,,,,,,,6,,,,,, -Microsoft.Extensions.Caching.Distributed,,,15,,,,,,,,,,,,,15, -Microsoft.Extensions.Caching.Memory,,,46,,,,,,,,,,,,,45,1 -Microsoft.Extensions.Configuration,,,83,,,,,,,,,,,,,80,3 -Microsoft.Extensions.DependencyInjection,,,62,,,,,,,,,,,,,62, -Microsoft.Extensions.DependencyModel,,,12,,,,,,,,,,,,,12, -Microsoft.Extensions.FileProviders,,,16,,,,,,,,,,,,,16, -Microsoft.Extensions.FileSystemGlobbing,,,15,,,,,,,,,,,,,13,2 -Microsoft.Extensions.Hosting,,,17,,,,,,,,,,,,,16,1 -Microsoft.Extensions.Http,,,10,,,,,,,,,,,,,10, -Microsoft.Extensions.Logging,,,37,,,,,,,,,,,,,37, -Microsoft.Extensions.Options,,,8,,,,,,,,,,,,,8, -Microsoft.Extensions.Primitives,,,63,,,,,,,,,,,,,63, -Microsoft.Interop,,,27,,,,,,,,,,,,,27, -Microsoft.NET.Build.Tasks,,,1,,,,,,,,,,,,,1, -Microsoft.NETCore.Platforms.BuildTasks,,,4,,,,,,,,,,,,,4, -Microsoft.VisualBasic,,,10,,,,,,,,,,,,,5,5 -Microsoft.Win32,,,8,,,,,,,,,,,,,8, -MySql.Data.MySqlClient,48,,,,,,,,,,48,,,,,, -Newtonsoft.Json,,,91,,,,,,,,,,,,,73,18 -ServiceStack,194,,7,27,,,,,,75,92,,,,,7, -System,65,8,12154,,8,8,9,,4,,33,3,1,3,4,10163,1991 -Windows.Security.Cryptography.Core,1,,,,,,,1,,,,,,,,, +package,sink,source,summary,sink:code,sink:encryption-decryptor,sink:encryption-encryptor,sink:encryption-keyprop,sink:encryption-symmetrickey,sink:html,sink:remote,sink:sql,sink:xss,source:file,source:file-write,source:local,source:remote,summary:taint,summary:value +Dapper,55,,,,,,,,,,55,,,,,,, +JsonToItemsTaskFactory,,,7,,,,,,,,,,,,,,7, +Microsoft.ApplicationBlocks.Data,28,,,,,,,,,,28,,,,,,, +Microsoft.CSharp,,,24,,,,,,,,,,,,,,24, +Microsoft.EntityFrameworkCore,6,,,,,,,,,,6,,,,,,, +Microsoft.Extensions.Caching.Distributed,,,15,,,,,,,,,,,,,,15, +Microsoft.Extensions.Caching.Memory,,,46,,,,,,,,,,,,,,45,1 +Microsoft.Extensions.Configuration,,,83,,,,,,,,,,,,,,80,3 +Microsoft.Extensions.DependencyInjection,,,62,,,,,,,,,,,,,,62, +Microsoft.Extensions.DependencyModel,,,12,,,,,,,,,,,,,,12, +Microsoft.Extensions.FileProviders,,,16,,,,,,,,,,,,,,16, +Microsoft.Extensions.FileSystemGlobbing,,,15,,,,,,,,,,,,,,13,2 +Microsoft.Extensions.Hosting,,,17,,,,,,,,,,,,,,16,1 +Microsoft.Extensions.Http,,,10,,,,,,,,,,,,,,10, +Microsoft.Extensions.Logging,,,37,,,,,,,,,,,,,,37, +Microsoft.Extensions.Options,,,8,,,,,,,,,,,,,,8, +Microsoft.Extensions.Primitives,,,63,,,,,,,,,,,,,,63, +Microsoft.Interop,,,27,,,,,,,,,,,,,,27, +Microsoft.NET.Build.Tasks,,,1,,,,,,,,,,,,,,1, +Microsoft.NETCore.Platforms.BuildTasks,,,4,,,,,,,,,,,,,,4, +Microsoft.VisualBasic,,,10,,,,,,,,,,,,,,5,5 +Microsoft.Win32,,,8,,,,,,,,,,,,,,8, +MySql.Data.MySqlClient,48,,,,,,,,,,48,,,,,,, +Newtonsoft.Json,,,91,,,,,,,,,,,,,,73,18 +ServiceStack,194,,7,27,,,,,,75,92,,,,,,7, +System,65,25,12154,,8,8,9,,4,,33,3,1,17,3,4,10163,1991 +Windows.Security.Cryptography.Core,1,,,,,,,1,,,,,,,,,, diff --git a/csharp/documentation/library-coverage/coverage.rst b/csharp/documentation/library-coverage/coverage.rst index 6324b78ed41..3837422c867 100644 --- a/csharp/documentation/library-coverage/coverage.rst +++ b/csharp/documentation/library-coverage/coverage.rst @@ -8,7 +8,7 @@ C# framework & library support Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE-079` :sub:`Cross-site scripting` `ServiceStack `_,"``ServiceStack.*``, ``ServiceStack``",,7,194, - System,"``System.*``, ``System``",8,12154,65,7 + System,"``System.*``, ``System``",25,12154,65,7 Others,"``Dapper``, ``JsonToItemsTaskFactory``, ``Microsoft.ApplicationBlocks.Data``, ``Microsoft.CSharp``, ``Microsoft.EntityFrameworkCore``, ``Microsoft.Extensions.Caching.Distributed``, ``Microsoft.Extensions.Caching.Memory``, ``Microsoft.Extensions.Configuration``, ``Microsoft.Extensions.DependencyInjection``, ``Microsoft.Extensions.DependencyModel``, ``Microsoft.Extensions.FileProviders``, ``Microsoft.Extensions.FileSystemGlobbing``, ``Microsoft.Extensions.Hosting``, ``Microsoft.Extensions.Http``, ``Microsoft.Extensions.Logging``, ``Microsoft.Extensions.Options``, ``Microsoft.Extensions.Primitives``, ``Microsoft.Interop``, ``Microsoft.NET.Build.Tasks``, ``Microsoft.NETCore.Platforms.BuildTasks``, ``Microsoft.VisualBasic``, ``Microsoft.Win32``, ``MySql.Data.MySqlClient``, ``Newtonsoft.Json``, ``Windows.Security.Cryptography.Core``",,556,138, - Totals,,8,12717,397,7 + Totals,,25,12717,397,7 diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index c2ef44439be..56de88b8aa5 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.5.1 + +No user-facing changes. + ## 1.5.0 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.5.1.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.5.1.md new file mode 100644 index 00000000000..7b24a64aca3 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.5.1.md @@ -0,0 +1,3 @@ +## 1.5.1 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 639f80c4341..c5775c46013 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.5.0 +lastReleaseVersion: 1.5.1 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index c309105c100..dd2973995a2 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.5.0 +version: 1.5.1 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index c2ef44439be..56de88b8aa5 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.5.1 + +No user-facing changes. + ## 1.5.0 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.5.1.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.5.1.md new file mode 100644 index 00000000000..7b24a64aca3 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.5.1.md @@ -0,0 +1,3 @@ +## 1.5.1 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 639f80c4341..c5775c46013 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.5.0 +lastReleaseVersion: 1.5.1 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 3f3e603ee72..9019d4121c4 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.5.0 +version: 1.5.1 groups: - csharp - solorigate diff --git a/csharp/ql/examples/queries.xml b/csharp/ql/examples/queries.xml deleted file mode 100644 index 56abe7737ac..00000000000 --- a/csharp/ql/examples/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/diagnostics.expected b/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/diagnostics.expected index 689ddcc3652..b58a4a0db5b 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/diagnostics.expected +++ b/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/diagnostics.expected @@ -1,7 +1,4 @@ { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL found some projects which cannot be built with .NET Core:\n\n- `test.csproj`", "severity": "warning", "source": { @@ -16,9 +13,6 @@ } } { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL was unable to build the following projects using MSBuild:\n\n- `test.csproj`\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { diff --git a/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/diagnostics.expected b/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/diagnostics.expected index 6eca0003987..550307a43e0 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/diagnostics.expected +++ b/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/diagnostics.expected @@ -1,7 +1,4 @@ { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL was unable to build the following projects using MSBuild:\n\n- `test.sln`\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { @@ -16,9 +13,6 @@ } } { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "Some project files were not found when CodeQL built your project:\n\n- `Example.csproj`\n- `Example.Test.csproj`\n\nThis may lead to subsequent failures. You can check for common causes for missing project files:\n\n- Ensure that the project is built using the [intended operating system](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on) and that filenames on case-sensitive platforms are correctly specified.\n- If your repository uses Git submodules, ensure that those are [checked out](https://github.com/actions/checkout#usage) before the CodeQL Action is run.\n- If you auto-generate some project files as part of your build process, ensure that these are generated before the CodeQL Action is run.", "severity": "error", "source": { diff --git a/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/diagnostics.expected b/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/diagnostics.expected index 0825ee8ae85..ea6f4f87bf5 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/diagnostics.expected +++ b/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/diagnostics.expected @@ -1,7 +1,4 @@ { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL was unable to build the following projects using .NET Core:\n\n- `test.csproj`\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { @@ -16,9 +13,6 @@ } } { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL was unable to build the following projects using MSBuild:\n\n- `test.csproj`\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { @@ -33,9 +27,6 @@ } } { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "[Configure your workflow](https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-xamarin-applications) for this SDK before running CodeQL.", "severity": "error", "source": { diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_run/test.py b/csharp/ql/integration-tests/all-platforms/dotnet_run/test.py index 12ca67463ec..52a0be310cc 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_run/test.py +++ b/csharp/ql/integration-tests/all-platforms/dotnet_run/test.py @@ -1,4 +1,3 @@ -import os from create_database_utils import * from diagnostics_test_utils import * @@ -22,35 +21,35 @@ check_diagnostics() # no arguments, but `--` s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test-db', 'dotnet run --'], "test2-db") check_build_out("Default reply", s) -check_diagnostics(diagnostics_dir="test2-db/diagnostic") +check_diagnostics(test_db="test2-db") # one argument, no `--` s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test2-db', 'dotnet run hello'], "test3-db") check_build_out("Default reply", s) -check_diagnostics(diagnostics_dir="test3-db/diagnostic") +check_diagnostics(test_db="test3-db") # one argument, but `--` s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test3-db', 'dotnet run -- hello'], "test4-db") check_build_out("Default reply", s) -check_diagnostics(diagnostics_dir="test4-db/diagnostic") +check_diagnostics(test_db="test4-db") # two arguments, no `--` s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test4-db', 'dotnet run hello world'], "test5-db") check_build_out("hello, world", s) -check_diagnostics(diagnostics_dir="test5-db/diagnostic") +check_diagnostics(test_db="test5-db") # two arguments, and `--` s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test5-db', 'dotnet run -- hello world'], "test6-db") check_build_out("hello, world", s) -check_diagnostics(diagnostics_dir="test6-db/diagnostic") +check_diagnostics(test_db="test6-db") # shared compilation enabled; tracer should override by changing the command # to `dotnet run -p:UseSharedCompilation=true -p:UseSharedCompilation=false -- hello world` s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test6-db', 'dotnet run -p:UseSharedCompilation=true -- hello world'], "test7-db") check_build_out("hello, world", s) -check_diagnostics(diagnostics_dir="test7-db/diagnostic") +check_diagnostics(test_db="test7-db") # option passed into `dotnet run` s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test7-db', 'dotnet build', 'dotnet run --no-build hello world'], "test8-db") check_build_out("hello, world", s) -check_diagnostics(diagnostics_dir="test8-db/diagnostic") +check_diagnostics(test_db="test8-db") diff --git a/csharp/ql/integration-tests/posix-only/diag_autobuild_script/diagnostics.expected b/csharp/ql/integration-tests/posix-only/diag_autobuild_script/diagnostics.expected index 129675517a6..58a222edffc 100644 --- a/csharp/ql/integration-tests/posix-only/diag_autobuild_script/diagnostics.expected +++ b/csharp/ql/integration-tests/posix-only/diag_autobuild_script/diagnostics.expected @@ -1,7 +1,4 @@ { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL attempted to build your project using a script located at `build.sh`, which failed.\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { @@ -16,9 +13,6 @@ } } { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL could not find any project or solution files in your repository.\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { diff --git a/csharp/ql/integration-tests/posix-only/diag_multiple_scripts/diagnostics.expected b/csharp/ql/integration-tests/posix-only/diag_multiple_scripts/diagnostics.expected index 4e6b5823018..95cc0ada78c 100644 --- a/csharp/ql/integration-tests/posix-only/diag_multiple_scripts/diagnostics.expected +++ b/csharp/ql/integration-tests/posix-only/diag_multiple_scripts/diagnostics.expected @@ -1,7 +1,4 @@ { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL could not find any project or solution files in your repository.\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { @@ -16,9 +13,6 @@ } } { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL found multiple potential build scripts for your project and attempted to run `build.sh`, which failed. This may not be the right build script for your project.\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { diff --git a/csharp/ql/integration-tests/windows-only/diag_autobuild_script/diagnostics.expected b/csharp/ql/integration-tests/windows-only/diag_autobuild_script/diagnostics.expected index 6135496f878..5d4727471f5 100644 --- a/csharp/ql/integration-tests/windows-only/diag_autobuild_script/diagnostics.expected +++ b/csharp/ql/integration-tests/windows-only/diag_autobuild_script/diagnostics.expected @@ -1,7 +1,4 @@ { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL attempted to build your project using a script located at `build.bat`, which failed.\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { @@ -16,9 +13,6 @@ } } { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL could not find any project or solution files in your repository.\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { diff --git a/csharp/ql/integration-tests/windows-only/diag_multiple_scripts/diagnostics.expected b/csharp/ql/integration-tests/windows-only/diag_multiple_scripts/diagnostics.expected index 4e165ac11fc..a34bb04b340 100644 --- a/csharp/ql/integration-tests/windows-only/diag_multiple_scripts/diagnostics.expected +++ b/csharp/ql/integration-tests/windows-only/diag_multiple_scripts/diagnostics.expected @@ -1,7 +1,4 @@ { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL could not find any project or solution files in your repository.\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { @@ -16,9 +13,6 @@ } } { - "attributes": {}, - "helpLinks": [], - "internal": false, "markdownMessage": "CodeQL found multiple potential build scripts for your project and attempted to run `build.bat`, which failed. This may not be the right build script for your project.\n\nSet up a [manual build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", "severity": "error", "source": { diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index c38aef0018a..4ebff5c86a7 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.1 + +No user-facing changes. + ## 0.6.0 ### Deprecated APIs diff --git a/csharp/ql/lib/change-notes/released/0.6.1.md b/csharp/ql/lib/change-notes/released/0.6.1.md new file mode 100644 index 00000000000..6008e49b8e7 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.6.1.md @@ -0,0 +1,3 @@ +## 0.6.1 + +No user-facing changes. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index a3f820f884d..80fb0899f64 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.0 +lastReleaseVersion: 0.6.1 diff --git a/csharp/ql/lib/ext/System.IO.model.yml b/csharp/ql/lib/ext/System.IO.model.yml index 49b0818ef5f..8222f51d624 100644 --- a/csharp/ql/lib/ext/System.IO.model.yml +++ b/csharp/ql/lib/ext/System.IO.model.yml @@ -4,6 +4,23 @@ extensions: extensible: sourceModel data: - ["System.IO", "FileStream", False, "FileStream", "", "", "Argument[this]", "file", "manual"] + - ["System.IO", "FileStream", False, "FileStream", "", "", "Argument[this]", "file-write", "manual"] + - ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String)", "", "Argument[this]", "file-write", "manual"] + - ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String,System.Boolean)", "", "Argument[this]", "file-write", "manual"] + - ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String,System.Boolean,System.Text.Encoding)", "", "Argument[this]", "file-write", "manual"] + - ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String,System.Boolean,System.Text.Encoding,System.Int32)", "", "Argument[this]", "file-write", "manual"] + - ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String,System.Text.Encoding,System.IO.FileStreamOptions)", "", "Argument[this]", "file-write", "manual"] + - ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String,System.IO.FileStreamOptions)", "", "Argument[this]", "file-write", "manual"] + - ["System.IO", "File", False, "Open", "", "", "ReturnValue", "file-write", "manual"] + - ["System.IO", "File", False, "OpenWrite", "", "", "ReturnValue", "file-write", "manual"] + - ["System.IO", "File", False, "Create", "", "", "ReturnValue", "file-write", "manual"] + - ["System.IO", "File", False, "CreateText", "", "", "ReturnValue", "file-write", "manual"] + - ["System.IO", "File", False, "AppendText", "", "", "ReturnValue", "file-write", "manual"] + - ["System.IO", "FileInfo", False, "Open", "", "", "ReturnValue", "file-write", "manual"] + - ["System.IO", "FileInfo", False, "OpenWrite", "", "", "ReturnValue", "file-write", "manual"] + - ["System.IO", "FileInfo", False, "Create", "", "", "ReturnValue", "file-write", "manual"] + - ["System.IO", "FileInfo", False, "CreateText", "", "", "ReturnValue", "file-write", "manual"] + - ["System.IO", "FileInfo", False, "AppendText", "", "", "ReturnValue", "file-write", "manual"] - addsTo: pack: codeql/csharp-all extensible: summaryModel diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index a9a6066f525..672fa8d4f0e 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 0.6.0 +version: 0.6.1 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll index 50784e7d1d9..89140d44af0 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll @@ -215,7 +215,7 @@ module ModelValidation { ) or exists(string kind | sourceModel(_, _, _, _, _, _, _, kind, _) | - not kind = ["local", "remote", "file"] and + not kind = ["local", "remote", "file", "file-write"] and result = "Invalid kind \"" + kind + "\" in source model." ) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll index 865d7b4d6ce..f34554d6eea 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll @@ -361,3 +361,52 @@ module MergePathGraph< } } } + +/** + * Constructs a `PathGraph` from three `PathGraph`s by disjoint union. + */ +module MergePathGraph3< + PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3, + PathGraphSig Graph1, PathGraphSig Graph2, PathGraphSig Graph3> +{ + private module MergedInner = MergePathGraph; + + private module Merged = + MergePathGraph; + + /** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */ + class PathNode instanceof Merged::PathNode { + /** Gets this as a projection on the first given `PathGraph`. */ + PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() } + + /** Gets this as a projection on the second given `PathGraph`. */ + PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() } + + /** Gets this as a projection on the third given `PathGraph`. */ + PathNode3 asPathNode3() { result = super.asPathNode2() } + + /** Gets a textual representation of this element. */ + string toString() { result = super.toString() } + + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + Node getNode() { result = super.getNode() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PathGraph = Merged::PathGraph; +} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll index 6ea97954bdf..cd8e992c980 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll @@ -3031,6 +3031,17 @@ module Impl { this instanceof PathNodeSinkGroup } + private string ppType() { + this instanceof PathNodeSink and result = "" + or + this.(PathNodeMid).getAp() instanceof AccessPathNil and result = "" + or + exists(DataFlowType t | t = this.(PathNodeMid).getAp().getHead().getContainerType() | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { this instanceof PathNodeSink and result = "" or @@ -3046,14 +3057,14 @@ module Impl { } /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -3998,14 +4009,14 @@ module Impl { */ class PartialPathNode extends TPartialPathNode { /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -4046,6 +4057,19 @@ module Impl { */ int getSinkDistance() { result = distSink(this.getNodeEx().getEnclosingCallable()) } + private string ppType() { + this instanceof PartialPathNodeRev and result = "" + or + this.(PartialPathNodeFwd).getAp() instanceof PartialAccessPathNil and result = "" + or + exists(DataFlowType t | + t = this.(PartialPathNodeFwd).getAp().(PartialAccessPathCons).getType() + | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { exists(string s | s = this.(PartialPathNodeFwd).getAp().toString() or diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll index f50f601b45f..77dd7ea90ec 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll @@ -52,23 +52,24 @@ class IDbCommandConstructionSqlExpr extends SqlExpr, ObjectCreation { class DapperCommandDefinitionMethodCallSqlExpr extends SqlExpr, ObjectCreation { DapperCommandDefinitionMethodCallSqlExpr() { this.getObjectType() instanceof Dapper::CommandDefinitionStruct and - exists(Conf c | c.hasFlow(DataFlow::exprNode(this), _)) + DapperCommandDefinitionMethodCallSql::flow(DataFlow::exprNode(this), _) } override Expr getSql() { result = this.getArgumentForName("commandText") } } -private class Conf extends DataFlow4::Configuration { - Conf() { this = "DapperCommandDefinitionFlowConfig" } - - override predicate isSource(DataFlow::Node node) { +private module DapperCommandDefitionMethodCallSqlConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { node.asExpr().(ObjectCreation).getObjectType() instanceof Dapper::CommandDefinitionStruct } - override predicate isSink(DataFlow::Node node) { + predicate isSink(DataFlow::Node node) { exists(MethodCall mc | mc.getTarget() = any(Dapper::SqlMapperClass c).getAQueryMethod() and node.asExpr() = mc.getArgumentForName("command") ) } } + +private module DapperCommandDefinitionMethodCallSql = + DataFlow::Global; diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll index df6827660a0..ee2994ef2fe 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll @@ -162,18 +162,14 @@ class XmlReaderSettingsCreation extends ObjectCreation { } } -private class SettingsDataFlowConfig extends DataFlow3::Configuration { - SettingsDataFlowConfig() { this = "SettingsDataFlowConfig" } +private module SettingsDataFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source.asExpr() instanceof XmlReaderSettingsCreation } - override predicate isSource(DataFlow::Node source) { - source.asExpr() instanceof XmlReaderSettingsCreation - } - - override predicate isSink(DataFlow::Node sink) { - sink.asExpr() instanceof XmlReaderSettingsInstance - } + predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof XmlReaderSettingsInstance } } +private module SettingsDataFlow = DataFlow::Global; + /** A call to `XmlReader.Create`. */ class XmlReaderCreateCall extends MethodCall { XmlReaderCreateCall() { this.getTarget() = any(SystemXmlXmlReaderClass r).getCreateMethod() } @@ -190,8 +186,6 @@ class XmlReaderSettingsInstance extends Expr { /** Gets a possible creation point for this instance of `XmlReaderSettings`. */ XmlReaderSettingsCreation getASettingsCreation() { - exists(SettingsDataFlowConfig settingsFlow | - settingsFlow.hasFlow(DataFlow::exprNode(result), DataFlow::exprNode(this)) - ) + SettingsDataFlow::flow(DataFlow::exprNode(result), DataFlow::exprNode(this)) } } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll index 3fab0bd2d4e..27f70a0d4e4 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll @@ -78,10 +78,12 @@ predicate isExponentialRegex(StringLiteral s) { } /** + * DEPRECATED: Use `ExponentialRegexDataflow` instead. + * * A data flow configuration for tracking exponential worst case time regular expression string * literals to the pattern argument of a regex. */ -class ExponentialRegexDataflow extends DataFlow2::Configuration { +deprecated class ExponentialRegexDataflow extends DataFlow2::Configuration { ExponentialRegexDataflow() { this = "ExponentialRegex" } override predicate isSource(DataFlow::Node s) { isExponentialRegex(s.asExpr()) } @@ -89,15 +91,27 @@ class ExponentialRegexDataflow extends DataFlow2::Configuration { override predicate isSink(DataFlow::Node s) { s.asExpr() = any(RegexOperation c).getPattern() } } +/** + * A data flow configuration for tracking exponential worst case time regular expression string + * literals to the pattern argument of a regex. + */ +private module ExponentialRegexDataFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node s) { isExponentialRegex(s.asExpr()) } + + predicate isSink(DataFlow::Node s) { s.asExpr() = any(RegexOperation c).getPattern() } +} + +module ExponentialRegexDataFlow = DataFlow::Global; + /** * An expression passed as the `input` to a call to a `Regex` method, where the regex appears to * have exponential behavior. */ class ExponentialRegexSink extends DataFlow::ExprNode, Sink { ExponentialRegexSink() { - exists(ExponentialRegexDataflow regexDataflow, RegexOperation regexOperation | + exists(RegexOperation regexOperation | // Exponential regex flows to the pattern argument - regexDataflow.hasFlow(_, DataFlow::exprNode(regexOperation.getPattern())) + ExponentialRegexDataFlow::flow(_, DataFlow::exprNode(regexOperation.getPattern())) | // This is used as an input for this pattern this.getExpr() = regexOperation.getInput() and diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll index 7e9f266a310..005a9e96bfa 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll @@ -26,9 +26,11 @@ abstract class Sink extends DataFlow::ExprNode { } abstract class Sanitizer extends DataFlow::ExprNode { } /** + * DEPRECATED: Use `TaintedPath` instead. + * * A taint-tracking configuration for uncontrolled data in path expression vulnerabilities. */ -class TaintTrackingConfiguration extends TaintTracking::Configuration { +deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration { TaintTrackingConfiguration() { this = "TaintedPath" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -38,6 +40,22 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } } +/** + * A taint-tracking configuration for uncontrolled data in path expression vulnerabilities. + */ +private module TaintedPathConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** + * A taint-tracking module for uncontrolled data in path expression vulnerabilities. + */ +module TaintedPath = TaintTracking::Global; + /** A source of remote user input. */ class RemoteSource extends Source instanceof RemoteFlowSource { } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll index 3ccc1f64fd4..cf586517d55 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll @@ -75,9 +75,11 @@ class JsonConvertTrackingConfig extends TaintTracking::Configuration { } /** + * DEPRECATED: Use `TypeNameTracking` instead. + * * Tracks unsafe `TypeNameHandling` setting to `JsonConvert` call */ -class TypeNameTrackingConfig extends DataFlow::Configuration { +deprecated class TypeNameTrackingConfig extends DataFlow::Configuration { TypeNameTrackingConfig() { this = "TypeNameTrackingConfig" } override predicate isSource(DataFlow::Node source) { @@ -127,6 +129,62 @@ class TypeNameTrackingConfig extends DataFlow::Configuration { } } +/** + * Configuration module for tracking unsafe `TypeNameHandling` setting to `JsonConvert` calls. + */ +private module TypeNameTrackingConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + ( + source.asExpr() instanceof MemberConstantAccess and + source.getType() instanceof TypeNameHandlingEnum + or + source.asExpr() instanceof IntegerLiteral + ) and + source.asExpr().hasValue() and + not source.asExpr().getValue() = "0" + } + + predicate isSink(DataFlow::Node sink) { + exists(MethodCall mc, Method m, Expr expr | + m = mc.getTarget() and + ( + not mc.getArgument(0).hasValue() and + m instanceof NewtonsoftJsonConvertClassDeserializeObjectMethod + ) and + expr = mc.getAnArgument() and + sink.asExpr() = expr and + expr.getType() instanceof JsonSerializerSettingsClass + ) + } + + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + node1.asExpr() instanceof IntegerLiteral and + node2.asExpr().(CastExpr).getExpr() = node1.asExpr() + or + node1.getType() instanceof TypeNameHandlingEnum and + exists(PropertyWrite pw, Property p, Assignment a | + a.getLValue() = pw and + pw.getProperty() = p and + p.getDeclaringType() instanceof JsonSerializerSettingsClass and + p.hasName("TypeNameHandling") and + ( + node1.asExpr() = a.getRValue() and + node2.asExpr() = pw.getQualifier() + or + exists(ObjectInitializer oi | + node1.asExpr() = oi.getAMemberInitializer().getRValue() and + node2.asExpr() = oi + ) + ) + ) + } +} + +/** + * Configuration module for tracking unsafe `TypeNameHandling` setting to `JsonConvert` calls. + */ +module TypeNameTracking = DataFlow::Global; + /** * User input to static method or constructor call deserialization flow tracking. */ diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll index 499ff5c4a09..44b90cf3096 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll @@ -33,9 +33,11 @@ abstract class Sanitizer extends DataFlow::ExprNode { } abstract deprecated class SanitizerGuard extends DataFlow::BarrierGuard { } /** + * DEPRECATED: Use `UrlRedirect` instead. + * * A taint-tracking configuration for reasoning about unvalidated URL redirect vulnerabilities. */ -class TaintTrackingConfiguration extends TaintTracking::Configuration { +deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration { TaintTrackingConfiguration() { this = "UrlRedirect" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -49,6 +51,22 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { } } +/** + * A taint-tracking configuration for reasoning about unvalidated URL redirect vulnerabilities. + */ +private module UrlRedirectConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** + * A taint-tracking module for reasoning about unvalidated URL redirect vulnerabilities. + */ +module UrlRedirect = TaintTracking::Global; + /** A source of remote user input. */ class RemoteSource extends Source instanceof RemoteFlowSource { } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll index ea5a16b6aaf..e2d347a2268 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll @@ -44,9 +44,11 @@ private class InsecureXmlSink extends Sink { abstract class Sanitizer extends DataFlow::Node { } /** + * DEPRECATED: Use `XmlEntityInjection` instead. + * * A taint-tracking configuration for untrusted user input used in XML processing. */ -class TaintTrackingConfiguration extends TaintTracking::Configuration { +deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration { TaintTrackingConfiguration() { this = "XMLInjection" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -61,6 +63,36 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { } } +/** + * A taint-tracking configuration for untrusted user input used in XML processing. + */ +private module XmlEntityInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** + * A taint-tracking module for untrusted user input used in XML processing. + */ +module XmlEntityInjection implements DataFlow::GlobalFlowSig { + import TaintTracking::Global as Super + import Super + + /** + * Holds if data can flow from `source` to `sink`. + * + * The corresponding paths are generated from the end-points and the graph + * included in the module `PathGraph`. + */ + predicate flowPath(XmlEntityInjection::PathNode source, XmlEntityInjection::PathNode sink) { + Super::flowPath(source, sink) and + exists(sink.getNode().(Sink).getReason()) + } +} + private class SimpleTypeSanitizer extends Sanitizer, SimpleTypeSanitizedExpr { } private class GuidSanitizer extends Sanitizer, GuidSanitizedExpr { } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll index f6f02fcd426..57a0d6e9b50 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll @@ -24,9 +24,11 @@ abstract class Sink extends DataFlow::ExprNode { } abstract class Sanitizer extends DataFlow::ExprNode { } /** + * DEPRECATED: Use `XpathInjection` instead. + * * A taint-tracking configuration for untrusted user input used in XPath expression. */ -class TaintTrackingConfiguration extends TaintTracking::Configuration { +deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration { TaintTrackingConfiguration() { this = "XPathInjection" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -36,6 +38,32 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } } +/** + * A taint-tracking configuration for untrusted user input used in XPath expression. + */ +module XpathInjectionConfig implements DataFlow::ConfigSig { + /** + * Holds if `source` is a relevant data flow source. + */ + predicate isSource(DataFlow::Node source) { source instanceof Source } + + /** + * Holds if `sink` is a relevant data flow sink. + */ + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + /** + * Holds if data flow through `node` is prohibited. This completely removes + * `node` from the data flow graph. + */ + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** + * A taint-tracking module for untrusted user input used in XPath expression. + */ +module XpathInjection = TaintTracking::Global; + /** A source of remote user input. */ class RemoteSource extends Source instanceof RemoteFlowSource { } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll index 72a1d930354..5ad2b6bc675 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll @@ -18,12 +18,10 @@ private import semmle.code.csharp.dataflow.TaintTracking2 */ predicate xssFlow(XssNode source, XssNode sink, string message) { // standard taint-tracking - exists( - TaintTrackingConfiguration c, DataFlow2::PathNode sourceNode, DataFlow2::PathNode sinkNode - | + exists(XssTracking::PathNode sourceNode, XssTracking::PathNode sinkNode | sourceNode = source.asDataFlowNode() and sinkNode = sink.asDataFlowNode() and - c.hasFlowPath(sourceNode, sinkNode) and + XssTracking::flowPath(sourceNode, sinkNode) and message = "is written to HTML or JavaScript" + any(string explanation | @@ -45,7 +43,7 @@ predicate xssFlow(XssNode source, XssNode sink, string message) { module PathGraph { /** Holds if `(pred,succ)` is an edge in the graph of data flow path explanations. */ query predicate edges(XssNode pred, XssNode succ) { - exists(DataFlow2::PathNode a, DataFlow2::PathNode b | DataFlow2::PathGraph::edges(a, b) | + exists(XssTracking::PathNode a, XssTracking::PathNode b | XssTracking::PathGraph::edges(a, b) | pred.asDataFlowNode() = a and succ.asDataFlowNode() = b ) @@ -56,7 +54,7 @@ module PathGraph { /** Holds if `n` is a node in the graph of data flow path explanations. */ query predicate nodes(XssNode n, string key, string val) { - DataFlow2::PathGraph::nodes(n.asDataFlowNode(), key, val) + XssTracking::PathGraph::nodes(n.asDataFlowNode(), key, val) or xssFlow(n, n, _) and key = "semmle.label" and @@ -69,13 +67,13 @@ module PathGraph { * `ret -> out` is summarized as the edge `arg -> out`. */ query predicate subpaths(XssNode arg, XssNode par, XssNode ret, XssNode out) { - DataFlow2::PathGraph::subpaths(arg.asDataFlowNode(), par.asDataFlowNode(), ret.asDataFlowNode(), - out.asDataFlowNode()) + XssTracking::PathGraph::subpaths(arg.asDataFlowNode(), par.asDataFlowNode(), + ret.asDataFlowNode(), out.asDataFlowNode()) } } private newtype TXssNode = - TXssDataFlowNode(DataFlow2::PathNode node) or + TXssDataFlowNode(XssTracking::PathNode node) or TXssAspNode(AspInlineMember m) /** @@ -90,21 +88,25 @@ class XssNode extends TXssNode { /** Gets the location of this node. */ Location getLocation() { none() } - /** Gets the data flow node corresponding to this node, if any. */ - DataFlow2::PathNode asDataFlowNode() { result = this.(XssDataFlowNode).getDataFlowNode() } + /** + * Gets the data flow node corresponding to this node, if any. + */ + XssTracking::PathNode asDataFlowNode() { result = this.(XssDataFlowNode).getDataFlowNode() } /** Gets the ASP inline code element corresponding to this node, if any. */ AspInlineMember asAspInlineMember() { result = this.(XssAspNode).getAspInlineMember() } } -/** A data flow node, viewed as an XSS flow node. */ +/** + * A data flow node, viewed as an XSS flow node. + */ class XssDataFlowNode extends TXssDataFlowNode, XssNode { - DataFlow2::PathNode node; + XssTracking::PathNode node; XssDataFlowNode() { this = TXssDataFlowNode(node) } /** Gets the data flow node corresponding to this node. */ - DataFlow2::PathNode getDataFlowNode() { result = node } + XssTracking::PathNode getDataFlowNode() { result = node } override string toString() { result = node.toString() } @@ -136,9 +138,11 @@ abstract class Source extends DataFlow::Node { } abstract class Sanitizer extends DataFlow::ExprNode { } /** + * DEPRECATED: Use `XssTracking` instead. + * * A taint-tracking configuration for cross-site scripting (XSS) vulnerabilities. */ -class TaintTrackingConfiguration extends TaintTracking2::Configuration { +deprecated class TaintTrackingConfiguration extends TaintTracking2::Configuration { TaintTrackingConfiguration() { this = "XSSDataFlowConfiguration" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -148,6 +152,29 @@ class TaintTrackingConfiguration extends TaintTracking2::Configuration { override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } } +/** + * A taint-tracking configuration for cross-site scripting (XSS) vulnerabilities. + */ +module XssTrackingConfig implements DataFlow::ConfigSig { + /** + * Holds if `source` is a relevant data flow source. + */ + predicate isSource(DataFlow::Node source) { source instanceof Source } + + /** + * Holds if `sink` is a relevant data flow sink. + */ + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + /** + * Holds if data flow through `node` is prohibited. This completely removes + * `node` from the data flow graph. + */ + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +module XssTracking = TaintTracking::Global; + /** A source of remote user input. */ private class RemoteSource extends Source instanceof RemoteFlowSource { } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ZipSlipQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ZipSlipQuery.qll index 53009a6c4aa..a59b355feb4 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ZipSlipQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ZipSlipQuery.qll @@ -2,432 +2,488 @@ * Provides a taint tracking configuration for reasoning about unsafe zip extraction. */ -import csharp -import semmle.code.csharp.dataflow.TaintTracking2 -import semmle.code.csharp.dataflow.TaintTracking3 -import semmle.code.csharp.controlflow.Guards -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph - -private abstract class AbstractSanitizerMethod extends Method { } - -class MethodSystemStringStartsWith extends AbstractSanitizerMethod { - MethodSystemStringStartsWith() { this.getQualifiedName() = "System.String.StartsWith" } -} - -private abstract class UnsanitizedPathCombiner extends Expr { } - -class PathCombinerViaMethodCall extends UnsanitizedPathCombiner { - PathCombinerViaMethodCall() { - this.(MethodCall).getTarget().hasQualifiedName("System.IO.Path", "Combine") - } -} - -class PathCombinerViaStringInterpolation extends UnsanitizedPathCombiner { - PathCombinerViaStringInterpolation() { exists(InterpolatedStringExpr e | this = e) } -} - -class PathCombinerViaStringConcatenation extends UnsanitizedPathCombiner { - PathCombinerViaStringConcatenation() { exists(AddExpr e | this = e) } -} - -class MethodCallGetFullPath extends MethodCall { - MethodCallGetFullPath() { this.getTarget().hasQualifiedName("System.IO.Path", "GetFullPath") } -} - -class GetFullPathToQualifierTaintTrackingConfiguration extends TaintTracking3::Configuration { - GetFullPathToQualifierTaintTrackingConfiguration() { - this = "GetFullPathToQualifierTaintTrackingConfiguration" - } - - override predicate isSource(DataFlow::Node node) { - exists(MethodCallGetFullPath mcGetFullPath | node = DataFlow::exprNode(mcGetFullPath)) - } - - override predicate isSink(DataFlow::Node node) { - exists(MethodCall mc | - mc.getTarget() instanceof MethodSystemStringStartsWith and - node.asExpr() = mc.getQualifier() - ) - } -} - -/** - * PathCombinerToGetFullPathTaintTrackingConfiguration - A Taint Tracking configuration that tracks - * a File path combining expression (Such as string concatenation, Path.Combine, or string interpolation), - * to a Path.GetFullPath method call's argument. - * - * We need this because we need to find a safe sequence of operations wherein - * - An absolute path is created (uncanonicalized) - * - The Path is canonicalized - * - * If the operations are in the opposite order, the resultant may still contain path traversal characters, - * as you cannot fully resolve a relative path. So we must ascertain that they are conducted in this sequence. - */ -class PathCombinerToGetFullPathTaintTrackingConfiguration extends TaintTracking3::Configuration { - PathCombinerToGetFullPathTaintTrackingConfiguration() { - this = "PathCombinerToGetFullPathTaintTrackingConfiguration " - } - - /** - * We are looking for the result of some Path combining operation (String concat, Path.Combine, etc.) - */ - override predicate isSource(DataFlow::Node node) { - exists(UnsanitizedPathCombiner pathCombiner | node = DataFlow::exprNode(pathCombiner)) - } - - /** - * Find the first (and only) argument of Path.GetFullPath, so we make sure that our expression - * first goes through some path combining function, and then is canonicalized. - */ - override predicate isSink(DataFlow::Node node) { - exists(MethodCallGetFullPath mcGetFullPath | - node = DataFlow::exprNode(mcGetFullPath.getArgument(0)) - ) - } -} - -/** Predicate to check for a safe sequence of events - * Path.Combine THEN Path.GetFullPath is applied (with possibly arbitrary mutations) - */ -private predicate safeCombineGetFullPathSequence(MethodCallGetFullPath mcGetFullPath, Expr q) { - exists(UnsanitizedPathCombiner source, PathCombinerToGetFullPathTaintTrackingConfiguration taintTracking | - taintTracking.hasFlow(DataFlow::exprNode(source), DataFlow::exprNode(mcGetFullPath.getArgument(0))) - ) and - exists(GetFullPathToQualifierTaintTrackingConfiguration qualifierTaintTracker | - qualifierTaintTracker.hasFlow(DataFlow::exprNode(mcGetFullPath), DataFlow::exprNode(q)) - ) -} - -/** -* The set of /valid/ Guards of RootSanitizerMethodCall. -* -* IN CONJUNCTION with BOTH -* Path.Combine -* AND Path.GetFullPath -* OR -* There is a direct flow from Path.GetFullPath to qualifier of RootSanitizerMethodCall. -* -* It is not simply enough for the qualifier of String.StartsWith -* to pass through Path.Combine without also passing through GetFullPath AFTER. -*/ -class RootSanitizerMethodCall extends SanitizerMethodCall { - RootSanitizerMethodCall() { - exists(MethodSystemStringStartsWith sm | this.getTarget() = sm) and - exists(Expr q, AbstractValue v | - this.getQualifier() = q and - v.(AbstractValues::BooleanValue).getValue() = true and - exists(MethodCallGetFullPath mcGetFullPath | safeCombineGetFullPathSequence(mcGetFullPath, q)) - ) - } - - override Expr getFilePathArgument() { result = this.getQualifier() } -} - -/** -* The set of Guards of RootSanitizerMethodCall that are used IN CONJUNCTION with -* Path.GetFullPath - it is not simply enough for the qualifier of String.StartsWith -* to pass through Path.Combine without also passing through GetFullPath. -*/ -class ZipSlipGuard extends Guard { - ZipSlipGuard() { this instanceof SanitizerMethodCall } - - Expr getFilePathArgument() { result = this.(SanitizerMethodCall).getFilePathArgument() } -} - -private abstract class SanitizerMethodCall extends MethodCall { - SanitizerMethodCall() { this instanceof MethodCall } - - abstract Expr getFilePathArgument(); -} - -/** - * SanitizedGuardTaintTrackingConfiguration - A Taint Tracking configuration class to trace - * parameters of a function to calls to RootSanitizerMethodCall (String.StartsWith). - * - * For example, the following function: - * void exampleFn(String somePath){ - * somePath = Path.GetFullPath(somePath); - * ... - * if(somePath.startsWith("aaaaa")) - * ... - * ... - * } - */ -class SanitizedGuardTaintTrackingConfiguration extends TaintTracking2::Configuration { - SanitizedGuardTaintTrackingConfiguration() { this = "SanitizedGuardTaintTrackingConfiguration" } - - override predicate isSource(DataFlow::Node source) { source instanceof DataFlow::ParameterNode } - - override predicate isSink(DataFlow::Node sink) { - exists(RootSanitizerMethodCall smc | - smc.getAnArgument() = sink.asExpr() or - smc.getQualifier() = sink.asExpr() - ) - } -} - -/** - * An AbstractWrapperSanitizerMethod is a Method that - * is a suitable sanitizer for a ZipSlip path that may not have been canonicalized prior. + import csharp + private import semmle.code.csharp.controlflow.Guards + private import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph + + private abstract class AbstractSanitizerMethod extends Method { } + + class MethodSystemStringStartsWith extends AbstractSanitizerMethod { + MethodSystemStringStartsWith() { this.getQualifiedName() = "System.String.StartsWith" } + } + + private abstract class UnsanitizedPathCombiner extends Expr { } + + class PathCombinerViaMethodCall extends UnsanitizedPathCombiner { + PathCombinerViaMethodCall() { + this.(MethodCall).getTarget().hasQualifiedName("System.IO.Path", "Combine") + } + } + + class PathCombinerViaStringInterpolation extends UnsanitizedPathCombiner { + PathCombinerViaStringInterpolation() { exists(InterpolatedStringExpr e | this = e) } + } + + class PathCombinerViaStringConcatenation extends UnsanitizedPathCombiner { + PathCombinerViaStringConcatenation() { exists(AddExpr e | this = e) } + } + + class MethodCallGetFullPath extends MethodCall { + MethodCallGetFullPath() { this.getTarget().hasQualifiedName("System.IO.Path", "GetFullPath") } + } + + /** + * A taint tracking module for GetFullPath to String.StartsWith. + */ + module GetFullPathToQualifierTT = TaintTracking::Global; + + private module GetFullPathToQualifierTaintTrackingConfiguration implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { + exists(MethodCallGetFullPath mcGetFullPath | node = DataFlow::exprNode(mcGetFullPath)) + } + predicate isSink(DataFlow::Node node) { + exists(MethodCall mc | + mc.getTarget() instanceof MethodSystemStringStartsWith and + node.asExpr() = mc.getQualifier() + ) + } + } + + /** + * DEPRECATED: Use `Sanitizer` instead. + * + * A guard for unsafe zip extraction. + */ + abstract deprecated class SanitizerGuard extends DataFlow::BarrierGuard { } + + /** + * DEPRECATED: Use `ZipSlip` instead. + * + * A taint tracking configuration for Zip Slip. + */ + deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration { + TaintTrackingConfiguration() { this = "ZipSlipTaintTracking" } + + override predicate isSource(DataFlow::Node source) { source instanceof Source } + + override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } + + deprecated override predicate isSanitizerGuard(DataFlow::BarrierGuard guard) { + guard instanceof SanitizerGuard + } + } + + /** + * A taint tracking configuration for Zip Slip. + */ + private module ZipSlipConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } + } + + /** + * A taint tracking module for Zip Slip. + */ + module ZipSlip = TaintTracking::Global; + + /** An access to the `FullName` property of a `ZipArchiveEntry`. */ + class ArchiveFullNameSource extends Source { + ArchiveFullNameSource() { + exists(PropertyAccess pa | this.asExpr() = pa | + pa.getTarget().getDeclaringType().hasQualifiedName("System.IO.Compression", "ZipArchiveEntry") and + pa.getTarget().getName() = "FullName" + ) + } + } + + + /** + * A taint tracking module for String combining to GetFullPath. + */ + module PathCombinerToGetFullPathTT = TaintTracking::Global; + + /** + * PathCombinerToGetFullPathTaintTrackingConfiguration - A Taint Tracking configuration that tracks + * a File path combining expression (Such as string concatenation, Path.Combine, or string interpolation), + * to a Path.GetFullPath method call's argument. + * + * We need this because we need to find a safe sequence of operations wherein + * - An absolute path is created (uncanonicalized) + * - The Path is canonicalized + * + * If the operations are in the opposite order, the resultant may still contain path traversal characters, + * as you cannot fully resolve a relative path. So we must ascertain that they are conducted in this sequence. + */ + private module PathCombinerToGetFullPathTaintTrackingConfiguration implements DataFlow::ConfigSig { + /** + * We are looking for the result of some Path combining operation (String concat, Path.Combine, etc.) + */ + predicate isSource(DataFlow::Node node) { + exists(UnsanitizedPathCombiner pathCombiner | node = DataFlow::exprNode(pathCombiner)) + } + + /** + * Find the first (and only) argument of Path.GetFullPath, so we make sure that our expression + * first goes through some path combining function, and then is canonicalized. + */ + predicate isSink(DataFlow::Node node) { + exists(MethodCallGetFullPath mcGetFullPath | + node = DataFlow::exprNode(mcGetFullPath.getArgument(0)) + ) + } + } + + /** Predicate to check for a safe sequence of events + * Path.Combine THEN Path.GetFullPath is applied (with possibly arbitrary mutations) + */ + private predicate safeCombineGetFullPathSequence(MethodCallGetFullPath mcGetFullPath, Expr q) { + exists(UnsanitizedPathCombiner source | + PathCombinerToGetFullPathTT::flow(DataFlow::exprNode(source), DataFlow::exprNode(mcGetFullPath.getArgument(0))) + ) and + GetFullPathToQualifierTT::flow(DataFlow::exprNode(mcGetFullPath), DataFlow::exprNode(q)) + } + + /** + * The set of /valid/ Guards of RootSanitizerMethodCall. * - * If the return value of this Method correctly validates if a file path is in a valid location, - * or is a restricted subset of that validation, then any use of this Method is as valid as the Root - * sanitizer (Path.StartsWith). - */ -private abstract class AbstractWrapperSanitizerMethod extends AbstractSanitizerMethod { - - Parameter paramFilename; - - AbstractWrapperSanitizerMethod() { - this.getReturnType() instanceof BoolType and - this.getAParameter() = paramFilename - } - - Parameter paramFilePath() { result = paramFilename } -} - -/** -* A DirectWrapperSantizierMethod is a Method where -* The function can /only/ returns true when passes through the RootSanitizerGuard -* -* bool wrapperFn(a,b){ -* if(guard(a,b)) -* return true -* .... -* return false -* } -* -* bool wrapperFn(a,b){ -* ... -* return guard(a,b) -* } -*/ -class DirectWrapperSantizierMethod extends AbstractWrapperSanitizerMethod { - - /** - * To be declared a Wrapper, a function must: - * - Be a predicate (return a boolean) - * - Accept and use a parameter which represents a File path - * - Contain a call to another sanitizer - * - And can only return true if the sanitizer also returns true. - */ - DirectWrapperSantizierMethod() { - // For every return statement in this Method, - forex(ReturnStmt ret | ret.getEnclosingCallable() = this | - // The function returns false (Fails the Guard) - ret.getExpr().(BoolLiteral).getBoolValue() = false - or - // It passes the guard, contraining the function argument to the Guard argument. - exists(ZipSlipGuard g, SanitizedGuardTaintTrackingConfiguration taintTracker | - g.getEnclosingCallable() = this and - taintTracker - .hasFlow(DataFlow::parameterNode(paramFilename), - DataFlow::exprNode(g.getFilePathArgument())) and - ( - exists(AbstractValues::BooleanValue bv | - // If there exists a control block that guards against misuse - bv.getValue() = true and - g.controlsNode(ret.getAControlFlowNode(), bv) - ) - or - // Or if the function returns the resultant of the guard call - DataFlow::localFlow(DataFlow::exprNode(g), DataFlow::exprNode(ret.getExpr())) - ) - ) - ) - } -} - -/** - * An IndirectOverloadedWrapperSanitizerMethod is a Method in which simply wraps /another/ wrapper.class + * IN CONJUNCTION with BOTH + * Path.Combine + * AND Path.GetFullPath + * OR + * There is a direct flow from Path.GetFullPath to qualifier of RootSanitizerMethodCall. * - * Usually this will look like the following stanza: - * boolean someWrapper(string s){ - * return someWrapper(s, true); - * } + * It is not simply enough for the qualifier of String.StartsWith + * to pass through Path.Combine without also passing through GetFullPath AFTER. */ -class IndirectOverloadedWrapperSantizierMethod extends AbstractWrapperSanitizerMethod { - - /** - * To be declared a Wrapper, a function must: - * - Be a predicate (return a boolean) - * - Accept and use a parameter which represents a File path (via delegation) - * - Contain a call to another sanitizer (via delegation) - * - And can only return true if the delegate sanitizer also returns true. - */ - IndirectOverloadedWrapperSantizierMethod() { - // For every return statement in our Method, - forex(ReturnStmt ret | ret.getEnclosingCallable() = this | - // The Return statement returns false OR - ret.getExpr().(BoolLiteral).getBoolValue() = false - or - // The Method returns the result of calling another known-good sanitizer, connecting - // the parameters of this function to the sanitizer MethodCall. - exists(ZipSlipGuard g | - // If the parameter flows directly to SanitizerMethodCall, and the resultant is returned - DataFlow::localFlow(DataFlow::parameterNode(paramFilename), - DataFlow::exprNode(g.getFilePathArgument())) and - DataFlow::localFlow(DataFlow::exprNode(g), DataFlow::exprNode(ret.getExpr())) - ) - ) - } -} - -/** - * A Wrapped Sanitizer Method call (some function that is equally or more restrictive than our root sanitizer) - * - * bool wrapperMethod(string path){ - * return realSanitizer(path); - * } + class RootSanitizerMethodCall extends SanitizerMethodCall { + RootSanitizerMethodCall() { + exists(MethodSystemStringStartsWith sm | this.getTarget() = sm) and + exists(Expr q, AbstractValue v | + this.getQualifier() = q and + v.(AbstractValues::BooleanValue).getValue() = true and + exists(MethodCallGetFullPath mcGetFullPath | safeCombineGetFullPathSequence(mcGetFullPath, q)) + ) + } + + override Expr getFilePathArgument() { result = this.getQualifier() } + } + + /** + * The set of Guards of RootSanitizerMethodCall that are used IN CONJUNCTION with + * Path.GetFullPath - it is not simply enough for the qualifier of String.StartsWith + * to pass through Path.Combine without also passing through GetFullPath. */ -class WrapperSanitizerMethodCall extends SanitizerMethodCall { - - AbstractWrapperSanitizerMethod wrapperMethod; - - WrapperSanitizerMethodCall() { - exists(AbstractWrapperSanitizerMethod sm | - this.getTarget() = sm and - wrapperMethod = sm - ) - } - - override Expr getFilePathArgument() { - result = this.getArgument(wrapperMethod.paramFilePath().getIndex()) - } -} - -private predicate wrapperCheckGuard(Guard g, Expr e, AbstractValue v) { - // A given wrapper method call, with the filePathArgument as a sink, that returns 'true' - g instanceof WrapperSanitizerMethodCall and - g.(WrapperSanitizerMethodCall).getFilePathArgument() = e and - v.(AbstractValues::BooleanValue).getValue() = true -} - -/** - * A sanitizer for unsafe zip extraction. + class ZipSlipGuard extends Guard { + ZipSlipGuard() { this instanceof SanitizerMethodCall } + + Expr getFilePathArgument() { result = this.(SanitizerMethodCall).getFilePathArgument() } + } + + private abstract class SanitizerMethodCall extends MethodCall { + SanitizerMethodCall() { this instanceof MethodCall } + + abstract Expr getFilePathArgument(); + } + + /** + * A taint tracking module for Zip Slip Guard. + */ + module SanitizedGuardTT = TaintTracking::Global; + + /** + * SanitizedGuardTaintTrackingConfiguration - A Taint Tracking configuration class to trace + * parameters of a function to calls to RootSanitizerMethodCall (String.StartsWith). + * + * For example, the following function: + * void exampleFn(String somePath){ + * somePath = Path.GetFullPath(somePath); + * ... + * if(somePath.startsWith("aaaaa")) + * ... + * ... + * } + */ + private module SanitizedGuardTaintTrackingConfiguration implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source instanceof DataFlow::ParameterNode + } + + predicate isSink(DataFlow::Node sink) { + exists(RootSanitizerMethodCall smc | + smc.getAnArgument() = sink.asExpr() or + smc.getQualifier() = sink.asExpr() + ) + } + } + + /** + * An AbstractWrapperSanitizerMethod is a Method that + * is a suitable sanitizer for a ZipSlip path that may not have been canonicalized prior. + * + * If the return value of this Method correctly validates if a file path is in a valid location, + * or is a restricted subset of that validation, then any use of this Method is as valid as the Root + * sanitizer (Path.StartsWith). + */ + private abstract class AbstractWrapperSanitizerMethod extends AbstractSanitizerMethod { + + Parameter paramFilename; + + AbstractWrapperSanitizerMethod() { + this.getReturnType() instanceof BoolType and + this.getAParameter() = paramFilename + } + + Parameter paramFilePath() { result = paramFilename } + } + + /** + * A DirectWrapperSantizierMethod is a Method where + * The function can /only/ returns true when passes through the RootSanitizerGuard + * + * bool wrapperFn(a,b){ + * if(guard(a,b)) + * return true + * .... + * return false + * } + * + * bool wrapperFn(a,b){ + * ... + * return guard(a,b) + * } */ -private abstract class Sanitizer extends DataFlow::ExprNode { } - -class WrapperCheckSanitizer extends Sanitizer { - // A Wrapped RootSanitizer that is an explicit subset of RootSanitizer - WrapperCheckSanitizer() { this = DataFlow::BarrierGuard::getABarrierNode() } -} - -/** - * A data flow source for unsafe zip extraction. - */ -private abstract class Source extends DataFlow::Node { } - -/** - * Access to the `FullName` property of the archive item - */ -class ArchiveEntryFullName extends Source { - ArchiveEntryFullName() { - exists(PropertyAccess pa | - pa.getTarget().hasQualifiedName("System.IO.Compression.ZipArchiveEntry", "FullName") and - this = DataFlow::exprNode(pa) - ) - } -} - -/** - * A data flow sink for unsafe zip extraction. - */ -private abstract class Sink extends DataFlow::Node { } - -/** - * Argument to extract to file extension method - */ -class SinkCompressionExtractToFileArgument extends Sink { - SinkCompressionExtractToFileArgument() { - exists(MethodCall mc | - mc.getTarget().hasQualifiedName("System.IO.Compression.ZipFileExtensions", "ExtractToFile") and - this.asExpr() = mc.getArgumentForName("destinationFileName") - ) - } -} - -/** - * File Stream created from tainted file name through File.Open/File.Create - */ -class SinkFileOpenArgument extends Sink { - SinkFileOpenArgument() { - exists(MethodCall mc | - ( - mc.getTarget().hasQualifiedName("System.IO.File", "Open") or - mc.getTarget().hasQualifiedName("System.IO.File", "OpenWrite") or - mc.getTarget().hasQualifiedName("System.IO.File", "Create") - ) and - this.asExpr() = mc.getArgumentForName("path") - ) - } -} - -/** - * File Stream created from tainted file name passed directly to the constructor - */ -class SinkStreamConstructorArgument extends Sink { - SinkStreamConstructorArgument() { - exists(ObjectCreation oc | - oc.getTarget().getDeclaringType().hasQualifiedName("System.IO", "FileStream") and - this.asExpr() = oc.getArgumentForName("path") - ) - } -} - - -/** - * Constructor to FileInfo can take tainted file name and subsequently be used to open file stream - */ -class SinkFileInfoConstructorArgument extends Sink { - SinkFileInfoConstructorArgument() { - exists(ObjectCreation oc | - oc.getTarget().getDeclaringType().hasQualifiedName("System.IO", "FileInfo") and - this.asExpr() = oc.getArgumentForName("fileName") - ) - } -} - -/** - * Extracting just file name from a ZipEntry, not the full path - */ -class FileNameExtrationSanitizer extends Sanitizer { - FileNameExtrationSanitizer() { - exists(MethodCall mc | - mc.getTarget().hasQualifiedName("System.IO.Path", "GetFileName") and - this = DataFlow::exprNode(mc.getAnArgument()) - ) - } -} - -/** - * Checks the string for relative path, - * or checks the destination folder for whitelisted/target path, etc - */ -class StringCheckSanitizer extends Sanitizer { - StringCheckSanitizer() { - exists(MethodCall mc | - ( - mc instanceof RootSanitizerMethodCall or - mc.getTarget().hasQualifiedName("System.String", "Substring") - ) and - this = DataFlow::exprNode(mc.getQualifier()) - ) - } -} - -final class ZipSlipTaintTrackingConfiguration extends TaintTracking::Configuration { - ZipSlipTaintTrackingConfiguration() { this = "ZipSlipTaintTrackingConfiguration" } - - override predicate isSource(DataFlow::Node node) { node instanceof Source } - - override predicate isSink(DataFlow::Node node) { node instanceof Sink } - - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { - super.isAdditionalTaintStep(pred, succ) - or - exists(MethodCall mc | succ.asExpr() = mc and pred.asExpr() = mc.getAnArgument()) - } - - override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } -} + class DirectWrapperSantizierMethod extends AbstractWrapperSanitizerMethod { + + /** + * To be declared a Wrapper, a function must: + * - Be a predicate (return a boolean) + * - Accept and use a parameter which represents a File path + * - Contain a call to another sanitizer + * - And can only return true if the sanitizer also returns true. + */ + DirectWrapperSantizierMethod() { + // For every return statement in this Method, + forex(ReturnStmt ret | ret.getEnclosingCallable() = this | + // The function returns false (Fails the Guard) + ret.getExpr().(BoolLiteral).getBoolValue() = false + or + // It passes the guard, contraining the function argument to the Guard argument. + exists(ZipSlipGuard g, DataFlow::Node source, DataFlow::Node sink | + g.getEnclosingCallable() = this and + source = DataFlow::parameterNode(paramFilename) and + sink = DataFlow::exprNode(g.getFilePathArgument()) and + SanitizedGuardTT::flow(source, sink) and + ( + exists(AbstractValues::BooleanValue bv | + // If there exists a control block that guards against misuse + bv.getValue() = true and + g.controlsNode(ret.getAControlFlowNode(), bv) + ) + or + // Or if the function returns the resultant of the guard call + DataFlow::localFlow(DataFlow::exprNode(g), DataFlow::exprNode(ret.getExpr())) + ) + ) + ) + } + } + + /** + * An IndirectOverloadedWrapperSanitizerMethod is a Method in which simply wraps /another/ wrapper.class + * + * Usually this will look like the following stanza: + * boolean someWrapper(string s){ + * return someWrapper(s, true); + * } + */ + class IndirectOverloadedWrapperSantizierMethod extends AbstractWrapperSanitizerMethod { + + /** + * To be declared a Wrapper, a function must: + * - Be a predicate (return a boolean) + * - Accept and use a parameter which represents a File path (via delegation) + * - Contain a call to another sanitizer (via delegation) + * - And can only return true if the delegate sanitizer also returns true. + */ + IndirectOverloadedWrapperSantizierMethod() { + // For every return statement in our Method, + forex(ReturnStmt ret | ret.getEnclosingCallable() = this | + // The Return statement returns false OR + ret.getExpr().(BoolLiteral).getBoolValue() = false + or + // The Method returns the result of calling another known-good sanitizer, connecting + // the parameters of this function to the sanitizer MethodCall. + exists(ZipSlipGuard g | + // If the parameter flows directly to SanitizerMethodCall, and the resultant is returned + DataFlow::localFlow(DataFlow::parameterNode(paramFilename), + DataFlow::exprNode(g.getFilePathArgument())) and + DataFlow::localFlow(DataFlow::exprNode(g), DataFlow::exprNode(ret.getExpr())) + ) + ) + } + } + + /** + * A Wrapped Sanitizer Method call (some function that is equally or more restrictive than our root sanitizer) + * + * bool wrapperMethod(string path){ + * return realSanitizer(path); + * } + */ + class WrapperSanitizerMethodCall extends SanitizerMethodCall { + + AbstractWrapperSanitizerMethod wrapperMethod; + + WrapperSanitizerMethodCall() { + exists(AbstractWrapperSanitizerMethod sm | + this.getTarget() = sm and + wrapperMethod = sm + ) + } + + override Expr getFilePathArgument() { + result = this.getArgument(wrapperMethod.paramFilePath().getIndex()) + } + } + + private predicate wrapperCheckGuard(Guard g, Expr e, AbstractValue v) { + // A given wrapper method call, with the filePathArgument as a sink, that returns 'true' + g instanceof WrapperSanitizerMethodCall and + g.(WrapperSanitizerMethodCall).getFilePathArgument() = e and + v.(AbstractValues::BooleanValue).getValue() = true + } + + /** + * A sanitizer for unsafe zip extraction. + */ + private abstract class Sanitizer extends DataFlow::ExprNode { } + + class WrapperCheckSanitizer extends Sanitizer { + // A Wrapped RootSanitizer that is an explicit subset of RootSanitizer + WrapperCheckSanitizer() { this = DataFlow::BarrierGuard::getABarrierNode() } + } + + /** + * A data flow source for unsafe zip extraction. + */ + private abstract class Source extends DataFlow::Node { } + + /** + * Access to the `FullName` property of the archive item + */ + class ArchiveEntryFullName extends Source { + ArchiveEntryFullName() { + exists(PropertyAccess pa | + pa.getTarget().hasQualifiedName("System.IO.Compression.ZipArchiveEntry", "FullName") and + this = DataFlow::exprNode(pa) + ) + } + } + + /** + * A data flow sink for unsafe zip extraction. + */ + private abstract class Sink extends DataFlow::Node { } + + /** + * Argument to extract to file extension method + */ + class SinkCompressionExtractToFileArgument extends Sink { + SinkCompressionExtractToFileArgument() { + exists(MethodCall mc | + mc.getTarget().hasQualifiedName("System.IO.Compression.ZipFileExtensions", "ExtractToFile") and + this.asExpr() = mc.getArgumentForName("destinationFileName") + ) + } + } + + /** + * File Stream created from tainted file name through File.Open/File.Create + */ + class SinkFileOpenArgument extends Sink { + SinkFileOpenArgument() { + exists(MethodCall mc | + ( + mc.getTarget().hasQualifiedName("System.IO.File", "Open") or + mc.getTarget().hasQualifiedName("System.IO.File", "OpenWrite") or + mc.getTarget().hasQualifiedName("System.IO.File", "Create") + ) and + this.asExpr() = mc.getArgumentForName("path") + ) + } + } + + /** + * File Stream created from tainted file name passed directly to the constructor + */ + class SinkStreamConstructorArgument extends Sink { + SinkStreamConstructorArgument() { + exists(ObjectCreation oc | + oc.getTarget().getDeclaringType().hasQualifiedName("System.IO", "FileStream") and + this.asExpr() = oc.getArgumentForName("path") + ) + } + } + + + /** + * Constructor to FileInfo can take tainted file name and subsequently be used to open file stream + */ + class SinkFileInfoConstructorArgument extends Sink { + SinkFileInfoConstructorArgument() { + exists(ObjectCreation oc | + oc.getTarget().getDeclaringType().hasQualifiedName("System.IO", "FileInfo") and + this.asExpr() = oc.getArgumentForName("fileName") + ) + } + } + + /** + * Extracting just file name from a ZipEntry, not the full path + */ + class FileNameExtrationSanitizer extends Sanitizer { + FileNameExtrationSanitizer() { + exists(MethodCall mc | + mc.getTarget().hasQualifiedName("System.IO.Path", "GetFileName") and + this = DataFlow::exprNode(mc.getAnArgument()) + ) + } + } + + /** + * Checks the string for relative path, + * or checks the destination folder for whitelisted/target path, etc + */ + class StringCheckSanitizer extends Sanitizer { + StringCheckSanitizer() { + exists(MethodCall mc | + ( + mc instanceof RootSanitizerMethodCall or + mc.getTarget().hasQualifiedName("System.String", "Substring") + ) and + this = DataFlow::exprNode(mc.getQualifier()) + ) + } + } + + final class ZipSlipTaintTrackingConfiguration extends TaintTracking::Configuration { + ZipSlipTaintTrackingConfiguration() { this = "ZipSlipTaintTrackingConfiguration" } + + override predicate isSource(DataFlow::Node node) { node instanceof Source } + + override predicate isSink(DataFlow::Node node) { node instanceof Sink } + + override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { + super.isAdditionalTaintStep(pred, succ) + or + exists(MethodCall mc | succ.asExpr() = mc and pred.asExpr() = mc.getAnArgument()) + } + + override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } + } + \ No newline at end of file diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll index 30736bdabf6..26b75f06269 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll @@ -6,6 +6,7 @@ import csharp private import Remote private import semmle.code.csharp.commons.Loggers private import semmle.code.csharp.frameworks.system.Web +private import semmle.code.csharp.frameworks.system.IO private import semmle.code.csharp.dataflow.ExternalFlow /** @@ -63,3 +64,56 @@ class CookieStorageSink extends ExternalLocationSink, RemoteFlowSink { ) } } + +private predicate isFileWriteCall(Expr stream, Expr data) { + exists(MethodCall mc, Method m | mc.getTarget() = m.getAnOverrider*() | + m.hasQualifiedName("System.IO", "Stream", ["Write", "WriteAsync"]) and + stream = mc.getQualifier() and + data = mc.getArgument(0) + or + m.hasQualifiedName("System.IO", "TextWriter", + ["Write", "WriteAsync", "WriteLine", "WriteLineAsync"]) and + stream = mc.getQualifier() and + data = mc.getArgument(0) + or + m.hasQualifiedName("System.Xml.Linq", "XDocument", ["Save", "SaveAsync"]) and + data = mc.getQualifier() and + stream = mc.getArgument(0) + ) +} + +/** A configuration for tracking flow from calls that open a file in write mode to methods that write to that file, excluding encrypted streams. */ +private module LocalFileOutputStreamConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { sourceNode(src, "file-write") } + + predicate isSink(DataFlow::Node sink) { isFileWriteCall(sink.asExpr(), _) } + + predicate isBarrier(DataFlow::Node node) { + node.asExpr() + .(ObjectCreation) + .getObjectType() + .hasQualifiedName("System.Security.Cryptography", "CryptoStream") + } + + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + exists(ObjectCreation oc | + node2.asExpr() = oc and + node1.asExpr() = oc.getArgument(0) and + oc.getObjectType() instanceof SystemIOStreamWriterClass + ) + } +} + +private module LocalFileOutputStreamFlow = DataFlow::Global; + +/** + * A write to the local filesystem. + */ +class LocalFileOutputSink extends ExternalLocationSink { + LocalFileOutputSink() { + exists(DataFlow::Node streamSink | + LocalFileOutputStreamFlow::flowTo(streamSink) and + isFileWriteCall(streamSink.asExpr(), this.asExpr()) + ) + } +} diff --git a/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll index b83795b033a..0517652474a 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll @@ -172,26 +172,24 @@ module XmlReader { isNetFrameworkBefore(this.(MethodCall).getTarget().getDeclaringType(), "4.0") or // bad settings flow here - exists(SettingsDataFlowConfig flow, ObjectCreation settings | - flow.hasFlow(DataFlow::exprNode(settings), DataFlow::exprNode(this.getSettings())) and + exists(ObjectCreation settings | + SettingsDataFlow::flow(DataFlow::exprNode(settings), DataFlow::exprNode(this.getSettings())) and XmlSettings::dtdEnabledSettings(settings, evidence, reason) ) } private predicate insecureResolver(string reason, Expr evidence) { // bad settings flow here - exists(SettingsDataFlowConfig flow, ObjectCreation settings | - flow.hasFlow(DataFlow::exprNode(settings), DataFlow::exprNode(this.getSettings())) and + exists(ObjectCreation settings | + SettingsDataFlow::flow(DataFlow::exprNode(settings), DataFlow::exprNode(this.getSettings())) and XmlSettings::insecureResolverSettings(settings, evidence, reason) ) // default is secure } } - private class SettingsDataFlowConfig extends DataFlow2::Configuration { - SettingsDataFlowConfig() { this = "SettingsDataFlowConfig" } - - override predicate isSource(DataFlow::Node source) { + private module SettingsDataFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { // flow from places where we construct an XmlReaderSettings source .asExpr() @@ -202,10 +200,12 @@ module XmlReader { .hasQualifiedName("System.Xml", "XmlReaderSettings") } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(InsecureXmlReaderCreate create).getSettings() } } + + private module SettingsDataFlow = DataFlow::Global; } /** Provides predicates related to `System.Xml.XmlTextReader`. */ diff --git a/csharp/ql/src/API Abuse/FormatInvalid.ql b/csharp/ql/src/API Abuse/FormatInvalid.ql index ef16359de09..235daa1ecc2 100644 --- a/csharp/ql/src/API Abuse/FormatInvalid.ql +++ b/csharp/ql/src/API Abuse/FormatInvalid.ql @@ -12,38 +12,36 @@ import csharp import semmle.code.csharp.frameworks.Format -import DataFlow::PathGraph +import FormatInvalid::PathGraph -private class FormatConfiguration extends DataFlow::Configuration { - FormatConfiguration() { this = "format" } +module FormatInvalidConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr() instanceof StringLiteral } - override predicate isSource(DataFlow::Node n) { n.asExpr() instanceof StringLiteral } - - override predicate isSink(DataFlow::Node n) { - exists(FormatCall c | n.asExpr() = c.getFormatExpr()) - } + predicate isSink(DataFlow::Node n) { exists(FormatCall c | n.asExpr() = c.getFormatExpr()) } } +module FormatInvalid = DataFlow::Global; + private predicate invalidFormatString( - InvalidFormatString src, DataFlow::PathNode source, DataFlow::PathNode sink, string msg, + InvalidFormatString src, FormatInvalid::PathNode source, FormatInvalid::PathNode sink, string msg, FormatCall call, string callString ) { source.getNode().asExpr() = src and sink.getNode().asExpr() = call.getFormatExpr() and - any(FormatConfiguration conf).hasFlowPath(source, sink) and + FormatInvalid::flowPath(source, sink) and call.hasInsertions() and msg = "Invalid format string used in $@ formatting call." and callString = "this" } private predicate unusedArgument( - FormatCall call, DataFlow::PathNode source, DataFlow::PathNode sink, string msg, + FormatCall call, FormatInvalid::PathNode source, FormatInvalid::PathNode sink, string msg, ValidFormatString src, string srcString, Expr unusedExpr, string unusedString ) { exists(int unused | source.getNode().asExpr() = src and sink.getNode().asExpr() = call.getFormatExpr() and - any(FormatConfiguration conf).hasFlowPath(source, sink) and + FormatInvalid::flowPath(source, sink) and unused = call.getASuppliedArgument() and not unused = src.getAnInsert() and not src.getValue() = "" and @@ -55,13 +53,13 @@ private predicate unusedArgument( } private predicate missingArgument( - FormatCall call, DataFlow::PathNode source, DataFlow::PathNode sink, string msg, + FormatCall call, FormatInvalid::PathNode source, FormatInvalid::PathNode sink, string msg, ValidFormatString src, string srcString ) { exists(int used, int supplied | source.getNode().asExpr() = src and sink.getNode().asExpr() = call.getFormatExpr() and - any(FormatConfiguration conf).hasFlowPath(source, sink) and + FormatInvalid::flowPath(source, sink) and used = src.getAnInsert() and supplied = call.getSuppliedArguments() and used >= supplied and @@ -71,8 +69,8 @@ private predicate missingArgument( } from - Element alert, DataFlow::PathNode source, DataFlow::PathNode sink, string msg, Element extra1, - string extra1String, Element extra2, string extra2String + Element alert, FormatInvalid::PathNode source, FormatInvalid::PathNode sink, string msg, + Element extra1, string extra1String, Element extra2, string extra2String where invalidFormatString(alert, source, sink, msg, extra1, extra1String) and extra2 = extra1 and diff --git a/csharp/ql/src/API Abuse/NoDisposeCallOnLocalIDisposable.ql b/csharp/ql/src/API Abuse/NoDisposeCallOnLocalIDisposable.ql index c3b5068bb09..3072b154812 100644 --- a/csharp/ql/src/API Abuse/NoDisposeCallOnLocalIDisposable.ql +++ b/csharp/ql/src/API Abuse/NoDisposeCallOnLocalIDisposable.ql @@ -24,10 +24,8 @@ private class ReturnNode extends DataFlow::ExprNode { } } -private class Conf extends DataFlow::Configuration { - Conf() { this = "NoDisposeCallOnLocalIDisposable" } - - override predicate isSource(DataFlow::Node node) { +module DisposeCallOnLocalIDisposableConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { node.asExpr() = any(LocalScopeDisposableCreation disposable | // Only care about library types - user types often have spurious IDisposable declarations @@ -37,7 +35,7 @@ private class Conf extends DataFlow::Configuration { ) } - override predicate isSink(DataFlow::Node node) { + predicate isSink(DataFlow::Node node) { // Things that return may be disposed elsewhere node instanceof ReturnNode or @@ -80,23 +78,27 @@ private class Conf extends DataFlow::Configuration { ) } - override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { node2.asExpr() = any(LocalScopeDisposableCreation other | other.getAnArgument() = node1.asExpr()) } - override predicate isBarrierOut(DataFlow::Node node) { - this.isSink(node) and + predicate isBarrierOut(DataFlow::Node node) { + isSink(node) and not node instanceof ReturnNode } } +module DisposeCallOnLocalIDisposable = DataFlow::Global; + /** Holds if `disposable` may not be disposed. */ predicate mayNotBeDisposed(LocalScopeDisposableCreation disposable) { - exists(Conf conf, DataFlow::ExprNode e | + exists(DataFlow::ExprNode e | e.getExpr() = disposable and - conf.isSource(e) and - not exists(DataFlow::Node sink | conf.hasFlow(DataFlow::exprNode(disposable), sink) | + DisposeCallOnLocalIDisposableConfig::isSource(e) and + not exists(DataFlow::Node sink | + DisposeCallOnLocalIDisposable::flow(DataFlow::exprNode(disposable), sink) + | sink instanceof ReturnNode implies sink.getEnclosingCallable() = disposable.getEnclosingCallable() diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 23b347b3122..fb6006fc6f9 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.6.1 + +### Minor Analysis Improvements + +* Additional sinks modelling writes to unencrypted local files have been added to `ExternalLocationSink`, used by the `cs/cleartext-storage` and `cs/exposure-of-sensitive-information` queries. + ## 0.6.0 ### Minor Analysis Improvements diff --git a/csharp/ql/src/Language Abuse/ForeachCapture.ql b/csharp/ql/src/Language Abuse/ForeachCapture.ql index babd79bb407..86bf643c534 100644 --- a/csharp/ql/src/Language Abuse/ForeachCapture.ql +++ b/csharp/ql/src/Language Abuse/ForeachCapture.ql @@ -37,19 +37,19 @@ predicate inForeachStmtBody(ForeachStmt loop, Element e) { ) } -class LambdaDataFlowConfiguration extends DataFlow::Configuration { - LambdaDataFlowConfiguration() { this = "LambdaDataFlowConfiguration" } +module LambdaDataFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { lambdaCapturesLoopVariable(source.asExpr(), _, _) } - override predicate isSource(DataFlow::Node source) { - lambdaCapturesLoopVariable(source.asExpr(), _, _) - } + predicate isSink(DataFlow::Node sink) { exists(getAssignmentTarget(sink.asExpr())) } +} - override predicate isSink(DataFlow::Node sink) { exists(getAssignmentTarget(sink.asExpr())) } +module LambdaDataFlow { + private import DataFlow::Global predicate capturesLoopVarAndIsStoredIn( AnonymousFunctionExpr lambda, Variable loopVar, Element storage ) { - exists(DataFlow::Node sink | this.hasFlow(DataFlow::exprNode(lambda), sink) | + exists(DataFlow::Node sink | flow(DataFlow::exprNode(lambda), sink) | storage = getAssignmentTarget(sink.asExpr()) ) and exists(ForeachStmt loop | lambdaCapturesLoopVariable(lambda, loop, loopVar) | @@ -109,7 +109,7 @@ predicate declaredInsideLoop(ForeachStmt loop, LocalVariable v) { ) } -from LambdaDataFlowConfiguration c, AnonymousFunctionExpr lambda, Variable loopVar, Element storage -where c.capturesLoopVarAndIsStoredIn(lambda, loopVar, storage) +from AnonymousFunctionExpr lambda, Variable loopVar, Element storage +where LambdaDataFlow::capturesLoopVarAndIsStoredIn(lambda, loopVar, storage) select lambda, "Function which may be stored in $@ captures variable $@.", storage, storage.toString(), loopVar, loopVar.getName() diff --git a/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.ql b/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.ql index 814ccd99e4e..3f0ed6a38ed 100644 --- a/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.ql +++ b/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.ql @@ -10,21 +10,17 @@ */ import csharp -import DataFlow::PathGraph +import UnsafeYearCreationFromArithmetic::PathGraph -class UnsafeYearCreationFromArithmeticConfiguration extends TaintTracking::Configuration { - UnsafeYearCreationFromArithmeticConfiguration() { - this = "UnsafeYearCreationFromArithmeticConfiguration" - } - - override predicate isSource(DataFlow::Node source) { +module UnsafeYearCreationFromArithmeticConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { exists(ArithmeticOperation ao, PropertyAccess pa | ao = source.asExpr() | pa = ao.getAChild*() and pa.getProperty().hasQualifiedName("System.DateTime", "Year") ) } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(ObjectCreation oc | sink.asExpr() = oc.getArgumentForName("year") and oc.getObjectType().getABaseType*().hasQualifiedName("System", "DateTime") @@ -32,10 +28,12 @@ class UnsafeYearCreationFromArithmeticConfiguration extends TaintTracking::Confi } } +module UnsafeYearCreationFromArithmetic = + TaintTracking::Global; + from - UnsafeYearCreationFromArithmeticConfiguration config, DataFlow::PathNode source, - DataFlow::PathNode sink -where config.hasFlowPath(source, sink) + UnsafeYearCreationFromArithmetic::PathNode source, UnsafeYearCreationFromArithmetic::PathNode sink +where UnsafeYearCreationFromArithmetic::flowPath(source, sink) select sink, source, sink, "This $@ based on a 'System.DateTime.Year' property is used in a construction of a new 'System.DateTime' object, flowing to the 'year' argument.", source, "arithmetic operation" diff --git a/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransformLambda.ql b/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransformLambda.ql index 9ed4963169f..77151d0ba30 100644 --- a/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransformLambda.ql +++ b/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransformLambda.ql @@ -18,21 +18,20 @@ import csharp import ParallelSink import ICryptoTransform -class NotThreadSafeCryptoUsageIntoParallelInvokeConfig extends TaintTracking::Configuration { - NotThreadSafeCryptoUsageIntoParallelInvokeConfig() { - this = "NotThreadSafeCryptoUsageIntoParallelInvokeConfig" - } - - override predicate isSource(DataFlow::Node source) { +module NotThreadSafeCryptoUsageIntoParallelInvokeConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof LambdaCapturingICryptoTransformSource } - override predicate isSink(DataFlow::Node sink) { sink instanceof ParallelSink } + predicate isSink(DataFlow::Node sink) { sink instanceof ParallelSink } } -from Expr e, string m, LambdaExpr l, NotThreadSafeCryptoUsageIntoParallelInvokeConfig config +module NotThreadSafeCryptoUsageIntoParallelInvoke = + TaintTracking::Global; + +from Expr e, string m, LambdaExpr l where - config.hasFlow(DataFlow::exprNode(l), DataFlow::exprNode(e)) and + NotThreadSafeCryptoUsageIntoParallelInvoke::flow(DataFlow::exprNode(l), DataFlow::exprNode(e)) and m = "A $@ seems to be used to start a new thread is capturing a local variable that either implements 'System.Security.Cryptography.ICryptoTransform' or has a field of this type." select e, m, l, "lambda expression" diff --git a/csharp/ql/src/Security Features/CWE-022/TaintedPath.ql b/csharp/ql/src/Security Features/CWE-022/TaintedPath.ql index 545484e6294..56427dd4865 100644 --- a/csharp/ql/src/Security Features/CWE-022/TaintedPath.ql +++ b/csharp/ql/src/Security Features/CWE-022/TaintedPath.ql @@ -16,9 +16,9 @@ import csharp import semmle.code.csharp.security.dataflow.TaintedPathQuery -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import TaintedPath::PathGraph -from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +from TaintedPath::PathNode source, TaintedPath::PathNode sink +where TaintedPath::flowPath(source, sink) select sink.getNode(), source, sink, "This path depends on a $@.", source.getNode(), "user-provided value" diff --git a/csharp/ql/src/Security Features/CWE-022/ZipSlip.ql b/csharp/ql/src/Security Features/CWE-022/ZipSlip.ql index d9c6d6fc113..7650e915b0e 100644 --- a/csharp/ql/src/Security Features/CWE-022/ZipSlip.ql +++ b/csharp/ql/src/Security Features/CWE-022/ZipSlip.ql @@ -14,10 +14,10 @@ import csharp import semmle.code.csharp.security.dataflow.ZipSlipQuery -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import ZipSlip::PathGraph -from ZipSlipTaintTrackingConfiguration zipTaintTracking, DataFlow::PathNode source, DataFlow::PathNode sink -where zipTaintTracking.hasFlowPath(source, sink) +from ZipSlip::PathNode source, ZipSlip::PathNode sink +where ZipSlip::flowPath(source, sink) select source.getNode(), source, sink, "Unsanitized archive entry, which may contain '..', is used in a $@.", sink.getNode(), "file system operation" diff --git a/csharp/ql/src/Security Features/CWE-079/StoredXSS.ql b/csharp/ql/src/Security Features/CWE-079/StoredXSS.ql index f2dc334539c..140dedfec51 100644 --- a/csharp/ql/src/Security Features/CWE-079/StoredXSS.ql +++ b/csharp/ql/src/Security Features/CWE-079/StoredXSS.ql @@ -16,18 +16,21 @@ import csharp import semmle.code.csharp.security.dataflow.flowsources.Stored import semmle.code.csharp.security.dataflow.XSSQuery import semmle.code.csharp.security.dataflow.XSSSinks -import semmle.code.csharp.dataflow.DataFlow2 -import DataFlow2::PathGraph +import StoredXss::PathGraph -class StoredTaintTrackingConfiguration extends TaintTrackingConfiguration { - override predicate isSource(DataFlow2::Node source) { source instanceof StoredFlowSource } +module StoredXssTrackingConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof StoredFlowSource } + + predicate isSink = XssTrackingConfig::isSink/1; + + predicate isBarrier = XssTrackingConfig::isBarrier/1; } -from - StoredTaintTrackingConfiguration c, DataFlow2::PathNode source, DataFlow2::PathNode sink, - string explanation +module StoredXss = TaintTracking::Global; + +from StoredXss::PathNode source, StoredXss::PathNode sink, string explanation where - c.hasFlowPath(source, sink) and + StoredXss::flowPath(source, sink) and if exists(sink.getNode().(Sink).explanation()) then explanation = " (" + sink.getNode().(Sink).explanation() + ")" else explanation = "" diff --git a/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql b/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql index c537a85c1f1..dfd6fd7733d 100644 --- a/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql +++ b/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql @@ -12,19 +12,17 @@ */ import csharp -import DataFlow::PathGraph import semmle.code.csharp.security.dataflow.flowsources.Remote import semmle.code.csharp.frameworks.system.Xml +import XmlInjection::PathGraph /** * A taint-tracking configuration for untrusted user input used in XML. */ -class TaintTrackingConfiguration extends TaintTracking::Configuration { - TaintTrackingConfiguration() { this = "XMLInjection" } +module XmlInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodCall mc | mc.getTarget().hasName("WriteRaw") and mc.getTarget().getDeclaringType().getABaseType*().hasQualifiedName("System.Xml", "XmlWriter") @@ -33,7 +31,7 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { ) } - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { exists(MethodCall mc | mc.getTarget().hasName("Escape") and mc.getTarget() @@ -46,7 +44,12 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { } } -from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +/** + * A taint-tracking module for untrusted user input used in XML. + */ +module XmlInjection = TaintTracking::Global; + +from XmlInjection::PathNode source, XmlInjection::PathNode sink +where XmlInjection::flowPath(source, sink) select sink.getNode(), source, sink, "This XML element depends on a $@.", source.getNode(), "user-provided value" diff --git a/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.ql b/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.ql index c0990112188..8c36a944baf 100644 --- a/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.ql +++ b/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.ql @@ -15,20 +15,18 @@ import csharp import semmle.code.csharp.security.dataflow.flowsources.Remote import semmle.code.csharp.commons.Util -import DataFlow::PathGraph +import AssemblyPathInjection::PathGraph /** * A taint-tracking configuration for untrusted user input used to load a DLL. */ -class TaintTrackingConfiguration extends TaintTracking::Configuration { - TaintTrackingConfiguration() { this = "DLLInjection" } - - override predicate isSource(DataFlow::Node source) { +module AssemblyPathInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource or source.asExpr() = any(MainMethod main).getParameter(0).getAnAccess() } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodCall mc, string name, int arg | mc.getTarget().getName().matches(name) and mc.getTarget() @@ -48,7 +46,12 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { } } -from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +/** + * A taint-tracking module for untrusted user input used to load a DLL. + */ +module AssemblyPathInjection = TaintTracking::Global; + +from AssemblyPathInjection::PathNode source, AssemblyPathInjection::PathNode sink +where AssemblyPathInjection::flowPath(source, sink) select sink.getNode(), source, sink, "This assembly path depends on a $@.", source, "user-provided value" diff --git a/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql b/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql index 35529f4e234..e8b9aa0a53f 100644 --- a/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql +++ b/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql @@ -15,29 +15,29 @@ import csharp import semmle.code.csharp.security.dataflow.flowsources.Remote import semmle.code.csharp.security.dataflow.flowsources.Local import semmle.code.csharp.frameworks.Format -import DataFlow::PathGraph +import FormatString::PathGraph -class FormatStringConfiguration extends TaintTracking::Configuration { - FormatStringConfiguration() { this = "FormatStringConfiguration" } - - override predicate isSource(DataFlow::Node source) { +module FormatStringConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource or source instanceof LocalFlowSource } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(FormatCall call | call.hasInsertions()).getFormatExpr() } } +module FormatString = TaintTracking::Global; + string getSourceType(DataFlow::Node node) { result = node.(RemoteFlowSource).getSourceType() or result = node.(LocalFlowSource).getSourceType() } -from FormatStringConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from FormatString::PathNode source, FormatString::PathNode sink +where FormatString::flowPath(source, sink) select sink.getNode(), source, sink, "This format string depends on $@.", source.getNode(), ("this" + getSourceType(source.getNode())) diff --git a/csharp/ql/src/Security Features/CWE-201/ExposureInTransmittedData.ql b/csharp/ql/src/Security Features/CWE-201/ExposureInTransmittedData.ql index 3bcb16b749d..0d71a08fe97 100644 --- a/csharp/ql/src/Security Features/CWE-201/ExposureInTransmittedData.ql +++ b/csharp/ql/src/Security Features/CWE-201/ExposureInTransmittedData.ql @@ -15,12 +15,10 @@ import semmle.code.csharp.security.SensitiveActions import semmle.code.csharp.security.dataflow.flowsinks.Remote import semmle.code.csharp.frameworks.system.data.Common import semmle.code.csharp.frameworks.System -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import ExposureInTransmittedData::PathGraph -class TaintTrackingConfiguration extends TaintTracking::Configuration { - TaintTrackingConfiguration() { this = "Exposure through transmitted data" } - - override predicate isSource(DataFlow::Node source) { +module ExposureInTransmittedDataConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { // `source` may contain a password source.asExpr() instanceof PasswordExpr or @@ -42,10 +40,12 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { ) } - override predicate isSink(DataFlow::Node sink) { sink instanceof RemoteFlowSink } + predicate isSink(DataFlow::Node sink) { sink instanceof RemoteFlowSink } } -from TaintTrackingConfiguration configuration, DataFlow::PathNode source, DataFlow::PathNode sink -where configuration.hasFlowPath(source, sink) +module ExposureInTransmittedData = TaintTracking::Global; + +from ExposureInTransmittedData::PathNode source, ExposureInTransmittedData::PathNode sink +where ExposureInTransmittedData::flowPath(source, sink) select sink.getNode(), source, sink, "This data transmitted to the user depends on $@.", source.getNode(), "sensitive information" diff --git a/csharp/ql/src/Security Features/CWE-209/ExceptionInformationExposure.ql b/csharp/ql/src/Security Features/CWE-209/ExceptionInformationExposure.ql index 0f374fb6abe..49774fae491 100644 --- a/csharp/ql/src/Security Features/CWE-209/ExceptionInformationExposure.ql +++ b/csharp/ql/src/Security Features/CWE-209/ExceptionInformationExposure.ql @@ -16,15 +16,13 @@ import csharp import semmle.code.csharp.frameworks.System import semmle.code.csharp.security.dataflow.flowsinks.Remote -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import ExceptionInformationExposure::PathGraph /** * A taint-tracking configuration for reasoning about stack traces that flow to web page outputs. */ -class TaintTrackingConfiguration extends TaintTracking::Configuration { - TaintTrackingConfiguration() { this = "StackTrace" } - - override predicate isSource(DataFlow::Node source) { +module ExceptionInformationExposureConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { exists(Expr exceptionExpr | // Writing an exception directly is bad source.asExpr() = exceptionExpr @@ -40,7 +38,7 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { ) } - override predicate isAdditionalTaintStep(DataFlow::Node source, DataFlow::Node sink) { + predicate isAdditionalFlowStep(DataFlow::Node source, DataFlow::Node sink) { sink.asExpr() = any(MethodCall mc | source.asExpr() = mc.getQualifier() and @@ -49,20 +47,25 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { ) } - override predicate isSink(DataFlow::Node sink) { sink instanceof RemoteFlowSink } + predicate isSink(DataFlow::Node sink) { sink instanceof RemoteFlowSink } - override predicate isSanitizer(DataFlow::Node sanitizer) { + predicate isBarrier(DataFlow::Node sanitizer) { // Do not flow through Message sanitizer.asExpr() = any(SystemExceptionClass se).getProperty("Message").getAnAccess() } - override predicate isSanitizerIn(DataFlow::Node sanitizer) { + predicate isBarrierIn(DataFlow::Node sanitizer) { // Do not flow through Message sanitizer.asExpr().getType().(RefType).getABaseType*() instanceof SystemExceptionClass } } -from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +/** + * A taint-tracking module for reasoning about stack traces that flow to web page outputs. + */ +module ExceptionInformationExposure = TaintTracking::Global; + +from ExceptionInformationExposure::PathNode source, ExceptionInformationExposure::PathNode sink +where ExceptionInformationExposure::flowPath(source, sink) select sink.getNode(), source, sink, "This information exposed to the user depends on $@.", source.getNode(), "exception information" diff --git a/csharp/ql/src/Security Features/CWE-327/DontInstallRootCert.ql b/csharp/ql/src/Security Features/CWE-327/DontInstallRootCert.ql index fefd27727ec..07a3aa114d4 100644 --- a/csharp/ql/src/Security Features/CWE-327/DontInstallRootCert.ql +++ b/csharp/ql/src/Security Features/CWE-327/DontInstallRootCert.ql @@ -12,12 +12,10 @@ import csharp import semmle.code.csharp.dataflow.DataFlow::DataFlow -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import AddCertToRootStore::PathGraph -class AddCertToRootStoreConfig extends DataFlow::Configuration { - AddCertToRootStoreConfig() { this = "Adding Certificate To Root Store" } - - override predicate isSource(DataFlow::Node source) { +module AddCertToRootStoreConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { exists(ObjectCreation oc | oc = source.asExpr() | oc.getType() .(RefType) @@ -26,7 +24,7 @@ class AddCertToRootStoreConfig extends DataFlow::Configuration { ) } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodCall mc | ( mc.getTarget() @@ -40,6 +38,8 @@ class AddCertToRootStoreConfig extends DataFlow::Configuration { } } -from DataFlow::PathNode oc, DataFlow::PathNode mc, AddCertToRootStoreConfig config -where config.hasFlowPath(oc, mc) +module AddCertToRootStore = DataFlow::Global; + +from AddCertToRootStore::PathNode oc, AddCertToRootStore::PathNode mc +where AddCertToRootStore::flowPath(oc, mc) select mc.getNode(), oc, mc, "This certificate is added to the root certificate store." diff --git a/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql b/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql index 8f7a49db36d..ff24f882005 100644 --- a/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql +++ b/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql @@ -11,15 +11,13 @@ */ import csharp -import DataFlow::PathGraph +import InsecureSqlConnection::PathGraph /** * A data flow configuration for tracking strings passed to `SqlConnection[StringBuilder]` instances. */ -class TaintTrackingConfiguration extends DataFlow::Configuration { - TaintTrackingConfiguration() { this = "TaintTrackingConfiguration" } - - override predicate isSource(DataFlow::Node source) { +module InsecureSqlConnectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { exists(string s | s = source.asExpr().(StringLiteral).getValue().toLowerCase() | s.matches("%encrypt=false%") or @@ -27,7 +25,7 @@ class TaintTrackingConfiguration extends DataFlow::Configuration { ) } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(ObjectCreation oc | oc.getRuntimeArgument(0) = sink.asExpr() and ( @@ -39,8 +37,13 @@ class TaintTrackingConfiguration extends DataFlow::Configuration { } } -from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +/** + * A data flow configuration for tracking strings passed to `SqlConnection[StringBuilder]` instances. + */ +module InsecureSqlConnection = DataFlow::Global; + +from InsecureSqlConnection::PathNode source, InsecureSqlConnection::PathNode sink +where InsecureSqlConnection::flowPath(source, sink) select sink.getNode(), source, sink, "$@ flows to this SQL connection and does not specify `Encrypt=True`.", source.getNode(), "Connection string" diff --git a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql index 48c9d5ac08a..32f8f159f8b 100644 --- a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql +++ b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql @@ -48,12 +48,9 @@ where ) or // JsonConvert static method call, but with additional unsafe typename tracking - exists( - JsonConvertTrackingConfig taintTrackingJsonConvert, TypeNameTrackingConfig typenameTracking, - DataFlow::Node settingsCallArg - | + exists(JsonConvertTrackingConfig taintTrackingJsonConvert, DataFlow::Node settingsCallArg | taintTrackingJsonConvert.hasFlowPath(userInput, deserializeCallArg) and - typenameTracking.hasFlow(_, settingsCallArg) and + TypeNameTracking::flow(_, settingsCallArg) and deserializeCallArg.getNode().asExpr().getParent() = settingsCallArg.asExpr().getParent() ) select deserializeCallArg, userInput, deserializeCallArg, "$@ flows to unsafe deserializer.", diff --git a/csharp/ql/src/Security Features/CWE-601/UrlRedirect.ql b/csharp/ql/src/Security Features/CWE-601/UrlRedirect.ql index 18acc7fe193..dbe21cfd4f1 100644 --- a/csharp/ql/src/Security Features/CWE-601/UrlRedirect.ql +++ b/csharp/ql/src/Security Features/CWE-601/UrlRedirect.ql @@ -13,9 +13,9 @@ import csharp import semmle.code.csharp.security.dataflow.UrlRedirectQuery -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import UrlRedirect::PathGraph -from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +from UrlRedirect::PathNode source, UrlRedirect::PathNode sink +where UrlRedirect::flowPath(source, sink) select sink.getNode(), source, sink, "Untrusted URL redirection due to $@.", source.getNode(), "user-provided value" diff --git a/csharp/ql/src/Security Features/CWE-611/UntrustedDataInsecureXml.ql b/csharp/ql/src/Security Features/CWE-611/UntrustedDataInsecureXml.ql index 9bd90a5b212..a8043108061 100644 --- a/csharp/ql/src/Security Features/CWE-611/UntrustedDataInsecureXml.ql +++ b/csharp/ql/src/Security Features/CWE-611/UntrustedDataInsecureXml.ql @@ -14,10 +14,10 @@ import csharp import semmle.code.csharp.security.dataflow.XMLEntityInjectionQuery -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import XmlEntityInjection::PathGraph -from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +from XmlEntityInjection::PathNode source, XmlEntityInjection::PathNode sink +where XmlEntityInjection::flowPath(source, sink) select sink.getNode(), source, sink, "This insecure XML processing depends on a $@ (" + sink.getNode().(Sink).getReason() + ").", source.getNode(), "user-provided value" diff --git a/csharp/ql/src/Security Features/CWE-643/StoredXPathInjection.ql b/csharp/ql/src/Security Features/CWE-643/StoredXPathInjection.ql index 46fd76a2453..3042997ec7a 100644 --- a/csharp/ql/src/Security Features/CWE-643/StoredXPathInjection.ql +++ b/csharp/ql/src/Security Features/CWE-643/StoredXPathInjection.ql @@ -13,14 +13,20 @@ import csharp import semmle.code.csharp.security.dataflow.flowsources.Stored -import semmle.code.csharp.security.dataflow.XPathInjectionQuery as XPathInjection -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import semmle.code.csharp.security.dataflow.XPathInjectionQuery +import StoredXpathInjection::PathGraph -class StoredTaintTrackingConfiguration extends XPathInjection::TaintTrackingConfiguration { - override predicate isSource(DataFlow::Node source) { source instanceof StoredFlowSource } +module StoredXpathInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof StoredFlowSource } + + predicate isSink = XpathInjectionConfig::isSink/1; + + predicate isBarrier = XpathInjectionConfig::isBarrier/1; } -from StoredTaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +module StoredXpathInjection = TaintTracking::Global; + +from StoredXpathInjection::PathNode source, StoredXpathInjection::PathNode sink +where StoredXpathInjection::flowPath(source, sink) select sink.getNode(), source, sink, "This XPath expression depends on a $@.", source.getNode(), "stored (potentially user-provided) value" diff --git a/csharp/ql/src/Security Features/CWE-643/XPathInjection.ql b/csharp/ql/src/Security Features/CWE-643/XPathInjection.ql index c05e34d09db..3bfb42c49cc 100644 --- a/csharp/ql/src/Security Features/CWE-643/XPathInjection.ql +++ b/csharp/ql/src/Security Features/CWE-643/XPathInjection.ql @@ -13,9 +13,9 @@ import csharp import semmle.code.csharp.security.dataflow.XPathInjectionQuery -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import XpathInjection::PathGraph -from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +from XpathInjection::PathNode source, XpathInjection::PathNode sink +where XpathInjection::flowPath(source, sink) select sink.getNode(), source, sink, "This XPath expression depends on a $@.", source.getNode(), "user-provided value" diff --git a/csharp/ql/src/Security Features/CWE-838/InappropriateEncoding.ql b/csharp/ql/src/Security Features/CWE-838/InappropriateEncoding.ql index 33f44f3212e..b35247634ea 100644 --- a/csharp/ql/src/Security Features/CWE-838/InappropriateEncoding.ql +++ b/csharp/ql/src/Security Features/CWE-838/InappropriateEncoding.ql @@ -20,57 +20,46 @@ import semmle.code.csharp.security.dataflow.SqlInjectionQuery as SqlInjection import semmle.code.csharp.security.dataflow.flowsinks.Html import semmle.code.csharp.security.dataflow.UrlRedirectQuery as UrlRedirect import semmle.code.csharp.security.Sanitizers -import semmle.code.csharp.dataflow.DataFlow2::DataFlow2 -import semmle.code.csharp.dataflow.DataFlow2::DataFlow2::PathGraph -import semmle.code.csharp.dataflow.TaintTracking2 +import EncodingConfigurations::Flow::PathGraph -/** - * A configuration for specifying expressions that must be - * encoded, along with a set of potential valid encoded values. - */ -abstract class RequiresEncodingConfiguration extends TaintTracking2::Configuration { - bindingset[this] - RequiresEncodingConfiguration() { any() } - - /** Gets a textual representation of this kind of encoding requirement. */ - abstract string getKind(); - - /** Holds if `e` is an expression whose value must be encoded. */ - abstract predicate requiresEncoding(Node n); +signature module EncodingConfigSig { + /** Holds if `n` is a node whose value must be encoded. */ + predicate requiresEncoding(DataFlow::Node n); /** Holds if `e` is a possible valid encoded value. */ - predicate isPossibleEncodedValue(Expr e) { none() } + predicate isPossibleEncodedValue(Expr e); +} - /** - * Holds if `encodedValue` is a possibly ill-encoded value that reaches - * `sink`, where `sink` is an expression of kind `kind` that is required - * to be encoded. - */ - predicate hasWrongEncoding(PathNode encodedValue, PathNode sink, string kind) { - this.hasFlowPath(encodedValue, sink) and - kind = this.getKind() - } - - override predicate isSource(Node source) { +/** + * A configuration for specifying expressions that must be encoded. + */ +module RequiresEncodingConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { // all encoded values that do not match this configuration are // considered sources exists(Expr e | e = source.asExpr() | e instanceof EncodedValue and - not this.isPossibleEncodedValue(e) + not EncodingConfig::isPossibleEncodedValue(e) ) } - override predicate isSink(Node sink) { this.requiresEncoding(sink) } + predicate isSink(DataFlow::Node sink) { EncodingConfig::requiresEncoding(sink) } - override predicate isSanitizer(Node sanitizer) { this.isPossibleEncodedValue(sanitizer.asExpr()) } + predicate isBarrier(DataFlow::Node sanitizer) { + EncodingConfig::isPossibleEncodedValue(sanitizer.asExpr()) + } - override int fieldFlowBranchLimit() { result = 0 } + int fieldFlowBranchLimit() { result = 0 } } -/** An encoded value, for example a call to `HttpServerUtility.HtmlEncode`. */ +/** An encoded value, for example through a call to `HttpServerUtility.HtmlEncode`. */ class EncodedValue extends Expr { EncodedValue() { - any(RequiresEncodingConfiguration c).isPossibleEncodedValue(this) + EncodingConfigurations::SqlExprEncodingConfig::isPossibleEncodedValue(this) + or + EncodingConfigurations::HtmlExprEncodingConfig::isPossibleEncodedValue(this) + or + EncodingConfigurations::UrlExprEncodingConfig::isPossibleEncodedValue(this) or this = any(SystemWebHttpUtility c).getAJavaScriptStringEncodeMethod().getACall() or @@ -86,18 +75,20 @@ class EncodedValue extends Expr { } module EncodingConfigurations { + module SqlExprEncodingConfig implements EncodingConfigSig { + predicate requiresEncoding(DataFlow::Node n) { n instanceof SqlInjection::Sink } + + predicate isPossibleEncodedValue(Expr e) { none() } + } + /** An encoding configuration for SQL expressions. */ - class SqlExpr extends RequiresEncodingConfiguration { - SqlExpr() { this = "SqlExpr" } - - override string getKind() { result = "SQL expression" } - - override predicate requiresEncoding(Node n) { n instanceof SqlInjection::Sink } + module SqlExprConfig implements DataFlow::ConfigSig { + import RequiresEncodingConfig as Super // no override for `isPossibleEncodedValue` as SQL parameters should // be used instead of explicit encoding - override predicate isSource(Node source) { - super.isSource(source) + predicate isSource(DataFlow::Node source) { + Super::isSource(source) or // consider quote-replacing calls as additional sources for // SQL expressions (e.g., `s.Replace("\"", "\"\"")`) @@ -107,32 +98,62 @@ module EncodingConfigurations { mc.getArgument(0).getValue().regexpMatch("\"|'|`") ) } + + predicate isSink = Super::isSink/1; + + predicate isBarrier = Super::isBarrier/1; + + int fieldFlowBranchLimit() { result = Super::fieldFlowBranchLimit() } + } + + module SqlExpr = TaintTracking::Global; + + module HtmlExprEncodingConfig implements EncodingConfigSig { + predicate requiresEncoding(DataFlow::Node n) { n instanceof HtmlSink } + + predicate isPossibleEncodedValue(Expr e) { e instanceof HtmlSanitizedExpr } } /** An encoding configuration for HTML expressions. */ - class HtmlExpr extends RequiresEncodingConfiguration { - HtmlExpr() { this = "HtmlExpr" } + module HtmlExprConfig = RequiresEncodingConfig; - override string getKind() { result = "HTML expression" } + module HtmlExpr = TaintTracking::Global; - override predicate requiresEncoding(Node n) { n instanceof HtmlSink } + module UrlExprEncodingConfig implements EncodingConfigSig { + predicate requiresEncoding(DataFlow::Node n) { n instanceof UrlRedirect::Sink } - override predicate isPossibleEncodedValue(Expr e) { e instanceof HtmlSanitizedExpr } + predicate isPossibleEncodedValue(Expr e) { e instanceof UrlSanitizedExpr } } /** An encoding configuration for URL expressions. */ - class UrlExpr extends RequiresEncodingConfiguration { - UrlExpr() { this = "UrlExpr" } + module UrlExprConfig = RequiresEncodingConfig; - override string getKind() { result = "URL expression" } + module UrlExpr = TaintTracking::Global; - override predicate requiresEncoding(Node n) { n instanceof UrlRedirect::Sink } + module Flow = + DataFlow::MergePathGraph3; - override predicate isPossibleEncodedValue(Expr e) { e instanceof UrlSanitizedExpr } + /** + * Holds if `encodedValue` is a possibly ill-encoded value that reaches + * `sink`, where `sink` is an expression of kind `kind` that is required + * to be encoded. + */ + predicate hasWrongEncoding(Flow::PathNode encodedValue, Flow::PathNode sink, string kind) { + SqlExpr::flowPath(encodedValue.asPathNode1(), sink.asPathNode1()) and + kind = "SQL expression" + or + HtmlExpr::flowPath(encodedValue.asPathNode2(), sink.asPathNode2()) and + kind = "HTML expression" + or + UrlExpr::flowPath(encodedValue.asPathNode3(), sink.asPathNode3()) and + kind = "URL expression" } } -from RequiresEncodingConfiguration c, PathNode encodedValue, PathNode sink, string kind -where c.hasWrongEncoding(encodedValue, sink, kind) +from + EncodingConfigurations::Flow::PathNode encodedValue, EncodingConfigurations::Flow::PathNode sink, + string kind +where EncodingConfigurations::hasWrongEncoding(encodedValue, sink, kind) select sink.getNode(), encodedValue, sink, "This " + kind + " may include data from a $@.", encodedValue.getNode(), "possibly inappropriately encoded value" diff --git a/csharp/ql/src/Security Features/InsecureRandomness.ql b/csharp/ql/src/Security Features/InsecureRandomness.ql index 6262eac9df2..54f83c340de 100644 --- a/csharp/ql/src/Security Features/InsecureRandomness.ql +++ b/csharp/ql/src/Security Features/InsecureRandomness.ql @@ -14,7 +14,7 @@ import csharp import semmle.code.csharp.frameworks.Test -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import Random::InsecureRandomness::PathGraph module Random { import semmle.code.csharp.security.dataflow.flowsources.Remote @@ -38,21 +38,24 @@ module Random { /** * A taint-tracking configuration for insecure randomness in security sensitive context. */ - class TaintTrackingConfiguration extends TaintTracking::Configuration { - TaintTrackingConfiguration() { this = "RandomDataFlowConfiguration" } + module InsecureRandomnessConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } - override predicate isSource(DataFlow::Node source) { source instanceof Source } + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } - override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } - - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { + predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { // succ = array_or_indexer[pred] - use of random numbers in an index succ.asExpr().(ElementAccess).getAnIndex() = pred.asExpr() } } + /** + * A taint-tracking module for insecure randomness in security sensitive context. + */ + module InsecureRandomness = TaintTracking::Global; + /** A source of cryptographically insecure random numbers. */ class RandomSource extends Source { RandomSource() { @@ -112,10 +115,8 @@ module Random { } } -from - Random::TaintTrackingConfiguration randomTracking, DataFlow::PathNode source, - DataFlow::PathNode sink -where randomTracking.hasFlowPath(source, sink) +from Random::InsecureRandomness::PathNode source, Random::InsecureRandomness::PathNode sink +where Random::InsecureRandomness::flowPath(source, sink) select sink.getNode(), source, sink, "This uses a cryptographically insecure random number generated at $@ in a security context.", source.getNode(), source.getNode().toString() diff --git a/csharp/ql/src/change-notes/released/0.6.1.md b/csharp/ql/src/change-notes/released/0.6.1.md new file mode 100644 index 00000000000..e250efda053 --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.6.1.md @@ -0,0 +1,5 @@ +## 0.6.1 + +### Minor Analysis Improvements + +* Additional sinks modelling writes to unencrypted local files have been added to `ExternalLocationSink`, used by the `cs/cleartext-storage` and `cs/exposure-of-sensitive-information` queries. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index a3f820f884d..80fb0899f64 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.0 +lastReleaseVersion: 0.6.1 diff --git a/csharp/ql/src/experimental/CWE-099/TaintedWebClient.ql b/csharp/ql/src/experimental/CWE-099/TaintedWebClient.ql index e4d2cbd0d4e..38d99db6590 100644 --- a/csharp/ql/src/experimental/CWE-099/TaintedWebClient.ql +++ b/csharp/ql/src/experimental/CWE-099/TaintedWebClient.ql @@ -16,9 +16,9 @@ import csharp import TaintedWebClientLib -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import TaintedWebClient::PathGraph -from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +from TaintedWebClient::PathNode source, TaintedWebClient::PathNode sink +where TaintedWebClient::flowPath(source, sink) select sink.getNode(), source, sink, "A method of WebClient depepends on a $@.", source.getNode(), "user-provided value" diff --git a/csharp/ql/src/experimental/CWE-099/TaintedWebClientLib.qll b/csharp/ql/src/experimental/CWE-099/TaintedWebClientLib.qll index 5f04d766827..3810ff6f76a 100644 --- a/csharp/ql/src/experimental/CWE-099/TaintedWebClientLib.qll +++ b/csharp/ql/src/experimental/CWE-099/TaintedWebClientLib.qll @@ -38,9 +38,11 @@ abstract class Sink extends DataFlow::ExprNode { } abstract class Sanitizer extends DataFlow::ExprNode { } /** + * DEPRECATED: Use `TaintedWebClient` instead. + * * A taint-tracking configuration for uncontrolled data in path expression vulnerabilities. */ -class TaintTrackingConfiguration extends TaintTracking::Configuration { +deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration { TaintTrackingConfiguration() { this = "TaintedWebClientLib" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -50,6 +52,22 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } } +/** + * A taint-tracking configuration for uncontrolled data in path expression vulnerabilities. + */ +private module TaintedWebClientConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** + * A taint-tracking module for uncontrolled data in path expression vulnerabilities. + */ +module TaintedWebClient = TaintTracking::Global; + /** A source of remote user input. */ class RemoteSource extends Source instanceof RemoteFlowSource { } diff --git a/csharp/ql/src/experimental/CWE-918/RequestForgery.ql b/csharp/ql/src/experimental/CWE-918/RequestForgery.ql index bdf2e588e88..9f59da7e38d 100644 --- a/csharp/ql/src/experimental/CWE-918/RequestForgery.ql +++ b/csharp/ql/src/experimental/CWE-918/RequestForgery.ql @@ -12,9 +12,9 @@ import csharp import RequestForgery::RequestForgery -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import RequestForgeryFlow::PathGraph -from RequestForgeryConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink -where c.hasFlowPath(source, sink) +from RequestForgeryFlow::PathNode source, RequestForgeryFlow::PathNode sink +where RequestForgeryFlow::flowPath(source, sink) select sink.getNode(), source, sink, "The URL of this request depends on a $@.", source.getNode(), "user-provided value" diff --git a/csharp/ql/src/experimental/CWE-918/RequestForgery.qll b/csharp/ql/src/experimental/CWE-918/RequestForgery.qll index 868e1e29a13..d5a1965709e 100644 --- a/csharp/ql/src/experimental/CWE-918/RequestForgery.qll +++ b/csharp/ql/src/experimental/CWE-918/RequestForgery.qll @@ -24,9 +24,11 @@ module RequestForgery { abstract private class Barrier extends DataFlow::Node { } /** + * DEPRECATED: Use `RequestForgeryFlow` instead. + * * A data flow configuration for detecting server side request forgery vulnerabilities. */ - class RequestForgeryConfiguration extends DataFlow::Configuration { + deprecated class RequestForgeryConfiguration extends DataFlow::Configuration { RequestForgeryConfiguration() { this = "Server Side Request forgery" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -54,6 +56,40 @@ module RequestForgery { override predicate isBarrier(DataFlow::Node node) { node instanceof Barrier } } + /** + * A data flow configuration for detecting server side request forgery vulnerabilities. + */ + private module RequestForgeryFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isAdditionalFlowStep(DataFlow::Node prev, DataFlow::Node succ) { + interpolatedStringFlowStep(prev, succ) + or + stringReplaceStep(prev, succ) + or + uriCreationStep(prev, succ) + or + formatConvertStep(prev, succ) + or + toStringStep(prev, succ) + or + stringConcatStep(prev, succ) + or + stringFormatStep(prev, succ) + or + pathCombineStep(prev, succ) + } + + predicate isBarrier(DataFlow::Node node) { node instanceof Barrier } + } + + /** + * A data flow module for detecting server side request forgery vulnerabilities. + */ + module RequestForgeryFlow = DataFlow::Global; + /** * A remote data flow source taken as a source * for Server Side Request Forgery(SSRF) Vulnerabilities. diff --git a/csharp/ql/src/experimental/Security Features/CWE-1004/CookieWithoutHttpOnly.ql b/csharp/ql/src/experimental/Security Features/CWE-1004/CookieWithoutHttpOnly.ql index 5424db18b5b..560dcc6dd74 100644 --- a/csharp/ql/src/experimental/Security Features/CWE-1004/CookieWithoutHttpOnly.ql +++ b/csharp/ql/src/experimental/Security Features/CWE-1004/CookieWithoutHttpOnly.ql @@ -36,13 +36,10 @@ where iResponse.getAppendMethod() = mc.getTarget() and isCookieWithSensitiveName(mc.getArgument(0)) and // there is no callback `OnAppendCookie` that sets `HttpOnly` to true - not exists(OnAppendCookieHttpOnlyTrackingConfig config | config.hasFlowTo(_)) and + not OnAppendCookieHttpOnlyTracking::flowTo(_) and // Passed as third argument to `IResponseCookies.Append` - exists( - CookieOptionsTrackingConfiguration cookieTracking, DataFlow::Node creation, - DataFlow::Node append - | - cookieTracking.hasFlow(creation, append) and + exists(DataFlow::Node creation, DataFlow::Node append | + CookieOptionsTracking::flow(creation, append) and creation.asExpr() = oc and append.asExpr() = mc.getArgument(2) ) @@ -70,7 +67,7 @@ where // default is not configured or is not set to `Always` not getAValueForCookiePolicyProp("HttpOnly").getValue() = "1" and // there is no callback `OnAppendCookie` that sets `HttpOnly` to true - not exists(OnAppendCookieHttpOnlyTrackingConfig config | config.hasFlowTo(_)) and + not OnAppendCookieHttpOnlyTracking::flowTo(_) and iResponse.getAppendMethod() = mc.getTarget() and isCookieWithSensitiveName(mc.getArgument(0)) and ( @@ -79,8 +76,8 @@ where oc = c and oc.getType() instanceof MicrosoftAspNetCoreHttpCookieOptions and not isPropertySet(oc, "HttpOnly") and - exists(CookieOptionsTrackingConfiguration cookieTracking, DataFlow::Node creation | - cookieTracking.hasFlow(creation, _) and + exists(DataFlow::Node creation | + CookieOptionsTracking::flow(creation, _) and creation.asExpr() = oc ) ) diff --git a/csharp/ql/src/experimental/Security Features/CWE-614/CookieWithoutSecure.ql b/csharp/ql/src/experimental/Security Features/CWE-614/CookieWithoutSecure.ql index d7b531b194a..417c5e592aa 100644 --- a/csharp/ql/src/experimental/Security Features/CWE-614/CookieWithoutSecure.ql +++ b/csharp/ql/src/experimental/Security Features/CWE-614/CookieWithoutSecure.ql @@ -30,15 +30,15 @@ where getAValueForCookiePolicyProp("Secure").getValue() = "1" ) and // there is no callback `OnAppendCookie` that sets `Secure` to true - not exists(OnAppendCookieSecureTrackingConfig config | config.hasFlowTo(_)) and + not OnAppendCookieSecureTracking::flowTo(_) and ( // `Secure` property in `CookieOptions` passed to IResponseCookies.Append(...) wasn't set exists(ObjectCreation oc | oc = c and oc.getType() instanceof MicrosoftAspNetCoreHttpCookieOptions and not isPropertySet(oc, "Secure") and - exists(CookieOptionsTrackingConfiguration cookieTracking, DataFlow::Node creation | - cookieTracking.hasFlow(creation, _) and + exists(DataFlow::Node creation | + CookieOptionsTracking::flow(creation, _) and creation.asExpr() = oc ) ) @@ -80,10 +80,10 @@ where or oc.getType() instanceof MicrosoftAspNetCoreHttpCookieOptions and // there is no callback `OnAppendCookie` that sets `Secure` to true - not exists(OnAppendCookieSecureTrackingConfig config | config.hasFlowTo(_)) and + not OnAppendCookieSecureTracking::flowTo(_) and // the cookie option is passed to `Append` - exists(CookieOptionsTrackingConfiguration cookieTracking, DataFlow::Node creation | - cookieTracking.hasFlow(creation, _) and + exists(DataFlow::Node creation | + CookieOptionsTracking::flow(creation, _) and creation.asExpr() = oc ) ) diff --git a/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql b/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql index ab3c7f8d59c..28dd786fbf5 100644 --- a/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql +++ b/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql @@ -12,7 +12,7 @@ import csharp import semmle.code.csharp.dataflow.DataFlow2 import semmle.code.csharp.dataflow.TaintTracking2 -import DataFlow::PathGraph +import HashWithoutSalt::PathGraph /** The C# class `Windows.Security.Cryptography.Core.HashAlgorithmProvider`. */ class HashAlgorithmProvider extends RefType { @@ -120,12 +120,10 @@ predicate hasHashAncestor(MethodCall mc) { * Taint configuration tracking flow from an expression whose name suggests it holds * password data to a method call that generates a hash without a salt. */ -class HashWithoutSaltConfiguration extends TaintTracking::Configuration { - HashWithoutSaltConfiguration() { this = "HashWithoutSaltConfiguration" } +module HashWithoutSaltConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source.asExpr() instanceof PasswordVarExpr } - override predicate isSource(DataFlow::Node source) { source.asExpr() instanceof PasswordVarExpr } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodCall mc | sink.asExpr() = mc.getArgument(0) and isHashCall(mc) and @@ -148,7 +146,7 @@ class HashWithoutSaltConfiguration extends TaintTracking::Configuration { ) } - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { exists(MethodCall mc | mc.getTarget() .hasQualifiedName("Windows.Security.Cryptography", "CryptographicBuffer", @@ -166,7 +164,7 @@ class HashWithoutSaltConfiguration extends TaintTracking::Configuration { * `byte[] saltedPassword = sha256.ComputeHash(rawSalted);` * Or the password is concatenated with a salt as a string. */ - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { exists(MethodCall mc | hasFurtherProcessing(mc) and mc.getAnArgument() = node.asExpr() @@ -194,7 +192,9 @@ class HashWithoutSaltConfiguration extends TaintTracking::Configuration { } } -from DataFlow::PathNode source, DataFlow::PathNode sink, HashWithoutSaltConfiguration c -where c.hasFlowPath(source, sink) +module HashWithoutSalt = TaintTracking::Global; + +from HashWithoutSalt::PathNode source, HashWithoutSalt::PathNode sink +where HashWithoutSalt::flowPath(source, sink) select sink.getNode(), source, sink, "$@ is hashed without a salt.", source.getNode(), "The password" diff --git a/csharp/ql/src/experimental/Security Features/JsonWebTokenHandler/JsonWebTokenHandlerLib.qll b/csharp/ql/src/experimental/Security Features/JsonWebTokenHandler/JsonWebTokenHandlerLib.qll index 8b2c28a4a06..b876ddf9479 100644 --- a/csharp/ql/src/experimental/Security Features/JsonWebTokenHandler/JsonWebTokenHandlerLib.qll +++ b/csharp/ql/src/experimental/Security Features/JsonWebTokenHandler/JsonWebTokenHandlerLib.qll @@ -19,9 +19,11 @@ class TokenValidationParametersPropertySensitiveValidation extends Property { } /** + * DEPRECATED: Use `FalseValueFlowsToTokenValidationParametersPropertyWriteToBypassValidation` instead. + * * A dataflow from a `false` value to a write sensitive property for `TokenValidationParameters`. */ -class FalseValueFlowsToTokenValidationParametersPropertyWriteToBypassValidation extends DataFlow::Configuration +deprecated class FalseValueFlowsToTokenValidationParametersPropertyWriteToBypassValidation extends DataFlow::Configuration { FalseValueFlowsToTokenValidationParametersPropertyWriteToBypassValidation() { this = "FalseValueFlowsToTokenValidationParametersPropertyWriteToBypassValidation" @@ -37,6 +39,25 @@ class FalseValueFlowsToTokenValidationParametersPropertyWriteToBypassValidation } } +/** + * A dataflow configuration from a `false` value to a write sensitive property for `TokenValidationParameters`. + */ +private module FalseValueFlowsToTokenValidationParametersPropertyWriteToBypassValidationConfig + implements DataFlow::ConfigSig +{ + predicate isSource(DataFlow::Node source) { + source.asExpr().getValue() = "false" and + source.asExpr().getType() instanceof BoolType + } + + predicate isSink(DataFlow::Node sink) { + sink.asExpr() = any(TokenValidationParametersPropertySensitiveValidation p).getAnAssignedValue() + } +} + +module FalseValueFlowsToTokenValidationParametersPropertyWriteToBypassValidation = + DataFlow::Global; + /** * Holds if `assemblyName` is older than version `ver` */ @@ -81,21 +102,6 @@ private class TokenValidationResultIsValidCall extends PropertyRead { } } -/** - * Dataflow from the output of `Microsoft.IdentityModel.JsonWebTokens.JsonWebTokenHandler.ValidateToken` call to access the `IsValid` or `Exception` property - */ -private class FlowsToTokenValidationResultIsValidCall extends DataFlow::Configuration { - FlowsToTokenValidationResultIsValidCall() { this = "FlowsToTokenValidationResultIsValidCall" } - - override predicate isSource(DataFlow::Node source) { - source.asExpr() instanceof JsonWebTokenHandlerValidateTokenCall - } - - override predicate isSink(DataFlow::Node sink) { - exists(TokenValidationResultIsValidCall call | sink.asExpr() = call.getQualifier()) - } -} - /** * A security-sensitive property for `Microsoft.IdentityModel.Tokens.TokenValidationParameters` */ diff --git a/csharp/ql/src/experimental/Security Features/JsonWebTokenHandler/security-validation-disabled.ql b/csharp/ql/src/experimental/Security Features/JsonWebTokenHandler/security-validation-disabled.ql index 54a2301734d..e13338af2b2 100644 --- a/csharp/ql/src/experimental/Security Features/JsonWebTokenHandler/security-validation-disabled.ql +++ b/csharp/ql/src/experimental/Security Features/JsonWebTokenHandler/security-validation-disabled.ql @@ -16,11 +16,10 @@ import JsonWebTokenHandlerLib import semmle.code.csharp.commons.QualifiedName from - FalseValueFlowsToTokenValidationParametersPropertyWriteToBypassValidation config, DataFlow::Node source, DataFlow::Node sink, TokenValidationParametersPropertySensitiveValidation pw, string qualifier, string name where - config.hasFlow(source, sink) and + FalseValueFlowsToTokenValidationParametersPropertyWriteToBypassValidation::flow(source, sink) and sink.asExpr() = pw.getAnAssignedValue() and pw.hasQualifiedName(qualifier, name) select sink, "The security sensitive property $@ is being disabled by the following value: $@.", pw, diff --git a/csharp/ql/src/experimental/Security Features/Serialization/UnsafeTypeUsedDataContractSerializer.ql b/csharp/ql/src/experimental/Security Features/Serialization/UnsafeTypeUsedDataContractSerializer.ql index 00622007cbf..73ebfa64b45 100644 --- a/csharp/ql/src/experimental/Security Features/Serialization/UnsafeTypeUsedDataContractSerializer.ql +++ b/csharp/ql/src/experimental/Security Features/Serialization/UnsafeTypeUsedDataContractSerializer.ql @@ -31,16 +31,16 @@ predicate unsafeDataContractTypeCreation(Expr e) { e.(TypeofExpr).getTypeAccess().getTarget() instanceof DataSetOrTableRelatedClass } -class Conf extends DataFlow::Configuration { - Conf() { this = "FlowToDataSerializerConstructor" } +module FlowToDataSerializerConstructorConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { unsafeDataContractTypeCreation(node.asExpr()) } - override predicate isSource(DataFlow::Node node) { unsafeDataContractTypeCreation(node.asExpr()) } - - override predicate isSink(DataFlow::Node node) { xmlSerializerConstructorArgument(node.asExpr()) } + predicate isSink(DataFlow::Node node) { xmlSerializerConstructorArgument(node.asExpr()) } } -from Conf conf, DataFlow::Node source, DataFlow::Node sink -where conf.hasFlow(source, sink) +module FlowToDataSerializerConstructor = DataFlow::Global; + +from DataFlow::Node source, DataFlow::Node sink +where FlowToDataSerializerConstructor::flow(source, sink) select sink, "Unsafe type is used in data contract serializer. Make sure $@ comes from the trusted source.", source, source.toString() diff --git a/csharp/ql/src/experimental/Security Features/backdoor/ProcessNameToHashTaintFlow.ql b/csharp/ql/src/experimental/Security Features/backdoor/ProcessNameToHashTaintFlow.ql index 17c59a338a4..364f87d1093 100644 --- a/csharp/ql/src/experimental/Security Features/backdoor/ProcessNameToHashTaintFlow.ql +++ b/csharp/ql/src/experimental/Security Features/backdoor/ProcessNameToHashTaintFlow.ql @@ -11,23 +11,17 @@ */ import csharp -import DataFlow::PathGraph import experimental.code.csharp.Cryptography.NonCryptographicHashes +import DataFlowFromMethodToHash::PathGraph -class DataFlowFromMethodToHash extends TaintTracking::Configuration { - DataFlowFromMethodToHash() { this = "DataFlowFromMethodNameToHashFunction" } +module DataFlowFromMethodToHashConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { isSuspiciousPropertyName(source.asExpr()) } - /** - * Holds if `source` is a relevant data flow source. - */ - override predicate isSource(DataFlow::Node source) { isSuspiciousPropertyName(source.asExpr()) } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - override predicate isSink(DataFlow::Node sink) { isGetHash(sink.asExpr()) } + predicate isSink(DataFlow::Node sink) { isGetHash(sink.asExpr()) } } +module DataFlowFromMethodToHash = TaintTracking::Global; + predicate isGetHash(Expr arg) { exists(MethodCall mc | ( @@ -48,8 +42,8 @@ predicate isSuspiciousPropertyName(PropertyRead pr) { pr.getTarget().hasQualifiedName("System.Diagnostics", "Process", "ProcessName") } -from DataFlow::PathNode src, DataFlow::PathNode sink, DataFlowFromMethodToHash conf -where conf.hasFlow(src.getNode(), sink.getNode()) +from DataFlowFromMethodToHash::PathNode src, DataFlowFromMethodToHash::PathNode sink +where DataFlowFromMethodToHash::flow(src.getNode(), sink.getNode()) select src.getNode(), src, sink, "The hash is calculated on $@, may be related to a backdoor. Please review the code for possible malicious intent.", sink.getNode(), "this process name" diff --git a/csharp/ql/src/experimental/dataflow/flowsources/AuthCookie.qll b/csharp/ql/src/experimental/dataflow/flowsources/AuthCookie.qll index 968a92f4af8..60ea37b39db 100644 --- a/csharp/ql/src/experimental/dataflow/flowsources/AuthCookie.qll +++ b/csharp/ql/src/experimental/dataflow/flowsources/AuthCookie.qll @@ -9,18 +9,16 @@ import semmle.code.csharp.frameworks.microsoft.AspNetCore * Holds if the expression is a variable with a sensitive name. */ predicate isCookieWithSensitiveName(Expr cookieExpr) { - exists(AuthCookieNameConfiguration dataflow, DataFlow::Node sink | - dataflow.hasFlowTo(sink) and + exists(DataFlow::Node sink | + AuthCookieName::flowTo(sink) and sink.asExpr() = cookieExpr ) } /** - * Tracks if a variable with a sensitive name is used as an argument. + * Configuration for tracking if a variable with a sensitive name is used as an argument. */ -private class AuthCookieNameConfiguration extends DataFlow::Configuration { - AuthCookieNameConfiguration() { this = "AuthCookieNameConfiguration" } - +private module AuthCookieNameConfig implements DataFlow::ConfigSig { private predicate isAuthVariable(Expr expr) { exists(string val | ( @@ -32,17 +30,22 @@ private class AuthCookieNameConfiguration extends DataFlow::Configuration { ) } - override predicate isSource(DataFlow::Node source) { isAuthVariable(source.asExpr()) } + predicate isSource(DataFlow::Node source) { isAuthVariable(source.asExpr()) } - override predicate isSink(DataFlow::Node sink) { - exists(Call c | sink.asExpr() = c.getAnArgument()) - } + predicate isSink(DataFlow::Node sink) { exists(Call c | sink.asExpr() = c.getAnArgument()) } } /** + * Tracks if a variable with a sensitive name is used as an argument. + */ +private module AuthCookieName = DataFlow::Global; + +/** + * DEPRECATED: Use `CookieOptionsTracking` instead. + * * Tracks creation of `CookieOptions` to `IResponseCookies.Append(String, String, CookieOptions)` call as a third parameter. */ -class CookieOptionsTrackingConfiguration extends DataFlow::Configuration { +deprecated class CookieOptionsTrackingConfiguration extends DataFlow::Configuration { CookieOptionsTrackingConfiguration() { this = "CookieOptionsTrackingConfiguration" } override predicate isSource(DataFlow::Node source) { @@ -57,6 +60,29 @@ class CookieOptionsTrackingConfiguration extends DataFlow::Configuration { } } +/** + * Configuration module tracking creation of `CookieOptions` to `IResponseCookies.Append(String, String, CookieOptions)` + * calls as a third parameter. + */ +private module CookieOptionsTrackingConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source.asExpr().(ObjectCreation).getType() instanceof MicrosoftAspNetCoreHttpCookieOptions + } + + predicate isSink(DataFlow::Node sink) { + exists(MicrosoftAspNetCoreHttpResponseCookies iResponse, MethodCall mc | + iResponse.getAppendMethod() = mc.getTarget() and + mc.getArgument(2) = sink.asExpr() + ) + } +} + +/** + * Tracking creation of `CookieOptions` to `IResponseCookies.Append(String, String, CookieOptions)` + * calls as a third parameter. + */ +module CookieOptionsTracking = DataFlow::Global; + /** * Looks for property value of `CookiePolicyOptions` passed to `app.UseCookiePolicy` in `Startup.Configure`. */ @@ -109,18 +135,22 @@ Expr getAValueForProp(ObjectCreation create, Assignment a, string prop) { predicate isPropertySet(ObjectCreation oc, string prop) { exists(getAValueForProp(oc, _, prop)) } /** + * DEPRECATED: Use `OnAppendCookieSecureTracking` instead. + * * Tracks if a callback used in `OnAppendCookie` sets `Secure` to `true`. */ -class OnAppendCookieSecureTrackingConfig extends OnAppendCookieTrackingConfig { +deprecated class OnAppendCookieSecureTrackingConfig extends OnAppendCookieTrackingConfig { OnAppendCookieSecureTrackingConfig() { this = "OnAppendCookieSecureTrackingConfig" } override string propertyName() { result = "Secure" } } /** + * DEPRECATED: Use `OnAppendCookieHttpOnlyTracking` instead. + * * Tracks if a callback used in `OnAppendCookie` sets `HttpOnly` to `true`. */ -class OnAppendCookieHttpOnlyTrackingConfig extends OnAppendCookieTrackingConfig { +deprecated class OnAppendCookieHttpOnlyTrackingConfig extends OnAppendCookieTrackingConfig { OnAppendCookieHttpOnlyTrackingConfig() { this = "OnAppendCookieHttpOnlyTrackingConfig" } override string propertyName() { result = "HttpOnly" } @@ -180,3 +210,83 @@ abstract private class OnAppendCookieTrackingConfig extends DataFlow::Configurat ) } } + +private signature string propertyName(); + +/** + * Configuration for tracking if a callback used in `OnAppendCookie` sets a cookie property to `true`. + */ +private module OnAppendCookieTrackingConfig implements + DataFlow::ConfigSig +{ + /** + * Specifies the cookie property name to track. + */ + predicate isSource(DataFlow::Node source) { + exists(PropertyWrite pw, Assignment delegateAssign, Callable c | + pw.getProperty().getName() = "OnAppendCookie" and + pw.getProperty().getDeclaringType() instanceof MicrosoftAspNetCoreBuilderCookiePolicyOptions and + delegateAssign.getLValue() = pw and + ( + exists(LambdaExpr lambda | + delegateAssign.getRValue() = lambda and + lambda = c + ) + or + exists(DelegateCreation delegate | + delegateAssign.getRValue() = delegate and + delegate.getArgument().(CallableAccess).getTarget() = c + ) + ) and + c.getParameter(0) = source.asParameter() + ) + } + + predicate isSink(DataFlow::Node sink) { + exists(PropertyWrite pw, Assignment a | + pw.getProperty().getDeclaringType() instanceof MicrosoftAspNetCoreHttpCookieOptions and + pw.getProperty().getName() = getPropertyName() and + a.getLValue() = pw and + exists(Expr val | + DataFlow::localExprFlow(val, a.getRValue()) and + val.getValue() = "true" + ) and + sink.asExpr() = pw.getQualifier() + ) + } + + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + node2.asExpr() = + any(PropertyRead pr | + pr.getQualifier() = node1.asExpr() and + pr.getProperty().getDeclaringType() instanceof + MicrosoftAspNetCoreCookiePolicyAppendCookieContext + ) + } +} + +private string getPropertyNameSecure() { result = "Secure" } + +/** + * Configuration module for tracking if a callback used in `OnAppendCookie` sets `Secure` to `true`. + */ +private module OnAppendCookieSecureTrackingConfig = + OnAppendCookieTrackingConfig; + +/** + * Tracks if a callback used in `OnAppendCookie` sets `Secure` to `true`. + */ +module OnAppendCookieSecureTracking = DataFlow::Global; + +private string getPropertyNameHttpOnly() { result = "HttpOnly" } + +/** + * Configuration module for tracking if a callback used in `OnAppendCookie` sets `HttpOnly` to `true`. + */ +private module OnAppendCookieHttpOnlyTrackingConfig = + OnAppendCookieTrackingConfig; + +/** + * Tracks if a callback used in `OnAppendCookie` sets `HttpOnly` to `true`. + */ +module OnAppendCookieHttpOnlyTracking = DataFlow::Global; diff --git a/csharp/ql/src/experimental/ir/implementation/internal/IRFunctionBase.qll b/csharp/ql/src/experimental/ir/implementation/internal/IRFunctionBase.qll index 576b4f9adf1..571b0a12f49 100644 --- a/csharp/ql/src/experimental/ir/implementation/internal/IRFunctionBase.qll +++ b/csharp/ql/src/experimental/ir/implementation/internal/IRFunctionBase.qll @@ -6,7 +6,7 @@ private import IRFunctionBaseInternal private newtype TIRFunction = TFunctionIRFunction(Language::Function func) { IRConstruction::Raw::functionHasIR(func) } or - TVarInitIRFunction(Language::GlobalVariable var) { IRConstruction::Raw::varHasIRFunc(var) } + TVarInitIRFunction(Language::Variable var) { IRConstruction::Raw::varHasIRFunc(var) } /** * The IR for a function. This base class contains only the predicates that are the same between all diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index f560260e450..d7fa73347f0 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 0.6.0 +version: 0.6.1 groups: - csharp - queries diff --git a/csharp/ql/src/queries.xml b/csharp/ql/src/queries.xml deleted file mode 100644 index 56abe7737ac..00000000000 --- a/csharp/ql/src/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected b/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected index a4229373684..e858c24758d 100644 --- a/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected +++ b/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected @@ -7,11 +7,11 @@ edges | CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | CSharp7.cs:56:18:56:19 | access to local variable t4 | | CSharp7.cs:80:21:80:21 | x : String | CSharp7.cs:82:20:82:20 | access to parameter x : String | -| CSharp7.cs:82:16:82:24 | (..., ...) [field Item1] : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | -| CSharp7.cs:82:20:82:20 | access to parameter x : String | CSharp7.cs:82:16:82:24 | (..., ...) [field Item1] : String | -| CSharp7.cs:87:18:87:34 | (..., ...) [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 [field Item1] : String | -| CSharp7.cs:87:19:87:27 | "tainted" : String | CSharp7.cs:87:18:87:34 | (..., ...) [field Item1] : String | -| CSharp7.cs:90:20:90:21 | access to local variable t1 [field Item1] : String | CSharp7.cs:90:20:90:27 | access to field Item1 : String | +| CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | +| CSharp7.cs:82:20:82:20 | access to parameter x : String | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | +| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | +| CSharp7.cs:87:19:87:27 | "tainted" : String | CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | +| CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:27 | access to field Item1 : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:80:21:80:21 | x : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:90:18:90:28 | call to method I | | CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:181:23:181:25 | access to local variable src : String | @@ -33,13 +33,13 @@ nodes | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | semmle.label | SSA def(t4) : String | | CSharp7.cs:56:18:56:19 | access to local variable t4 | semmle.label | access to local variable t4 | | CSharp7.cs:80:21:80:21 | x : String | semmle.label | x : String | -| CSharp7.cs:82:16:82:24 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:82:16:82:26 | access to field Item1 : String | semmle.label | access to field Item1 : String | | CSharp7.cs:82:20:82:20 | access to parameter x : String | semmle.label | access to parameter x : String | -| CSharp7.cs:87:18:87:34 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:87:19:87:27 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:90:18:90:28 | call to method I | semmle.label | call to method I | -| CSharp7.cs:90:20:90:21 | access to local variable t1 [field Item1] : String | semmle.label | access to local variable t1 [field Item1] : String | +| CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | semmle.label | access to local variable t1 : ValueTuple [field Item1] : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | semmle.label | access to field Item1 : String | | CSharp7.cs:175:22:175:30 | "tainted" | semmle.label | "tainted" | | CSharp7.cs:175:22:175:30 | "tainted" : String | semmle.label | "tainted" : String | diff --git a/csharp/ql/test/library-tests/csharp7/GlobalFlow.ql b/csharp/ql/test/library-tests/csharp7/GlobalFlow.ql index d1d09e89893..b1880fa58a3 100644 --- a/csharp/ql/test/library-tests/csharp7/GlobalFlow.ql +++ b/csharp/ql/test/library-tests/csharp7/GlobalFlow.ql @@ -3,20 +3,18 @@ */ import csharp -import DataFlow::PathGraph +import GlobalFlow::PathGraph -class DataflowConfiguration extends DataFlow::Configuration { - DataflowConfiguration() { this = "data flow configuration" } +module GlobalFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source.asExpr().(Expr).getValue() = "tainted" } - override predicate isSource(DataFlow::Node source) { - source.asExpr().(Expr).getValue() = "tainted" - } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(LocalVariable v | sink.asExpr() = v.getInitializer()) } } -from DataFlow::PathNode source, DataFlow::PathNode sink, DataflowConfiguration conf -where conf.hasFlowPath(source, sink) +module GlobalFlow = DataFlow::Global; + +from GlobalFlow::PathNode source, GlobalFlow::PathNode sink +where GlobalFlow::flowPath(source, sink) select source, source, sink, "$@", sink, sink.toString() diff --git a/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected b/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected index d3869f3eae7..04bb7095ec9 100644 --- a/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected +++ b/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected @@ -7,11 +7,11 @@ edges | CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | CSharp7.cs:56:18:56:19 | access to local variable t4 | | CSharp7.cs:80:21:80:21 | x : String | CSharp7.cs:82:20:82:20 | access to parameter x : String | -| CSharp7.cs:82:16:82:24 | (..., ...) [field Item1] : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | -| CSharp7.cs:82:20:82:20 | access to parameter x : String | CSharp7.cs:82:16:82:24 | (..., ...) [field Item1] : String | -| CSharp7.cs:87:18:87:34 | (..., ...) [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 [field Item1] : String | -| CSharp7.cs:87:19:87:27 | "tainted" : String | CSharp7.cs:87:18:87:34 | (..., ...) [field Item1] : String | -| CSharp7.cs:90:20:90:21 | access to local variable t1 [field Item1] : String | CSharp7.cs:90:20:90:27 | access to field Item1 : String | +| CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | +| CSharp7.cs:82:20:82:20 | access to parameter x : String | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | +| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | +| CSharp7.cs:87:19:87:27 | "tainted" : String | CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | +| CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:27 | access to field Item1 : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:80:21:80:21 | x : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:90:18:90:28 | call to method I | | CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:180:23:180:25 | access to local variable src : String | @@ -40,13 +40,13 @@ nodes | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | semmle.label | SSA def(t4) : String | | CSharp7.cs:56:18:56:19 | access to local variable t4 | semmle.label | access to local variable t4 | | CSharp7.cs:80:21:80:21 | x : String | semmle.label | x : String | -| CSharp7.cs:82:16:82:24 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:82:16:82:26 | access to field Item1 : String | semmle.label | access to field Item1 : String | | CSharp7.cs:82:20:82:20 | access to parameter x : String | semmle.label | access to parameter x : String | -| CSharp7.cs:87:18:87:34 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:87:19:87:27 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:90:18:90:28 | call to method I | semmle.label | call to method I | -| CSharp7.cs:90:20:90:21 | access to local variable t1 [field Item1] : String | semmle.label | access to local variable t1 [field Item1] : String | +| CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | semmle.label | access to local variable t1 : ValueTuple [field Item1] : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | semmle.label | access to field Item1 : String | | CSharp7.cs:175:22:175:30 | "tainted" | semmle.label | "tainted" | | CSharp7.cs:175:22:175:30 | "tainted" : String | semmle.label | "tainted" : String | diff --git a/csharp/ql/test/library-tests/dataflow/async/Async.expected b/csharp/ql/test/library-tests/dataflow/async/Async.expected index be01574f724..4fd0136cda0 100644 --- a/csharp/ql/test/library-tests/dataflow/async/Async.expected +++ b/csharp/ql/test/library-tests/dataflow/async/Async.expected @@ -6,34 +6,34 @@ edges | Async.cs:14:34:14:34 | x : String | Async.cs:16:16:16:16 | access to parameter x : String | | Async.cs:16:16:16:16 | access to parameter x : String | Async.cs:11:14:11:26 | call to method Return | | Async.cs:19:41:19:45 | input : String | Async.cs:21:32:21:36 | access to parameter input : String | -| Async.cs:21:20:21:37 | call to method ReturnAwait [property Result] : String | Async.cs:21:14:21:37 | await ... | -| Async.cs:21:32:21:36 | access to parameter input : String | Async.cs:21:20:21:37 | call to method ReturnAwait [property Result] : String | +| Async.cs:21:20:21:37 | call to method ReturnAwait : Task [property Result] : String | Async.cs:21:14:21:37 | await ... | +| Async.cs:21:32:21:36 | access to parameter input : String | Async.cs:21:20:21:37 | call to method ReturnAwait : Task [property Result] : String | | Async.cs:21:32:21:36 | access to parameter input : String | Async.cs:35:51:35:51 | x : String | | Async.cs:24:41:24:45 | input : String | Async.cs:26:35:26:39 | access to parameter input : String | | Async.cs:26:17:26:40 | await ... : String | Async.cs:27:14:27:14 | access to local variable x | -| Async.cs:26:23:26:40 | call to method ReturnAwait [property Result] : String | Async.cs:26:17:26:40 | await ... : String | -| Async.cs:26:35:26:39 | access to parameter input : String | Async.cs:26:23:26:40 | call to method ReturnAwait [property Result] : String | +| Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | Async.cs:26:17:26:40 | await ... : String | +| Async.cs:26:35:26:39 | access to parameter input : String | Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | | Async.cs:26:35:26:39 | access to parameter input : String | Async.cs:35:51:35:51 | x : String | | Async.cs:30:35:30:39 | input : String | Async.cs:32:27:32:31 | access to parameter input : String | -| Async.cs:32:14:32:32 | call to method ReturnAwait2 [property Result] : String | Async.cs:32:14:32:39 | access to property Result | -| Async.cs:32:27:32:31 | access to parameter input : String | Async.cs:32:14:32:32 | call to method ReturnAwait2 [property Result] : String | +| Async.cs:32:14:32:32 | call to method ReturnAwait2 : Task [property Result] : String | Async.cs:32:14:32:39 | access to property Result | +| Async.cs:32:27:32:31 | access to parameter input : String | Async.cs:32:14:32:32 | call to method ReturnAwait2 : Task [property Result] : String | | Async.cs:32:27:32:31 | access to parameter input : String | Async.cs:51:52:51:52 | x : String | | Async.cs:35:51:35:51 | x : String | Async.cs:38:16:38:16 | access to parameter x : String | | Async.cs:35:51:35:51 | x : String | Async.cs:38:16:38:16 | access to parameter x : String | -| Async.cs:38:16:38:16 | access to parameter x : String | Async.cs:21:20:21:37 | call to method ReturnAwait [property Result] : String | -| Async.cs:38:16:38:16 | access to parameter x : String | Async.cs:26:23:26:40 | call to method ReturnAwait [property Result] : String | +| Async.cs:38:16:38:16 | access to parameter x : String | Async.cs:21:20:21:37 | call to method ReturnAwait : Task [property Result] : String | +| Async.cs:38:16:38:16 | access to parameter x : String | Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | | Async.cs:41:33:41:37 | input : String | Async.cs:43:25:43:29 | access to parameter input : String | -| Async.cs:43:14:43:30 | call to method ReturnTask [property Result] : String | Async.cs:43:14:43:37 | access to property Result | -| Async.cs:43:25:43:29 | access to parameter input : String | Async.cs:43:14:43:30 | call to method ReturnTask [property Result] : String | +| Async.cs:43:14:43:30 | call to method ReturnTask : Task [property Result] : String | Async.cs:43:14:43:37 | access to property Result | +| Async.cs:43:25:43:29 | access to parameter input : String | Async.cs:43:14:43:30 | call to method ReturnTask : Task [property Result] : String | | Async.cs:43:25:43:29 | access to parameter input : String | Async.cs:46:44:46:44 | x : String | | Async.cs:46:44:46:44 | x : String | Async.cs:48:32:48:32 | access to parameter x : String | | Async.cs:46:44:46:44 | x : String | Async.cs:48:32:48:32 | access to parameter x : String | -| Async.cs:48:16:48:33 | call to method FromResult [property Result] : String | Async.cs:43:14:43:30 | call to method ReturnTask [property Result] : String | -| Async.cs:48:32:48:32 | access to parameter x : String | Async.cs:48:16:48:33 | call to method FromResult [property Result] : String | -| Async.cs:48:32:48:32 | access to parameter x : String | Async.cs:48:16:48:33 | call to method FromResult [property Result] : String | +| Async.cs:48:16:48:33 | call to method FromResult : Task [property Result] : String | Async.cs:43:14:43:30 | call to method ReturnTask : Task [property Result] : String | +| Async.cs:48:32:48:32 | access to parameter x : String | Async.cs:48:16:48:33 | call to method FromResult : Task [property Result] : String | +| Async.cs:48:32:48:32 | access to parameter x : String | Async.cs:48:16:48:33 | call to method FromResult : Task [property Result] : String | | Async.cs:51:52:51:52 | x : String | Async.cs:51:58:51:58 | access to parameter x : String | | Async.cs:51:52:51:52 | x : String | Async.cs:51:58:51:58 | access to parameter x : String | -| Async.cs:51:58:51:58 | access to parameter x : String | Async.cs:32:14:32:32 | call to method ReturnAwait2 [property Result] : String | +| Async.cs:51:58:51:58 | access to parameter x : String | Async.cs:32:14:32:32 | call to method ReturnAwait2 : Task [property Result] : String | nodes | Async.cs:9:37:9:41 | input : String | semmle.label | input : String | | Async.cs:11:14:11:26 | call to method Return | semmle.label | call to method Return | @@ -44,15 +44,15 @@ nodes | Async.cs:16:16:16:16 | access to parameter x : String | semmle.label | access to parameter x : String | | Async.cs:19:41:19:45 | input : String | semmle.label | input : String | | Async.cs:21:14:21:37 | await ... | semmle.label | await ... | -| Async.cs:21:20:21:37 | call to method ReturnAwait [property Result] : String | semmle.label | call to method ReturnAwait [property Result] : String | +| Async.cs:21:20:21:37 | call to method ReturnAwait : Task [property Result] : String | semmle.label | call to method ReturnAwait : Task [property Result] : String | | Async.cs:21:32:21:36 | access to parameter input : String | semmle.label | access to parameter input : String | | Async.cs:24:41:24:45 | input : String | semmle.label | input : String | | Async.cs:26:17:26:40 | await ... : String | semmle.label | await ... : String | -| Async.cs:26:23:26:40 | call to method ReturnAwait [property Result] : String | semmle.label | call to method ReturnAwait [property Result] : String | +| Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | semmle.label | call to method ReturnAwait : Task [property Result] : String | | Async.cs:26:35:26:39 | access to parameter input : String | semmle.label | access to parameter input : String | | Async.cs:27:14:27:14 | access to local variable x | semmle.label | access to local variable x | | Async.cs:30:35:30:39 | input : String | semmle.label | input : String | -| Async.cs:32:14:32:32 | call to method ReturnAwait2 [property Result] : String | semmle.label | call to method ReturnAwait2 [property Result] : String | +| Async.cs:32:14:32:32 | call to method ReturnAwait2 : Task [property Result] : String | semmle.label | call to method ReturnAwait2 : Task [property Result] : String | | Async.cs:32:14:32:39 | access to property Result | semmle.label | access to property Result | | Async.cs:32:27:32:31 | access to parameter input : String | semmle.label | access to parameter input : String | | Async.cs:35:51:35:51 | x : String | semmle.label | x : String | @@ -60,13 +60,13 @@ nodes | Async.cs:38:16:38:16 | access to parameter x : String | semmle.label | access to parameter x : String | | Async.cs:38:16:38:16 | access to parameter x : String | semmle.label | access to parameter x : String | | Async.cs:41:33:41:37 | input : String | semmle.label | input : String | -| Async.cs:43:14:43:30 | call to method ReturnTask [property Result] : String | semmle.label | call to method ReturnTask [property Result] : String | +| Async.cs:43:14:43:30 | call to method ReturnTask : Task [property Result] : String | semmle.label | call to method ReturnTask : Task [property Result] : String | | Async.cs:43:14:43:37 | access to property Result | semmle.label | access to property Result | | Async.cs:43:25:43:29 | access to parameter input : String | semmle.label | access to parameter input : String | | Async.cs:46:44:46:44 | x : String | semmle.label | x : String | | Async.cs:46:44:46:44 | x : String | semmle.label | x : String | -| Async.cs:48:16:48:33 | call to method FromResult [property Result] : String | semmle.label | call to method FromResult [property Result] : String | -| Async.cs:48:16:48:33 | call to method FromResult [property Result] : String | semmle.label | call to method FromResult [property Result] : String | +| Async.cs:48:16:48:33 | call to method FromResult : Task [property Result] : String | semmle.label | call to method FromResult : Task [property Result] : String | +| Async.cs:48:16:48:33 | call to method FromResult : Task [property Result] : String | semmle.label | call to method FromResult : Task [property Result] : String | | Async.cs:48:32:48:32 | access to parameter x : String | semmle.label | access to parameter x : String | | Async.cs:48:32:48:32 | access to parameter x : String | semmle.label | access to parameter x : String | | Async.cs:51:52:51:52 | x : String | semmle.label | x : String | @@ -75,10 +75,10 @@ nodes | Async.cs:51:58:51:58 | access to parameter x : String | semmle.label | access to parameter x : String | subpaths | Async.cs:11:21:11:25 | access to parameter input : String | Async.cs:14:34:14:34 | x : String | Async.cs:16:16:16:16 | access to parameter x : String | Async.cs:11:14:11:26 | call to method Return | -| Async.cs:21:32:21:36 | access to parameter input : String | Async.cs:35:51:35:51 | x : String | Async.cs:38:16:38:16 | access to parameter x : String | Async.cs:21:20:21:37 | call to method ReturnAwait [property Result] : String | -| Async.cs:26:35:26:39 | access to parameter input : String | Async.cs:35:51:35:51 | x : String | Async.cs:38:16:38:16 | access to parameter x : String | Async.cs:26:23:26:40 | call to method ReturnAwait [property Result] : String | -| Async.cs:32:27:32:31 | access to parameter input : String | Async.cs:51:52:51:52 | x : String | Async.cs:51:58:51:58 | access to parameter x : String | Async.cs:32:14:32:32 | call to method ReturnAwait2 [property Result] : String | -| Async.cs:43:25:43:29 | access to parameter input : String | Async.cs:46:44:46:44 | x : String | Async.cs:48:16:48:33 | call to method FromResult [property Result] : String | Async.cs:43:14:43:30 | call to method ReturnTask [property Result] : String | +| Async.cs:21:32:21:36 | access to parameter input : String | Async.cs:35:51:35:51 | x : String | Async.cs:38:16:38:16 | access to parameter x : String | Async.cs:21:20:21:37 | call to method ReturnAwait : Task [property Result] : String | +| Async.cs:26:35:26:39 | access to parameter input : String | Async.cs:35:51:35:51 | x : String | Async.cs:38:16:38:16 | access to parameter x : String | Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | +| Async.cs:32:27:32:31 | access to parameter input : String | Async.cs:51:52:51:52 | x : String | Async.cs:51:58:51:58 | access to parameter x : String | Async.cs:32:14:32:32 | call to method ReturnAwait2 : Task [property Result] : String | +| Async.cs:43:25:43:29 | access to parameter input : String | Async.cs:46:44:46:44 | x : String | Async.cs:48:16:48:33 | call to method FromResult : Task [property Result] : String | Async.cs:43:14:43:30 | call to method ReturnTask : Task [property Result] : String | #select | Async.cs:11:14:11:26 | call to method Return | Async.cs:9:37:9:41 | input : String | Async.cs:11:14:11:26 | call to method Return | $@ flows to here and is used. | Async.cs:9:37:9:41 | input | User-provided value | | Async.cs:11:14:11:26 | call to method Return | Async.cs:14:34:14:34 | x : String | Async.cs:11:14:11:26 | call to method Return | $@ flows to here and is used. | Async.cs:14:34:14:34 | x | User-provided value | diff --git a/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.ql b/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.ql index d77365f2db9..c2c6a4409c7 100644 --- a/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.ql +++ b/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.ql @@ -3,14 +3,12 @@ */ import csharp -import DataFlow::PathGraph +import CallSensitivity::PathGraph -class Conf extends DataFlow::Configuration { - Conf() { this = "CallSensitiveFlowConf" } +module CallSensitivityConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ObjectCreation } - override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ObjectCreation } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodCall mc | mc.getTarget().hasName("Sink") and mc.getAnArgument() = sink.asExpr() @@ -18,6 +16,8 @@ class Conf extends DataFlow::Configuration { } } -from DataFlow::PathNode source, DataFlow::PathNode sink, Conf conf -where conf.hasFlowPath(source, sink) +module CallSensitivity = DataFlow::Global; + +from CallSensitivity::PathNode source, CallSensitivity::PathNode sink +where CallSensitivity::flowPath(source, sink) select source, source, sink, "$@", sink, sink.toString() diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected index 2c77caebf92..d5bbeef765a 100644 --- a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected @@ -1,488 +1,488 @@ edges | CollectionFlow.cs:13:17:13:23 | object creation of type A : A | CollectionFlow.cs:14:27:14:27 | access to local variable a : A | -| CollectionFlow.cs:14:25:14:29 | { ..., ... } [element] : A | CollectionFlow.cs:15:14:15:16 | access to local variable as [element] : A | -| CollectionFlow.cs:14:25:14:29 | { ..., ... } [element] : A | CollectionFlow.cs:16:18:16:20 | access to local variable as [element] : A | -| CollectionFlow.cs:14:25:14:29 | { ..., ... } [element] : A | CollectionFlow.cs:17:20:17:22 | access to local variable as [element] : A | -| CollectionFlow.cs:14:27:14:27 | access to local variable a : A | CollectionFlow.cs:14:25:14:29 | { ..., ... } [element] : A | -| CollectionFlow.cs:15:14:15:16 | access to local variable as [element] : A | CollectionFlow.cs:15:14:15:19 | access to array element | -| CollectionFlow.cs:16:18:16:20 | access to local variable as [element] : A | CollectionFlow.cs:373:40:373:41 | ts [element] : A | -| CollectionFlow.cs:17:20:17:22 | access to local variable as [element] : A | CollectionFlow.cs:17:14:17:23 | call to method First | -| CollectionFlow.cs:17:20:17:22 | access to local variable as [element] : A | CollectionFlow.cs:381:34:381:35 | ts [element] : A | +| CollectionFlow.cs:14:25:14:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:15:14:15:16 | access to local variable as : null [element] : A | +| CollectionFlow.cs:14:25:14:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:16:18:16:20 | access to local variable as : null [element] : A | +| CollectionFlow.cs:14:25:14:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:17:20:17:22 | access to local variable as : null [element] : A | +| CollectionFlow.cs:14:27:14:27 | access to local variable a : A | CollectionFlow.cs:14:25:14:29 | { ..., ... } : null [element] : A | +| CollectionFlow.cs:15:14:15:16 | access to local variable as : null [element] : A | CollectionFlow.cs:15:14:15:19 | access to array element | +| CollectionFlow.cs:16:18:16:20 | access to local variable as : null [element] : A | CollectionFlow.cs:373:40:373:41 | ts : null [element] : A | +| CollectionFlow.cs:17:20:17:22 | access to local variable as : null [element] : A | CollectionFlow.cs:17:14:17:23 | call to method First | +| CollectionFlow.cs:17:20:17:22 | access to local variable as : null [element] : A | CollectionFlow.cs:381:34:381:35 | ts : null [element] : A | | CollectionFlow.cs:31:17:31:23 | object creation of type A : A | CollectionFlow.cs:32:53:32:53 | access to local variable a : A | -| CollectionFlow.cs:32:38:32:57 | { ..., ... } [field As, element] : A | CollectionFlow.cs:33:14:33:14 | access to local variable c [field As, element] : A | -| CollectionFlow.cs:32:38:32:57 | { ..., ... } [field As, element] : A | CollectionFlow.cs:34:18:34:18 | access to local variable c [field As, element] : A | -| CollectionFlow.cs:32:38:32:57 | { ..., ... } [field As, element] : A | CollectionFlow.cs:35:20:35:20 | access to local variable c [field As, element] : A | -| CollectionFlow.cs:32:45:32:55 | { ..., ... } [element] : A | CollectionFlow.cs:32:38:32:57 | { ..., ... } [field As, element] : A | -| CollectionFlow.cs:32:53:32:53 | access to local variable a : A | CollectionFlow.cs:32:45:32:55 | { ..., ... } [element] : A | -| CollectionFlow.cs:33:14:33:14 | access to local variable c [field As, element] : A | CollectionFlow.cs:33:14:33:17 | access to field As [element] : A | -| CollectionFlow.cs:33:14:33:17 | access to field As [element] : A | CollectionFlow.cs:33:14:33:20 | access to array element | -| CollectionFlow.cs:34:18:34:18 | access to local variable c [field As, element] : A | CollectionFlow.cs:34:18:34:21 | access to field As [element] : A | -| CollectionFlow.cs:34:18:34:21 | access to field As [element] : A | CollectionFlow.cs:373:40:373:41 | ts [element] : A | -| CollectionFlow.cs:35:20:35:20 | access to local variable c [field As, element] : A | CollectionFlow.cs:35:20:35:23 | access to field As [element] : A | -| CollectionFlow.cs:35:20:35:23 | access to field As [element] : A | CollectionFlow.cs:35:14:35:24 | call to method First | -| CollectionFlow.cs:35:20:35:23 | access to field As [element] : A | CollectionFlow.cs:381:34:381:35 | ts [element] : A | +| CollectionFlow.cs:32:38:32:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:33:14:33:14 | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:32:38:32:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:34:18:34:18 | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:32:38:32:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:35:20:35:20 | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:32:45:32:55 | { ..., ... } : A[] [element] : A | CollectionFlow.cs:32:38:32:57 | { ..., ... } : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:32:53:32:53 | access to local variable a : A | CollectionFlow.cs:32:45:32:55 | { ..., ... } : A[] [element] : A | +| CollectionFlow.cs:33:14:33:14 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:33:14:33:17 | access to field As : A[] [element] : A | +| CollectionFlow.cs:33:14:33:17 | access to field As : A[] [element] : A | CollectionFlow.cs:33:14:33:20 | access to array element | +| CollectionFlow.cs:34:18:34:18 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:34:18:34:21 | access to field As : A[] [element] : A | +| CollectionFlow.cs:34:18:34:21 | access to field As : A[] [element] : A | CollectionFlow.cs:373:40:373:41 | ts : A[] [element] : A | +| CollectionFlow.cs:35:20:35:20 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:35:20:35:23 | access to field As : A[] [element] : A | +| CollectionFlow.cs:35:20:35:23 | access to field As : A[] [element] : A | CollectionFlow.cs:35:14:35:24 | call to method First | +| CollectionFlow.cs:35:20:35:23 | access to field As : A[] [element] : A | CollectionFlow.cs:381:34:381:35 | ts : A[] [element] : A | | CollectionFlow.cs:49:17:49:23 | object creation of type A : A | CollectionFlow.cs:51:18:51:18 | access to local variable a : A | -| CollectionFlow.cs:51:9:51:11 | [post] access to local variable as [element] : A | CollectionFlow.cs:52:14:52:16 | access to local variable as [element] : A | -| CollectionFlow.cs:51:9:51:11 | [post] access to local variable as [element] : A | CollectionFlow.cs:53:18:53:20 | access to local variable as [element] : A | -| CollectionFlow.cs:51:9:51:11 | [post] access to local variable as [element] : A | CollectionFlow.cs:54:20:54:22 | access to local variable as [element] : A | -| CollectionFlow.cs:51:18:51:18 | access to local variable a : A | CollectionFlow.cs:51:9:51:11 | [post] access to local variable as [element] : A | -| CollectionFlow.cs:52:14:52:16 | access to local variable as [element] : A | CollectionFlow.cs:52:14:52:19 | access to array element | -| CollectionFlow.cs:53:18:53:20 | access to local variable as [element] : A | CollectionFlow.cs:373:40:373:41 | ts [element] : A | -| CollectionFlow.cs:54:20:54:22 | access to local variable as [element] : A | CollectionFlow.cs:54:14:54:23 | call to method First | -| CollectionFlow.cs:54:20:54:22 | access to local variable as [element] : A | CollectionFlow.cs:381:34:381:35 | ts [element] : A | +| CollectionFlow.cs:51:9:51:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:52:14:52:16 | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:51:9:51:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:53:18:53:20 | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:51:9:51:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:54:20:54:22 | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:51:18:51:18 | access to local variable a : A | CollectionFlow.cs:51:9:51:11 | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:52:14:52:16 | access to local variable as : A[] [element] : A | CollectionFlow.cs:52:14:52:19 | access to array element | +| CollectionFlow.cs:53:18:53:20 | access to local variable as : A[] [element] : A | CollectionFlow.cs:373:40:373:41 | ts : A[] [element] : A | +| CollectionFlow.cs:54:20:54:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:54:14:54:23 | call to method First | +| CollectionFlow.cs:54:20:54:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:381:34:381:35 | ts : A[] [element] : A | | CollectionFlow.cs:69:17:69:23 | object creation of type A : A | CollectionFlow.cs:71:19:71:19 | access to local variable a : A | -| CollectionFlow.cs:71:9:71:12 | [post] access to local variable list [element] : A | CollectionFlow.cs:72:14:72:17 | access to local variable list [element] : A | -| CollectionFlow.cs:71:9:71:12 | [post] access to local variable list [element] : A | CollectionFlow.cs:73:22:73:25 | access to local variable list [element] : A | -| CollectionFlow.cs:71:9:71:12 | [post] access to local variable list [element] : A | CollectionFlow.cs:74:24:74:27 | access to local variable list [element] : A | -| CollectionFlow.cs:71:19:71:19 | access to local variable a : A | CollectionFlow.cs:71:9:71:12 | [post] access to local variable list [element] : A | -| CollectionFlow.cs:72:14:72:17 | access to local variable list [element] : A | CollectionFlow.cs:72:14:72:20 | access to indexer | -| CollectionFlow.cs:73:22:73:25 | access to local variable list [element] : A | CollectionFlow.cs:375:49:375:52 | list [element] : A | -| CollectionFlow.cs:74:24:74:27 | access to local variable list [element] : A | CollectionFlow.cs:74:14:74:28 | call to method ListFirst | -| CollectionFlow.cs:74:24:74:27 | access to local variable list [element] : A | CollectionFlow.cs:383:43:383:46 | list [element] : A | +| CollectionFlow.cs:71:9:71:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:72:14:72:17 | access to local variable list : List [element] : A | +| CollectionFlow.cs:71:9:71:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:73:22:73:25 | access to local variable list : List [element] : A | +| CollectionFlow.cs:71:9:71:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:74:24:74:27 | access to local variable list : List [element] : A | +| CollectionFlow.cs:71:19:71:19 | access to local variable a : A | CollectionFlow.cs:71:9:71:12 | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:72:14:72:17 | access to local variable list : List [element] : A | CollectionFlow.cs:72:14:72:20 | access to indexer | +| CollectionFlow.cs:73:22:73:25 | access to local variable list : List [element] : A | CollectionFlow.cs:375:49:375:52 | list : List [element] : A | +| CollectionFlow.cs:74:24:74:27 | access to local variable list : List [element] : A | CollectionFlow.cs:74:14:74:28 | call to method ListFirst | +| CollectionFlow.cs:74:24:74:27 | access to local variable list : List [element] : A | CollectionFlow.cs:383:43:383:46 | list : List [element] : A | | CollectionFlow.cs:88:17:88:23 | object creation of type A : A | CollectionFlow.cs:89:36:89:36 | access to local variable a : A | -| CollectionFlow.cs:89:20:89:38 | object creation of type List [element] : A | CollectionFlow.cs:90:14:90:17 | access to local variable list [element] : A | -| CollectionFlow.cs:89:20:89:38 | object creation of type List [element] : A | CollectionFlow.cs:91:22:91:25 | access to local variable list [element] : A | -| CollectionFlow.cs:89:20:89:38 | object creation of type List [element] : A | CollectionFlow.cs:92:24:92:27 | access to local variable list [element] : A | -| CollectionFlow.cs:89:36:89:36 | access to local variable a : A | CollectionFlow.cs:89:20:89:38 | object creation of type List [element] : A | -| CollectionFlow.cs:90:14:90:17 | access to local variable list [element] : A | CollectionFlow.cs:90:14:90:20 | access to indexer | -| CollectionFlow.cs:91:22:91:25 | access to local variable list [element] : A | CollectionFlow.cs:375:49:375:52 | list [element] : A | -| CollectionFlow.cs:92:24:92:27 | access to local variable list [element] : A | CollectionFlow.cs:92:14:92:28 | call to method ListFirst | -| CollectionFlow.cs:92:24:92:27 | access to local variable list [element] : A | CollectionFlow.cs:383:43:383:46 | list [element] : A | +| CollectionFlow.cs:89:20:89:38 | object creation of type List : List [element] : A | CollectionFlow.cs:90:14:90:17 | access to local variable list : List [element] : A | +| CollectionFlow.cs:89:20:89:38 | object creation of type List : List [element] : A | CollectionFlow.cs:91:22:91:25 | access to local variable list : List [element] : A | +| CollectionFlow.cs:89:20:89:38 | object creation of type List : List [element] : A | CollectionFlow.cs:92:24:92:27 | access to local variable list : List [element] : A | +| CollectionFlow.cs:89:36:89:36 | access to local variable a : A | CollectionFlow.cs:89:20:89:38 | object creation of type List : List [element] : A | +| CollectionFlow.cs:90:14:90:17 | access to local variable list : List [element] : A | CollectionFlow.cs:90:14:90:20 | access to indexer | +| CollectionFlow.cs:91:22:91:25 | access to local variable list : List [element] : A | CollectionFlow.cs:375:49:375:52 | list : List [element] : A | +| CollectionFlow.cs:92:24:92:27 | access to local variable list : List [element] : A | CollectionFlow.cs:92:14:92:28 | call to method ListFirst | +| CollectionFlow.cs:92:24:92:27 | access to local variable list : List [element] : A | CollectionFlow.cs:383:43:383:46 | list : List [element] : A | | CollectionFlow.cs:105:17:105:23 | object creation of type A : A | CollectionFlow.cs:107:18:107:18 | access to local variable a : A | -| CollectionFlow.cs:107:9:107:12 | [post] access to local variable list [element] : A | CollectionFlow.cs:108:14:108:17 | access to local variable list [element] : A | -| CollectionFlow.cs:107:9:107:12 | [post] access to local variable list [element] : A | CollectionFlow.cs:109:22:109:25 | access to local variable list [element] : A | -| CollectionFlow.cs:107:9:107:12 | [post] access to local variable list [element] : A | CollectionFlow.cs:110:24:110:27 | access to local variable list [element] : A | -| CollectionFlow.cs:107:18:107:18 | access to local variable a : A | CollectionFlow.cs:107:9:107:12 | [post] access to local variable list [element] : A | -| CollectionFlow.cs:108:14:108:17 | access to local variable list [element] : A | CollectionFlow.cs:108:14:108:20 | access to indexer | -| CollectionFlow.cs:109:22:109:25 | access to local variable list [element] : A | CollectionFlow.cs:375:49:375:52 | list [element] : A | -| CollectionFlow.cs:110:24:110:27 | access to local variable list [element] : A | CollectionFlow.cs:110:14:110:28 | call to method ListFirst | -| CollectionFlow.cs:110:24:110:27 | access to local variable list [element] : A | CollectionFlow.cs:383:43:383:46 | list [element] : A | +| CollectionFlow.cs:107:9:107:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:108:14:108:17 | access to local variable list : List [element] : A | +| CollectionFlow.cs:107:9:107:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:109:22:109:25 | access to local variable list : List [element] : A | +| CollectionFlow.cs:107:9:107:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:110:24:110:27 | access to local variable list : List [element] : A | +| CollectionFlow.cs:107:18:107:18 | access to local variable a : A | CollectionFlow.cs:107:9:107:12 | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:108:14:108:17 | access to local variable list : List [element] : A | CollectionFlow.cs:108:14:108:20 | access to indexer | +| CollectionFlow.cs:109:22:109:25 | access to local variable list : List [element] : A | CollectionFlow.cs:375:49:375:52 | list : List [element] : A | +| CollectionFlow.cs:110:24:110:27 | access to local variable list : List [element] : A | CollectionFlow.cs:110:14:110:28 | call to method ListFirst | +| CollectionFlow.cs:110:24:110:27 | access to local variable list : List [element] : A | CollectionFlow.cs:383:43:383:46 | list : List [element] : A | | CollectionFlow.cs:124:17:124:23 | object creation of type A : A | CollectionFlow.cs:126:19:126:19 | access to local variable a : A | -| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict [element, property Value] : A | CollectionFlow.cs:127:14:127:17 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict [element, property Value] : A | CollectionFlow.cs:128:23:128:26 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict [element, property Value] : A | CollectionFlow.cs:129:28:129:31 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict [element, property Value] : A | CollectionFlow.cs:130:29:130:32 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict [element, property Value] : A | CollectionFlow.cs:131:30:131:33 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:126:19:126:19 | access to local variable a : A | CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:127:14:127:17 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:127:14:127:20 | access to indexer | -| CollectionFlow.cs:128:23:128:26 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:377:61:377:64 | dict [element, property Value] : A | -| CollectionFlow.cs:129:28:129:31 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:129:14:129:32 | call to method DictIndexZero | -| CollectionFlow.cs:129:28:129:31 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | -| CollectionFlow.cs:130:29:130:32 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:130:14:130:33 | call to method DictFirstValue | -| CollectionFlow.cs:130:29:130:32 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict [element, property Value] : A | -| CollectionFlow.cs:131:30:131:33 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:131:14:131:34 | call to method DictValuesFirst | -| CollectionFlow.cs:131:30:131:33 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict [element, property Value] : A | +| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:127:14:127:17 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:128:23:128:26 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:129:28:129:31 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:130:29:130:32 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:131:30:131:33 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:126:19:126:19 | access to local variable a : A | CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:127:14:127:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:127:14:127:20 | access to indexer | +| CollectionFlow.cs:128:23:128:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:377:61:377:64 | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:129:28:129:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:129:14:129:32 | call to method DictIndexZero | +| CollectionFlow.cs:129:28:129:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:130:29:130:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:130:14:130:33 | call to method DictFirstValue | +| CollectionFlow.cs:130:29:130:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:131:30:131:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:131:14:131:34 | call to method DictValuesFirst | +| CollectionFlow.cs:131:30:131:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:147:17:147:23 | object creation of type A : A | CollectionFlow.cs:148:52:148:52 | access to local variable a : A | -| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary [element, property Value] : A | CollectionFlow.cs:149:14:149:17 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary [element, property Value] : A | CollectionFlow.cs:150:23:150:26 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary [element, property Value] : A | CollectionFlow.cs:151:28:151:31 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary [element, property Value] : A | CollectionFlow.cs:152:29:152:32 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary [element, property Value] : A | CollectionFlow.cs:153:30:153:33 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:148:52:148:52 | access to local variable a : A | CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary [element, property Value] : A | -| CollectionFlow.cs:149:14:149:17 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:149:14:149:20 | access to indexer | -| CollectionFlow.cs:150:23:150:26 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:377:61:377:64 | dict [element, property Value] : A | -| CollectionFlow.cs:151:28:151:31 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:151:14:151:32 | call to method DictIndexZero | -| CollectionFlow.cs:151:28:151:31 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | -| CollectionFlow.cs:152:29:152:32 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:152:14:152:33 | call to method DictFirstValue | -| CollectionFlow.cs:152:29:152:32 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict [element, property Value] : A | -| CollectionFlow.cs:153:30:153:33 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:153:14:153:34 | call to method DictValuesFirst | -| CollectionFlow.cs:153:30:153:33 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict [element, property Value] : A | +| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:149:14:149:17 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:150:23:150:26 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:151:28:151:31 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:152:29:152:32 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:153:30:153:33 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:148:52:148:52 | access to local variable a : A | CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | +| CollectionFlow.cs:149:14:149:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:149:14:149:20 | access to indexer | +| CollectionFlow.cs:150:23:150:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:377:61:377:64 | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:151:28:151:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:151:14:151:32 | call to method DictIndexZero | +| CollectionFlow.cs:151:28:151:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:152:29:152:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:152:14:152:33 | call to method DictFirstValue | +| CollectionFlow.cs:152:29:152:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:153:30:153:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:153:14:153:34 | call to method DictValuesFirst | +| CollectionFlow.cs:153:30:153:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:168:17:168:23 | object creation of type A : A | CollectionFlow.cs:169:53:169:53 | access to local variable a : A | -| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary [element, property Value] : A | CollectionFlow.cs:170:14:170:17 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary [element, property Value] : A | CollectionFlow.cs:171:23:171:26 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary [element, property Value] : A | CollectionFlow.cs:172:28:172:31 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary [element, property Value] : A | CollectionFlow.cs:173:29:173:32 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary [element, property Value] : A | CollectionFlow.cs:174:30:174:33 | access to local variable dict [element, property Value] : A | -| CollectionFlow.cs:169:53:169:53 | access to local variable a : A | CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary [element, property Value] : A | -| CollectionFlow.cs:170:14:170:17 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:170:14:170:20 | access to indexer | -| CollectionFlow.cs:171:23:171:26 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:377:61:377:64 | dict [element, property Value] : A | -| CollectionFlow.cs:172:28:172:31 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:172:14:172:32 | call to method DictIndexZero | -| CollectionFlow.cs:172:28:172:31 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | -| CollectionFlow.cs:173:29:173:32 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:173:14:173:33 | call to method DictFirstValue | -| CollectionFlow.cs:173:29:173:32 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict [element, property Value] : A | -| CollectionFlow.cs:174:30:174:33 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:174:14:174:34 | call to method DictValuesFirst | -| CollectionFlow.cs:174:30:174:33 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict [element, property Value] : A | +| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:170:14:170:17 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:171:23:171:26 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:172:28:172:31 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:173:29:173:32 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:174:30:174:33 | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:169:53:169:53 | access to local variable a : A | CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | +| CollectionFlow.cs:170:14:170:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:170:14:170:20 | access to indexer | +| CollectionFlow.cs:171:23:171:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:377:61:377:64 | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:172:28:172:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:172:14:172:32 | call to method DictIndexZero | +| CollectionFlow.cs:172:28:172:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:173:29:173:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:173:14:173:33 | call to method DictFirstValue | +| CollectionFlow.cs:173:29:173:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:174:30:174:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:174:14:174:34 | call to method DictValuesFirst | +| CollectionFlow.cs:174:30:174:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:190:17:190:23 | object creation of type A : A | CollectionFlow.cs:191:49:191:49 | access to local variable a : A | -| CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary [element, property Key] : A | CollectionFlow.cs:192:14:192:17 | access to local variable dict [element, property Key] : A | -| CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary [element, property Key] : A | CollectionFlow.cs:193:21:193:24 | access to local variable dict [element, property Key] : A | -| CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary [element, property Key] : A | CollectionFlow.cs:194:28:194:31 | access to local variable dict [element, property Key] : A | -| CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary [element, property Key] : A | CollectionFlow.cs:195:27:195:30 | access to local variable dict [element, property Key] : A | -| CollectionFlow.cs:191:49:191:49 | access to local variable a : A | CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary [element, property Key] : A | -| CollectionFlow.cs:192:14:192:17 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:192:14:192:22 | access to property Keys [element] : A | -| CollectionFlow.cs:192:14:192:22 | access to property Keys [element] : A | CollectionFlow.cs:192:14:192:30 | call to method First | -| CollectionFlow.cs:193:21:193:24 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:379:59:379:62 | dict [element, property Key] : A | -| CollectionFlow.cs:194:28:194:31 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:194:14:194:32 | call to method DictKeysFirst | -| CollectionFlow.cs:194:28:194:31 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:391:58:391:61 | dict [element, property Key] : A | -| CollectionFlow.cs:195:27:195:30 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:195:14:195:31 | call to method DictFirstKey | -| CollectionFlow.cs:195:27:195:30 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:393:57:393:60 | dict [element, property Key] : A | +| CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:192:14:192:17 | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:193:21:193:24 | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:194:28:194:31 | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:195:27:195:30 | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:191:49:191:49 | access to local variable a : A | CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | +| CollectionFlow.cs:192:14:192:17 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:192:14:192:22 | access to property Keys : Dictionary.KeyCollection [element] : A | +| CollectionFlow.cs:192:14:192:22 | access to property Keys : Dictionary.KeyCollection [element] : A | CollectionFlow.cs:192:14:192:30 | call to method First | +| CollectionFlow.cs:193:21:193:24 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:379:59:379:62 | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:194:28:194:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:194:14:194:32 | call to method DictKeysFirst | +| CollectionFlow.cs:194:28:194:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:391:58:391:61 | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:195:27:195:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:195:14:195:31 | call to method DictFirstKey | +| CollectionFlow.cs:195:27:195:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:393:57:393:60 | dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:209:17:209:23 | object creation of type A : A | CollectionFlow.cs:210:48:210:48 | access to local variable a : A | -| CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary [element, property Key] : A | CollectionFlow.cs:211:14:211:17 | access to local variable dict [element, property Key] : A | -| CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary [element, property Key] : A | CollectionFlow.cs:212:21:212:24 | access to local variable dict [element, property Key] : A | -| CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary [element, property Key] : A | CollectionFlow.cs:213:28:213:31 | access to local variable dict [element, property Key] : A | -| CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary [element, property Key] : A | CollectionFlow.cs:214:27:214:30 | access to local variable dict [element, property Key] : A | -| CollectionFlow.cs:210:48:210:48 | access to local variable a : A | CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary [element, property Key] : A | -| CollectionFlow.cs:211:14:211:17 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:211:14:211:22 | access to property Keys [element] : A | -| CollectionFlow.cs:211:14:211:22 | access to property Keys [element] : A | CollectionFlow.cs:211:14:211:30 | call to method First | -| CollectionFlow.cs:212:21:212:24 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:379:59:379:62 | dict [element, property Key] : A | -| CollectionFlow.cs:213:28:213:31 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:213:14:213:32 | call to method DictKeysFirst | -| CollectionFlow.cs:213:28:213:31 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:391:58:391:61 | dict [element, property Key] : A | -| CollectionFlow.cs:214:27:214:30 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:214:14:214:31 | call to method DictFirstKey | -| CollectionFlow.cs:214:27:214:30 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:393:57:393:60 | dict [element, property Key] : A | +| CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:211:14:211:17 | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:212:21:212:24 | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:213:28:213:31 | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:214:27:214:30 | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:210:48:210:48 | access to local variable a : A | CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | +| CollectionFlow.cs:211:14:211:17 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:211:14:211:22 | access to property Keys : Dictionary.KeyCollection [element] : A | +| CollectionFlow.cs:211:14:211:22 | access to property Keys : Dictionary.KeyCollection [element] : A | CollectionFlow.cs:211:14:211:30 | call to method First | +| CollectionFlow.cs:212:21:212:24 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:379:59:379:62 | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:213:28:213:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:213:14:213:32 | call to method DictKeysFirst | +| CollectionFlow.cs:213:28:213:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:391:58:391:61 | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:214:27:214:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:214:14:214:31 | call to method DictFirstKey | +| CollectionFlow.cs:214:27:214:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:393:57:393:60 | dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:228:17:228:23 | object creation of type A : A | CollectionFlow.cs:229:27:229:27 | access to local variable a : A | -| CollectionFlow.cs:229:25:229:29 | { ..., ... } [element] : A | CollectionFlow.cs:230:27:230:29 | access to local variable as [element] : A | -| CollectionFlow.cs:229:27:229:27 | access to local variable a : A | CollectionFlow.cs:229:25:229:29 | { ..., ... } [element] : A | +| CollectionFlow.cs:229:25:229:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:230:27:230:29 | access to local variable as : null [element] : A | +| CollectionFlow.cs:229:27:229:27 | access to local variable a : A | CollectionFlow.cs:229:25:229:29 | { ..., ... } : null [element] : A | | CollectionFlow.cs:230:22:230:22 | SSA def(x) : A | CollectionFlow.cs:231:18:231:18 | access to local variable x | -| CollectionFlow.cs:230:27:230:29 | access to local variable as [element] : A | CollectionFlow.cs:230:22:230:22 | SSA def(x) : A | +| CollectionFlow.cs:230:27:230:29 | access to local variable as : null [element] : A | CollectionFlow.cs:230:22:230:22 | SSA def(x) : A | | CollectionFlow.cs:243:17:243:23 | object creation of type A : A | CollectionFlow.cs:244:27:244:27 | access to local variable a : A | -| CollectionFlow.cs:244:25:244:29 | { ..., ... } [element] : A | CollectionFlow.cs:245:26:245:28 | access to local variable as [element] : A | -| CollectionFlow.cs:244:27:244:27 | access to local variable a : A | CollectionFlow.cs:244:25:244:29 | { ..., ... } [element] : A | -| CollectionFlow.cs:245:26:245:28 | access to local variable as [element] : A | CollectionFlow.cs:245:26:245:44 | call to method GetEnumerator [property Current] : A | -| CollectionFlow.cs:245:26:245:44 | call to method GetEnumerator [property Current] : A | CollectionFlow.cs:247:18:247:27 | access to local variable enumerator [property Current] : A | -| CollectionFlow.cs:247:18:247:27 | access to local variable enumerator [property Current] : A | CollectionFlow.cs:247:18:247:35 | access to property Current | +| CollectionFlow.cs:244:25:244:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:245:26:245:28 | access to local variable as : null [element] : A | +| CollectionFlow.cs:244:27:244:27 | access to local variable a : A | CollectionFlow.cs:244:25:244:29 | { ..., ... } : null [element] : A | +| CollectionFlow.cs:245:26:245:28 | access to local variable as : null [element] : A | CollectionFlow.cs:245:26:245:44 | call to method GetEnumerator : IEnumerator [property Current] : A | +| CollectionFlow.cs:245:26:245:44 | call to method GetEnumerator : IEnumerator [property Current] : A | CollectionFlow.cs:247:18:247:27 | access to local variable enumerator : IEnumerator [property Current] : A | +| CollectionFlow.cs:247:18:247:27 | access to local variable enumerator : IEnumerator [property Current] : A | CollectionFlow.cs:247:18:247:35 | access to property Current | | CollectionFlow.cs:260:17:260:23 | object creation of type A : A | CollectionFlow.cs:262:18:262:18 | access to local variable a : A | -| CollectionFlow.cs:262:9:262:12 | [post] access to local variable list [element] : A | CollectionFlow.cs:263:26:263:29 | access to local variable list [element] : A | -| CollectionFlow.cs:262:18:262:18 | access to local variable a : A | CollectionFlow.cs:262:9:262:12 | [post] access to local variable list [element] : A | -| CollectionFlow.cs:263:26:263:29 | access to local variable list [element] : A | CollectionFlow.cs:263:26:263:45 | call to method GetEnumerator [property Current] : A | -| CollectionFlow.cs:263:26:263:45 | call to method GetEnumerator [property Current] : A | CollectionFlow.cs:265:18:265:27 | access to local variable enumerator [property Current] : A | -| CollectionFlow.cs:265:18:265:27 | access to local variable enumerator [property Current] : A | CollectionFlow.cs:265:18:265:35 | access to property Current | +| CollectionFlow.cs:262:9:262:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:263:26:263:29 | access to local variable list : List [element] : A | +| CollectionFlow.cs:262:18:262:18 | access to local variable a : A | CollectionFlow.cs:262:9:262:12 | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:263:26:263:29 | access to local variable list : List [element] : A | CollectionFlow.cs:263:26:263:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:263:26:263:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:265:18:265:27 | access to local variable enumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:265:18:265:27 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:265:18:265:35 | access to property Current | | CollectionFlow.cs:279:17:279:23 | object creation of type A : A | CollectionFlow.cs:281:43:281:43 | access to local variable a : A | -| CollectionFlow.cs:281:9:281:12 | [post] access to local variable list [element, property Key] : A | CollectionFlow.cs:282:9:282:12 | access to local variable list [element, property Key] : A | -| CollectionFlow.cs:281:18:281:47 | object creation of type KeyValuePair [property Key] : A | CollectionFlow.cs:281:9:281:12 | [post] access to local variable list [element, property Key] : A | -| CollectionFlow.cs:281:43:281:43 | access to local variable a : A | CollectionFlow.cs:281:18:281:47 | object creation of type KeyValuePair [property Key] : A | -| CollectionFlow.cs:282:9:282:12 | access to local variable list [element, property Key] : A | CollectionFlow.cs:282:21:282:23 | kvp [property Key] : A | -| CollectionFlow.cs:282:21:282:23 | kvp [property Key] : A | CollectionFlow.cs:284:18:284:20 | access to parameter kvp [property Key] : A | -| CollectionFlow.cs:284:18:284:20 | access to parameter kvp [property Key] : A | CollectionFlow.cs:284:18:284:24 | access to property Key | +| CollectionFlow.cs:281:9:281:12 | [post] access to local variable list : List [element, property Key] : A | CollectionFlow.cs:282:9:282:12 | access to local variable list : List [element, property Key] : A | +| CollectionFlow.cs:281:18:281:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | CollectionFlow.cs:281:9:281:12 | [post] access to local variable list : List [element, property Key] : A | +| CollectionFlow.cs:281:43:281:43 | access to local variable a : A | CollectionFlow.cs:281:18:281:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | +| CollectionFlow.cs:282:9:282:12 | access to local variable list : List [element, property Key] : A | CollectionFlow.cs:282:21:282:23 | kvp : KeyValuePair [property Key] : A | +| CollectionFlow.cs:282:21:282:23 | kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:284:18:284:20 | access to parameter kvp : KeyValuePair [property Key] : A | +| CollectionFlow.cs:284:18:284:20 | access to parameter kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:284:18:284:24 | access to property Key | | CollectionFlow.cs:301:32:301:38 | element : A | CollectionFlow.cs:301:55:301:61 | access to parameter element : A | -| CollectionFlow.cs:301:55:301:61 | access to parameter element : A | CollectionFlow.cs:301:44:301:48 | [post] access to parameter array [element] : A | +| CollectionFlow.cs:301:55:301:61 | access to parameter element : A | CollectionFlow.cs:301:44:301:48 | [post] access to parameter array : A[] [element] : A | | CollectionFlow.cs:305:17:305:23 | object creation of type A : A | CollectionFlow.cs:307:23:307:23 | access to local variable a : A | -| CollectionFlow.cs:307:18:307:20 | [post] access to local variable as [element] : A | CollectionFlow.cs:308:14:308:16 | access to local variable as [element] : A | -| CollectionFlow.cs:307:18:307:20 | [post] access to local variable as [element] : A | CollectionFlow.cs:309:18:309:20 | access to local variable as [element] : A | -| CollectionFlow.cs:307:18:307:20 | [post] access to local variable as [element] : A | CollectionFlow.cs:310:20:310:22 | access to local variable as [element] : A | +| CollectionFlow.cs:307:18:307:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:308:14:308:16 | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:307:18:307:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:309:18:309:20 | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:307:18:307:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:310:20:310:22 | access to local variable as : A[] [element] : A | | CollectionFlow.cs:307:23:307:23 | access to local variable a : A | CollectionFlow.cs:301:32:301:38 | element : A | -| CollectionFlow.cs:307:23:307:23 | access to local variable a : A | CollectionFlow.cs:307:18:307:20 | [post] access to local variable as [element] : A | -| CollectionFlow.cs:308:14:308:16 | access to local variable as [element] : A | CollectionFlow.cs:308:14:308:19 | access to array element | -| CollectionFlow.cs:309:18:309:20 | access to local variable as [element] : A | CollectionFlow.cs:373:40:373:41 | ts [element] : A | -| CollectionFlow.cs:310:20:310:22 | access to local variable as [element] : A | CollectionFlow.cs:310:14:310:23 | call to method First | -| CollectionFlow.cs:310:20:310:22 | access to local variable as [element] : A | CollectionFlow.cs:381:34:381:35 | ts [element] : A | +| CollectionFlow.cs:307:23:307:23 | access to local variable a : A | CollectionFlow.cs:307:18:307:20 | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:308:14:308:16 | access to local variable as : A[] [element] : A | CollectionFlow.cs:308:14:308:19 | access to array element | +| CollectionFlow.cs:309:18:309:20 | access to local variable as : A[] [element] : A | CollectionFlow.cs:373:40:373:41 | ts : A[] [element] : A | +| CollectionFlow.cs:310:20:310:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:310:14:310:23 | call to method First | +| CollectionFlow.cs:310:20:310:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:381:34:381:35 | ts : A[] [element] : A | | CollectionFlow.cs:323:34:323:40 | element : A | CollectionFlow.cs:323:55:323:61 | access to parameter element : A | -| CollectionFlow.cs:323:55:323:61 | access to parameter element : A | CollectionFlow.cs:323:46:323:49 | [post] access to parameter list [element] : A | +| CollectionFlow.cs:323:55:323:61 | access to parameter element : A | CollectionFlow.cs:323:46:323:49 | [post] access to parameter list : List [element] : A | | CollectionFlow.cs:327:17:327:23 | object creation of type A : A | CollectionFlow.cs:329:23:329:23 | access to local variable a : A | -| CollectionFlow.cs:329:17:329:20 | [post] access to local variable list [element] : A | CollectionFlow.cs:330:14:330:17 | access to local variable list [element] : A | -| CollectionFlow.cs:329:17:329:20 | [post] access to local variable list [element] : A | CollectionFlow.cs:331:22:331:25 | access to local variable list [element] : A | -| CollectionFlow.cs:329:17:329:20 | [post] access to local variable list [element] : A | CollectionFlow.cs:332:24:332:27 | access to local variable list [element] : A | +| CollectionFlow.cs:329:17:329:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:330:14:330:17 | access to local variable list : List [element] : A | +| CollectionFlow.cs:329:17:329:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:331:22:331:25 | access to local variable list : List [element] : A | +| CollectionFlow.cs:329:17:329:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:332:24:332:27 | access to local variable list : List [element] : A | | CollectionFlow.cs:329:23:329:23 | access to local variable a : A | CollectionFlow.cs:323:34:323:40 | element : A | -| CollectionFlow.cs:329:23:329:23 | access to local variable a : A | CollectionFlow.cs:329:17:329:20 | [post] access to local variable list [element] : A | -| CollectionFlow.cs:330:14:330:17 | access to local variable list [element] : A | CollectionFlow.cs:330:14:330:20 | access to indexer | -| CollectionFlow.cs:331:22:331:25 | access to local variable list [element] : A | CollectionFlow.cs:375:49:375:52 | list [element] : A | -| CollectionFlow.cs:332:24:332:27 | access to local variable list [element] : A | CollectionFlow.cs:332:14:332:28 | call to method ListFirst | -| CollectionFlow.cs:332:24:332:27 | access to local variable list [element] : A | CollectionFlow.cs:383:43:383:46 | list [element] : A | -| CollectionFlow.cs:346:20:346:26 | object creation of type A : A | CollectionFlow.cs:395:49:395:52 | args [element] : A | -| CollectionFlow.cs:347:26:347:32 | object creation of type A : A | CollectionFlow.cs:395:49:395:52 | args [element] : A | -| CollectionFlow.cs:348:26:348:32 | object creation of type A : A | CollectionFlow.cs:395:49:395:52 | args [element] : A | -| CollectionFlow.cs:349:20:349:38 | array creation of type A[] [element] : A | CollectionFlow.cs:395:49:395:52 | args [element] : A | -| CollectionFlow.cs:349:28:349:38 | { ..., ... } [element] : A | CollectionFlow.cs:349:20:349:38 | array creation of type A[] [element] : A | -| CollectionFlow.cs:349:30:349:36 | object creation of type A : A | CollectionFlow.cs:349:28:349:38 | { ..., ... } [element] : A | -| CollectionFlow.cs:373:40:373:41 | ts [element] : A | CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | -| CollectionFlow.cs:373:40:373:41 | ts [element] : A | CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | -| CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | CollectionFlow.cs:373:52:373:56 | access to array element | -| CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | CollectionFlow.cs:373:52:373:56 | access to array element | -| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | -| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | -| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | -| CollectionFlow.cs:375:49:375:52 | list [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | -| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer | -| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer | -| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer | -| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer | -| CollectionFlow.cs:377:61:377:64 | dict [element, property Value] : A | CollectionFlow.cs:377:75:377:78 | access to parameter dict [element, property Value] : A | -| CollectionFlow.cs:377:75:377:78 | access to parameter dict [element, property Value] : A | CollectionFlow.cs:377:75:377:81 | access to indexer | -| CollectionFlow.cs:379:59:379:62 | dict [element, property Key] : A | CollectionFlow.cs:379:73:379:76 | access to parameter dict [element, property Key] : A | -| CollectionFlow.cs:379:73:379:76 | access to parameter dict [element, property Key] : A | CollectionFlow.cs:379:73:379:81 | access to property Keys [element] : A | -| CollectionFlow.cs:379:73:379:81 | access to property Keys [element] : A | CollectionFlow.cs:379:73:379:89 | call to method First | -| CollectionFlow.cs:381:34:381:35 | ts [element] : A | CollectionFlow.cs:381:41:381:42 | access to parameter ts [element] : A | -| CollectionFlow.cs:381:34:381:35 | ts [element] : A | CollectionFlow.cs:381:41:381:42 | access to parameter ts [element] : A | -| CollectionFlow.cs:381:41:381:42 | access to parameter ts [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | -| CollectionFlow.cs:381:41:381:42 | access to parameter ts [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | -| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | -| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | -| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | -| CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | -| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | -| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | -| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | -| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | -| CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | CollectionFlow.cs:385:67:385:70 | access to parameter dict [element, property Value] : A | -| CollectionFlow.cs:385:67:385:70 | access to parameter dict [element, property Value] : A | CollectionFlow.cs:385:67:385:73 | access to indexer : A | -| CollectionFlow.cs:387:59:387:62 | dict [element, property Value] : A | CollectionFlow.cs:387:68:387:71 | access to parameter dict [element, property Value] : A | -| CollectionFlow.cs:387:68:387:71 | access to parameter dict [element, property Value] : A | CollectionFlow.cs:387:68:387:79 | call to method First> [property Value] : A | -| CollectionFlow.cs:387:68:387:79 | call to method First> [property Value] : A | CollectionFlow.cs:387:68:387:85 | access to property Value : A | -| CollectionFlow.cs:389:60:389:63 | dict [element, property Value] : A | CollectionFlow.cs:389:69:389:72 | access to parameter dict [element, property Value] : A | -| CollectionFlow.cs:389:69:389:72 | access to parameter dict [element, property Value] : A | CollectionFlow.cs:389:69:389:79 | access to property Values [element] : A | -| CollectionFlow.cs:389:69:389:79 | access to property Values [element] : A | CollectionFlow.cs:389:69:389:87 | call to method First : A | -| CollectionFlow.cs:391:58:391:61 | dict [element, property Key] : A | CollectionFlow.cs:391:67:391:70 | access to parameter dict [element, property Key] : A | -| CollectionFlow.cs:391:67:391:70 | access to parameter dict [element, property Key] : A | CollectionFlow.cs:391:67:391:75 | access to property Keys [element] : A | -| CollectionFlow.cs:391:67:391:75 | access to property Keys [element] : A | CollectionFlow.cs:391:67:391:83 | call to method First : A | -| CollectionFlow.cs:393:57:393:60 | dict [element, property Key] : A | CollectionFlow.cs:393:66:393:69 | access to parameter dict [element, property Key] : A | -| CollectionFlow.cs:393:66:393:69 | access to parameter dict [element, property Key] : A | CollectionFlow.cs:393:66:393:77 | call to method First> [property Key] : A | -| CollectionFlow.cs:393:66:393:77 | call to method First> [property Key] : A | CollectionFlow.cs:393:66:393:81 | access to property Key : A | -| CollectionFlow.cs:395:49:395:52 | args [element] : A | CollectionFlow.cs:395:63:395:66 | access to parameter args [element] : A | -| CollectionFlow.cs:395:49:395:52 | args [element] : A | CollectionFlow.cs:395:63:395:66 | access to parameter args [element] : A | -| CollectionFlow.cs:395:63:395:66 | access to parameter args [element] : A | CollectionFlow.cs:395:63:395:69 | access to array element | -| CollectionFlow.cs:395:63:395:66 | access to parameter args [element] : A | CollectionFlow.cs:395:63:395:69 | access to array element | +| CollectionFlow.cs:329:23:329:23 | access to local variable a : A | CollectionFlow.cs:329:17:329:20 | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:330:14:330:17 | access to local variable list : List [element] : A | CollectionFlow.cs:330:14:330:20 | access to indexer | +| CollectionFlow.cs:331:22:331:25 | access to local variable list : List [element] : A | CollectionFlow.cs:375:49:375:52 | list : List [element] : A | +| CollectionFlow.cs:332:24:332:27 | access to local variable list : List [element] : A | CollectionFlow.cs:332:14:332:28 | call to method ListFirst | +| CollectionFlow.cs:332:24:332:27 | access to local variable list : List [element] : A | CollectionFlow.cs:383:43:383:46 | list : List [element] : A | +| CollectionFlow.cs:346:20:346:26 | object creation of type A : A | CollectionFlow.cs:395:49:395:52 | args : A[] [element] : A | +| CollectionFlow.cs:347:26:347:32 | object creation of type A : A | CollectionFlow.cs:395:49:395:52 | args : A[] [element] : A | +| CollectionFlow.cs:348:26:348:32 | object creation of type A : A | CollectionFlow.cs:395:49:395:52 | args : A[] [element] : A | +| CollectionFlow.cs:349:20:349:38 | array creation of type A[] : null [element] : A | CollectionFlow.cs:395:49:395:52 | args : null [element] : A | +| CollectionFlow.cs:349:28:349:38 | { ..., ... } : null [element] : A | CollectionFlow.cs:349:20:349:38 | array creation of type A[] : null [element] : A | +| CollectionFlow.cs:349:30:349:36 | object creation of type A : A | CollectionFlow.cs:349:28:349:38 | { ..., ... } : null [element] : A | +| CollectionFlow.cs:373:40:373:41 | ts : A[] [element] : A | CollectionFlow.cs:373:52:373:53 | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:373:40:373:41 | ts : null [element] : A | CollectionFlow.cs:373:52:373:53 | access to parameter ts : null [element] : A | +| CollectionFlow.cs:373:52:373:53 | access to parameter ts : A[] [element] : A | CollectionFlow.cs:373:52:373:56 | access to array element | +| CollectionFlow.cs:373:52:373:53 | access to parameter ts : null [element] : A | CollectionFlow.cs:373:52:373:56 | access to array element | +| CollectionFlow.cs:375:49:375:52 | list : List [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | +| CollectionFlow.cs:375:49:375:52 | list : List [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | +| CollectionFlow.cs:375:49:375:52 | list : List [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | +| CollectionFlow.cs:375:49:375:52 | list : List [element] : A | CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | +| CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer | +| CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer | +| CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer | +| CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | CollectionFlow.cs:375:63:375:69 | access to indexer | +| CollectionFlow.cs:377:61:377:64 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:377:75:377:78 | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:377:75:377:78 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:377:75:377:81 | access to indexer | +| CollectionFlow.cs:379:59:379:62 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:379:73:379:76 | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:379:73:379:76 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:379:73:379:81 | access to property Keys : ICollection [element] : A | +| CollectionFlow.cs:379:73:379:81 | access to property Keys : ICollection [element] : A | CollectionFlow.cs:379:73:379:89 | call to method First | +| CollectionFlow.cs:381:34:381:35 | ts : A[] [element] : A | CollectionFlow.cs:381:41:381:42 | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:381:34:381:35 | ts : null [element] : A | CollectionFlow.cs:381:41:381:42 | access to parameter ts : null [element] : A | +| CollectionFlow.cs:381:41:381:42 | access to parameter ts : A[] [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | +| CollectionFlow.cs:381:41:381:42 | access to parameter ts : null [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | +| CollectionFlow.cs:383:43:383:46 | list : List [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | +| CollectionFlow.cs:383:43:383:46 | list : List [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | +| CollectionFlow.cs:383:43:383:46 | list : List [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | +| CollectionFlow.cs:383:43:383:46 | list : List [element] : A | CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | +| CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | +| CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | +| CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | +| CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | +| CollectionFlow.cs:385:58:385:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:67:385:70 | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:385:67:385:70 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:67:385:73 | access to indexer : A | +| CollectionFlow.cs:387:59:387:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:68:387:71 | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:387:68:387:71 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:68:387:79 | call to method First> : Object [property Value] : A | +| CollectionFlow.cs:387:68:387:79 | call to method First> : Object [property Value] : A | CollectionFlow.cs:387:68:387:85 | access to property Value : A | +| CollectionFlow.cs:389:60:389:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:69:389:72 | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:389:69:389:72 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:69:389:79 | access to property Values : ICollection [element] : A | +| CollectionFlow.cs:389:69:389:79 | access to property Values : ICollection [element] : A | CollectionFlow.cs:389:69:389:87 | call to method First : A | +| CollectionFlow.cs:391:58:391:61 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:391:67:391:70 | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:391:67:391:70 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:391:67:391:75 | access to property Keys : ICollection [element] : A | +| CollectionFlow.cs:391:67:391:75 | access to property Keys : ICollection [element] : A | CollectionFlow.cs:391:67:391:83 | call to method First : A | +| CollectionFlow.cs:393:57:393:60 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:393:66:393:69 | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:393:66:393:69 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:393:66:393:77 | call to method First> : Object [property Key] : A | +| CollectionFlow.cs:393:66:393:77 | call to method First> : Object [property Key] : A | CollectionFlow.cs:393:66:393:81 | access to property Key : A | +| CollectionFlow.cs:395:49:395:52 | args : A[] [element] : A | CollectionFlow.cs:395:63:395:66 | access to parameter args : A[] [element] : A | +| CollectionFlow.cs:395:49:395:52 | args : null [element] : A | CollectionFlow.cs:395:63:395:66 | access to parameter args : null [element] : A | +| CollectionFlow.cs:395:63:395:66 | access to parameter args : A[] [element] : A | CollectionFlow.cs:395:63:395:69 | access to array element | +| CollectionFlow.cs:395:63:395:66 | access to parameter args : null [element] : A | CollectionFlow.cs:395:63:395:69 | access to array element | nodes | CollectionFlow.cs:13:17:13:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:14:25:14:29 | { ..., ... } [element] : A | semmle.label | { ..., ... } [element] : A | +| CollectionFlow.cs:14:25:14:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:14:27:14:27 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:15:14:15:16 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | +| CollectionFlow.cs:15:14:15:16 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:15:14:15:19 | access to array element | semmle.label | access to array element | -| CollectionFlow.cs:16:18:16:20 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | +| CollectionFlow.cs:16:18:16:20 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:17:14:17:23 | call to method First | semmle.label | call to method First | -| CollectionFlow.cs:17:20:17:22 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | +| CollectionFlow.cs:17:20:17:22 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:31:17:31:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:32:38:32:57 | { ..., ... } [field As, element] : A | semmle.label | { ..., ... } [field As, element] : A | -| CollectionFlow.cs:32:45:32:55 | { ..., ... } [element] : A | semmle.label | { ..., ... } [element] : A | +| CollectionFlow.cs:32:38:32:57 | { ..., ... } : CollectionFlow [field As, element] : A | semmle.label | { ..., ... } : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:32:45:32:55 | { ..., ... } : A[] [element] : A | semmle.label | { ..., ... } : A[] [element] : A | | CollectionFlow.cs:32:53:32:53 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:33:14:33:14 | access to local variable c [field As, element] : A | semmle.label | access to local variable c [field As, element] : A | -| CollectionFlow.cs:33:14:33:17 | access to field As [element] : A | semmle.label | access to field As [element] : A | +| CollectionFlow.cs:33:14:33:14 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:33:14:33:17 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | | CollectionFlow.cs:33:14:33:20 | access to array element | semmle.label | access to array element | -| CollectionFlow.cs:34:18:34:18 | access to local variable c [field As, element] : A | semmle.label | access to local variable c [field As, element] : A | -| CollectionFlow.cs:34:18:34:21 | access to field As [element] : A | semmle.label | access to field As [element] : A | +| CollectionFlow.cs:34:18:34:18 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:34:18:34:21 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | | CollectionFlow.cs:35:14:35:24 | call to method First | semmle.label | call to method First | -| CollectionFlow.cs:35:20:35:20 | access to local variable c [field As, element] : A | semmle.label | access to local variable c [field As, element] : A | -| CollectionFlow.cs:35:20:35:23 | access to field As [element] : A | semmle.label | access to field As [element] : A | +| CollectionFlow.cs:35:20:35:20 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:35:20:35:23 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | | CollectionFlow.cs:49:17:49:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:51:9:51:11 | [post] access to local variable as [element] : A | semmle.label | [post] access to local variable as [element] : A | +| CollectionFlow.cs:51:9:51:11 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | | CollectionFlow.cs:51:18:51:18 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:52:14:52:16 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | +| CollectionFlow.cs:52:14:52:16 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | | CollectionFlow.cs:52:14:52:19 | access to array element | semmle.label | access to array element | -| CollectionFlow.cs:53:18:53:20 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | +| CollectionFlow.cs:53:18:53:20 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | | CollectionFlow.cs:54:14:54:23 | call to method First | semmle.label | call to method First | -| CollectionFlow.cs:54:20:54:22 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | +| CollectionFlow.cs:54:20:54:22 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | | CollectionFlow.cs:69:17:69:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:71:9:71:12 | [post] access to local variable list [element] : A | semmle.label | [post] access to local variable list [element] : A | +| CollectionFlow.cs:71:9:71:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:71:19:71:19 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:72:14:72:17 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:72:14:72:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:72:14:72:20 | access to indexer | semmle.label | access to indexer | -| CollectionFlow.cs:73:22:73:25 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:73:22:73:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:74:14:74:28 | call to method ListFirst | semmle.label | call to method ListFirst | -| CollectionFlow.cs:74:24:74:27 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:74:24:74:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:88:17:88:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:89:20:89:38 | object creation of type List [element] : A | semmle.label | object creation of type List [element] : A | +| CollectionFlow.cs:89:20:89:38 | object creation of type List : List [element] : A | semmle.label | object creation of type List : List [element] : A | | CollectionFlow.cs:89:36:89:36 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:90:14:90:17 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:90:14:90:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:90:14:90:20 | access to indexer | semmle.label | access to indexer | -| CollectionFlow.cs:91:22:91:25 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:91:22:91:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:92:14:92:28 | call to method ListFirst | semmle.label | call to method ListFirst | -| CollectionFlow.cs:92:24:92:27 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:92:24:92:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:105:17:105:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:107:9:107:12 | [post] access to local variable list [element] : A | semmle.label | [post] access to local variable list [element] : A | +| CollectionFlow.cs:107:9:107:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:107:18:107:18 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:108:14:108:17 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:108:14:108:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:108:14:108:20 | access to indexer | semmle.label | access to indexer | -| CollectionFlow.cs:109:22:109:25 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:109:22:109:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:110:14:110:28 | call to method ListFirst | semmle.label | call to method ListFirst | -| CollectionFlow.cs:110:24:110:27 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:110:24:110:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:124:17:124:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict [element, property Value] : A | semmle.label | [post] access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:126:9:126:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | semmle.label | [post] access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:126:19:126:19 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:127:14:127:17 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:127:14:127:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:127:14:127:20 | access to indexer | semmle.label | access to indexer | -| CollectionFlow.cs:128:23:128:26 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:128:23:128:26 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:129:14:129:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | -| CollectionFlow.cs:129:28:129:31 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:129:28:129:31 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:130:14:130:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | -| CollectionFlow.cs:130:29:130:32 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:130:29:130:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:131:14:131:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | -| CollectionFlow.cs:131:30:131:33 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:131:30:131:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:147:17:147:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary [element, property Value] : A | +| CollectionFlow.cs:148:20:148:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Value] : A | | CollectionFlow.cs:148:52:148:52 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:149:14:149:17 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:149:14:149:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:149:14:149:20 | access to indexer | semmle.label | access to indexer | -| CollectionFlow.cs:150:23:150:26 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:150:23:150:26 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:151:14:151:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | -| CollectionFlow.cs:151:28:151:31 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:151:28:151:31 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:152:14:152:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | -| CollectionFlow.cs:152:29:152:32 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:152:29:152:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:153:14:153:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | -| CollectionFlow.cs:153:30:153:33 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:153:30:153:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:168:17:168:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary [element, property Value] : A | +| CollectionFlow.cs:169:20:169:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Value] : A | | CollectionFlow.cs:169:53:169:53 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:170:14:170:17 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:170:14:170:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:170:14:170:20 | access to indexer | semmle.label | access to indexer | -| CollectionFlow.cs:171:23:171:26 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:171:23:171:26 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:172:14:172:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | -| CollectionFlow.cs:172:28:172:31 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:172:28:172:31 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:173:14:173:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | -| CollectionFlow.cs:173:29:173:32 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:173:29:173:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:174:14:174:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | -| CollectionFlow.cs:174:30:174:33 | access to local variable dict [element, property Value] : A | semmle.label | access to local variable dict [element, property Value] : A | +| CollectionFlow.cs:174:30:174:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:190:17:190:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary [element, property Key] : A | +| CollectionFlow.cs:191:20:191:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Key] : A | | CollectionFlow.cs:191:49:191:49 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:192:14:192:17 | access to local variable dict [element, property Key] : A | semmle.label | access to local variable dict [element, property Key] : A | -| CollectionFlow.cs:192:14:192:22 | access to property Keys [element] : A | semmle.label | access to property Keys [element] : A | +| CollectionFlow.cs:192:14:192:17 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:192:14:192:22 | access to property Keys : Dictionary.KeyCollection [element] : A | semmle.label | access to property Keys : Dictionary.KeyCollection [element] : A | | CollectionFlow.cs:192:14:192:30 | call to method First | semmle.label | call to method First | -| CollectionFlow.cs:193:21:193:24 | access to local variable dict [element, property Key] : A | semmle.label | access to local variable dict [element, property Key] : A | +| CollectionFlow.cs:193:21:193:24 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:194:14:194:32 | call to method DictKeysFirst | semmle.label | call to method DictKeysFirst | -| CollectionFlow.cs:194:28:194:31 | access to local variable dict [element, property Key] : A | semmle.label | access to local variable dict [element, property Key] : A | +| CollectionFlow.cs:194:28:194:31 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:195:14:195:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | -| CollectionFlow.cs:195:27:195:30 | access to local variable dict [element, property Key] : A | semmle.label | access to local variable dict [element, property Key] : A | +| CollectionFlow.cs:195:27:195:30 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:209:17:209:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary [element, property Key] : A | +| CollectionFlow.cs:210:20:210:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Key] : A | | CollectionFlow.cs:210:48:210:48 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:211:14:211:17 | access to local variable dict [element, property Key] : A | semmle.label | access to local variable dict [element, property Key] : A | -| CollectionFlow.cs:211:14:211:22 | access to property Keys [element] : A | semmle.label | access to property Keys [element] : A | +| CollectionFlow.cs:211:14:211:17 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:211:14:211:22 | access to property Keys : Dictionary.KeyCollection [element] : A | semmle.label | access to property Keys : Dictionary.KeyCollection [element] : A | | CollectionFlow.cs:211:14:211:30 | call to method First | semmle.label | call to method First | -| CollectionFlow.cs:212:21:212:24 | access to local variable dict [element, property Key] : A | semmle.label | access to local variable dict [element, property Key] : A | +| CollectionFlow.cs:212:21:212:24 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:213:14:213:32 | call to method DictKeysFirst | semmle.label | call to method DictKeysFirst | -| CollectionFlow.cs:213:28:213:31 | access to local variable dict [element, property Key] : A | semmle.label | access to local variable dict [element, property Key] : A | +| CollectionFlow.cs:213:28:213:31 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:214:14:214:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | -| CollectionFlow.cs:214:27:214:30 | access to local variable dict [element, property Key] : A | semmle.label | access to local variable dict [element, property Key] : A | +| CollectionFlow.cs:214:27:214:30 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:228:17:228:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:229:25:229:29 | { ..., ... } [element] : A | semmle.label | { ..., ... } [element] : A | +| CollectionFlow.cs:229:25:229:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:229:27:229:27 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:230:22:230:22 | SSA def(x) : A | semmle.label | SSA def(x) : A | -| CollectionFlow.cs:230:27:230:29 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | +| CollectionFlow.cs:230:27:230:29 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:231:18:231:18 | access to local variable x | semmle.label | access to local variable x | | CollectionFlow.cs:243:17:243:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:244:25:244:29 | { ..., ... } [element] : A | semmle.label | { ..., ... } [element] : A | +| CollectionFlow.cs:244:25:244:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:244:27:244:27 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:245:26:245:28 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | -| CollectionFlow.cs:245:26:245:44 | call to method GetEnumerator [property Current] : A | semmle.label | call to method GetEnumerator [property Current] : A | -| CollectionFlow.cs:247:18:247:27 | access to local variable enumerator [property Current] : A | semmle.label | access to local variable enumerator [property Current] : A | +| CollectionFlow.cs:245:26:245:28 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:245:26:245:44 | call to method GetEnumerator : IEnumerator [property Current] : A | semmle.label | call to method GetEnumerator : IEnumerator [property Current] : A | +| CollectionFlow.cs:247:18:247:27 | access to local variable enumerator : IEnumerator [property Current] : A | semmle.label | access to local variable enumerator : IEnumerator [property Current] : A | | CollectionFlow.cs:247:18:247:35 | access to property Current | semmle.label | access to property Current | | CollectionFlow.cs:260:17:260:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:262:9:262:12 | [post] access to local variable list [element] : A | semmle.label | [post] access to local variable list [element] : A | +| CollectionFlow.cs:262:9:262:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:262:18:262:18 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:263:26:263:29 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | -| CollectionFlow.cs:263:26:263:45 | call to method GetEnumerator [property Current] : A | semmle.label | call to method GetEnumerator [property Current] : A | -| CollectionFlow.cs:265:18:265:27 | access to local variable enumerator [property Current] : A | semmle.label | access to local variable enumerator [property Current] : A | +| CollectionFlow.cs:263:26:263:29 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:263:26:263:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:265:18:265:27 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | | CollectionFlow.cs:265:18:265:35 | access to property Current | semmle.label | access to property Current | | CollectionFlow.cs:279:17:279:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:281:9:281:12 | [post] access to local variable list [element, property Key] : A | semmle.label | [post] access to local variable list [element, property Key] : A | -| CollectionFlow.cs:281:18:281:47 | object creation of type KeyValuePair [property Key] : A | semmle.label | object creation of type KeyValuePair [property Key] : A | +| CollectionFlow.cs:281:9:281:12 | [post] access to local variable list : List [element, property Key] : A | semmle.label | [post] access to local variable list : List [element, property Key] : A | +| CollectionFlow.cs:281:18:281:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | semmle.label | object creation of type KeyValuePair : KeyValuePair [property Key] : A | | CollectionFlow.cs:281:43:281:43 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:282:9:282:12 | access to local variable list [element, property Key] : A | semmle.label | access to local variable list [element, property Key] : A | -| CollectionFlow.cs:282:21:282:23 | kvp [property Key] : A | semmle.label | kvp [property Key] : A | -| CollectionFlow.cs:284:18:284:20 | access to parameter kvp [property Key] : A | semmle.label | access to parameter kvp [property Key] : A | +| CollectionFlow.cs:282:9:282:12 | access to local variable list : List [element, property Key] : A | semmle.label | access to local variable list : List [element, property Key] : A | +| CollectionFlow.cs:282:21:282:23 | kvp : KeyValuePair [property Key] : A | semmle.label | kvp : KeyValuePair [property Key] : A | +| CollectionFlow.cs:284:18:284:20 | access to parameter kvp : KeyValuePair [property Key] : A | semmle.label | access to parameter kvp : KeyValuePair [property Key] : A | | CollectionFlow.cs:284:18:284:24 | access to property Key | semmle.label | access to property Key | | CollectionFlow.cs:301:32:301:38 | element : A | semmle.label | element : A | -| CollectionFlow.cs:301:44:301:48 | [post] access to parameter array [element] : A | semmle.label | [post] access to parameter array [element] : A | +| CollectionFlow.cs:301:44:301:48 | [post] access to parameter array : A[] [element] : A | semmle.label | [post] access to parameter array : A[] [element] : A | | CollectionFlow.cs:301:55:301:61 | access to parameter element : A | semmle.label | access to parameter element : A | | CollectionFlow.cs:305:17:305:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:307:18:307:20 | [post] access to local variable as [element] : A | semmle.label | [post] access to local variable as [element] : A | +| CollectionFlow.cs:307:18:307:20 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | | CollectionFlow.cs:307:23:307:23 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:308:14:308:16 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | +| CollectionFlow.cs:308:14:308:16 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | | CollectionFlow.cs:308:14:308:19 | access to array element | semmle.label | access to array element | -| CollectionFlow.cs:309:18:309:20 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | +| CollectionFlow.cs:309:18:309:20 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | | CollectionFlow.cs:310:14:310:23 | call to method First | semmle.label | call to method First | -| CollectionFlow.cs:310:20:310:22 | access to local variable as [element] : A | semmle.label | access to local variable as [element] : A | +| CollectionFlow.cs:310:20:310:22 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | | CollectionFlow.cs:323:34:323:40 | element : A | semmle.label | element : A | -| CollectionFlow.cs:323:46:323:49 | [post] access to parameter list [element] : A | semmle.label | [post] access to parameter list [element] : A | +| CollectionFlow.cs:323:46:323:49 | [post] access to parameter list : List [element] : A | semmle.label | [post] access to parameter list : List [element] : A | | CollectionFlow.cs:323:55:323:61 | access to parameter element : A | semmle.label | access to parameter element : A | | CollectionFlow.cs:327:17:327:23 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:329:17:329:20 | [post] access to local variable list [element] : A | semmle.label | [post] access to local variable list [element] : A | +| CollectionFlow.cs:329:17:329:20 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:329:23:329:23 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:330:14:330:17 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:330:14:330:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:330:14:330:20 | access to indexer | semmle.label | access to indexer | -| CollectionFlow.cs:331:22:331:25 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:331:22:331:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:332:14:332:28 | call to method ListFirst | semmle.label | call to method ListFirst | -| CollectionFlow.cs:332:24:332:27 | access to local variable list [element] : A | semmle.label | access to local variable list [element] : A | +| CollectionFlow.cs:332:24:332:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:346:20:346:26 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:347:26:347:32 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:348:26:348:32 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:349:20:349:38 | array creation of type A[] [element] : A | semmle.label | array creation of type A[] [element] : A | -| CollectionFlow.cs:349:28:349:38 | { ..., ... } [element] : A | semmle.label | { ..., ... } [element] : A | +| CollectionFlow.cs:349:20:349:38 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | +| CollectionFlow.cs:349:28:349:38 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:349:30:349:36 | object creation of type A : A | semmle.label | object creation of type A : A | -| CollectionFlow.cs:373:40:373:41 | ts [element] : A | semmle.label | ts [element] : A | -| CollectionFlow.cs:373:40:373:41 | ts [element] : A | semmle.label | ts [element] : A | -| CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | semmle.label | access to parameter ts [element] : A | -| CollectionFlow.cs:373:52:373:53 | access to parameter ts [element] : A | semmle.label | access to parameter ts [element] : A | +| CollectionFlow.cs:373:40:373:41 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | +| CollectionFlow.cs:373:40:373:41 | ts : null [element] : A | semmle.label | ts : null [element] : A | +| CollectionFlow.cs:373:52:373:53 | access to parameter ts : A[] [element] : A | semmle.label | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:373:52:373:53 | access to parameter ts : null [element] : A | semmle.label | access to parameter ts : null [element] : A | | CollectionFlow.cs:373:52:373:56 | access to array element | semmle.label | access to array element | -| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A | -| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A | -| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A | -| CollectionFlow.cs:375:49:375:52 | list [element] : A | semmle.label | list [element] : A | -| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A | -| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A | -| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A | -| CollectionFlow.cs:375:63:375:66 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A | +| CollectionFlow.cs:375:49:375:52 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:375:49:375:52 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:375:49:375:52 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:375:49:375:52 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | +| CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | +| CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | +| CollectionFlow.cs:375:63:375:66 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | | CollectionFlow.cs:375:63:375:69 | access to indexer | semmle.label | access to indexer | -| CollectionFlow.cs:377:61:377:64 | dict [element, property Value] : A | semmle.label | dict [element, property Value] : A | -| CollectionFlow.cs:377:75:377:78 | access to parameter dict [element, property Value] : A | semmle.label | access to parameter dict [element, property Value] : A | +| CollectionFlow.cs:377:61:377:64 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:377:75:377:78 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:377:75:377:81 | access to indexer | semmle.label | access to indexer | -| CollectionFlow.cs:379:59:379:62 | dict [element, property Key] : A | semmle.label | dict [element, property Key] : A | -| CollectionFlow.cs:379:73:379:76 | access to parameter dict [element, property Key] : A | semmle.label | access to parameter dict [element, property Key] : A | -| CollectionFlow.cs:379:73:379:81 | access to property Keys [element] : A | semmle.label | access to property Keys [element] : A | +| CollectionFlow.cs:379:59:379:62 | dict : Dictionary [element, property Key] : A | semmle.label | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:379:73:379:76 | access to parameter dict : Dictionary [element, property Key] : A | semmle.label | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:379:73:379:81 | access to property Keys : ICollection [element] : A | semmle.label | access to property Keys : ICollection [element] : A | | CollectionFlow.cs:379:73:379:89 | call to method First | semmle.label | call to method First | -| CollectionFlow.cs:381:34:381:35 | ts [element] : A | semmle.label | ts [element] : A | -| CollectionFlow.cs:381:34:381:35 | ts [element] : A | semmle.label | ts [element] : A | -| CollectionFlow.cs:381:41:381:42 | access to parameter ts [element] : A | semmle.label | access to parameter ts [element] : A | -| CollectionFlow.cs:381:41:381:42 | access to parameter ts [element] : A | semmle.label | access to parameter ts [element] : A | +| CollectionFlow.cs:381:34:381:35 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | +| CollectionFlow.cs:381:34:381:35 | ts : null [element] : A | semmle.label | ts : null [element] : A | +| CollectionFlow.cs:381:41:381:42 | access to parameter ts : A[] [element] : A | semmle.label | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:381:41:381:42 | access to parameter ts : null [element] : A | semmle.label | access to parameter ts : null [element] : A | | CollectionFlow.cs:381:41:381:45 | access to array element : A | semmle.label | access to array element : A | | CollectionFlow.cs:381:41:381:45 | access to array element : A | semmle.label | access to array element : A | -| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A | -| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A | -| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A | -| CollectionFlow.cs:383:43:383:46 | list [element] : A | semmle.label | list [element] : A | -| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A | -| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A | -| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A | -| CollectionFlow.cs:383:52:383:55 | access to parameter list [element] : A | semmle.label | access to parameter list [element] : A | +| CollectionFlow.cs:383:43:383:46 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:383:43:383:46 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:383:43:383:46 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:383:43:383:46 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | +| CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | +| CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | +| CollectionFlow.cs:383:52:383:55 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | | CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A | | CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A | | CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A | | CollectionFlow.cs:383:52:383:58 | access to indexer : A | semmle.label | access to indexer : A | -| CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | semmle.label | dict [element, property Value] : A | -| CollectionFlow.cs:385:67:385:70 | access to parameter dict [element, property Value] : A | semmle.label | access to parameter dict [element, property Value] : A | +| CollectionFlow.cs:385:58:385:61 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:385:67:385:70 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:385:67:385:73 | access to indexer : A | semmle.label | access to indexer : A | -| CollectionFlow.cs:387:59:387:62 | dict [element, property Value] : A | semmle.label | dict [element, property Value] : A | -| CollectionFlow.cs:387:68:387:71 | access to parameter dict [element, property Value] : A | semmle.label | access to parameter dict [element, property Value] : A | -| CollectionFlow.cs:387:68:387:79 | call to method First> [property Value] : A | semmle.label | call to method First> [property Value] : A | +| CollectionFlow.cs:387:59:387:62 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:387:68:387:71 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:387:68:387:79 | call to method First> : Object [property Value] : A | semmle.label | call to method First> : Object [property Value] : A | | CollectionFlow.cs:387:68:387:85 | access to property Value : A | semmle.label | access to property Value : A | -| CollectionFlow.cs:389:60:389:63 | dict [element, property Value] : A | semmle.label | dict [element, property Value] : A | -| CollectionFlow.cs:389:69:389:72 | access to parameter dict [element, property Value] : A | semmle.label | access to parameter dict [element, property Value] : A | -| CollectionFlow.cs:389:69:389:79 | access to property Values [element] : A | semmle.label | access to property Values [element] : A | +| CollectionFlow.cs:389:60:389:63 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:389:69:389:72 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:389:69:389:79 | access to property Values : ICollection [element] : A | semmle.label | access to property Values : ICollection [element] : A | | CollectionFlow.cs:389:69:389:87 | call to method First : A | semmle.label | call to method First : A | -| CollectionFlow.cs:391:58:391:61 | dict [element, property Key] : A | semmle.label | dict [element, property Key] : A | -| CollectionFlow.cs:391:67:391:70 | access to parameter dict [element, property Key] : A | semmle.label | access to parameter dict [element, property Key] : A | -| CollectionFlow.cs:391:67:391:75 | access to property Keys [element] : A | semmle.label | access to property Keys [element] : A | +| CollectionFlow.cs:391:58:391:61 | dict : Dictionary [element, property Key] : A | semmle.label | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:391:67:391:70 | access to parameter dict : Dictionary [element, property Key] : A | semmle.label | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:391:67:391:75 | access to property Keys : ICollection [element] : A | semmle.label | access to property Keys : ICollection [element] : A | | CollectionFlow.cs:391:67:391:83 | call to method First : A | semmle.label | call to method First : A | -| CollectionFlow.cs:393:57:393:60 | dict [element, property Key] : A | semmle.label | dict [element, property Key] : A | -| CollectionFlow.cs:393:66:393:69 | access to parameter dict [element, property Key] : A | semmle.label | access to parameter dict [element, property Key] : A | -| CollectionFlow.cs:393:66:393:77 | call to method First> [property Key] : A | semmle.label | call to method First> [property Key] : A | +| CollectionFlow.cs:393:57:393:60 | dict : Dictionary [element, property Key] : A | semmle.label | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:393:66:393:69 | access to parameter dict : Dictionary [element, property Key] : A | semmle.label | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:393:66:393:77 | call to method First> : Object [property Key] : A | semmle.label | call to method First> : Object [property Key] : A | | CollectionFlow.cs:393:66:393:81 | access to property Key : A | semmle.label | access to property Key : A | -| CollectionFlow.cs:395:49:395:52 | args [element] : A | semmle.label | args [element] : A | -| CollectionFlow.cs:395:49:395:52 | args [element] : A | semmle.label | args [element] : A | -| CollectionFlow.cs:395:63:395:66 | access to parameter args [element] : A | semmle.label | access to parameter args [element] : A | -| CollectionFlow.cs:395:63:395:66 | access to parameter args [element] : A | semmle.label | access to parameter args [element] : A | +| CollectionFlow.cs:395:49:395:52 | args : A[] [element] : A | semmle.label | args : A[] [element] : A | +| CollectionFlow.cs:395:49:395:52 | args : null [element] : A | semmle.label | args : null [element] : A | +| CollectionFlow.cs:395:63:395:66 | access to parameter args : A[] [element] : A | semmle.label | access to parameter args : A[] [element] : A | +| CollectionFlow.cs:395:63:395:66 | access to parameter args : null [element] : A | semmle.label | access to parameter args : null [element] : A | | CollectionFlow.cs:395:63:395:69 | access to array element | semmle.label | access to array element | subpaths -| CollectionFlow.cs:17:20:17:22 | access to local variable as [element] : A | CollectionFlow.cs:381:34:381:35 | ts [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | CollectionFlow.cs:17:14:17:23 | call to method First | -| CollectionFlow.cs:35:20:35:23 | access to field As [element] : A | CollectionFlow.cs:381:34:381:35 | ts [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | CollectionFlow.cs:35:14:35:24 | call to method First | -| CollectionFlow.cs:54:20:54:22 | access to local variable as [element] : A | CollectionFlow.cs:381:34:381:35 | ts [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | CollectionFlow.cs:54:14:54:23 | call to method First | -| CollectionFlow.cs:74:24:74:27 | access to local variable list [element] : A | CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | CollectionFlow.cs:74:14:74:28 | call to method ListFirst | -| CollectionFlow.cs:92:24:92:27 | access to local variable list [element] : A | CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | CollectionFlow.cs:92:14:92:28 | call to method ListFirst | -| CollectionFlow.cs:110:24:110:27 | access to local variable list [element] : A | CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | CollectionFlow.cs:110:14:110:28 | call to method ListFirst | -| CollectionFlow.cs:129:28:129:31 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | CollectionFlow.cs:385:67:385:73 | access to indexer : A | CollectionFlow.cs:129:14:129:32 | call to method DictIndexZero | -| CollectionFlow.cs:130:29:130:32 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict [element, property Value] : A | CollectionFlow.cs:387:68:387:85 | access to property Value : A | CollectionFlow.cs:130:14:130:33 | call to method DictFirstValue | -| CollectionFlow.cs:131:30:131:33 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict [element, property Value] : A | CollectionFlow.cs:389:69:389:87 | call to method First : A | CollectionFlow.cs:131:14:131:34 | call to method DictValuesFirst | -| CollectionFlow.cs:151:28:151:31 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | CollectionFlow.cs:385:67:385:73 | access to indexer : A | CollectionFlow.cs:151:14:151:32 | call to method DictIndexZero | -| CollectionFlow.cs:152:29:152:32 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict [element, property Value] : A | CollectionFlow.cs:387:68:387:85 | access to property Value : A | CollectionFlow.cs:152:14:152:33 | call to method DictFirstValue | -| CollectionFlow.cs:153:30:153:33 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict [element, property Value] : A | CollectionFlow.cs:389:69:389:87 | call to method First : A | CollectionFlow.cs:153:14:153:34 | call to method DictValuesFirst | -| CollectionFlow.cs:172:28:172:31 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict [element, property Value] : A | CollectionFlow.cs:385:67:385:73 | access to indexer : A | CollectionFlow.cs:172:14:172:32 | call to method DictIndexZero | -| CollectionFlow.cs:173:29:173:32 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict [element, property Value] : A | CollectionFlow.cs:387:68:387:85 | access to property Value : A | CollectionFlow.cs:173:14:173:33 | call to method DictFirstValue | -| CollectionFlow.cs:174:30:174:33 | access to local variable dict [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict [element, property Value] : A | CollectionFlow.cs:389:69:389:87 | call to method First : A | CollectionFlow.cs:174:14:174:34 | call to method DictValuesFirst | -| CollectionFlow.cs:194:28:194:31 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:391:58:391:61 | dict [element, property Key] : A | CollectionFlow.cs:391:67:391:83 | call to method First : A | CollectionFlow.cs:194:14:194:32 | call to method DictKeysFirst | -| CollectionFlow.cs:195:27:195:30 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:393:57:393:60 | dict [element, property Key] : A | CollectionFlow.cs:393:66:393:81 | access to property Key : A | CollectionFlow.cs:195:14:195:31 | call to method DictFirstKey | -| CollectionFlow.cs:213:28:213:31 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:391:58:391:61 | dict [element, property Key] : A | CollectionFlow.cs:391:67:391:83 | call to method First : A | CollectionFlow.cs:213:14:213:32 | call to method DictKeysFirst | -| CollectionFlow.cs:214:27:214:30 | access to local variable dict [element, property Key] : A | CollectionFlow.cs:393:57:393:60 | dict [element, property Key] : A | CollectionFlow.cs:393:66:393:81 | access to property Key : A | CollectionFlow.cs:214:14:214:31 | call to method DictFirstKey | -| CollectionFlow.cs:307:23:307:23 | access to local variable a : A | CollectionFlow.cs:301:32:301:38 | element : A | CollectionFlow.cs:301:44:301:48 | [post] access to parameter array [element] : A | CollectionFlow.cs:307:18:307:20 | [post] access to local variable as [element] : A | -| CollectionFlow.cs:310:20:310:22 | access to local variable as [element] : A | CollectionFlow.cs:381:34:381:35 | ts [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | CollectionFlow.cs:310:14:310:23 | call to method First | -| CollectionFlow.cs:329:23:329:23 | access to local variable a : A | CollectionFlow.cs:323:34:323:40 | element : A | CollectionFlow.cs:323:46:323:49 | [post] access to parameter list [element] : A | CollectionFlow.cs:329:17:329:20 | [post] access to local variable list [element] : A | -| CollectionFlow.cs:332:24:332:27 | access to local variable list [element] : A | CollectionFlow.cs:383:43:383:46 | list [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | CollectionFlow.cs:332:14:332:28 | call to method ListFirst | +| CollectionFlow.cs:17:20:17:22 | access to local variable as : null [element] : A | CollectionFlow.cs:381:34:381:35 | ts : null [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | CollectionFlow.cs:17:14:17:23 | call to method First | +| CollectionFlow.cs:35:20:35:23 | access to field As : A[] [element] : A | CollectionFlow.cs:381:34:381:35 | ts : A[] [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | CollectionFlow.cs:35:14:35:24 | call to method First | +| CollectionFlow.cs:54:20:54:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:381:34:381:35 | ts : A[] [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | CollectionFlow.cs:54:14:54:23 | call to method First | +| CollectionFlow.cs:74:24:74:27 | access to local variable list : List [element] : A | CollectionFlow.cs:383:43:383:46 | list : List [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | CollectionFlow.cs:74:14:74:28 | call to method ListFirst | +| CollectionFlow.cs:92:24:92:27 | access to local variable list : List [element] : A | CollectionFlow.cs:383:43:383:46 | list : List [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | CollectionFlow.cs:92:14:92:28 | call to method ListFirst | +| CollectionFlow.cs:110:24:110:27 | access to local variable list : List [element] : A | CollectionFlow.cs:383:43:383:46 | list : List [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | CollectionFlow.cs:110:14:110:28 | call to method ListFirst | +| CollectionFlow.cs:129:28:129:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:67:385:73 | access to indexer : A | CollectionFlow.cs:129:14:129:32 | call to method DictIndexZero | +| CollectionFlow.cs:130:29:130:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:68:387:85 | access to property Value : A | CollectionFlow.cs:130:14:130:33 | call to method DictFirstValue | +| CollectionFlow.cs:131:30:131:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:69:389:87 | call to method First : A | CollectionFlow.cs:131:14:131:34 | call to method DictValuesFirst | +| CollectionFlow.cs:151:28:151:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:67:385:73 | access to indexer : A | CollectionFlow.cs:151:14:151:32 | call to method DictIndexZero | +| CollectionFlow.cs:152:29:152:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:68:387:85 | access to property Value : A | CollectionFlow.cs:152:14:152:33 | call to method DictFirstValue | +| CollectionFlow.cs:153:30:153:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:69:389:87 | call to method First : A | CollectionFlow.cs:153:14:153:34 | call to method DictValuesFirst | +| CollectionFlow.cs:172:28:172:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:58:385:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:385:67:385:73 | access to indexer : A | CollectionFlow.cs:172:14:172:32 | call to method DictIndexZero | +| CollectionFlow.cs:173:29:173:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:59:387:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:387:68:387:85 | access to property Value : A | CollectionFlow.cs:173:14:173:33 | call to method DictFirstValue | +| CollectionFlow.cs:174:30:174:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:60:389:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:389:69:389:87 | call to method First : A | CollectionFlow.cs:174:14:174:34 | call to method DictValuesFirst | +| CollectionFlow.cs:194:28:194:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:391:58:391:61 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:391:67:391:83 | call to method First : A | CollectionFlow.cs:194:14:194:32 | call to method DictKeysFirst | +| CollectionFlow.cs:195:27:195:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:393:57:393:60 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:393:66:393:81 | access to property Key : A | CollectionFlow.cs:195:14:195:31 | call to method DictFirstKey | +| CollectionFlow.cs:213:28:213:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:391:58:391:61 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:391:67:391:83 | call to method First : A | CollectionFlow.cs:213:14:213:32 | call to method DictKeysFirst | +| CollectionFlow.cs:214:27:214:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:393:57:393:60 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:393:66:393:81 | access to property Key : A | CollectionFlow.cs:214:14:214:31 | call to method DictFirstKey | +| CollectionFlow.cs:307:23:307:23 | access to local variable a : A | CollectionFlow.cs:301:32:301:38 | element : A | CollectionFlow.cs:301:44:301:48 | [post] access to parameter array : A[] [element] : A | CollectionFlow.cs:307:18:307:20 | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:310:20:310:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:381:34:381:35 | ts : A[] [element] : A | CollectionFlow.cs:381:41:381:45 | access to array element : A | CollectionFlow.cs:310:14:310:23 | call to method First | +| CollectionFlow.cs:329:23:329:23 | access to local variable a : A | CollectionFlow.cs:323:34:323:40 | element : A | CollectionFlow.cs:323:46:323:49 | [post] access to parameter list : List [element] : A | CollectionFlow.cs:329:17:329:20 | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:332:24:332:27 | access to local variable list : List [element] : A | CollectionFlow.cs:383:43:383:46 | list : List [element] : A | CollectionFlow.cs:383:52:383:58 | access to indexer : A | CollectionFlow.cs:332:14:332:28 | call to method ListFirst | #select | CollectionFlow.cs:13:17:13:23 | object creation of type A : A | CollectionFlow.cs:13:17:13:23 | object creation of type A : A | CollectionFlow.cs:15:14:15:19 | access to array element | $@ | CollectionFlow.cs:15:14:15:19 | access to array element | access to array element | | CollectionFlow.cs:13:17:13:23 | object creation of type A : A | CollectionFlow.cs:13:17:13:23 | object creation of type A : A | CollectionFlow.cs:17:14:17:23 | call to method First | $@ | CollectionFlow.cs:17:14:17:23 | call to method First | call to method First | diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql index 6d89c413730..abeb61cf3fc 100644 --- a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql @@ -3,23 +3,23 @@ */ import csharp -import DataFlow::PathGraph +import ArrayFlow::PathGraph -class Conf extends DataFlow::Configuration { - Conf() { this = "ArrayFlowConf" } +module ArrayFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ObjectCreation } - override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ObjectCreation } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodCall mc | mc.getTarget().hasUndecoratedName("Sink") and mc.getAnArgument() = sink.asExpr() ) } - override int fieldFlowBranchLimit() { result = 100 } + int fieldFlowBranchLimit() { result = 100 } } -from DataFlow::PathNode source, DataFlow::PathNode sink, Conf conf -where conf.hasFlowPath(source, sink) +module ArrayFlow = DataFlow::Global; + +from ArrayFlow::PathNode source, ArrayFlow::PathNode sink +where ArrayFlow::flowPath(source, sink) select source, source, sink, "$@", sink, sink.toString() diff --git a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected index 3e03ec71fdb..25267c71e87 100644 --- a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected @@ -9,59 +9,59 @@ edges | ExternalFlow.cs:23:27:23:38 | object creation of type Object : Object | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | | ExternalFlow.cs:24:13:24:29 | [post] this access : D | ExternalFlow.cs:25:18:25:21 | this access | | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | ExternalFlow.cs:24:13:24:29 | [post] this access : D | -| ExternalFlow.cs:30:13:30:16 | [post] this access [field Field] : Object | ExternalFlow.cs:31:18:31:21 | this access [field Field] : Object | -| ExternalFlow.cs:30:26:30:37 | object creation of type Object : Object | ExternalFlow.cs:30:13:30:16 | [post] this access [field Field] : Object | -| ExternalFlow.cs:31:18:31:21 | this access [field Field] : Object | ExternalFlow.cs:31:18:31:39 | call to method StepFieldGetter | -| ExternalFlow.cs:36:19:36:62 | (...) ... [field Field] : Object | ExternalFlow.cs:36:18:36:69 | access to field Field | -| ExternalFlow.cs:36:22:36:25 | [post] this access [field Field] : Object | ExternalFlow.cs:37:18:37:21 | this access [field Field] : Object | -| ExternalFlow.cs:36:22:36:55 | call to method StepFieldSetter [field Field2, field Field] : Object | ExternalFlow.cs:36:22:36:62 | access to field Field2 [field Field] : Object | -| ExternalFlow.cs:36:22:36:62 | access to field Field2 [field Field] : Object | ExternalFlow.cs:36:19:36:62 | (...) ... [field Field] : Object | -| ExternalFlow.cs:36:43:36:54 | object creation of type Object : Object | ExternalFlow.cs:36:22:36:25 | [post] this access [field Field] : Object | -| ExternalFlow.cs:36:43:36:54 | object creation of type Object : Object | ExternalFlow.cs:36:22:36:55 | call to method StepFieldSetter [field Field2, field Field] : Object | -| ExternalFlow.cs:37:18:37:21 | this access [field Field] : Object | ExternalFlow.cs:37:18:37:27 | access to field Field | -| ExternalFlow.cs:42:13:42:16 | [post] this access [property Property] : Object | ExternalFlow.cs:43:18:43:21 | this access [property Property] : Object | -| ExternalFlow.cs:42:29:42:40 | object creation of type Object : Object | ExternalFlow.cs:42:13:42:16 | [post] this access [property Property] : Object | -| ExternalFlow.cs:43:18:43:21 | this access [property Property] : Object | ExternalFlow.cs:43:18:43:42 | call to method StepPropertyGetter | -| ExternalFlow.cs:48:13:48:16 | [post] this access [property Property] : Object | ExternalFlow.cs:49:18:49:21 | this access [property Property] : Object | -| ExternalFlow.cs:48:37:48:48 | object creation of type Object : Object | ExternalFlow.cs:48:13:48:16 | [post] this access [property Property] : Object | -| ExternalFlow.cs:49:18:49:21 | this access [property Property] : Object | ExternalFlow.cs:49:18:49:30 | access to property Property | -| ExternalFlow.cs:54:13:54:16 | [post] this access [element] : Object | ExternalFlow.cs:55:18:55:21 | this access [element] : Object | -| ExternalFlow.cs:54:36:54:47 | object creation of type Object : Object | ExternalFlow.cs:54:13:54:16 | [post] this access [element] : Object | -| ExternalFlow.cs:55:18:55:21 | this access [element] : Object | ExternalFlow.cs:55:18:55:41 | call to method StepElementGetter | +| ExternalFlow.cs:30:13:30:16 | [post] this access : D [field Field] : Object | ExternalFlow.cs:31:18:31:21 | this access : D [field Field] : Object | +| ExternalFlow.cs:30:26:30:37 | object creation of type Object : Object | ExternalFlow.cs:30:13:30:16 | [post] this access : D [field Field] : Object | +| ExternalFlow.cs:31:18:31:21 | this access : D [field Field] : Object | ExternalFlow.cs:31:18:31:39 | call to method StepFieldGetter | +| ExternalFlow.cs:36:19:36:62 | (...) ... : Object [field Field] : Object | ExternalFlow.cs:36:18:36:69 | access to field Field | +| ExternalFlow.cs:36:22:36:25 | [post] this access : D [field Field] : Object | ExternalFlow.cs:37:18:37:21 | this access : D [field Field] : Object | +| ExternalFlow.cs:36:22:36:55 | call to method StepFieldSetter : D [field Field2, field Field] : Object | ExternalFlow.cs:36:22:36:62 | access to field Field2 : Object [field Field] : Object | +| ExternalFlow.cs:36:22:36:62 | access to field Field2 : Object [field Field] : Object | ExternalFlow.cs:36:19:36:62 | (...) ... : Object [field Field] : Object | +| ExternalFlow.cs:36:43:36:54 | object creation of type Object : Object | ExternalFlow.cs:36:22:36:25 | [post] this access : D [field Field] : Object | +| ExternalFlow.cs:36:43:36:54 | object creation of type Object : Object | ExternalFlow.cs:36:22:36:55 | call to method StepFieldSetter : D [field Field2, field Field] : Object | +| ExternalFlow.cs:37:18:37:21 | this access : D [field Field] : Object | ExternalFlow.cs:37:18:37:27 | access to field Field | +| ExternalFlow.cs:42:13:42:16 | [post] this access : D [property Property] : Object | ExternalFlow.cs:43:18:43:21 | this access : D [property Property] : Object | +| ExternalFlow.cs:42:29:42:40 | object creation of type Object : Object | ExternalFlow.cs:42:13:42:16 | [post] this access : D [property Property] : Object | +| ExternalFlow.cs:43:18:43:21 | this access : D [property Property] : Object | ExternalFlow.cs:43:18:43:42 | call to method StepPropertyGetter | +| ExternalFlow.cs:48:13:48:16 | [post] this access : D [property Property] : Object | ExternalFlow.cs:49:18:49:21 | this access : D [property Property] : Object | +| ExternalFlow.cs:48:37:48:48 | object creation of type Object : Object | ExternalFlow.cs:48:13:48:16 | [post] this access : D [property Property] : Object | +| ExternalFlow.cs:49:18:49:21 | this access : D [property Property] : Object | ExternalFlow.cs:49:18:49:30 | access to property Property | +| ExternalFlow.cs:54:13:54:16 | [post] this access : D [element] : Object | ExternalFlow.cs:55:18:55:21 | this access : D [element] : Object | +| ExternalFlow.cs:54:36:54:47 | object creation of type Object : Object | ExternalFlow.cs:54:13:54:16 | [post] this access : D [element] : Object | +| ExternalFlow.cs:55:18:55:21 | this access : D [element] : Object | ExternalFlow.cs:55:18:55:41 | call to method StepElementGetter | | ExternalFlow.cs:60:35:60:35 | o : Object | ExternalFlow.cs:60:47:60:47 | access to parameter o | | ExternalFlow.cs:60:64:60:75 | object creation of type Object : Object | ExternalFlow.cs:60:35:60:35 | o : Object | | ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | ExternalFlow.cs:66:18:66:18 | access to local variable o | | ExternalFlow.cs:65:45:65:56 | object creation of type Object : Object | ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | -| ExternalFlow.cs:71:30:71:45 | { ..., ... } [element] : Object | ExternalFlow.cs:72:17:72:20 | access to local variable objs [element] : Object | -| ExternalFlow.cs:71:32:71:43 | object creation of type Object : Object | ExternalFlow.cs:71:30:71:45 | { ..., ... } [element] : Object | -| ExternalFlow.cs:72:17:72:20 | access to local variable objs [element] : Object | ExternalFlow.cs:72:23:72:23 | o : Object | +| ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | +| ExternalFlow.cs:71:32:71:43 | object creation of type Object : Object | ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | +| ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | ExternalFlow.cs:72:23:72:23 | o : Object | | ExternalFlow.cs:72:23:72:23 | o : Object | ExternalFlow.cs:72:35:72:35 | access to parameter o | -| ExternalFlow.cs:77:24:77:58 | call to method Map [element] : Object | ExternalFlow.cs:78:18:78:21 | access to local variable objs [element] : Object | -| ExternalFlow.cs:77:46:77:57 | object creation of type Object : Object | ExternalFlow.cs:77:24:77:58 | call to method Map [element] : Object | -| ExternalFlow.cs:78:18:78:21 | access to local variable objs [element] : Object | ExternalFlow.cs:78:18:78:24 | access to array element : Object | +| ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | +| ExternalFlow.cs:77:46:77:57 | object creation of type Object : Object | ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | +| ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | ExternalFlow.cs:78:18:78:24 | access to array element : Object | | ExternalFlow.cs:78:18:78:24 | access to array element : Object | ExternalFlow.cs:78:18:78:24 | (...) ... | -| ExternalFlow.cs:83:30:83:45 | { ..., ... } [element] : Object | ExternalFlow.cs:84:29:84:32 | access to local variable objs [element] : Object | -| ExternalFlow.cs:83:32:83:43 | object creation of type Object : Object | ExternalFlow.cs:83:30:83:45 | { ..., ... } [element] : Object | -| ExternalFlow.cs:84:25:84:41 | call to method Map [element] : Object | ExternalFlow.cs:85:18:85:22 | access to local variable objs2 [element] : Object | -| ExternalFlow.cs:84:29:84:32 | access to local variable objs [element] : Object | ExternalFlow.cs:84:25:84:41 | call to method Map [element] : Object | -| ExternalFlow.cs:85:18:85:22 | access to local variable objs2 [element] : Object | ExternalFlow.cs:85:18:85:25 | access to array element | +| ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | +| ExternalFlow.cs:83:32:83:43 | object creation of type Object : Object | ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | +| ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | +| ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | +| ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | ExternalFlow.cs:85:18:85:25 | access to array element | | ExternalFlow.cs:90:21:90:34 | object creation of type String : String | ExternalFlow.cs:91:19:91:19 | access to local variable s : String | | ExternalFlow.cs:91:19:91:19 | access to local variable s : String | ExternalFlow.cs:91:30:91:30 | SSA def(i) : Int32 | | ExternalFlow.cs:91:30:91:30 | SSA def(i) : Int32 | ExternalFlow.cs:92:18:92:18 | (...) ... | -| ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 [field Field] : Object | ExternalFlow.cs:103:16:103:17 | access to local variable d1 [field Field] : Object | -| ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 [field Field] : Object | ExternalFlow.cs:104:18:104:19 | access to local variable d1 [field Field] : Object | -| ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 [field Field] : Object | +| ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | ExternalFlow.cs:103:16:103:17 | access to local variable d1 : D [field Field] : Object | +| ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | ExternalFlow.cs:104:18:104:19 | access to local variable d1 : D [field Field] : Object | +| ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | | ExternalFlow.cs:100:20:100:20 | d : Object | ExternalFlow.cs:102:22:102:22 | access to parameter d | -| ExternalFlow.cs:103:16:103:17 | access to local variable d1 [field Field] : Object | ExternalFlow.cs:100:20:100:20 | d : Object | -| ExternalFlow.cs:104:18:104:19 | access to local variable d1 [field Field] : Object | ExternalFlow.cs:104:18:104:25 | access to field Field | -| ExternalFlow.cs:111:13:111:13 | [post] access to local variable f [field MyField] : Object | ExternalFlow.cs:112:18:112:18 | access to local variable f [field MyField] : Object | -| ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | ExternalFlow.cs:111:13:111:13 | [post] access to local variable f [field MyField] : Object | -| ExternalFlow.cs:112:18:112:18 | access to local variable f [field MyField] : Object | ExternalFlow.cs:112:18:112:25 | access to property MyProp | -| ExternalFlow.cs:117:34:117:49 | { ..., ... } [element] : Object | ExternalFlow.cs:118:29:118:29 | access to local variable a [element] : Object | -| ExternalFlow.cs:117:36:117:47 | object creation of type Object : Object | ExternalFlow.cs:117:34:117:49 | { ..., ... } [element] : Object | -| ExternalFlow.cs:118:21:118:30 | call to method Reverse [element] : Object | ExternalFlow.cs:120:18:120:18 | access to local variable b [element] : Object | -| ExternalFlow.cs:118:29:118:29 | access to local variable a [element] : Object | ExternalFlow.cs:118:21:118:30 | call to method Reverse [element] : Object | -| ExternalFlow.cs:120:18:120:18 | access to local variable b [element] : Object | ExternalFlow.cs:120:18:120:21 | access to array element | +| ExternalFlow.cs:103:16:103:17 | access to local variable d1 : D [field Field] : Object | ExternalFlow.cs:100:20:100:20 | d : Object | +| ExternalFlow.cs:104:18:104:19 | access to local variable d1 : D [field Field] : Object | ExternalFlow.cs:104:18:104:25 | access to field Field | +| ExternalFlow.cs:111:13:111:13 | [post] access to local variable f : F [field MyField] : Object | ExternalFlow.cs:112:18:112:18 | access to local variable f : F [field MyField] : Object | +| ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | ExternalFlow.cs:111:13:111:13 | [post] access to local variable f : F [field MyField] : Object | +| ExternalFlow.cs:112:18:112:18 | access to local variable f : F [field MyField] : Object | ExternalFlow.cs:112:18:112:25 | access to property MyProp | +| ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | +| ExternalFlow.cs:117:36:117:47 | object creation of type Object : Object | ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | +| ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | +| ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | +| ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | ExternalFlow.cs:120:18:120:21 | access to array element | | ExternalFlow.cs:187:21:187:32 | object creation of type Object : Object | ExternalFlow.cs:188:32:188:32 | access to local variable o : Object | | ExternalFlow.cs:188:32:188:32 | access to local variable o : Object | ExternalFlow.cs:188:18:188:33 | call to method GeneratedFlow | | ExternalFlow.cs:193:22:193:33 | object creation of type Object : Object | ExternalFlow.cs:194:36:194:37 | access to local variable o1 : Object | @@ -83,29 +83,29 @@ nodes | ExternalFlow.cs:24:13:24:29 | [post] this access : D | semmle.label | [post] this access : D | | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | semmle.label | access to local variable arg2 : Object | | ExternalFlow.cs:25:18:25:21 | this access | semmle.label | this access | -| ExternalFlow.cs:30:13:30:16 | [post] this access [field Field] : Object | semmle.label | [post] this access [field Field] : Object | +| ExternalFlow.cs:30:13:30:16 | [post] this access : D [field Field] : Object | semmle.label | [post] this access : D [field Field] : Object | | ExternalFlow.cs:30:26:30:37 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| ExternalFlow.cs:31:18:31:21 | this access [field Field] : Object | semmle.label | this access [field Field] : Object | +| ExternalFlow.cs:31:18:31:21 | this access : D [field Field] : Object | semmle.label | this access : D [field Field] : Object | | ExternalFlow.cs:31:18:31:39 | call to method StepFieldGetter | semmle.label | call to method StepFieldGetter | | ExternalFlow.cs:36:18:36:69 | access to field Field | semmle.label | access to field Field | -| ExternalFlow.cs:36:19:36:62 | (...) ... [field Field] : Object | semmle.label | (...) ... [field Field] : Object | -| ExternalFlow.cs:36:22:36:25 | [post] this access [field Field] : Object | semmle.label | [post] this access [field Field] : Object | -| ExternalFlow.cs:36:22:36:55 | call to method StepFieldSetter [field Field2, field Field] : Object | semmle.label | call to method StepFieldSetter [field Field2, field Field] : Object | -| ExternalFlow.cs:36:22:36:62 | access to field Field2 [field Field] : Object | semmle.label | access to field Field2 [field Field] : Object | +| ExternalFlow.cs:36:19:36:62 | (...) ... : Object [field Field] : Object | semmle.label | (...) ... : Object [field Field] : Object | +| ExternalFlow.cs:36:22:36:25 | [post] this access : D [field Field] : Object | semmle.label | [post] this access : D [field Field] : Object | +| ExternalFlow.cs:36:22:36:55 | call to method StepFieldSetter : D [field Field2, field Field] : Object | semmle.label | call to method StepFieldSetter : D [field Field2, field Field] : Object | +| ExternalFlow.cs:36:22:36:62 | access to field Field2 : Object [field Field] : Object | semmle.label | access to field Field2 : Object [field Field] : Object | | ExternalFlow.cs:36:43:36:54 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| ExternalFlow.cs:37:18:37:21 | this access [field Field] : Object | semmle.label | this access [field Field] : Object | +| ExternalFlow.cs:37:18:37:21 | this access : D [field Field] : Object | semmle.label | this access : D [field Field] : Object | | ExternalFlow.cs:37:18:37:27 | access to field Field | semmle.label | access to field Field | -| ExternalFlow.cs:42:13:42:16 | [post] this access [property Property] : Object | semmle.label | [post] this access [property Property] : Object | +| ExternalFlow.cs:42:13:42:16 | [post] this access : D [property Property] : Object | semmle.label | [post] this access : D [property Property] : Object | | ExternalFlow.cs:42:29:42:40 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| ExternalFlow.cs:43:18:43:21 | this access [property Property] : Object | semmle.label | this access [property Property] : Object | +| ExternalFlow.cs:43:18:43:21 | this access : D [property Property] : Object | semmle.label | this access : D [property Property] : Object | | ExternalFlow.cs:43:18:43:42 | call to method StepPropertyGetter | semmle.label | call to method StepPropertyGetter | -| ExternalFlow.cs:48:13:48:16 | [post] this access [property Property] : Object | semmle.label | [post] this access [property Property] : Object | +| ExternalFlow.cs:48:13:48:16 | [post] this access : D [property Property] : Object | semmle.label | [post] this access : D [property Property] : Object | | ExternalFlow.cs:48:37:48:48 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| ExternalFlow.cs:49:18:49:21 | this access [property Property] : Object | semmle.label | this access [property Property] : Object | +| ExternalFlow.cs:49:18:49:21 | this access : D [property Property] : Object | semmle.label | this access : D [property Property] : Object | | ExternalFlow.cs:49:18:49:30 | access to property Property | semmle.label | access to property Property | -| ExternalFlow.cs:54:13:54:16 | [post] this access [element] : Object | semmle.label | [post] this access [element] : Object | +| ExternalFlow.cs:54:13:54:16 | [post] this access : D [element] : Object | semmle.label | [post] this access : D [element] : Object | | ExternalFlow.cs:54:36:54:47 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| ExternalFlow.cs:55:18:55:21 | this access [element] : Object | semmle.label | this access [element] : Object | +| ExternalFlow.cs:55:18:55:21 | this access : D [element] : Object | semmle.label | this access : D [element] : Object | | ExternalFlow.cs:55:18:55:41 | call to method StepElementGetter | semmle.label | call to method StepElementGetter | | ExternalFlow.cs:60:35:60:35 | o : Object | semmle.label | o : Object | | ExternalFlow.cs:60:47:60:47 | access to parameter o | semmle.label | access to parameter o | @@ -113,42 +113,42 @@ nodes | ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | semmle.label | call to method Apply : Object | | ExternalFlow.cs:65:45:65:56 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:66:18:66:18 | access to local variable o | semmle.label | access to local variable o | -| ExternalFlow.cs:71:30:71:45 | { ..., ... } [element] : Object | semmle.label | { ..., ... } [element] : Object | +| ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | semmle.label | { ..., ... } : null [element] : Object | | ExternalFlow.cs:71:32:71:43 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| ExternalFlow.cs:72:17:72:20 | access to local variable objs [element] : Object | semmle.label | access to local variable objs [element] : Object | +| ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | semmle.label | access to local variable objs : null [element] : Object | | ExternalFlow.cs:72:23:72:23 | o : Object | semmle.label | o : Object | | ExternalFlow.cs:72:35:72:35 | access to parameter o | semmle.label | access to parameter o | -| ExternalFlow.cs:77:24:77:58 | call to method Map [element] : Object | semmle.label | call to method Map [element] : Object | +| ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | semmle.label | call to method Map : T[] [element] : Object | | ExternalFlow.cs:77:46:77:57 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| ExternalFlow.cs:78:18:78:21 | access to local variable objs [element] : Object | semmle.label | access to local variable objs [element] : Object | +| ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | semmle.label | access to local variable objs : T[] [element] : Object | | ExternalFlow.cs:78:18:78:24 | (...) ... | semmle.label | (...) ... | | ExternalFlow.cs:78:18:78:24 | access to array element : Object | semmle.label | access to array element : Object | -| ExternalFlow.cs:83:30:83:45 | { ..., ... } [element] : Object | semmle.label | { ..., ... } [element] : Object | +| ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | semmle.label | { ..., ... } : null [element] : Object | | ExternalFlow.cs:83:32:83:43 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| ExternalFlow.cs:84:25:84:41 | call to method Map [element] : Object | semmle.label | call to method Map [element] : Object | -| ExternalFlow.cs:84:29:84:32 | access to local variable objs [element] : Object | semmle.label | access to local variable objs [element] : Object | -| ExternalFlow.cs:85:18:85:22 | access to local variable objs2 [element] : Object | semmle.label | access to local variable objs2 [element] : Object | +| ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | semmle.label | call to method Map : T[] [element] : Object | +| ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | semmle.label | access to local variable objs : null [element] : Object | +| ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | semmle.label | access to local variable objs2 : T[] [element] : Object | | ExternalFlow.cs:85:18:85:25 | access to array element | semmle.label | access to array element | | ExternalFlow.cs:90:21:90:34 | object creation of type String : String | semmle.label | object creation of type String : String | | ExternalFlow.cs:91:19:91:19 | access to local variable s : String | semmle.label | access to local variable s : String | | ExternalFlow.cs:91:30:91:30 | SSA def(i) : Int32 | semmle.label | SSA def(i) : Int32 | | ExternalFlow.cs:92:18:92:18 | (...) ... | semmle.label | (...) ... | -| ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 [field Field] : Object | semmle.label | [post] access to local variable d1 [field Field] : Object | +| ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | semmle.label | [post] access to local variable d1 : D [field Field] : Object | | ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:100:20:100:20 | d : Object | semmle.label | d : Object | | ExternalFlow.cs:102:22:102:22 | access to parameter d | semmle.label | access to parameter d | -| ExternalFlow.cs:103:16:103:17 | access to local variable d1 [field Field] : Object | semmle.label | access to local variable d1 [field Field] : Object | -| ExternalFlow.cs:104:18:104:19 | access to local variable d1 [field Field] : Object | semmle.label | access to local variable d1 [field Field] : Object | +| ExternalFlow.cs:103:16:103:17 | access to local variable d1 : D [field Field] : Object | semmle.label | access to local variable d1 : D [field Field] : Object | +| ExternalFlow.cs:104:18:104:19 | access to local variable d1 : D [field Field] : Object | semmle.label | access to local variable d1 : D [field Field] : Object | | ExternalFlow.cs:104:18:104:25 | access to field Field | semmle.label | access to field Field | -| ExternalFlow.cs:111:13:111:13 | [post] access to local variable f [field MyField] : Object | semmle.label | [post] access to local variable f [field MyField] : Object | +| ExternalFlow.cs:111:13:111:13 | [post] access to local variable f : F [field MyField] : Object | semmle.label | [post] access to local variable f : F [field MyField] : Object | | ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| ExternalFlow.cs:112:18:112:18 | access to local variable f [field MyField] : Object | semmle.label | access to local variable f [field MyField] : Object | +| ExternalFlow.cs:112:18:112:18 | access to local variable f : F [field MyField] : Object | semmle.label | access to local variable f : F [field MyField] : Object | | ExternalFlow.cs:112:18:112:25 | access to property MyProp | semmle.label | access to property MyProp | -| ExternalFlow.cs:117:34:117:49 | { ..., ... } [element] : Object | semmle.label | { ..., ... } [element] : Object | +| ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | semmle.label | { ..., ... } : null [element] : Object | | ExternalFlow.cs:117:36:117:47 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| ExternalFlow.cs:118:21:118:30 | call to method Reverse [element] : Object | semmle.label | call to method Reverse [element] : Object | -| ExternalFlow.cs:118:29:118:29 | access to local variable a [element] : Object | semmle.label | access to local variable a [element] : Object | -| ExternalFlow.cs:120:18:120:18 | access to local variable b [element] : Object | semmle.label | access to local variable b [element] : Object | +| ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | semmle.label | call to method Reverse : null [element] : Object | +| ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | semmle.label | access to local variable a : null [element] : Object | +| ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | semmle.label | access to local variable b : null [element] : Object | | ExternalFlow.cs:120:18:120:21 | access to array element | semmle.label | access to array element | | ExternalFlow.cs:187:21:187:32 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:188:18:188:33 | call to method GeneratedFlow | semmle.label | call to method GeneratedFlow | diff --git a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected index c09c738fbe1..aa9ac0493aa 100644 --- a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected @@ -1,1029 +1,1029 @@ failures edges | A.cs:5:17:5:28 | call to method Source : C | A.cs:6:24:6:24 | access to local variable c : C | -| A.cs:6:17:6:25 | call to method Make [field c] : C | A.cs:7:14:7:14 | access to local variable b [field c] : C | -| A.cs:6:24:6:24 | access to local variable c : C | A.cs:6:17:6:25 | call to method Make [field c] : C | +| A.cs:6:17:6:25 | call to method Make : B [field c] : C | A.cs:7:14:7:14 | access to local variable b : B [field c] : C | +| A.cs:6:24:6:24 | access to local variable c : C | A.cs:6:17:6:25 | call to method Make : B [field c] : C | | A.cs:6:24:6:24 | access to local variable c : C | A.cs:147:32:147:32 | c : C | -| A.cs:7:14:7:14 | access to local variable b [field c] : C | A.cs:7:14:7:16 | access to field c | -| A.cs:13:9:13:9 | [post] access to local variable b [field c] : C1 | A.cs:14:14:14:14 | access to local variable b [field c] : C1 | -| A.cs:13:15:13:29 | call to method Source : C1 | A.cs:13:9:13:9 | [post] access to local variable b [field c] : C1 | +| A.cs:7:14:7:14 | access to local variable b : B [field c] : C | A.cs:7:14:7:16 | access to field c | +| A.cs:13:9:13:9 | [post] access to local variable b : B [field c] : C1 | A.cs:14:14:14:14 | access to local variable b : B [field c] : C1 | +| A.cs:13:15:13:29 | call to method Source : C1 | A.cs:13:9:13:9 | [post] access to local variable b : B [field c] : C1 | | A.cs:13:15:13:29 | call to method Source : C1 | A.cs:145:27:145:27 | c : C1 | -| A.cs:14:14:14:14 | access to local variable b [field c] : C1 | A.cs:14:14:14:20 | call to method Get | -| A.cs:14:14:14:14 | access to local variable b [field c] : C1 | A.cs:146:18:146:20 | this [field c] : C1 | -| A.cs:15:15:15:35 | object creation of type B [field c] : C | A.cs:15:14:15:42 | call to method Get | -| A.cs:15:15:15:35 | object creation of type B [field c] : C | A.cs:146:18:146:20 | this [field c] : C | -| A.cs:15:21:15:34 | call to method Source : C | A.cs:15:15:15:35 | object creation of type B [field c] : C | +| A.cs:14:14:14:14 | access to local variable b : B [field c] : C1 | A.cs:14:14:14:20 | call to method Get | +| A.cs:14:14:14:14 | access to local variable b : B [field c] : C1 | A.cs:146:18:146:20 | this : B [field c] : C1 | +| A.cs:15:15:15:35 | object creation of type B : B [field c] : C | A.cs:15:14:15:42 | call to method Get | +| A.cs:15:15:15:35 | object creation of type B : B [field c] : C | A.cs:146:18:146:20 | this : B [field c] : C | +| A.cs:15:21:15:34 | call to method Source : C | A.cs:15:15:15:35 | object creation of type B : B [field c] : C | | A.cs:15:21:15:34 | call to method Source : C | A.cs:141:20:141:20 | c : C | -| A.cs:22:14:22:38 | call to method SetOnB [field c] : C2 | A.cs:24:14:24:15 | access to local variable b2 [field c] : C2 | -| A.cs:22:25:22:37 | call to method Source : C2 | A.cs:22:14:22:38 | call to method SetOnB [field c] : C2 | +| A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | +| A.cs:22:25:22:37 | call to method Source : C2 | A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | | A.cs:22:25:22:37 | call to method Source : C2 | A.cs:42:29:42:29 | c : C2 | -| A.cs:24:14:24:15 | access to local variable b2 [field c] : C2 | A.cs:24:14:24:17 | access to field c | -| A.cs:31:14:31:42 | call to method SetOnBWrap [field c] : C2 | A.cs:33:14:33:15 | access to local variable b2 [field c] : C2 | -| A.cs:31:29:31:41 | call to method Source : C2 | A.cs:31:14:31:42 | call to method SetOnBWrap [field c] : C2 | +| A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | A.cs:24:14:24:17 | access to field c | +| A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | +| A.cs:31:29:31:41 | call to method Source : C2 | A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | | A.cs:31:29:31:41 | call to method Source : C2 | A.cs:36:33:36:33 | c : C2 | -| A.cs:33:14:33:15 | access to local variable b2 [field c] : C2 | A.cs:33:14:33:17 | access to field c | +| A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | A.cs:33:14:33:17 | access to field c | | A.cs:36:33:36:33 | c : C2 | A.cs:38:29:38:29 | access to parameter c : C2 | -| A.cs:38:18:38:30 | call to method SetOnB [field c] : C2 | A.cs:39:16:39:28 | ... ? ... : ... [field c] : C2 | -| A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:38:18:38:30 | call to method SetOnB [field c] : C2 | +| A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | +| A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | | A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:42:29:42:29 | c : C2 | | A.cs:42:29:42:29 | c : C2 | A.cs:47:20:47:20 | access to parameter c : C2 | -| A.cs:47:13:47:14 | [post] access to local variable b2 [field c] : C2 | A.cs:48:20:48:21 | access to local variable b2 [field c] : C2 | -| A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:47:13:47:14 | [post] access to local variable b2 [field c] : C2 | +| A.cs:47:13:47:14 | [post] access to local variable b2 : B [field c] : C2 | A.cs:48:20:48:21 | access to local variable b2 : B [field c] : C2 | +| A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:47:13:47:14 | [post] access to local variable b2 : B [field c] : C2 | | A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:145:27:145:27 | c : C2 | | A.cs:55:17:55:28 | call to method Source : A | A.cs:57:16:57:16 | access to local variable a : A | -| A.cs:57:9:57:10 | [post] access to local variable c1 [field a] : A | A.cs:58:12:58:13 | access to local variable c1 [field a] : A | -| A.cs:57:16:57:16 | access to local variable a : A | A.cs:57:9:57:10 | [post] access to local variable c1 [field a] : A | -| A.cs:58:12:58:13 | access to local variable c1 [field a] : A | A.cs:60:22:60:22 | c [field a] : A | -| A.cs:60:22:60:22 | c [field a] : A | A.cs:64:19:64:23 | (...) ... [field a] : A | -| A.cs:64:19:64:23 | (...) ... [field a] : A | A.cs:64:18:64:26 | access to field a | -| A.cs:83:9:83:9 | [post] access to parameter b [field c] : C | A.cs:88:12:88:12 | [post] access to local variable b [field c] : C | -| A.cs:83:15:83:26 | call to method Source : C | A.cs:83:9:83:9 | [post] access to parameter b [field c] : C | +| A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | A.cs:58:12:58:13 | access to local variable c1 : C1 [field a] : A | +| A.cs:57:16:57:16 | access to local variable a : A | A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | +| A.cs:58:12:58:13 | access to local variable c1 : C1 [field a] : A | A.cs:60:22:60:22 | c : C1 [field a] : A | +| A.cs:60:22:60:22 | c : C1 [field a] : A | A.cs:64:19:64:23 | (...) ... : C1 [field a] : A | +| A.cs:64:19:64:23 | (...) ... : C1 [field a] : A | A.cs:64:18:64:26 | access to field a | +| A.cs:83:9:83:9 | [post] access to parameter b : B [field c] : C | A.cs:88:12:88:12 | [post] access to local variable b : B [field c] : C | +| A.cs:83:15:83:26 | call to method Source : C | A.cs:83:9:83:9 | [post] access to parameter b : B [field c] : C | | A.cs:83:15:83:26 | call to method Source : C | A.cs:145:27:145:27 | c : C | -| A.cs:88:12:88:12 | [post] access to local variable b [field c] : C | A.cs:89:14:89:14 | access to local variable b [field c] : C | -| A.cs:89:14:89:14 | access to local variable b [field c] : C | A.cs:89:14:89:16 | access to field c | +| A.cs:88:12:88:12 | [post] access to local variable b : B [field c] : C | A.cs:89:14:89:14 | access to local variable b : B [field c] : C | +| A.cs:89:14:89:14 | access to local variable b : B [field c] : C | A.cs:89:14:89:16 | access to field c | | A.cs:95:20:95:20 | b : B | A.cs:97:13:97:13 | access to parameter b : B | -| A.cs:97:13:97:13 | [post] access to parameter b [field c] : C | A.cs:98:22:98:43 | ... ? ... : ... [field c] : C | -| A.cs:97:13:97:13 | [post] access to parameter b [field c] : C | A.cs:105:23:105:23 | [post] access to local variable b [field c] : C | +| A.cs:97:13:97:13 | [post] access to parameter b : B [field c] : C | A.cs:98:22:98:43 | ... ? ... : ... : B [field c] : C | +| A.cs:97:13:97:13 | [post] access to parameter b : B [field c] : C | A.cs:105:23:105:23 | [post] access to local variable b : B [field c] : C | | A.cs:97:13:97:13 | access to parameter b : B | A.cs:98:22:98:43 | ... ? ... : ... : B | -| A.cs:97:19:97:32 | call to method Source : C | A.cs:97:13:97:13 | [post] access to parameter b [field c] : C | -| A.cs:98:13:98:16 | [post] this access [field b, field c] : C | A.cs:105:17:105:29 | object creation of type D [field b, field c] : C | -| A.cs:98:13:98:16 | [post] this access [field b] : B | A.cs:105:17:105:29 | object creation of type D [field b] : B | -| A.cs:98:22:98:43 | ... ? ... : ... : B | A.cs:98:13:98:16 | [post] this access [field b] : B | -| A.cs:98:22:98:43 | ... ? ... : ... : B | A.cs:98:13:98:16 | [post] this access [field b] : B | -| A.cs:98:22:98:43 | ... ? ... : ... [field c] : C | A.cs:98:13:98:16 | [post] this access [field b, field c] : C | +| A.cs:97:19:97:32 | call to method Source : C | A.cs:97:13:97:13 | [post] access to parameter b : B [field c] : C | +| A.cs:98:13:98:16 | [post] this access : D [field b, field c] : C | A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | +| A.cs:98:13:98:16 | [post] this access : D [field b] : B | A.cs:105:17:105:29 | object creation of type D : D [field b] : B | +| A.cs:98:22:98:43 | ... ? ... : ... : B | A.cs:98:13:98:16 | [post] this access : D [field b] : B | +| A.cs:98:22:98:43 | ... ? ... : ... : B | A.cs:98:13:98:16 | [post] this access : D [field b] : B | +| A.cs:98:22:98:43 | ... ? ... : ... : B [field c] : C | A.cs:98:13:98:16 | [post] this access : D [field b, field c] : C | | A.cs:98:30:98:43 | call to method Source : B | A.cs:98:22:98:43 | ... ? ... : ... : B | | A.cs:104:17:104:30 | call to method Source : B | A.cs:105:23:105:23 | access to local variable b : B | -| A.cs:105:17:105:29 | object creation of type D [field b, field c] : C | A.cs:107:14:107:14 | access to local variable d [field b, field c] : C | -| A.cs:105:17:105:29 | object creation of type D [field b] : B | A.cs:106:14:106:14 | access to local variable d [field b] : B | -| A.cs:105:23:105:23 | [post] access to local variable b [field c] : C | A.cs:108:14:108:14 | access to local variable b [field c] : C | +| A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | +| A.cs:105:17:105:29 | object creation of type D : D [field b] : B | A.cs:106:14:106:14 | access to local variable d : D [field b] : B | +| A.cs:105:23:105:23 | [post] access to local variable b : B [field c] : C | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | | A.cs:105:23:105:23 | access to local variable b : B | A.cs:95:20:95:20 | b : B | -| A.cs:105:23:105:23 | access to local variable b : B | A.cs:105:17:105:29 | object creation of type D [field b] : B | -| A.cs:106:14:106:14 | access to local variable d [field b] : B | A.cs:106:14:106:16 | access to field b | -| A.cs:107:14:107:14 | access to local variable d [field b, field c] : C | A.cs:107:14:107:16 | access to field b [field c] : C | -| A.cs:107:14:107:16 | access to field b [field c] : C | A.cs:107:14:107:18 | access to field c | -| A.cs:108:14:108:14 | access to local variable b [field c] : C | A.cs:108:14:108:16 | access to field c | +| A.cs:105:23:105:23 | access to local variable b : B | A.cs:105:17:105:29 | object creation of type D : D [field b] : B | +| A.cs:106:14:106:14 | access to local variable d : D [field b] : B | A.cs:106:14:106:16 | access to field b | +| A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | A.cs:107:14:107:16 | access to field b : B [field c] : C | +| A.cs:107:14:107:16 | access to field b : B [field c] : C | A.cs:107:14:107:18 | access to field c | +| A.cs:108:14:108:14 | access to local variable b : B [field c] : C | A.cs:108:14:108:16 | access to field c | | A.cs:113:17:113:29 | call to method Source : B | A.cs:114:29:114:29 | access to local variable b : B | -| A.cs:114:18:114:54 | object creation of type MyList [field head] : B | A.cs:115:35:115:36 | access to local variable l1 [field head] : B | -| A.cs:114:29:114:29 | access to local variable b : B | A.cs:114:18:114:54 | object creation of type MyList [field head] : B | +| A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | +| A.cs:114:29:114:29 | access to local variable b : B | A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | | A.cs:114:29:114:29 | access to local variable b : B | A.cs:157:25:157:28 | head : B | -| A.cs:115:18:115:37 | object creation of type MyList [field next, field head] : B | A.cs:116:35:116:36 | access to local variable l2 [field next, field head] : B | -| A.cs:115:35:115:36 | access to local variable l1 [field head] : B | A.cs:115:18:115:37 | object creation of type MyList [field next, field head] : B | -| A.cs:115:35:115:36 | access to local variable l1 [field head] : B | A.cs:157:38:157:41 | next [field head] : B | -| A.cs:116:18:116:37 | object creation of type MyList [field next, field next, field head] : B | A.cs:119:14:119:15 | access to local variable l3 [field next, field next, field head] : B | -| A.cs:116:18:116:37 | object creation of type MyList [field next, field next, field head] : B | A.cs:121:41:121:41 | access to local variable l [field next, field next, field head] : B | -| A.cs:116:35:116:36 | access to local variable l2 [field next, field head] : B | A.cs:116:18:116:37 | object creation of type MyList [field next, field next, field head] : B | -| A.cs:116:35:116:36 | access to local variable l2 [field next, field head] : B | A.cs:157:38:157:41 | next [field next, field head] : B | -| A.cs:119:14:119:15 | access to local variable l3 [field next, field next, field head] : B | A.cs:119:14:119:20 | access to field next [field next, field head] : B | -| A.cs:119:14:119:20 | access to field next [field next, field head] : B | A.cs:119:14:119:25 | access to field next [field head] : B | -| A.cs:119:14:119:25 | access to field next [field head] : B | A.cs:119:14:119:30 | access to field head | -| A.cs:121:41:121:41 | access to local variable l [field next, field head] : B | A.cs:121:41:121:46 | access to field next [field head] : B | -| A.cs:121:41:121:41 | access to local variable l [field next, field next, field head] : B | A.cs:121:41:121:46 | access to field next [field next, field head] : B | -| A.cs:121:41:121:46 | access to field next [field head] : B | A.cs:123:18:123:18 | access to local variable l [field head] : B | -| A.cs:121:41:121:46 | access to field next [field next, field head] : B | A.cs:121:41:121:41 | access to local variable l [field next, field head] : B | -| A.cs:123:18:123:18 | access to local variable l [field head] : B | A.cs:123:18:123:23 | access to field head | +| A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | +| A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | +| A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:157:38:157:41 | next : MyList [field head] : B | +| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | +| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | +| A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | +| A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | A.cs:157:38:157:41 | next : MyList [field next, field head] : B | +| A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | A.cs:119:14:119:20 | access to field next : MyList [field next, field head] : B | +| A.cs:119:14:119:20 | access to field next : MyList [field next, field head] : B | A.cs:119:14:119:25 | access to field next : MyList [field head] : B | +| A.cs:119:14:119:25 | access to field next : MyList [field head] : B | A.cs:119:14:119:30 | access to field head | +| A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | A.cs:121:41:121:46 | access to field next : MyList [field head] : B | +| A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | +| A.cs:121:41:121:46 | access to field next : MyList [field head] : B | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | +| A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | +| A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | A.cs:123:18:123:23 | access to field head | | A.cs:141:20:141:20 | c : C | A.cs:143:22:143:22 | access to parameter c : C | -| A.cs:143:22:143:22 | access to parameter c : C | A.cs:143:13:143:16 | [post] this access [field c] : C | +| A.cs:143:22:143:22 | access to parameter c : C | A.cs:143:13:143:16 | [post] this access : B [field c] : C | | A.cs:145:27:145:27 | c : C | A.cs:145:41:145:41 | access to parameter c : C | | A.cs:145:27:145:27 | c : C1 | A.cs:145:41:145:41 | access to parameter c : C1 | | A.cs:145:27:145:27 | c : C2 | A.cs:145:41:145:41 | access to parameter c : C2 | -| A.cs:145:41:145:41 | access to parameter c : C | A.cs:145:32:145:35 | [post] this access [field c] : C | -| A.cs:145:41:145:41 | access to parameter c : C1 | A.cs:145:32:145:35 | [post] this access [field c] : C1 | -| A.cs:145:41:145:41 | access to parameter c : C2 | A.cs:145:32:145:35 | [post] this access [field c] : C2 | -| A.cs:146:18:146:20 | this [field c] : C | A.cs:146:33:146:36 | this access [field c] : C | -| A.cs:146:18:146:20 | this [field c] : C1 | A.cs:146:33:146:36 | this access [field c] : C1 | -| A.cs:146:33:146:36 | this access [field c] : C | A.cs:146:33:146:38 | access to field c : C | -| A.cs:146:33:146:36 | this access [field c] : C1 | A.cs:146:33:146:38 | access to field c : C1 | +| A.cs:145:41:145:41 | access to parameter c : C | A.cs:145:32:145:35 | [post] this access : B [field c] : C | +| A.cs:145:41:145:41 | access to parameter c : C1 | A.cs:145:32:145:35 | [post] this access : B [field c] : C1 | +| A.cs:145:41:145:41 | access to parameter c : C2 | A.cs:145:32:145:35 | [post] this access : B [field c] : C2 | +| A.cs:146:18:146:20 | this : B [field c] : C | A.cs:146:33:146:36 | this access : B [field c] : C | +| A.cs:146:18:146:20 | this : B [field c] : C1 | A.cs:146:33:146:36 | this access : B [field c] : C1 | +| A.cs:146:33:146:36 | this access : B [field c] : C | A.cs:146:33:146:38 | access to field c : C | +| A.cs:146:33:146:36 | this access : B [field c] : C1 | A.cs:146:33:146:38 | access to field c : C1 | | A.cs:147:32:147:32 | c : C | A.cs:149:26:149:26 | access to parameter c : C | | A.cs:149:26:149:26 | access to parameter c : C | A.cs:141:20:141:20 | c : C | -| A.cs:149:26:149:26 | access to parameter c : C | A.cs:149:20:149:27 | object creation of type B [field c] : C | +| A.cs:149:26:149:26 | access to parameter c : C | A.cs:149:20:149:27 | object creation of type B : B [field c] : C | | A.cs:157:25:157:28 | head : B | A.cs:159:25:159:28 | access to parameter head : B | -| A.cs:157:38:157:41 | next [field head] : B | A.cs:160:25:160:28 | access to parameter next [field head] : B | -| A.cs:157:38:157:41 | next [field next, field head] : B | A.cs:160:25:160:28 | access to parameter next [field next, field head] : B | -| A.cs:159:25:159:28 | access to parameter head : B | A.cs:159:13:159:16 | [post] this access [field head] : B | -| A.cs:160:25:160:28 | access to parameter next [field head] : B | A.cs:160:13:160:16 | [post] this access [field next, field head] : B | -| A.cs:160:25:160:28 | access to parameter next [field next, field head] : B | A.cs:160:13:160:16 | [post] this access [field next, field next, field head] : B | +| A.cs:157:38:157:41 | next : MyList [field head] : B | A.cs:160:25:160:28 | access to parameter next : MyList [field head] : B | +| A.cs:157:38:157:41 | next : MyList [field next, field head] : B | A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | +| A.cs:159:25:159:28 | access to parameter head : B | A.cs:159:13:159:16 | [post] this access : MyList [field head] : B | +| A.cs:160:25:160:28 | access to parameter next : MyList [field head] : B | A.cs:160:13:160:16 | [post] this access : MyList [field next, field head] : B | +| A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | A.cs:160:13:160:16 | [post] this access : MyList [field next, field next, field head] : B | | B.cs:5:17:5:31 | call to method Source : Elem | B.cs:6:27:6:27 | access to local variable e : Elem | -| B.cs:6:18:6:34 | object creation of type Box1 [field elem1] : Elem | B.cs:7:27:7:28 | access to local variable b1 [field elem1] : Elem | -| B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:6:18:6:34 | object creation of type Box1 [field elem1] : Elem | +| B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | +| B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | | B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:29:26:29:27 | e1 : Elem | -| B.cs:7:18:7:29 | object creation of type Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:15 | access to local variable b2 [field box1, field elem1] : Elem | -| B.cs:7:27:7:28 | access to local variable b1 [field elem1] : Elem | B.cs:7:18:7:29 | object creation of type Box2 [field box1, field elem1] : Elem | -| B.cs:7:27:7:28 | access to local variable b1 [field elem1] : Elem | B.cs:39:26:39:27 | b1 [field elem1] : Elem | -| B.cs:8:14:8:15 | access to local variable b2 [field box1, field elem1] : Elem | B.cs:8:14:8:20 | access to field box1 [field elem1] : Elem | -| B.cs:8:14:8:20 | access to field box1 [field elem1] : Elem | B.cs:8:14:8:26 | access to field elem1 | +| B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | +| B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | +| B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:39:26:39:27 | b1 : Box1 [field elem1] : Elem | +| B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | +| B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | B.cs:8:14:8:26 | access to field elem1 | | B.cs:14:17:14:31 | call to method Source : Elem | B.cs:15:33:15:33 | access to local variable e : Elem | -| B.cs:15:18:15:34 | object creation of type Box1 [field elem2] : Elem | B.cs:16:27:16:28 | access to local variable b1 [field elem2] : Elem | -| B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:15:18:15:34 | object creation of type Box1 [field elem2] : Elem | +| B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | +| B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | | B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:29:35:29:36 | e2 : Elem | -| B.cs:16:18:16:29 | object creation of type Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:15 | access to local variable b2 [field box1, field elem2] : Elem | -| B.cs:16:27:16:28 | access to local variable b1 [field elem2] : Elem | B.cs:16:18:16:29 | object creation of type Box2 [field box1, field elem2] : Elem | -| B.cs:16:27:16:28 | access to local variable b1 [field elem2] : Elem | B.cs:39:26:39:27 | b1 [field elem2] : Elem | -| B.cs:18:14:18:15 | access to local variable b2 [field box1, field elem2] : Elem | B.cs:18:14:18:20 | access to field box1 [field elem2] : Elem | -| B.cs:18:14:18:20 | access to field box1 [field elem2] : Elem | B.cs:18:14:18:26 | access to field elem2 | +| B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | +| B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | +| B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:39:26:39:27 | b1 : Box1 [field elem2] : Elem | +| B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:20 | access to field box1 : Box1 [field elem2] : Elem | +| B.cs:18:14:18:20 | access to field box1 : Box1 [field elem2] : Elem | B.cs:18:14:18:26 | access to field elem2 | | B.cs:29:26:29:27 | e1 : Elem | B.cs:31:26:31:27 | access to parameter e1 : Elem | | B.cs:29:35:29:36 | e2 : Elem | B.cs:32:26:32:27 | access to parameter e2 : Elem | -| B.cs:31:26:31:27 | access to parameter e1 : Elem | B.cs:31:13:31:16 | [post] this access [field elem1] : Elem | -| B.cs:32:26:32:27 | access to parameter e2 : Elem | B.cs:32:13:32:16 | [post] this access [field elem2] : Elem | -| B.cs:39:26:39:27 | b1 [field elem1] : Elem | B.cs:41:25:41:26 | access to parameter b1 [field elem1] : Elem | -| B.cs:39:26:39:27 | b1 [field elem2] : Elem | B.cs:41:25:41:26 | access to parameter b1 [field elem2] : Elem | -| B.cs:41:25:41:26 | access to parameter b1 [field elem1] : Elem | B.cs:41:13:41:16 | [post] this access [field box1, field elem1] : Elem | -| B.cs:41:25:41:26 | access to parameter b1 [field elem2] : Elem | B.cs:41:13:41:16 | [post] this access [field box1, field elem2] : Elem | -| C.cs:3:18:3:19 | [post] this access [field s1] : Elem | C.cs:12:15:12:21 | object creation of type C [field s1] : Elem | -| C.cs:3:23:3:37 | call to method Source : Elem | C.cs:3:18:3:19 | [post] this access [field s1] : Elem | -| C.cs:4:27:4:28 | [post] this access [field s2] : Elem | C.cs:12:15:12:21 | object creation of type C [field s2] : Elem | -| C.cs:4:32:4:46 | call to method Source : Elem | C.cs:4:27:4:28 | [post] this access [field s2] : Elem | +| B.cs:31:26:31:27 | access to parameter e1 : Elem | B.cs:31:13:31:16 | [post] this access : Box1 [field elem1] : Elem | +| B.cs:32:26:32:27 | access to parameter e2 : Elem | B.cs:32:13:32:16 | [post] this access : Box1 [field elem2] : Elem | +| B.cs:39:26:39:27 | b1 : Box1 [field elem1] : Elem | B.cs:41:25:41:26 | access to parameter b1 : Box1 [field elem1] : Elem | +| B.cs:39:26:39:27 | b1 : Box1 [field elem2] : Elem | B.cs:41:25:41:26 | access to parameter b1 : Box1 [field elem2] : Elem | +| B.cs:41:25:41:26 | access to parameter b1 : Box1 [field elem1] : Elem | B.cs:41:13:41:16 | [post] this access : Box2 [field box1, field elem1] : Elem | +| B.cs:41:25:41:26 | access to parameter b1 : Box1 [field elem2] : Elem | B.cs:41:13:41:16 | [post] this access : Box2 [field box1, field elem2] : Elem | +| C.cs:3:18:3:19 | [post] this access : C [field s1] : Elem | C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | +| C.cs:3:23:3:37 | call to method Source : Elem | C.cs:3:18:3:19 | [post] this access : C [field s1] : Elem | +| C.cs:4:27:4:28 | [post] this access : C [field s2] : Elem | C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | +| C.cs:4:32:4:46 | call to method Source : Elem | C.cs:4:27:4:28 | [post] this access : C [field s2] : Elem | | C.cs:6:30:6:44 | call to method Source : Elem | C.cs:26:14:26:15 | access to field s4 | -| C.cs:7:18:7:19 | [post] this access [property s5] : Elem | C.cs:12:15:12:21 | object creation of type C [property s5] : Elem | -| C.cs:7:37:7:51 | call to method Source : Elem | C.cs:7:18:7:19 | [post] this access [property s5] : Elem | +| C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | +| C.cs:7:37:7:51 | call to method Source : Elem | C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | | C.cs:8:30:8:44 | call to method Source : Elem | C.cs:28:14:28:15 | access to property s6 | -| C.cs:12:15:12:21 | object creation of type C [field s1] : Elem | C.cs:13:9:13:9 | access to local variable c [field s1] : Elem | -| C.cs:12:15:12:21 | object creation of type C [field s2] : Elem | C.cs:13:9:13:9 | access to local variable c [field s2] : Elem | -| C.cs:12:15:12:21 | object creation of type C [field s3] : Elem | C.cs:13:9:13:9 | access to local variable c [field s3] : Elem | -| C.cs:12:15:12:21 | object creation of type C [property s5] : Elem | C.cs:13:9:13:9 | access to local variable c [property s5] : Elem | -| C.cs:13:9:13:9 | access to local variable c [field s1] : Elem | C.cs:21:17:21:18 | this [field s1] : Elem | -| C.cs:13:9:13:9 | access to local variable c [field s2] : Elem | C.cs:21:17:21:18 | this [field s2] : Elem | -| C.cs:13:9:13:9 | access to local variable c [field s3] : Elem | C.cs:21:17:21:18 | this [field s3] : Elem | -| C.cs:13:9:13:9 | access to local variable c [property s5] : Elem | C.cs:21:17:21:18 | this [property s5] : Elem | -| C.cs:18:9:18:12 | [post] this access [field s3] : Elem | C.cs:12:15:12:21 | object creation of type C [field s3] : Elem | -| C.cs:18:19:18:33 | call to method Source : Elem | C.cs:18:9:18:12 | [post] this access [field s3] : Elem | -| C.cs:21:17:21:18 | this [field s1] : Elem | C.cs:23:14:23:15 | this access [field s1] : Elem | -| C.cs:21:17:21:18 | this [field s2] : Elem | C.cs:24:14:24:15 | this access [field s2] : Elem | -| C.cs:21:17:21:18 | this [field s3] : Elem | C.cs:25:14:25:15 | this access [field s3] : Elem | -| C.cs:21:17:21:18 | this [property s5] : Elem | C.cs:27:14:27:15 | this access [property s5] : Elem | -| C.cs:23:14:23:15 | this access [field s1] : Elem | C.cs:23:14:23:15 | access to field s1 | -| C.cs:24:14:24:15 | this access [field s2] : Elem | C.cs:24:14:24:15 | access to field s2 | -| C.cs:25:14:25:15 | this access [field s3] : Elem | C.cs:25:14:25:15 | access to field s3 | -| C.cs:27:14:27:15 | this access [property s5] : Elem | C.cs:27:14:27:15 | access to property s5 | -| C_ctor.cs:3:18:3:19 | [post] this access [field s1] : Elem | C_ctor.cs:7:23:7:37 | object creation of type C_no_ctor [field s1] : Elem | -| C_ctor.cs:3:23:3:42 | call to method Source : Elem | C_ctor.cs:3:18:3:19 | [post] this access [field s1] : Elem | -| C_ctor.cs:7:23:7:37 | object creation of type C_no_ctor [field s1] : Elem | C_ctor.cs:8:9:8:9 | access to local variable c [field s1] : Elem | -| C_ctor.cs:8:9:8:9 | access to local variable c [field s1] : Elem | C_ctor.cs:11:17:11:18 | this [field s1] : Elem | -| C_ctor.cs:11:17:11:18 | this [field s1] : Elem | C_ctor.cs:13:19:13:20 | this access [field s1] : Elem | -| C_ctor.cs:13:19:13:20 | this access [field s1] : Elem | C_ctor.cs:13:19:13:20 | access to field s1 | -| C_ctor.cs:19:18:19:19 | [post] this access [field s1] : Elem | C_ctor.cs:23:25:23:41 | object creation of type C_with_ctor [field s1] : Elem | -| C_ctor.cs:19:23:19:42 | call to method Source : Elem | C_ctor.cs:19:18:19:19 | [post] this access [field s1] : Elem | -| C_ctor.cs:23:25:23:41 | object creation of type C_with_ctor [field s1] : Elem | C_ctor.cs:24:9:24:9 | access to local variable c [field s1] : Elem | -| C_ctor.cs:24:9:24:9 | access to local variable c [field s1] : Elem | C_ctor.cs:29:17:29:18 | this [field s1] : Elem | -| C_ctor.cs:29:17:29:18 | this [field s1] : Elem | C_ctor.cs:31:19:31:20 | this access [field s1] : Elem | -| C_ctor.cs:31:19:31:20 | this access [field s1] : Elem | C_ctor.cs:31:19:31:20 | access to field s1 | -| D.cs:8:9:8:11 | this [field trivialPropField] : Object | D.cs:8:22:8:25 | this access [field trivialPropField] : Object | -| D.cs:8:22:8:25 | this access [field trivialPropField] : Object | D.cs:8:22:8:42 | access to field trivialPropField : Object | +| C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | +| C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | +| C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | +| C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | +| C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | C.cs:21:17:21:18 | this : C [field s1] : Elem | +| C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | C.cs:21:17:21:18 | this : C [field s2] : Elem | +| C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | C.cs:21:17:21:18 | this : C [field s3] : Elem | +| C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | C.cs:21:17:21:18 | this : C [property s5] : Elem | +| C.cs:18:9:18:12 | [post] this access : C [field s3] : Elem | C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | +| C.cs:18:19:18:33 | call to method Source : Elem | C.cs:18:9:18:12 | [post] this access : C [field s3] : Elem | +| C.cs:21:17:21:18 | this : C [field s1] : Elem | C.cs:23:14:23:15 | this access : C [field s1] : Elem | +| C.cs:21:17:21:18 | this : C [field s2] : Elem | C.cs:24:14:24:15 | this access : C [field s2] : Elem | +| C.cs:21:17:21:18 | this : C [field s3] : Elem | C.cs:25:14:25:15 | this access : C [field s3] : Elem | +| C.cs:21:17:21:18 | this : C [property s5] : Elem | C.cs:27:14:27:15 | this access : C [property s5] : Elem | +| C.cs:23:14:23:15 | this access : C [field s1] : Elem | C.cs:23:14:23:15 | access to field s1 | +| C.cs:24:14:24:15 | this access : C [field s2] : Elem | C.cs:24:14:24:15 | access to field s2 | +| C.cs:25:14:25:15 | this access : C [field s3] : Elem | C.cs:25:14:25:15 | access to field s3 | +| C.cs:27:14:27:15 | this access : C [property s5] : Elem | C.cs:27:14:27:15 | access to property s5 | +| C_ctor.cs:3:18:3:19 | [post] this access : C_no_ctor [field s1] : Elem | C_ctor.cs:7:23:7:37 | object creation of type C_no_ctor : C_no_ctor [field s1] : Elem | +| C_ctor.cs:3:23:3:42 | call to method Source : Elem | C_ctor.cs:3:18:3:19 | [post] this access : C_no_ctor [field s1] : Elem | +| C_ctor.cs:7:23:7:37 | object creation of type C_no_ctor : C_no_ctor [field s1] : Elem | C_ctor.cs:8:9:8:9 | access to local variable c : C_no_ctor [field s1] : Elem | +| C_ctor.cs:8:9:8:9 | access to local variable c : C_no_ctor [field s1] : Elem | C_ctor.cs:11:17:11:18 | this : C_no_ctor [field s1] : Elem | +| C_ctor.cs:11:17:11:18 | this : C_no_ctor [field s1] : Elem | C_ctor.cs:13:19:13:20 | this access : C_no_ctor [field s1] : Elem | +| C_ctor.cs:13:19:13:20 | this access : C_no_ctor [field s1] : Elem | C_ctor.cs:13:19:13:20 | access to field s1 | +| C_ctor.cs:19:18:19:19 | [post] this access : C_with_ctor [field s1] : Elem | C_ctor.cs:23:25:23:41 | object creation of type C_with_ctor : C_with_ctor [field s1] : Elem | +| C_ctor.cs:19:23:19:42 | call to method Source : Elem | C_ctor.cs:19:18:19:19 | [post] this access : C_with_ctor [field s1] : Elem | +| C_ctor.cs:23:25:23:41 | object creation of type C_with_ctor : C_with_ctor [field s1] : Elem | C_ctor.cs:24:9:24:9 | access to local variable c : C_with_ctor [field s1] : Elem | +| C_ctor.cs:24:9:24:9 | access to local variable c : C_with_ctor [field s1] : Elem | C_ctor.cs:29:17:29:18 | this : C_with_ctor [field s1] : Elem | +| C_ctor.cs:29:17:29:18 | this : C_with_ctor [field s1] : Elem | C_ctor.cs:31:19:31:20 | this access : C_with_ctor [field s1] : Elem | +| C_ctor.cs:31:19:31:20 | this access : C_with_ctor [field s1] : Elem | C_ctor.cs:31:19:31:20 | access to field s1 | +| D.cs:8:9:8:11 | this : D [field trivialPropField] : Object | D.cs:8:22:8:25 | this access : D [field trivialPropField] : Object | +| D.cs:8:22:8:25 | this access : D [field trivialPropField] : Object | D.cs:8:22:8:42 | access to field trivialPropField : Object | | D.cs:9:9:9:11 | value : Object | D.cs:9:39:9:43 | access to parameter value : Object | -| D.cs:9:39:9:43 | access to parameter value : Object | D.cs:9:15:9:18 | [post] this access [field trivialPropField] : Object | -| D.cs:14:9:14:11 | this [field trivialPropField] : Object | D.cs:14:22:14:25 | this access [field trivialPropField] : Object | -| D.cs:14:22:14:25 | this access [field trivialPropField] : Object | D.cs:14:22:14:42 | access to field trivialPropField : Object | +| D.cs:9:39:9:43 | access to parameter value : Object | D.cs:9:15:9:18 | [post] this access : D [field trivialPropField] : Object | +| D.cs:14:9:14:11 | this : D [field trivialPropField] : Object | D.cs:14:22:14:25 | this access : D [field trivialPropField] : Object | +| D.cs:14:22:14:25 | this access : D [field trivialPropField] : Object | D.cs:14:22:14:42 | access to field trivialPropField : Object | | D.cs:15:9:15:11 | value : Object | D.cs:15:34:15:38 | access to parameter value : Object | | D.cs:15:34:15:38 | access to parameter value : Object | D.cs:9:9:9:11 | value : Object | -| D.cs:15:34:15:38 | access to parameter value : Object | D.cs:15:15:15:18 | [post] this access [field trivialPropField] : Object | +| D.cs:15:34:15:38 | access to parameter value : Object | D.cs:15:15:15:18 | [post] this access : D [field trivialPropField] : Object | | D.cs:18:28:18:29 | o1 : Object | D.cs:21:24:21:25 | access to parameter o1 : Object | | D.cs:18:39:18:40 | o2 : Object | D.cs:22:27:22:28 | access to parameter o2 : Object | | D.cs:18:50:18:51 | o3 : Object | D.cs:23:27:23:28 | access to parameter o3 : Object | -| D.cs:21:9:21:11 | [post] access to local variable ret [property AutoProp] : Object | D.cs:24:16:24:18 | access to local variable ret [property AutoProp] : Object | -| D.cs:21:24:21:25 | access to parameter o1 : Object | D.cs:21:9:21:11 | [post] access to local variable ret [property AutoProp] : Object | -| D.cs:22:9:22:11 | [post] access to local variable ret [field trivialPropField] : Object | D.cs:24:16:24:18 | access to local variable ret [field trivialPropField] : Object | +| D.cs:21:9:21:11 | [post] access to local variable ret : D [property AutoProp] : Object | D.cs:24:16:24:18 | access to local variable ret : D [property AutoProp] : Object | +| D.cs:21:24:21:25 | access to parameter o1 : Object | D.cs:21:9:21:11 | [post] access to local variable ret : D [property AutoProp] : Object | +| D.cs:22:9:22:11 | [post] access to local variable ret : D [field trivialPropField] : Object | D.cs:24:16:24:18 | access to local variable ret : D [field trivialPropField] : Object | | D.cs:22:27:22:28 | access to parameter o2 : Object | D.cs:9:9:9:11 | value : Object | -| D.cs:22:27:22:28 | access to parameter o2 : Object | D.cs:22:9:22:11 | [post] access to local variable ret [field trivialPropField] : Object | -| D.cs:23:9:23:11 | [post] access to local variable ret [field trivialPropField] : Object | D.cs:24:16:24:18 | access to local variable ret [field trivialPropField] : Object | +| D.cs:22:27:22:28 | access to parameter o2 : Object | D.cs:22:9:22:11 | [post] access to local variable ret : D [field trivialPropField] : Object | +| D.cs:23:9:23:11 | [post] access to local variable ret : D [field trivialPropField] : Object | D.cs:24:16:24:18 | access to local variable ret : D [field trivialPropField] : Object | | D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:15:9:15:11 | value : Object | -| D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:23:9:23:11 | [post] access to local variable ret [field trivialPropField] : Object | +| D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:23:9:23:11 | [post] access to local variable ret : D [field trivialPropField] : Object | | D.cs:29:17:29:33 | call to method Source : Object | D.cs:31:24:31:24 | access to local variable o : Object | -| D.cs:31:17:31:37 | call to method Create [property AutoProp] : Object | D.cs:32:14:32:14 | access to local variable d [property AutoProp] : Object | +| D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | | D.cs:31:24:31:24 | access to local variable o : Object | D.cs:18:28:18:29 | o1 : Object | -| D.cs:31:24:31:24 | access to local variable o : Object | D.cs:31:17:31:37 | call to method Create [property AutoProp] : Object | -| D.cs:32:14:32:14 | access to local variable d [property AutoProp] : Object | D.cs:32:14:32:23 | access to property AutoProp | -| D.cs:37:13:37:49 | call to method Create [field trivialPropField] : Object | D.cs:39:14:39:14 | access to local variable d [field trivialPropField] : Object | -| D.cs:37:13:37:49 | call to method Create [field trivialPropField] : Object | D.cs:40:14:40:14 | access to local variable d [field trivialPropField] : Object | -| D.cs:37:13:37:49 | call to method Create [field trivialPropField] : Object | D.cs:41:14:41:14 | access to local variable d [field trivialPropField] : Object | +| D.cs:31:24:31:24 | access to local variable o : Object | D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | +| D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | D.cs:32:14:32:23 | access to property AutoProp | +| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | +| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | +| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | | D.cs:37:26:37:42 | call to method Source : Object | D.cs:18:39:18:40 | o2 : Object | -| D.cs:37:26:37:42 | call to method Source : Object | D.cs:37:13:37:49 | call to method Create [field trivialPropField] : Object | -| D.cs:39:14:39:14 | access to local variable d [field trivialPropField] : Object | D.cs:8:9:8:11 | this [field trivialPropField] : Object | -| D.cs:39:14:39:14 | access to local variable d [field trivialPropField] : Object | D.cs:39:14:39:26 | access to property TrivialProp | -| D.cs:40:14:40:14 | access to local variable d [field trivialPropField] : Object | D.cs:40:14:40:31 | access to field trivialPropField | -| D.cs:41:14:41:14 | access to local variable d [field trivialPropField] : Object | D.cs:14:9:14:11 | this [field trivialPropField] : Object | -| D.cs:41:14:41:14 | access to local variable d [field trivialPropField] : Object | D.cs:41:14:41:26 | access to property ComplexProp | -| D.cs:43:13:43:49 | call to method Create [field trivialPropField] : Object | D.cs:45:14:45:14 | access to local variable d [field trivialPropField] : Object | -| D.cs:43:13:43:49 | call to method Create [field trivialPropField] : Object | D.cs:46:14:46:14 | access to local variable d [field trivialPropField] : Object | -| D.cs:43:13:43:49 | call to method Create [field trivialPropField] : Object | D.cs:47:14:47:14 | access to local variable d [field trivialPropField] : Object | +| D.cs:37:26:37:42 | call to method Source : Object | D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | +| D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:8:9:8:11 | this : D [field trivialPropField] : Object | +| D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:39:14:39:26 | access to property TrivialProp | +| D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:40:14:40:31 | access to field trivialPropField | +| D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:14:9:14:11 | this : D [field trivialPropField] : Object | +| D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:41:14:41:26 | access to property ComplexProp | +| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | +| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | +| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | | D.cs:43:32:43:48 | call to method Source : Object | D.cs:18:50:18:51 | o3 : Object | -| D.cs:43:32:43:48 | call to method Source : Object | D.cs:43:13:43:49 | call to method Create [field trivialPropField] : Object | -| D.cs:45:14:45:14 | access to local variable d [field trivialPropField] : Object | D.cs:8:9:8:11 | this [field trivialPropField] : Object | -| D.cs:45:14:45:14 | access to local variable d [field trivialPropField] : Object | D.cs:45:14:45:26 | access to property TrivialProp | -| D.cs:46:14:46:14 | access to local variable d [field trivialPropField] : Object | D.cs:46:14:46:31 | access to field trivialPropField | -| D.cs:47:14:47:14 | access to local variable d [field trivialPropField] : Object | D.cs:14:9:14:11 | this [field trivialPropField] : Object | -| D.cs:47:14:47:14 | access to local variable d [field trivialPropField] : Object | D.cs:47:14:47:26 | access to property ComplexProp | +| D.cs:43:32:43:48 | call to method Source : Object | D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | +| D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:8:9:8:11 | this : D [field trivialPropField] : Object | +| D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:45:14:45:26 | access to property TrivialProp | +| D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:46:14:46:31 | access to field trivialPropField | +| D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:14:9:14:11 | this : D [field trivialPropField] : Object | +| D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:47:14:47:26 | access to property ComplexProp | | E.cs:8:29:8:29 | o : Object | E.cs:11:21:11:21 | access to parameter o : Object | -| E.cs:11:9:11:11 | [post] access to local variable ret [field Field] : Object | E.cs:12:16:12:18 | access to local variable ret [field Field] : Object | -| E.cs:11:21:11:21 | access to parameter o : Object | E.cs:11:9:11:11 | [post] access to local variable ret [field Field] : Object | +| E.cs:11:9:11:11 | [post] access to local variable ret : S [field Field] : Object | E.cs:12:16:12:18 | access to local variable ret : S [field Field] : Object | +| E.cs:11:21:11:21 | access to parameter o : Object | E.cs:11:9:11:11 | [post] access to local variable ret : S [field Field] : Object | | E.cs:22:17:22:33 | call to method Source : Object | E.cs:23:25:23:25 | access to local variable o : Object | -| E.cs:23:17:23:26 | call to method CreateS [field Field] : Object | E.cs:24:14:24:14 | access to local variable s [field Field] : Object | +| E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | | E.cs:23:25:23:25 | access to local variable o : Object | E.cs:8:29:8:29 | o : Object | -| E.cs:23:25:23:25 | access to local variable o : Object | E.cs:23:17:23:26 | call to method CreateS [field Field] : Object | -| E.cs:24:14:24:14 | access to local variable s [field Field] : Object | E.cs:24:14:24:20 | access to field Field | +| E.cs:23:25:23:25 | access to local variable o : Object | E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | +| E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | E.cs:24:14:24:20 | access to field Field | | F.cs:6:28:6:29 | o1 : Object | F.cs:6:65:6:66 | access to parameter o1 : Object | | F.cs:6:39:6:40 | o2 : Object | F.cs:6:78:6:79 | access to parameter o2 : Object | -| F.cs:6:54:6:81 | { ..., ... } [field Field1] : Object | F.cs:6:46:6:81 | object creation of type F [field Field1] : Object | -| F.cs:6:54:6:81 | { ..., ... } [field Field2] : Object | F.cs:6:46:6:81 | object creation of type F [field Field2] : Object | -| F.cs:6:65:6:66 | access to parameter o1 : Object | F.cs:6:54:6:81 | { ..., ... } [field Field1] : Object | -| F.cs:6:78:6:79 | access to parameter o2 : Object | F.cs:6:54:6:81 | { ..., ... } [field Field2] : Object | +| F.cs:6:54:6:81 | { ..., ... } : F [field Field1] : Object | F.cs:6:46:6:81 | object creation of type F : F [field Field1] : Object | +| F.cs:6:54:6:81 | { ..., ... } : F [field Field2] : Object | F.cs:6:46:6:81 | object creation of type F : F [field Field2] : Object | +| F.cs:6:65:6:66 | access to parameter o1 : Object | F.cs:6:54:6:81 | { ..., ... } : F [field Field1] : Object | +| F.cs:6:78:6:79 | access to parameter o2 : Object | F.cs:6:54:6:81 | { ..., ... } : F [field Field2] : Object | | F.cs:10:17:10:33 | call to method Source : Object | F.cs:11:24:11:24 | access to local variable o : Object | -| F.cs:11:17:11:31 | call to method Create [field Field1] : Object | F.cs:12:14:12:14 | access to local variable f [field Field1] : Object | +| F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | | F.cs:11:24:11:24 | access to local variable o : Object | F.cs:6:28:6:29 | o1 : Object | -| F.cs:11:24:11:24 | access to local variable o : Object | F.cs:11:17:11:31 | call to method Create [field Field1] : Object | -| F.cs:12:14:12:14 | access to local variable f [field Field1] : Object | F.cs:12:14:12:21 | access to field Field1 | -| F.cs:15:13:15:43 | call to method Create [field Field2] : Object | F.cs:17:14:17:14 | access to local variable f [field Field2] : Object | +| F.cs:11:24:11:24 | access to local variable o : Object | F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | +| F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | F.cs:12:14:12:21 | access to field Field1 | +| F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | | F.cs:15:26:15:42 | call to method Source : Object | F.cs:6:39:6:40 | o2 : Object | -| F.cs:15:26:15:42 | call to method Source : Object | F.cs:15:13:15:43 | call to method Create [field Field2] : Object | -| F.cs:17:14:17:14 | access to local variable f [field Field2] : Object | F.cs:17:14:17:21 | access to field Field2 | -| F.cs:19:21:19:50 | { ..., ... } [field Field1] : Object | F.cs:20:14:20:14 | access to local variable f [field Field1] : Object | -| F.cs:19:32:19:48 | call to method Source : Object | F.cs:19:21:19:50 | { ..., ... } [field Field1] : Object | -| F.cs:20:14:20:14 | access to local variable f [field Field1] : Object | F.cs:20:14:20:21 | access to field Field1 | -| F.cs:23:21:23:50 | { ..., ... } [field Field2] : Object | F.cs:25:14:25:14 | access to local variable f [field Field2] : Object | -| F.cs:23:32:23:48 | call to method Source : Object | F.cs:23:21:23:50 | { ..., ... } [field Field2] : Object | -| F.cs:25:14:25:14 | access to local variable f [field Field2] : Object | F.cs:25:14:25:21 | access to field Field2 | +| F.cs:15:26:15:42 | call to method Source : Object | F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | +| F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | F.cs:17:14:17:21 | access to field Field2 | +| F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | +| F.cs:19:32:19:48 | call to method Source : Object | F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | +| F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | F.cs:20:14:20:21 | access to field Field1 | +| F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | +| F.cs:23:32:23:48 | call to method Source : Object | F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | +| F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | F.cs:25:14:25:21 | access to field Field2 | | F.cs:30:17:30:33 | call to method Source : Object | F.cs:32:27:32:27 | access to local variable o : Object | -| F.cs:32:17:32:40 | { ..., ... } [property X] : Object | F.cs:33:14:33:14 | access to local variable a [property X] : Object | -| F.cs:32:27:32:27 | access to local variable o : Object | F.cs:32:17:32:40 | { ..., ... } [property X] : Object | -| F.cs:33:14:33:14 | access to local variable a [property X] : Object | F.cs:33:14:33:16 | access to property X | +| F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | +| F.cs:32:27:32:27 | access to local variable o : Object | F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | +| F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | F.cs:33:14:33:16 | access to property X | | G.cs:7:18:7:32 | call to method Source : Elem | G.cs:9:23:9:23 | access to local variable e : Elem | -| G.cs:9:9:9:9 | [post] access to local variable b [field Box1, field Elem] : Elem | G.cs:10:18:10:18 | access to local variable b [field Box1, field Elem] : Elem | -| G.cs:9:9:9:14 | [post] access to field Box1 [field Elem] : Elem | G.cs:9:9:9:9 | [post] access to local variable b [field Box1, field Elem] : Elem | -| G.cs:9:23:9:23 | access to local variable e : Elem | G.cs:9:9:9:14 | [post] access to field Box1 [field Elem] : Elem | -| G.cs:10:18:10:18 | access to local variable b [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 [field Box1, field Elem] : Elem | +| G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:9:9:9:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:9:23:9:23 | access to local variable e : Elem | G.cs:9:9:9:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | +| G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | | G.cs:15:18:15:32 | call to method Source : Elem | G.cs:17:24:17:24 | access to local variable e : Elem | -| G.cs:17:9:17:9 | [post] access to local variable b [field Box1, field Elem] : Elem | G.cs:18:18:18:18 | access to local variable b [field Box1, field Elem] : Elem | -| G.cs:17:9:17:14 | [post] access to field Box1 [field Elem] : Elem | G.cs:17:9:17:9 | [post] access to local variable b [field Box1, field Elem] : Elem | -| G.cs:17:24:17:24 | access to local variable e : Elem | G.cs:17:9:17:14 | [post] access to field Box1 [field Elem] : Elem | +| G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:17:9:17:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:17:24:17:24 | access to local variable e : Elem | G.cs:17:9:17:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | | G.cs:17:24:17:24 | access to local variable e : Elem | G.cs:64:34:64:34 | e : Elem | -| G.cs:18:18:18:18 | access to local variable b [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 [field Box1, field Elem] : Elem | +| G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | | G.cs:23:18:23:32 | call to method Source : Elem | G.cs:25:28:25:28 | access to local variable e : Elem | -| G.cs:25:9:25:9 | [post] access to local variable b [field Box1, field Elem] : Elem | G.cs:26:18:26:18 | access to local variable b [field Box1, field Elem] : Elem | -| G.cs:25:9:25:19 | [post] call to method GetBox1 [field Elem] : Elem | G.cs:25:9:25:9 | [post] access to local variable b [field Box1, field Elem] : Elem | -| G.cs:25:28:25:28 | access to local variable e : Elem | G.cs:25:9:25:19 | [post] call to method GetBox1 [field Elem] : Elem | -| G.cs:26:18:26:18 | access to local variable b [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 [field Box1, field Elem] : Elem | +| G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:25:9:25:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:25:28:25:28 | access to local variable e : Elem | G.cs:25:9:25:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | +| G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | | G.cs:31:18:31:32 | call to method Source : Elem | G.cs:33:29:33:29 | access to local variable e : Elem | -| G.cs:33:9:33:9 | [post] access to local variable b [field Box1, field Elem] : Elem | G.cs:34:18:34:18 | access to local variable b [field Box1, field Elem] : Elem | -| G.cs:33:9:33:19 | [post] call to method GetBox1 [field Elem] : Elem | G.cs:33:9:33:9 | [post] access to local variable b [field Box1, field Elem] : Elem | -| G.cs:33:29:33:29 | access to local variable e : Elem | G.cs:33:9:33:19 | [post] call to method GetBox1 [field Elem] : Elem | +| G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:34:18:34:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:33:9:33:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:33:29:33:29 | access to local variable e : Elem | G.cs:33:9:33:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | | G.cs:33:29:33:29 | access to local variable e : Elem | G.cs:64:34:64:34 | e : Elem | -| G.cs:34:18:34:18 | access to local variable b [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 [field Box1, field Elem] : Elem | -| G.cs:37:38:37:39 | b2 [field Box1, field Elem] : Elem | G.cs:39:14:39:15 | access to parameter b2 [field Box1, field Elem] : Elem | -| G.cs:39:14:39:15 | access to parameter b2 [field Box1, field Elem] : Elem | G.cs:39:14:39:25 | call to method GetBox1 [field Elem] : Elem | -| G.cs:39:14:39:15 | access to parameter b2 [field Box1, field Elem] : Elem | G.cs:71:21:71:27 | this [field Box1, field Elem] : Elem | -| G.cs:39:14:39:25 | call to method GetBox1 [field Elem] : Elem | G.cs:39:14:39:35 | call to method GetElem | -| G.cs:39:14:39:25 | call to method GetBox1 [field Elem] : Elem | G.cs:63:21:63:27 | this [field Elem] : Elem | +| G.cs:34:18:34:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | +| G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | G.cs:39:14:39:15 | access to parameter b2 : Box2 [field Box1, field Elem] : Elem | +| G.cs:39:14:39:15 | access to parameter b2 : Box2 [field Box1, field Elem] : Elem | G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | +| G.cs:39:14:39:15 | access to parameter b2 : Box2 [field Box1, field Elem] : Elem | G.cs:71:21:71:27 | this : Box2 [field Box1, field Elem] : Elem | +| G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:39:14:39:35 | call to method GetElem | +| G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:63:21:63:27 | this : Box1 [field Elem] : Elem | | G.cs:44:18:44:32 | call to method Source : Elem | G.cs:46:30:46:30 | access to local variable e : Elem | -| G.cs:46:9:46:16 | [post] access to field boxfield [field Box1, field Elem] : Elem | G.cs:46:9:46:16 | [post] this access [field boxfield, field Box1, field Elem] : Elem | -| G.cs:46:9:46:16 | [post] this access [field boxfield, field Box1, field Elem] : Elem | G.cs:47:9:47:13 | this access [field boxfield, field Box1, field Elem] : Elem | -| G.cs:46:9:46:21 | [post] access to field Box1 [field Elem] : Elem | G.cs:46:9:46:16 | [post] access to field boxfield [field Box1, field Elem] : Elem | -| G.cs:46:30:46:30 | access to local variable e : Elem | G.cs:46:9:46:21 | [post] access to field Box1 [field Elem] : Elem | -| G.cs:47:9:47:13 | this access [field boxfield, field Box1, field Elem] : Elem | G.cs:50:18:50:20 | this [field boxfield, field Box1, field Elem] : Elem | -| G.cs:50:18:50:20 | this [field boxfield, field Box1, field Elem] : Elem | G.cs:52:14:52:21 | this access [field boxfield, field Box1, field Elem] : Elem | -| G.cs:52:14:52:21 | access to field boxfield [field Box1, field Elem] : Elem | G.cs:52:14:52:26 | access to field Box1 [field Elem] : Elem | -| G.cs:52:14:52:21 | this access [field boxfield, field Box1, field Elem] : Elem | G.cs:52:14:52:21 | access to field boxfield [field Box1, field Elem] : Elem | -| G.cs:52:14:52:26 | access to field Box1 [field Elem] : Elem | G.cs:52:14:52:31 | access to field Elem | -| G.cs:63:21:63:27 | this [field Elem] : Elem | G.cs:63:34:63:37 | this access [field Elem] : Elem | -| G.cs:63:34:63:37 | this access [field Elem] : Elem | G.cs:63:34:63:37 | access to field Elem : Elem | +| G.cs:46:9:46:16 | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | G.cs:46:9:46:16 | [post] this access : G [field boxfield, field Box1, field Elem] : Elem | +| G.cs:46:9:46:16 | [post] this access : G [field boxfield, field Box1, field Elem] : Elem | G.cs:47:9:47:13 | this access : G [field boxfield, field Box1, field Elem] : Elem | +| G.cs:46:9:46:21 | [post] access to field Box1 : Box1 [field Elem] : Elem | G.cs:46:9:46:16 | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | +| G.cs:46:30:46:30 | access to local variable e : Elem | G.cs:46:9:46:21 | [post] access to field Box1 : Box1 [field Elem] : Elem | +| G.cs:47:9:47:13 | this access : G [field boxfield, field Box1, field Elem] : Elem | G.cs:50:18:50:20 | this : G [field boxfield, field Box1, field Elem] : Elem | +| G.cs:50:18:50:20 | this : G [field boxfield, field Box1, field Elem] : Elem | G.cs:52:14:52:21 | this access : G [field boxfield, field Box1, field Elem] : Elem | +| G.cs:52:14:52:21 | access to field boxfield : Box2 [field Box1, field Elem] : Elem | G.cs:52:14:52:26 | access to field Box1 : Box1 [field Elem] : Elem | +| G.cs:52:14:52:21 | this access : G [field boxfield, field Box1, field Elem] : Elem | G.cs:52:14:52:21 | access to field boxfield : Box2 [field Box1, field Elem] : Elem | +| G.cs:52:14:52:26 | access to field Box1 : Box1 [field Elem] : Elem | G.cs:52:14:52:31 | access to field Elem | +| G.cs:63:21:63:27 | this : Box1 [field Elem] : Elem | G.cs:63:34:63:37 | this access : Box1 [field Elem] : Elem | +| G.cs:63:34:63:37 | this access : Box1 [field Elem] : Elem | G.cs:63:34:63:37 | access to field Elem : Elem | | G.cs:64:34:64:34 | e : Elem | G.cs:64:46:64:46 | access to parameter e : Elem | -| G.cs:64:46:64:46 | access to parameter e : Elem | G.cs:64:39:64:42 | [post] this access [field Elem] : Elem | -| G.cs:71:21:71:27 | this [field Box1, field Elem] : Elem | G.cs:71:34:71:37 | this access [field Box1, field Elem] : Elem | -| G.cs:71:34:71:37 | this access [field Box1, field Elem] : Elem | G.cs:71:34:71:37 | access to field Box1 [field Elem] : Elem | -| H.cs:13:15:13:15 | a [field FieldA] : Object | H.cs:16:22:16:22 | access to parameter a [field FieldA] : Object | -| H.cs:16:9:16:11 | [post] access to local variable ret [field FieldA] : Object | H.cs:17:16:17:18 | access to local variable ret [field FieldA] : Object | -| H.cs:16:22:16:22 | access to parameter a [field FieldA] : Object | H.cs:16:22:16:29 | access to field FieldA : Object | -| H.cs:16:22:16:29 | access to field FieldA : Object | H.cs:16:9:16:11 | [post] access to local variable ret [field FieldA] : Object | -| H.cs:23:9:23:9 | [post] access to local variable a [field FieldA] : Object | H.cs:24:27:24:27 | access to local variable a [field FieldA] : Object | -| H.cs:23:20:23:36 | call to method Source : Object | H.cs:23:9:23:9 | [post] access to local variable a [field FieldA] : Object | -| H.cs:24:21:24:28 | call to method Clone [field FieldA] : Object | H.cs:25:14:25:18 | access to local variable clone [field FieldA] : Object | -| H.cs:24:27:24:27 | access to local variable a [field FieldA] : Object | H.cs:13:15:13:15 | a [field FieldA] : Object | -| H.cs:24:27:24:27 | access to local variable a [field FieldA] : Object | H.cs:24:21:24:28 | call to method Clone [field FieldA] : Object | -| H.cs:25:14:25:18 | access to local variable clone [field FieldA] : Object | H.cs:25:14:25:25 | access to field FieldA | -| H.cs:33:19:33:19 | a [field FieldA] : A | H.cs:36:20:36:20 | access to parameter a [field FieldA] : A | -| H.cs:33:19:33:19 | a [field FieldA] : Object | H.cs:36:20:36:20 | access to parameter a [field FieldA] : Object | -| H.cs:36:9:36:9 | [post] access to local variable b [field FieldB] : A | H.cs:37:16:37:16 | access to local variable b [field FieldB] : A | -| H.cs:36:9:36:9 | [post] access to local variable b [field FieldB] : Object | H.cs:37:16:37:16 | access to local variable b [field FieldB] : Object | -| H.cs:36:20:36:20 | access to parameter a [field FieldA] : A | H.cs:36:20:36:27 | access to field FieldA : A | -| H.cs:36:20:36:20 | access to parameter a [field FieldA] : Object | H.cs:36:20:36:27 | access to field FieldA : Object | -| H.cs:36:20:36:27 | access to field FieldA : A | H.cs:36:9:36:9 | [post] access to local variable b [field FieldB] : A | -| H.cs:36:20:36:27 | access to field FieldA : Object | H.cs:36:9:36:9 | [post] access to local variable b [field FieldB] : Object | -| H.cs:43:9:43:9 | [post] access to local variable a [field FieldA] : Object | H.cs:44:27:44:27 | access to local variable a [field FieldA] : Object | -| H.cs:43:20:43:36 | call to method Source : Object | H.cs:43:9:43:9 | [post] access to local variable a [field FieldA] : Object | -| H.cs:44:17:44:28 | call to method Transform [field FieldB] : Object | H.cs:45:14:45:14 | access to local variable b [field FieldB] : Object | -| H.cs:44:27:44:27 | access to local variable a [field FieldA] : Object | H.cs:33:19:33:19 | a [field FieldA] : Object | -| H.cs:44:27:44:27 | access to local variable a [field FieldA] : Object | H.cs:44:17:44:28 | call to method Transform [field FieldB] : Object | -| H.cs:45:14:45:14 | access to local variable b [field FieldB] : Object | H.cs:45:14:45:21 | access to field FieldB | -| H.cs:53:25:53:25 | a [field FieldA] : Object | H.cs:55:21:55:21 | access to parameter a [field FieldA] : Object | -| H.cs:55:21:55:21 | access to parameter a [field FieldA] : Object | H.cs:55:21:55:28 | access to field FieldA : Object | -| H.cs:55:21:55:28 | access to field FieldA : Object | H.cs:55:9:55:10 | [post] access to parameter b1 [field FieldB] : Object | -| H.cs:63:9:63:9 | [post] access to local variable a [field FieldA] : Object | H.cs:64:22:64:22 | access to local variable a [field FieldA] : Object | -| H.cs:63:20:63:36 | call to method Source : Object | H.cs:63:9:63:9 | [post] access to local variable a [field FieldA] : Object | -| H.cs:64:22:64:22 | access to local variable a [field FieldA] : Object | H.cs:53:25:53:25 | a [field FieldA] : Object | -| H.cs:64:22:64:22 | access to local variable a [field FieldA] : Object | H.cs:64:25:64:26 | [post] access to local variable b1 [field FieldB] : Object | -| H.cs:64:25:64:26 | [post] access to local variable b1 [field FieldB] : Object | H.cs:65:14:65:15 | access to local variable b1 [field FieldB] : Object | -| H.cs:65:14:65:15 | access to local variable b1 [field FieldB] : Object | H.cs:65:14:65:22 | access to field FieldB | +| G.cs:64:46:64:46 | access to parameter e : Elem | G.cs:64:39:64:42 | [post] this access : Box1 [field Elem] : Elem | +| G.cs:71:21:71:27 | this : Box2 [field Box1, field Elem] : Elem | G.cs:71:34:71:37 | this access : Box2 [field Box1, field Elem] : Elem | +| G.cs:71:34:71:37 | this access : Box2 [field Box1, field Elem] : Elem | G.cs:71:34:71:37 | access to field Box1 : Box1 [field Elem] : Elem | +| H.cs:13:15:13:15 | a : A [field FieldA] : Object | H.cs:16:22:16:22 | access to parameter a : A [field FieldA] : Object | +| H.cs:16:9:16:11 | [post] access to local variable ret : A [field FieldA] : Object | H.cs:17:16:17:18 | access to local variable ret : A [field FieldA] : Object | +| H.cs:16:22:16:22 | access to parameter a : A [field FieldA] : Object | H.cs:16:22:16:29 | access to field FieldA : Object | +| H.cs:16:22:16:29 | access to field FieldA : Object | H.cs:16:9:16:11 | [post] access to local variable ret : A [field FieldA] : Object | +| H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | +| H.cs:23:20:23:36 | call to method Source : Object | H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | +| H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | +| H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | H.cs:13:15:13:15 | a : A [field FieldA] : Object | +| H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | +| H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | H.cs:25:14:25:25 | access to field FieldA | +| H.cs:33:19:33:19 | a : A [field FieldA] : A | H.cs:36:20:36:20 | access to parameter a : A [field FieldA] : A | +| H.cs:33:19:33:19 | a : A [field FieldA] : Object | H.cs:36:20:36:20 | access to parameter a : A [field FieldA] : Object | +| H.cs:36:9:36:9 | [post] access to local variable b : B [field FieldB] : A | H.cs:37:16:37:16 | access to local variable b : B [field FieldB] : A | +| H.cs:36:9:36:9 | [post] access to local variable b : B [field FieldB] : Object | H.cs:37:16:37:16 | access to local variable b : B [field FieldB] : Object | +| H.cs:36:20:36:20 | access to parameter a : A [field FieldA] : A | H.cs:36:20:36:27 | access to field FieldA : A | +| H.cs:36:20:36:20 | access to parameter a : A [field FieldA] : Object | H.cs:36:20:36:27 | access to field FieldA : Object | +| H.cs:36:20:36:27 | access to field FieldA : A | H.cs:36:9:36:9 | [post] access to local variable b : B [field FieldB] : A | +| H.cs:36:20:36:27 | access to field FieldA : Object | H.cs:36:9:36:9 | [post] access to local variable b : B [field FieldB] : Object | +| H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | +| H.cs:43:20:43:36 | call to method Source : Object | H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | +| H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | +| H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | +| H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | +| H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | H.cs:45:14:45:21 | access to field FieldB | +| H.cs:53:25:53:25 | a : A [field FieldA] : Object | H.cs:55:21:55:21 | access to parameter a : A [field FieldA] : Object | +| H.cs:55:21:55:21 | access to parameter a : A [field FieldA] : Object | H.cs:55:21:55:28 | access to field FieldA : Object | +| H.cs:55:21:55:28 | access to field FieldA : Object | H.cs:55:9:55:10 | [post] access to parameter b1 : B [field FieldB] : Object | +| H.cs:63:9:63:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:64:22:64:22 | access to local variable a : A [field FieldA] : Object | +| H.cs:63:20:63:36 | call to method Source : Object | H.cs:63:9:63:9 | [post] access to local variable a : A [field FieldA] : Object | +| H.cs:64:22:64:22 | access to local variable a : A [field FieldA] : Object | H.cs:53:25:53:25 | a : A [field FieldA] : Object | +| H.cs:64:22:64:22 | access to local variable a : A [field FieldA] : Object | H.cs:64:25:64:26 | [post] access to local variable b1 : B [field FieldB] : Object | +| H.cs:64:25:64:26 | [post] access to local variable b1 : B [field FieldB] : Object | H.cs:65:14:65:15 | access to local variable b1 : B [field FieldB] : Object | +| H.cs:65:14:65:15 | access to local variable b1 : B [field FieldB] : Object | H.cs:65:14:65:22 | access to field FieldB | | H.cs:77:30:77:30 | o : Object | H.cs:79:20:79:20 | access to parameter o : Object | -| H.cs:79:9:79:9 | [post] access to parameter a [field FieldA] : Object | H.cs:80:22:80:22 | access to parameter a [field FieldA] : Object | -| H.cs:79:20:79:20 | access to parameter o : Object | H.cs:79:9:79:9 | [post] access to parameter a [field FieldA] : Object | -| H.cs:80:22:80:22 | access to parameter a [field FieldA] : Object | H.cs:53:25:53:25 | a [field FieldA] : Object | -| H.cs:80:22:80:22 | access to parameter a [field FieldA] : Object | H.cs:80:25:80:26 | [post] access to parameter b1 [field FieldB] : Object | -| H.cs:88:17:88:17 | [post] access to local variable a [field FieldA] : Object | H.cs:89:14:89:14 | access to local variable a [field FieldA] : Object | +| H.cs:79:9:79:9 | [post] access to parameter a : A [field FieldA] : Object | H.cs:80:22:80:22 | access to parameter a : A [field FieldA] : Object | +| H.cs:79:20:79:20 | access to parameter o : Object | H.cs:79:9:79:9 | [post] access to parameter a : A [field FieldA] : Object | +| H.cs:80:22:80:22 | access to parameter a : A [field FieldA] : Object | H.cs:53:25:53:25 | a : A [field FieldA] : Object | +| H.cs:80:22:80:22 | access to parameter a : A [field FieldA] : Object | H.cs:80:25:80:26 | [post] access to parameter b1 : B [field FieldB] : Object | +| H.cs:88:17:88:17 | [post] access to local variable a : A [field FieldA] : Object | H.cs:89:14:89:14 | access to local variable a : A [field FieldA] : Object | | H.cs:88:20:88:36 | call to method Source : Object | H.cs:77:30:77:30 | o : Object | -| H.cs:88:20:88:36 | call to method Source : Object | H.cs:88:17:88:17 | [post] access to local variable a [field FieldA] : Object | -| H.cs:88:20:88:36 | call to method Source : Object | H.cs:88:39:88:40 | [post] access to local variable b1 [field FieldB] : Object | -| H.cs:88:39:88:40 | [post] access to local variable b1 [field FieldB] : Object | H.cs:90:14:90:15 | access to local variable b1 [field FieldB] : Object | -| H.cs:89:14:89:14 | access to local variable a [field FieldA] : Object | H.cs:89:14:89:21 | access to field FieldA | -| H.cs:90:14:90:15 | access to local variable b1 [field FieldB] : Object | H.cs:90:14:90:22 | access to field FieldB | -| H.cs:102:23:102:23 | a [field FieldA] : Object | H.cs:105:23:105:23 | access to parameter a [field FieldA] : Object | -| H.cs:105:9:105:12 | [post] access to local variable temp [field FieldB, field FieldA] : Object | H.cs:106:29:106:32 | access to local variable temp [field FieldB, field FieldA] : Object | -| H.cs:105:23:105:23 | access to parameter a [field FieldA] : Object | H.cs:105:9:105:12 | [post] access to local variable temp [field FieldB, field FieldA] : Object | -| H.cs:106:26:106:39 | (...) ... [field FieldA] : Object | H.cs:33:19:33:19 | a [field FieldA] : Object | -| H.cs:106:26:106:39 | (...) ... [field FieldA] : Object | H.cs:106:16:106:40 | call to method Transform [field FieldB] : Object | -| H.cs:106:29:106:32 | access to local variable temp [field FieldB, field FieldA] : Object | H.cs:106:29:106:39 | access to field FieldB [field FieldA] : Object | -| H.cs:106:29:106:39 | access to field FieldB [field FieldA] : Object | H.cs:106:26:106:39 | (...) ... [field FieldA] : Object | -| H.cs:112:9:112:9 | [post] access to local variable a [field FieldA] : Object | H.cs:113:31:113:31 | access to local variable a [field FieldA] : Object | -| H.cs:112:20:112:36 | call to method Source : Object | H.cs:112:9:112:9 | [post] access to local variable a [field FieldA] : Object | -| H.cs:113:17:113:32 | call to method TransformWrap [field FieldB] : Object | H.cs:114:14:114:14 | access to local variable b [field FieldB] : Object | -| H.cs:113:31:113:31 | access to local variable a [field FieldA] : Object | H.cs:102:23:102:23 | a [field FieldA] : Object | -| H.cs:113:31:113:31 | access to local variable a [field FieldA] : Object | H.cs:113:17:113:32 | call to method TransformWrap [field FieldB] : Object | -| H.cs:114:14:114:14 | access to local variable b [field FieldB] : Object | H.cs:114:14:114:21 | access to field FieldB | -| H.cs:122:18:122:18 | a [field FieldA] : Object | H.cs:124:26:124:26 | access to parameter a [field FieldA] : Object | -| H.cs:124:16:124:27 | call to method Transform [field FieldB] : Object | H.cs:124:16:124:34 | access to field FieldB : Object | -| H.cs:124:26:124:26 | access to parameter a [field FieldA] : Object | H.cs:33:19:33:19 | a [field FieldA] : Object | -| H.cs:124:26:124:26 | access to parameter a [field FieldA] : Object | H.cs:124:16:124:27 | call to method Transform [field FieldB] : Object | -| H.cs:130:9:130:9 | [post] access to local variable a [field FieldA] : Object | H.cs:131:18:131:18 | access to local variable a [field FieldA] : Object | -| H.cs:130:20:130:36 | call to method Source : Object | H.cs:130:9:130:9 | [post] access to local variable a [field FieldA] : Object | -| H.cs:131:18:131:18 | access to local variable a [field FieldA] : Object | H.cs:122:18:122:18 | a [field FieldA] : Object | -| H.cs:131:18:131:18 | access to local variable a [field FieldA] : Object | H.cs:131:14:131:19 | call to method Get | +| H.cs:88:20:88:36 | call to method Source : Object | H.cs:88:17:88:17 | [post] access to local variable a : A [field FieldA] : Object | +| H.cs:88:20:88:36 | call to method Source : Object | H.cs:88:39:88:40 | [post] access to local variable b1 : B [field FieldB] : Object | +| H.cs:88:39:88:40 | [post] access to local variable b1 : B [field FieldB] : Object | H.cs:90:14:90:15 | access to local variable b1 : B [field FieldB] : Object | +| H.cs:89:14:89:14 | access to local variable a : A [field FieldA] : Object | H.cs:89:14:89:21 | access to field FieldA | +| H.cs:90:14:90:15 | access to local variable b1 : B [field FieldB] : Object | H.cs:90:14:90:22 | access to field FieldB | +| H.cs:102:23:102:23 | a : A [field FieldA] : Object | H.cs:105:23:105:23 | access to parameter a : A [field FieldA] : Object | +| H.cs:105:9:105:12 | [post] access to local variable temp : B [field FieldB, field FieldA] : Object | H.cs:106:29:106:32 | access to local variable temp : B [field FieldB, field FieldA] : Object | +| H.cs:105:23:105:23 | access to parameter a : A [field FieldA] : Object | H.cs:105:9:105:12 | [post] access to local variable temp : B [field FieldB, field FieldA] : Object | +| H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | +| H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | H.cs:106:16:106:40 | call to method Transform : B [field FieldB] : Object | +| H.cs:106:29:106:32 | access to local variable temp : B [field FieldB, field FieldA] : Object | H.cs:106:29:106:39 | access to field FieldB : A [field FieldA] : Object | +| H.cs:106:29:106:39 | access to field FieldB : A [field FieldA] : Object | H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | +| H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | +| H.cs:112:20:112:36 | call to method Source : Object | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | +| H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | +| H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | H.cs:102:23:102:23 | a : A [field FieldA] : Object | +| H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | +| H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | H.cs:114:14:114:21 | access to field FieldB | +| H.cs:122:18:122:18 | a : A [field FieldA] : Object | H.cs:124:26:124:26 | access to parameter a : A [field FieldA] : Object | +| H.cs:124:16:124:27 | call to method Transform : B [field FieldB] : Object | H.cs:124:16:124:34 | access to field FieldB : Object | +| H.cs:124:26:124:26 | access to parameter a : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | +| H.cs:124:26:124:26 | access to parameter a : A [field FieldA] : Object | H.cs:124:16:124:27 | call to method Transform : B [field FieldB] : Object | +| H.cs:130:9:130:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:131:18:131:18 | access to local variable a : A [field FieldA] : Object | +| H.cs:130:20:130:36 | call to method Source : Object | H.cs:130:9:130:9 | [post] access to local variable a : A [field FieldA] : Object | +| H.cs:131:18:131:18 | access to local variable a : A [field FieldA] : Object | H.cs:122:18:122:18 | a : A [field FieldA] : Object | +| H.cs:131:18:131:18 | access to local variable a : A [field FieldA] : Object | H.cs:131:14:131:19 | call to method Get | | H.cs:138:27:138:27 | o : A | H.cs:141:20:141:25 | ... as ... : A | -| H.cs:141:9:141:9 | [post] access to local variable a [field FieldA] : A | H.cs:142:26:142:26 | access to local variable a [field FieldA] : A | -| H.cs:141:20:141:25 | ... as ... : A | H.cs:141:9:141:9 | [post] access to local variable a [field FieldA] : A | -| H.cs:142:16:142:27 | call to method Transform [field FieldB] : A | H.cs:142:16:142:34 | access to field FieldB : A | -| H.cs:142:26:142:26 | access to local variable a [field FieldA] : A | H.cs:33:19:33:19 | a [field FieldA] : A | -| H.cs:142:26:142:26 | access to local variable a [field FieldA] : A | H.cs:142:16:142:27 | call to method Transform [field FieldB] : A | +| H.cs:141:9:141:9 | [post] access to local variable a : A [field FieldA] : A | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | +| H.cs:141:20:141:25 | ... as ... : A | H.cs:141:9:141:9 | [post] access to local variable a : A [field FieldA] : A | +| H.cs:142:16:142:27 | call to method Transform : B [field FieldB] : A | H.cs:142:16:142:34 | access to field FieldB : A | +| H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | H.cs:33:19:33:19 | a : A [field FieldA] : A | +| H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | H.cs:142:16:142:27 | call to method Transform : B [field FieldB] : A | | H.cs:147:17:147:39 | call to method Through : A | H.cs:148:14:148:14 | access to local variable a | | H.cs:147:25:147:38 | call to method Source : A | H.cs:138:27:138:27 | o : A | | H.cs:147:25:147:38 | call to method Source : A | H.cs:147:17:147:39 | call to method Through : A | | H.cs:153:32:153:32 | o : Object | H.cs:156:20:156:20 | access to parameter o : Object | | H.cs:155:17:155:30 | call to method Source : B | H.cs:156:9:156:9 | access to local variable b : B | -| H.cs:156:9:156:9 | [post] access to local variable b [field FieldB] : Object | H.cs:157:20:157:20 | access to local variable b [field FieldB] : Object | +| H.cs:156:9:156:9 | [post] access to local variable b : B [field FieldB] : Object | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | | H.cs:156:9:156:9 | access to local variable b : B | H.cs:157:20:157:20 | access to local variable b : B | -| H.cs:156:20:156:20 | access to parameter o : Object | H.cs:156:9:156:9 | [post] access to local variable b [field FieldB] : Object | -| H.cs:157:9:157:9 | [post] access to parameter a [field FieldA] : B | H.cs:164:19:164:19 | [post] access to local variable a [field FieldA] : B | -| H.cs:157:20:157:20 | access to local variable b : B | H.cs:157:9:157:9 | [post] access to parameter a [field FieldA] : B | -| H.cs:157:20:157:20 | access to local variable b [field FieldB] : Object | H.cs:157:9:157:9 | [post] access to parameter a [field FieldA, field FieldB] : Object | +| H.cs:156:20:156:20 | access to parameter o : Object | H.cs:156:9:156:9 | [post] access to local variable b : B [field FieldB] : Object | +| H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA] : B | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA] : B | +| H.cs:157:20:157:20 | access to local variable b : B | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA] : B | +| H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | | H.cs:163:17:163:35 | call to method Source : Object | H.cs:164:22:164:22 | access to local variable o : Object | -| H.cs:164:19:164:19 | [post] access to local variable a [field FieldA, field FieldB] : Object | H.cs:165:20:165:20 | access to local variable a [field FieldA, field FieldB] : Object | -| H.cs:164:19:164:19 | [post] access to local variable a [field FieldA] : B | H.cs:165:20:165:20 | access to local variable a [field FieldA] : B | +| H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | +| H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA] : B | H.cs:165:20:165:20 | access to local variable a : A [field FieldA] : B | | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:153:32:153:32 | o : Object | -| H.cs:164:22:164:22 | access to local variable o : Object | H.cs:164:19:164:19 | [post] access to local variable a [field FieldA, field FieldB] : Object | +| H.cs:164:22:164:22 | access to local variable o : Object | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | | H.cs:165:17:165:27 | (...) ... : B | H.cs:166:14:166:14 | access to local variable b | -| H.cs:165:17:165:27 | (...) ... [field FieldB] : Object | H.cs:167:14:167:14 | access to local variable b [field FieldB] : Object | -| H.cs:165:20:165:20 | access to local variable a [field FieldA, field FieldB] : Object | H.cs:165:20:165:27 | access to field FieldA [field FieldB] : Object | -| H.cs:165:20:165:20 | access to local variable a [field FieldA] : B | H.cs:165:20:165:27 | access to field FieldA : B | +| H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | +| H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | +| H.cs:165:20:165:20 | access to local variable a : A [field FieldA] : B | H.cs:165:20:165:27 | access to field FieldA : B | | H.cs:165:20:165:27 | access to field FieldA : B | H.cs:165:17:165:27 | (...) ... : B | -| H.cs:165:20:165:27 | access to field FieldA [field FieldB] : Object | H.cs:165:17:165:27 | (...) ... [field FieldB] : Object | -| H.cs:167:14:167:14 | access to local variable b [field FieldB] : Object | H.cs:167:14:167:21 | access to field FieldB | -| I.cs:7:9:7:14 | [post] this access [field Field1] : Object | I.cs:21:13:21:19 | object creation of type I [field Field1] : Object | -| I.cs:7:9:7:14 | [post] this access [field Field1] : Object | I.cs:26:13:26:37 | [pre-initializer] object creation of type I [field Field1] : Object | -| I.cs:7:18:7:34 | call to method Source : Object | I.cs:7:9:7:14 | [post] this access [field Field1] : Object | +| H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | +| H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | H.cs:167:14:167:21 | access to field FieldB | +| I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | +| I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | +| I.cs:7:18:7:34 | call to method Source : Object | I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | | I.cs:13:17:13:33 | call to method Source : Object | I.cs:15:20:15:20 | access to local variable o : Object | -| I.cs:15:9:15:9 | [post] access to local variable i [field Field1] : Object | I.cs:16:9:16:9 | access to local variable i [field Field1] : Object | -| I.cs:15:20:15:20 | access to local variable o : Object | I.cs:15:9:15:9 | [post] access to local variable i [field Field1] : Object | -| I.cs:16:9:16:9 | access to local variable i [field Field1] : Object | I.cs:17:9:17:9 | access to local variable i [field Field1] : Object | -| I.cs:17:9:17:9 | access to local variable i [field Field1] : Object | I.cs:18:14:18:14 | access to local variable i [field Field1] : Object | -| I.cs:18:14:18:14 | access to local variable i [field Field1] : Object | I.cs:18:14:18:21 | access to field Field1 | -| I.cs:21:13:21:19 | object creation of type I [field Field1] : Object | I.cs:22:9:22:9 | access to local variable i [field Field1] : Object | -| I.cs:22:9:22:9 | access to local variable i [field Field1] : Object | I.cs:23:14:23:14 | access to local variable i [field Field1] : Object | -| I.cs:23:14:23:14 | access to local variable i [field Field1] : Object | I.cs:23:14:23:21 | access to field Field1 | -| I.cs:26:13:26:37 | [pre-initializer] object creation of type I [field Field1] : Object | I.cs:27:14:27:14 | access to local variable i [field Field1] : Object | -| I.cs:27:14:27:14 | access to local variable i [field Field1] : Object | I.cs:27:14:27:21 | access to field Field1 | +| I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | I.cs:16:9:16:9 | access to local variable i : I [field Field1] : Object | +| I.cs:15:20:15:20 | access to local variable o : Object | I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | +| I.cs:16:9:16:9 | access to local variable i : I [field Field1] : Object | I.cs:17:9:17:9 | access to local variable i : I [field Field1] : Object | +| I.cs:17:9:17:9 | access to local variable i : I [field Field1] : Object | I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | +| I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | I.cs:18:14:18:21 | access to field Field1 | +| I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | +| I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | +| I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | I.cs:23:14:23:21 | access to field Field1 | +| I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | +| I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | I.cs:27:14:27:21 | access to field Field1 | | I.cs:31:13:31:29 | call to method Source : Object | I.cs:32:20:32:20 | access to local variable o : Object | -| I.cs:32:9:32:9 | [post] access to local variable i [field Field1] : Object | I.cs:33:9:33:9 | access to local variable i [field Field1] : Object | -| I.cs:32:20:32:20 | access to local variable o : Object | I.cs:32:9:32:9 | [post] access to local variable i [field Field1] : Object | -| I.cs:33:9:33:9 | access to local variable i [field Field1] : Object | I.cs:34:12:34:12 | access to local variable i [field Field1] : Object | -| I.cs:34:12:34:12 | access to local variable i [field Field1] : Object | I.cs:37:23:37:23 | i [field Field1] : Object | -| I.cs:37:23:37:23 | i [field Field1] : Object | I.cs:39:9:39:9 | access to parameter i [field Field1] : Object | -| I.cs:39:9:39:9 | access to parameter i [field Field1] : Object | I.cs:40:14:40:14 | access to parameter i [field Field1] : Object | -| I.cs:40:14:40:14 | access to parameter i [field Field1] : Object | I.cs:40:14:40:21 | access to field Field1 | +| I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | I.cs:33:9:33:9 | access to local variable i : I [field Field1] : Object | +| I.cs:32:20:32:20 | access to local variable o : Object | I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | +| I.cs:33:9:33:9 | access to local variable i : I [field Field1] : Object | I.cs:34:12:34:12 | access to local variable i : I [field Field1] : Object | +| I.cs:34:12:34:12 | access to local variable i : I [field Field1] : Object | I.cs:37:23:37:23 | i : I [field Field1] : Object | +| I.cs:37:23:37:23 | i : I [field Field1] : Object | I.cs:39:9:39:9 | access to parameter i : I [field Field1] : Object | +| I.cs:39:9:39:9 | access to parameter i : I [field Field1] : Object | I.cs:40:14:40:14 | access to parameter i : I [field Field1] : Object | +| I.cs:40:14:40:14 | access to parameter i : I [field Field1] : Object | I.cs:40:14:40:21 | access to field Field1 | | J.cs:14:26:14:30 | field : Object | J.cs:14:66:14:70 | access to parameter field : Object | | J.cs:14:40:14:43 | prop : Object | J.cs:14:73:14:76 | access to parameter prop : Object | -| J.cs:14:66:14:70 | access to parameter field : Object | J.cs:14:50:14:54 | [post] this access [field Field] : Object | -| J.cs:14:73:14:76 | access to parameter prop : Object | J.cs:14:57:14:60 | [post] this access [property Prop] : Object | +| J.cs:14:66:14:70 | access to parameter field : Object | J.cs:14:50:14:54 | [post] this access : Struct [field Field] : Object | +| J.cs:14:73:14:76 | access to parameter prop : Object | J.cs:14:57:14:60 | [post] this access : Struct [property Prop] : Object | | J.cs:21:17:21:33 | call to method Source : Object | J.cs:22:34:22:34 | access to local variable o : Object | -| J.cs:22:18:22:41 | object creation of type RecordClass [property Prop1] : Object | J.cs:23:14:23:15 | access to local variable r1 [property Prop1] : Object | -| J.cs:22:18:22:41 | object creation of type RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 [property Prop1] : Object | -| J.cs:22:18:22:41 | object creation of type RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 [property Prop1] : Object | -| J.cs:22:34:22:34 | access to local variable o : Object | J.cs:22:18:22:41 | object creation of type RecordClass [property Prop1] : Object | -| J.cs:23:14:23:15 | access to local variable r1 [property Prop1] : Object | J.cs:23:14:23:21 | access to property Prop1 | -| J.cs:27:14:27:15 | access to local variable r2 [property Prop1] : Object | J.cs:27:14:27:21 | access to property Prop1 | -| J.cs:30:18:30:54 | ... with { ... } [property Prop2] : Object | J.cs:32:14:32:15 | access to local variable r3 [property Prop2] : Object | -| J.cs:30:36:30:52 | call to method Source : Object | J.cs:30:18:30:54 | ... with { ... } [property Prop2] : Object | -| J.cs:31:14:31:15 | access to local variable r3 [property Prop1] : Object | J.cs:31:14:31:21 | access to property Prop1 | -| J.cs:32:14:32:15 | access to local variable r3 [property Prop2] : Object | J.cs:32:14:32:21 | access to property Prop2 | +| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | +| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | +| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | +| J.cs:22:34:22:34 | access to local variable o : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | +| J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:23:14:23:21 | access to property Prop1 | +| J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | J.cs:27:14:27:21 | access to property Prop1 | +| J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | +| J.cs:30:36:30:52 | call to method Source : Object | J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | +| J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | J.cs:31:14:31:21 | access to property Prop1 | +| J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | J.cs:32:14:32:21 | access to property Prop2 | | J.cs:41:17:41:33 | call to method Source : Object | J.cs:42:35:42:35 | access to local variable o : Object | -| J.cs:42:18:42:42 | object creation of type RecordStruct [property Prop1] : Object | J.cs:43:14:43:15 | access to local variable r1 [property Prop1] : Object | -| J.cs:42:18:42:42 | object creation of type RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 [property Prop1] : Object | -| J.cs:42:18:42:42 | object creation of type RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 [property Prop1] : Object | -| J.cs:42:35:42:35 | access to local variable o : Object | J.cs:42:18:42:42 | object creation of type RecordStruct [property Prop1] : Object | -| J.cs:43:14:43:15 | access to local variable r1 [property Prop1] : Object | J.cs:43:14:43:21 | access to property Prop1 | -| J.cs:47:14:47:15 | access to local variable r2 [property Prop1] : Object | J.cs:47:14:47:21 | access to property Prop1 | -| J.cs:50:18:50:54 | ... with { ... } [property Prop2] : Object | J.cs:52:14:52:15 | access to local variable r3 [property Prop2] : Object | -| J.cs:50:36:50:52 | call to method Source : Object | J.cs:50:18:50:54 | ... with { ... } [property Prop2] : Object | -| J.cs:51:14:51:15 | access to local variable r3 [property Prop1] : Object | J.cs:51:14:51:21 | access to property Prop1 | -| J.cs:52:14:52:15 | access to local variable r3 [property Prop2] : Object | J.cs:52:14:52:21 | access to property Prop2 | +| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | +| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | +| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | +| J.cs:42:35:42:35 | access to local variable o : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | +| J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:43:14:43:21 | access to property Prop1 | +| J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | J.cs:47:14:47:21 | access to property Prop1 | +| J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | +| J.cs:50:36:50:52 | call to method Source : Object | J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | +| J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | J.cs:51:14:51:21 | access to property Prop1 | +| J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | J.cs:52:14:52:21 | access to property Prop2 | | J.cs:61:17:61:33 | call to method Source : Object | J.cs:62:29:62:29 | access to local variable o : Object | -| J.cs:62:18:62:36 | object creation of type Struct [field Field] : Object | J.cs:65:14:65:15 | access to local variable s2 [field Field] : Object | -| J.cs:62:18:62:36 | object creation of type Struct [field Field] : Object | J.cs:69:14:69:15 | access to local variable s3 [field Field] : Object | +| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | +| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | -| J.cs:62:29:62:29 | access to local variable o : Object | J.cs:62:18:62:36 | object creation of type Struct [field Field] : Object | -| J.cs:65:14:65:15 | access to local variable s2 [field Field] : Object | J.cs:65:14:65:21 | access to field Field | -| J.cs:68:18:68:53 | ... with { ... } [property Prop] : Object | J.cs:70:14:70:15 | access to local variable s3 [property Prop] : Object | -| J.cs:68:35:68:51 | call to method Source : Object | J.cs:68:18:68:53 | ... with { ... } [property Prop] : Object | -| J.cs:69:14:69:15 | access to local variable s3 [field Field] : Object | J.cs:69:14:69:21 | access to field Field | -| J.cs:70:14:70:15 | access to local variable s3 [property Prop] : Object | J.cs:70:14:70:20 | access to property Prop | +| J.cs:62:29:62:29 | access to local variable o : Object | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | +| J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | J.cs:65:14:65:21 | access to field Field | +| J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | +| J.cs:68:35:68:51 | call to method Source : Object | J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | +| J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | J.cs:69:14:69:21 | access to field Field | +| J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | J.cs:70:14:70:20 | access to property Prop | | J.cs:79:17:79:33 | call to method Source : Object | J.cs:80:35:80:35 | access to local variable o : Object | -| J.cs:80:18:80:36 | object creation of type Struct [property Prop] : Object | J.cs:84:14:84:15 | access to local variable s2 [property Prop] : Object | -| J.cs:80:18:80:36 | object creation of type Struct [property Prop] : Object | J.cs:88:14:88:15 | access to local variable s3 [property Prop] : Object | +| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | +| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:14:40:14:43 | prop : Object | -| J.cs:80:35:80:35 | access to local variable o : Object | J.cs:80:18:80:36 | object creation of type Struct [property Prop] : Object | -| J.cs:84:14:84:15 | access to local variable s2 [property Prop] : Object | J.cs:84:14:84:20 | access to property Prop | -| J.cs:86:18:86:54 | ... with { ... } [field Field] : Object | J.cs:87:14:87:15 | access to local variable s3 [field Field] : Object | -| J.cs:86:36:86:52 | call to method Source : Object | J.cs:86:18:86:54 | ... with { ... } [field Field] : Object | -| J.cs:87:14:87:15 | access to local variable s3 [field Field] : Object | J.cs:87:14:87:21 | access to field Field | -| J.cs:88:14:88:15 | access to local variable s3 [property Prop] : Object | J.cs:88:14:88:20 | access to property Prop | +| J.cs:80:35:80:35 | access to local variable o : Object | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | +| J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | J.cs:84:14:84:20 | access to property Prop | +| J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | +| J.cs:86:36:86:52 | call to method Source : Object | J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | +| J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | J.cs:87:14:87:21 | access to field Field | +| J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | J.cs:88:14:88:20 | access to property Prop | | J.cs:97:17:97:33 | call to method Source : Object | J.cs:99:28:99:28 | access to local variable o : Object | -| J.cs:99:18:99:41 | { ..., ... } [property X] : Object | J.cs:102:14:102:15 | access to local variable a2 [property X] : Object | -| J.cs:99:18:99:41 | { ..., ... } [property X] : Object | J.cs:106:14:106:15 | access to local variable a3 [property X] : Object | -| J.cs:99:28:99:28 | access to local variable o : Object | J.cs:99:18:99:41 | { ..., ... } [property X] : Object | -| J.cs:102:14:102:15 | access to local variable a2 [property X] : Object | J.cs:102:14:102:17 | access to property X | -| J.cs:105:18:105:50 | ... with { ... } [property Y] : Object | J.cs:107:14:107:15 | access to local variable a3 [property Y] : Object | -| J.cs:105:32:105:48 | call to method Source : Object | J.cs:105:18:105:50 | ... with { ... } [property Y] : Object | -| J.cs:106:14:106:15 | access to local variable a3 [property X] : Object | J.cs:106:14:106:17 | access to property X | -| J.cs:107:14:107:15 | access to local variable a3 [property Y] : Object | J.cs:107:14:107:17 | access to property Y | -| J.cs:119:13:119:13 | [post] access to local variable a [element] : Int32 | J.cs:125:14:125:14 | access to local variable a [element] : Int32 | -| J.cs:119:20:119:34 | call to method Source : Int32 | J.cs:119:13:119:13 | [post] access to local variable a [element] : Int32 | -| J.cs:125:14:125:14 | access to local variable a [element] : Int32 | J.cs:125:14:125:17 | access to array element : Int32 | +| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | +| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | +| J.cs:99:28:99:28 | access to local variable o : Object | J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | +| J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | J.cs:102:14:102:17 | access to property X | +| J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | +| J.cs:105:32:105:48 | call to method Source : Object | J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | +| J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | J.cs:106:14:106:17 | access to property X | +| J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | J.cs:107:14:107:17 | access to property Y | +| J.cs:119:13:119:13 | [post] access to local variable a : Int32[] [element] : Int32 | J.cs:125:14:125:14 | access to local variable a : Int32[] [element] : Int32 | +| J.cs:119:20:119:34 | call to method Source : Int32 | J.cs:119:13:119:13 | [post] access to local variable a : Int32[] [element] : Int32 | +| J.cs:125:14:125:14 | access to local variable a : Int32[] [element] : Int32 | J.cs:125:14:125:17 | access to array element : Int32 | | J.cs:125:14:125:17 | access to array element : Int32 | J.cs:125:14:125:17 | (...) ... | nodes | A.cs:5:17:5:28 | call to method Source : C | semmle.label | call to method Source : C | -| A.cs:6:17:6:25 | call to method Make [field c] : C | semmle.label | call to method Make [field c] : C | +| A.cs:6:17:6:25 | call to method Make : B [field c] : C | semmle.label | call to method Make : B [field c] : C | | A.cs:6:24:6:24 | access to local variable c : C | semmle.label | access to local variable c : C | -| A.cs:7:14:7:14 | access to local variable b [field c] : C | semmle.label | access to local variable b [field c] : C | +| A.cs:7:14:7:14 | access to local variable b : B [field c] : C | semmle.label | access to local variable b : B [field c] : C | | A.cs:7:14:7:16 | access to field c | semmle.label | access to field c | -| A.cs:13:9:13:9 | [post] access to local variable b [field c] : C1 | semmle.label | [post] access to local variable b [field c] : C1 | +| A.cs:13:9:13:9 | [post] access to local variable b : B [field c] : C1 | semmle.label | [post] access to local variable b : B [field c] : C1 | | A.cs:13:15:13:29 | call to method Source : C1 | semmle.label | call to method Source : C1 | -| A.cs:14:14:14:14 | access to local variable b [field c] : C1 | semmle.label | access to local variable b [field c] : C1 | +| A.cs:14:14:14:14 | access to local variable b : B [field c] : C1 | semmle.label | access to local variable b : B [field c] : C1 | | A.cs:14:14:14:20 | call to method Get | semmle.label | call to method Get | | A.cs:15:14:15:42 | call to method Get | semmle.label | call to method Get | -| A.cs:15:15:15:35 | object creation of type B [field c] : C | semmle.label | object creation of type B [field c] : C | +| A.cs:15:15:15:35 | object creation of type B : B [field c] : C | semmle.label | object creation of type B : B [field c] : C | | A.cs:15:21:15:34 | call to method Source : C | semmle.label | call to method Source : C | -| A.cs:22:14:22:38 | call to method SetOnB [field c] : C2 | semmle.label | call to method SetOnB [field c] : C2 | +| A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | semmle.label | call to method SetOnB : B [field c] : C2 | | A.cs:22:25:22:37 | call to method Source : C2 | semmle.label | call to method Source : C2 | -| A.cs:24:14:24:15 | access to local variable b2 [field c] : C2 | semmle.label | access to local variable b2 [field c] : C2 | +| A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:24:14:24:17 | access to field c | semmle.label | access to field c | -| A.cs:31:14:31:42 | call to method SetOnBWrap [field c] : C2 | semmle.label | call to method SetOnBWrap [field c] : C2 | +| A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | semmle.label | call to method SetOnBWrap : B [field c] : C2 | | A.cs:31:29:31:41 | call to method Source : C2 | semmle.label | call to method Source : C2 | -| A.cs:33:14:33:15 | access to local variable b2 [field c] : C2 | semmle.label | access to local variable b2 [field c] : C2 | +| A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:33:14:33:17 | access to field c | semmle.label | access to field c | | A.cs:36:33:36:33 | c : C2 | semmle.label | c : C2 | -| A.cs:38:18:38:30 | call to method SetOnB [field c] : C2 | semmle.label | call to method SetOnB [field c] : C2 | +| A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | semmle.label | call to method SetOnB : B [field c] : C2 | | A.cs:38:29:38:29 | access to parameter c : C2 | semmle.label | access to parameter c : C2 | -| A.cs:39:16:39:28 | ... ? ... : ... [field c] : C2 | semmle.label | ... ? ... : ... [field c] : C2 | +| A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | semmle.label | ... ? ... : ... : B [field c] : C2 | | A.cs:42:29:42:29 | c : C2 | semmle.label | c : C2 | -| A.cs:47:13:47:14 | [post] access to local variable b2 [field c] : C2 | semmle.label | [post] access to local variable b2 [field c] : C2 | +| A.cs:47:13:47:14 | [post] access to local variable b2 : B [field c] : C2 | semmle.label | [post] access to local variable b2 : B [field c] : C2 | | A.cs:47:20:47:20 | access to parameter c : C2 | semmle.label | access to parameter c : C2 | -| A.cs:48:20:48:21 | access to local variable b2 [field c] : C2 | semmle.label | access to local variable b2 [field c] : C2 | +| A.cs:48:20:48:21 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:55:17:55:28 | call to method Source : A | semmle.label | call to method Source : A | -| A.cs:57:9:57:10 | [post] access to local variable c1 [field a] : A | semmle.label | [post] access to local variable c1 [field a] : A | +| A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | semmle.label | [post] access to local variable c1 : C1 [field a] : A | | A.cs:57:16:57:16 | access to local variable a : A | semmle.label | access to local variable a : A | -| A.cs:58:12:58:13 | access to local variable c1 [field a] : A | semmle.label | access to local variable c1 [field a] : A | -| A.cs:60:22:60:22 | c [field a] : A | semmle.label | c [field a] : A | +| A.cs:58:12:58:13 | access to local variable c1 : C1 [field a] : A | semmle.label | access to local variable c1 : C1 [field a] : A | +| A.cs:60:22:60:22 | c : C1 [field a] : A | semmle.label | c : C1 [field a] : A | | A.cs:64:18:64:26 | access to field a | semmle.label | access to field a | -| A.cs:64:19:64:23 | (...) ... [field a] : A | semmle.label | (...) ... [field a] : A | -| A.cs:83:9:83:9 | [post] access to parameter b [field c] : C | semmle.label | [post] access to parameter b [field c] : C | +| A.cs:64:19:64:23 | (...) ... : C1 [field a] : A | semmle.label | (...) ... : C1 [field a] : A | +| A.cs:83:9:83:9 | [post] access to parameter b : B [field c] : C | semmle.label | [post] access to parameter b : B [field c] : C | | A.cs:83:15:83:26 | call to method Source : C | semmle.label | call to method Source : C | -| A.cs:88:12:88:12 | [post] access to local variable b [field c] : C | semmle.label | [post] access to local variable b [field c] : C | -| A.cs:89:14:89:14 | access to local variable b [field c] : C | semmle.label | access to local variable b [field c] : C | +| A.cs:88:12:88:12 | [post] access to local variable b : B [field c] : C | semmle.label | [post] access to local variable b : B [field c] : C | +| A.cs:89:14:89:14 | access to local variable b : B [field c] : C | semmle.label | access to local variable b : B [field c] : C | | A.cs:89:14:89:16 | access to field c | semmle.label | access to field c | | A.cs:95:20:95:20 | b : B | semmle.label | b : B | -| A.cs:97:13:97:13 | [post] access to parameter b [field c] : C | semmle.label | [post] access to parameter b [field c] : C | +| A.cs:97:13:97:13 | [post] access to parameter b : B [field c] : C | semmle.label | [post] access to parameter b : B [field c] : C | | A.cs:97:13:97:13 | access to parameter b : B | semmle.label | access to parameter b : B | | A.cs:97:19:97:32 | call to method Source : C | semmle.label | call to method Source : C | -| A.cs:98:13:98:16 | [post] this access [field b, field c] : C | semmle.label | [post] this access [field b, field c] : C | -| A.cs:98:13:98:16 | [post] this access [field b] : B | semmle.label | [post] this access [field b] : B | -| A.cs:98:13:98:16 | [post] this access [field b] : B | semmle.label | [post] this access [field b] : B | +| A.cs:98:13:98:16 | [post] this access : D [field b, field c] : C | semmle.label | [post] this access : D [field b, field c] : C | +| A.cs:98:13:98:16 | [post] this access : D [field b] : B | semmle.label | [post] this access : D [field b] : B | +| A.cs:98:13:98:16 | [post] this access : D [field b] : B | semmle.label | [post] this access : D [field b] : B | | A.cs:98:22:98:43 | ... ? ... : ... : B | semmle.label | ... ? ... : ... : B | | A.cs:98:22:98:43 | ... ? ... : ... : B | semmle.label | ... ? ... : ... : B | -| A.cs:98:22:98:43 | ... ? ... : ... [field c] : C | semmle.label | ... ? ... : ... [field c] : C | +| A.cs:98:22:98:43 | ... ? ... : ... : B [field c] : C | semmle.label | ... ? ... : ... : B [field c] : C | | A.cs:98:30:98:43 | call to method Source : B | semmle.label | call to method Source : B | | A.cs:104:17:104:30 | call to method Source : B | semmle.label | call to method Source : B | -| A.cs:105:17:105:29 | object creation of type D [field b, field c] : C | semmle.label | object creation of type D [field b, field c] : C | -| A.cs:105:17:105:29 | object creation of type D [field b] : B | semmle.label | object creation of type D [field b] : B | -| A.cs:105:23:105:23 | [post] access to local variable b [field c] : C | semmle.label | [post] access to local variable b [field c] : C | +| A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | semmle.label | object creation of type D : D [field b, field c] : C | +| A.cs:105:17:105:29 | object creation of type D : D [field b] : B | semmle.label | object creation of type D : D [field b] : B | +| A.cs:105:23:105:23 | [post] access to local variable b : B [field c] : C | semmle.label | [post] access to local variable b : B [field c] : C | | A.cs:105:23:105:23 | access to local variable b : B | semmle.label | access to local variable b : B | -| A.cs:106:14:106:14 | access to local variable d [field b] : B | semmle.label | access to local variable d [field b] : B | +| A.cs:106:14:106:14 | access to local variable d : D [field b] : B | semmle.label | access to local variable d : D [field b] : B | | A.cs:106:14:106:16 | access to field b | semmle.label | access to field b | -| A.cs:107:14:107:14 | access to local variable d [field b, field c] : C | semmle.label | access to local variable d [field b, field c] : C | -| A.cs:107:14:107:16 | access to field b [field c] : C | semmle.label | access to field b [field c] : C | +| A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | semmle.label | access to local variable d : D [field b, field c] : C | +| A.cs:107:14:107:16 | access to field b : B [field c] : C | semmle.label | access to field b : B [field c] : C | | A.cs:107:14:107:18 | access to field c | semmle.label | access to field c | -| A.cs:108:14:108:14 | access to local variable b [field c] : C | semmle.label | access to local variable b [field c] : C | +| A.cs:108:14:108:14 | access to local variable b : B [field c] : C | semmle.label | access to local variable b : B [field c] : C | | A.cs:108:14:108:16 | access to field c | semmle.label | access to field c | | A.cs:113:17:113:29 | call to method Source : B | semmle.label | call to method Source : B | -| A.cs:114:18:114:54 | object creation of type MyList [field head] : B | semmle.label | object creation of type MyList [field head] : B | +| A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | semmle.label | object creation of type MyList : MyList [field head] : B | | A.cs:114:29:114:29 | access to local variable b : B | semmle.label | access to local variable b : B | -| A.cs:115:18:115:37 | object creation of type MyList [field next, field head] : B | semmle.label | object creation of type MyList [field next, field head] : B | -| A.cs:115:35:115:36 | access to local variable l1 [field head] : B | semmle.label | access to local variable l1 [field head] : B | -| A.cs:116:18:116:37 | object creation of type MyList [field next, field next, field head] : B | semmle.label | object creation of type MyList [field next, field next, field head] : B | -| A.cs:116:35:116:36 | access to local variable l2 [field next, field head] : B | semmle.label | access to local variable l2 [field next, field head] : B | -| A.cs:119:14:119:15 | access to local variable l3 [field next, field next, field head] : B | semmle.label | access to local variable l3 [field next, field next, field head] : B | -| A.cs:119:14:119:20 | access to field next [field next, field head] : B | semmle.label | access to field next [field next, field head] : B | -| A.cs:119:14:119:25 | access to field next [field head] : B | semmle.label | access to field next [field head] : B | +| A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | semmle.label | object creation of type MyList : MyList [field next, field head] : B | +| A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | semmle.label | access to local variable l1 : MyList [field head] : B | +| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | semmle.label | object creation of type MyList : MyList [field next, field next, field head] : B | +| A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | semmle.label | access to local variable l2 : MyList [field next, field head] : B | +| A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | semmle.label | access to local variable l3 : MyList [field next, field next, field head] : B | +| A.cs:119:14:119:20 | access to field next : MyList [field next, field head] : B | semmle.label | access to field next : MyList [field next, field head] : B | +| A.cs:119:14:119:25 | access to field next : MyList [field head] : B | semmle.label | access to field next : MyList [field head] : B | | A.cs:119:14:119:30 | access to field head | semmle.label | access to field head | -| A.cs:121:41:121:41 | access to local variable l [field next, field head] : B | semmle.label | access to local variable l [field next, field head] : B | -| A.cs:121:41:121:41 | access to local variable l [field next, field next, field head] : B | semmle.label | access to local variable l [field next, field next, field head] : B | -| A.cs:121:41:121:46 | access to field next [field head] : B | semmle.label | access to field next [field head] : B | -| A.cs:121:41:121:46 | access to field next [field next, field head] : B | semmle.label | access to field next [field next, field head] : B | -| A.cs:123:18:123:18 | access to local variable l [field head] : B | semmle.label | access to local variable l [field head] : B | +| A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field head] : B | +| A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field next, field head] : B | +| A.cs:121:41:121:46 | access to field next : MyList [field head] : B | semmle.label | access to field next : MyList [field head] : B | +| A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | semmle.label | access to field next : MyList [field next, field head] : B | +| A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | semmle.label | access to local variable l : MyList [field head] : B | | A.cs:123:18:123:23 | access to field head | semmle.label | access to field head | | A.cs:141:20:141:20 | c : C | semmle.label | c : C | -| A.cs:143:13:143:16 | [post] this access [field c] : C | semmle.label | [post] this access [field c] : C | +| A.cs:143:13:143:16 | [post] this access : B [field c] : C | semmle.label | [post] this access : B [field c] : C | | A.cs:143:22:143:22 | access to parameter c : C | semmle.label | access to parameter c : C | | A.cs:145:27:145:27 | c : C | semmle.label | c : C | | A.cs:145:27:145:27 | c : C1 | semmle.label | c : C1 | | A.cs:145:27:145:27 | c : C2 | semmle.label | c : C2 | -| A.cs:145:32:145:35 | [post] this access [field c] : C | semmle.label | [post] this access [field c] : C | -| A.cs:145:32:145:35 | [post] this access [field c] : C1 | semmle.label | [post] this access [field c] : C1 | -| A.cs:145:32:145:35 | [post] this access [field c] : C2 | semmle.label | [post] this access [field c] : C2 | +| A.cs:145:32:145:35 | [post] this access : B [field c] : C | semmle.label | [post] this access : B [field c] : C | +| A.cs:145:32:145:35 | [post] this access : B [field c] : C1 | semmle.label | [post] this access : B [field c] : C1 | +| A.cs:145:32:145:35 | [post] this access : B [field c] : C2 | semmle.label | [post] this access : B [field c] : C2 | | A.cs:145:41:145:41 | access to parameter c : C | semmle.label | access to parameter c : C | | A.cs:145:41:145:41 | access to parameter c : C1 | semmle.label | access to parameter c : C1 | | A.cs:145:41:145:41 | access to parameter c : C2 | semmle.label | access to parameter c : C2 | -| A.cs:146:18:146:20 | this [field c] : C | semmle.label | this [field c] : C | -| A.cs:146:18:146:20 | this [field c] : C1 | semmle.label | this [field c] : C1 | -| A.cs:146:33:146:36 | this access [field c] : C | semmle.label | this access [field c] : C | -| A.cs:146:33:146:36 | this access [field c] : C1 | semmle.label | this access [field c] : C1 | +| A.cs:146:18:146:20 | this : B [field c] : C | semmle.label | this : B [field c] : C | +| A.cs:146:18:146:20 | this : B [field c] : C1 | semmle.label | this : B [field c] : C1 | +| A.cs:146:33:146:36 | this access : B [field c] : C | semmle.label | this access : B [field c] : C | +| A.cs:146:33:146:36 | this access : B [field c] : C1 | semmle.label | this access : B [field c] : C1 | | A.cs:146:33:146:38 | access to field c : C | semmle.label | access to field c : C | | A.cs:146:33:146:38 | access to field c : C1 | semmle.label | access to field c : C1 | | A.cs:147:32:147:32 | c : C | semmle.label | c : C | -| A.cs:149:20:149:27 | object creation of type B [field c] : C | semmle.label | object creation of type B [field c] : C | +| A.cs:149:20:149:27 | object creation of type B : B [field c] : C | semmle.label | object creation of type B : B [field c] : C | | A.cs:149:26:149:26 | access to parameter c : C | semmle.label | access to parameter c : C | | A.cs:157:25:157:28 | head : B | semmle.label | head : B | -| A.cs:157:38:157:41 | next [field head] : B | semmle.label | next [field head] : B | -| A.cs:157:38:157:41 | next [field next, field head] : B | semmle.label | next [field next, field head] : B | -| A.cs:159:13:159:16 | [post] this access [field head] : B | semmle.label | [post] this access [field head] : B | +| A.cs:157:38:157:41 | next : MyList [field head] : B | semmle.label | next : MyList [field head] : B | +| A.cs:157:38:157:41 | next : MyList [field next, field head] : B | semmle.label | next : MyList [field next, field head] : B | +| A.cs:159:13:159:16 | [post] this access : MyList [field head] : B | semmle.label | [post] this access : MyList [field head] : B | | A.cs:159:25:159:28 | access to parameter head : B | semmle.label | access to parameter head : B | -| A.cs:160:13:160:16 | [post] this access [field next, field head] : B | semmle.label | [post] this access [field next, field head] : B | -| A.cs:160:13:160:16 | [post] this access [field next, field next, field head] : B | semmle.label | [post] this access [field next, field next, field head] : B | -| A.cs:160:25:160:28 | access to parameter next [field head] : B | semmle.label | access to parameter next [field head] : B | -| A.cs:160:25:160:28 | access to parameter next [field next, field head] : B | semmle.label | access to parameter next [field next, field head] : B | +| A.cs:160:13:160:16 | [post] this access : MyList [field next, field head] : B | semmle.label | [post] this access : MyList [field next, field head] : B | +| A.cs:160:13:160:16 | [post] this access : MyList [field next, field next, field head] : B | semmle.label | [post] this access : MyList [field next, field next, field head] : B | +| A.cs:160:25:160:28 | access to parameter next : MyList [field head] : B | semmle.label | access to parameter next : MyList [field head] : B | +| A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | semmle.label | access to parameter next : MyList [field next, field head] : B | | B.cs:5:17:5:31 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| B.cs:6:18:6:34 | object creation of type Box1 [field elem1] : Elem | semmle.label | object creation of type Box1 [field elem1] : Elem | +| B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | semmle.label | object creation of type Box1 : Box1 [field elem1] : Elem | | B.cs:6:27:6:27 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | -| B.cs:7:18:7:29 | object creation of type Box2 [field box1, field elem1] : Elem | semmle.label | object creation of type Box2 [field box1, field elem1] : Elem | -| B.cs:7:27:7:28 | access to local variable b1 [field elem1] : Elem | semmle.label | access to local variable b1 [field elem1] : Elem | -| B.cs:8:14:8:15 | access to local variable b2 [field box1, field elem1] : Elem | semmle.label | access to local variable b2 [field box1, field elem1] : Elem | -| B.cs:8:14:8:20 | access to field box1 [field elem1] : Elem | semmle.label | access to field box1 [field elem1] : Elem | +| B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | semmle.label | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | +| B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | semmle.label | access to local variable b1 : Box1 [field elem1] : Elem | +| B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | semmle.label | access to local variable b2 : Box2 [field box1, field elem1] : Elem | +| B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | semmle.label | access to field box1 : Box1 [field elem1] : Elem | | B.cs:8:14:8:26 | access to field elem1 | semmle.label | access to field elem1 | | B.cs:14:17:14:31 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| B.cs:15:18:15:34 | object creation of type Box1 [field elem2] : Elem | semmle.label | object creation of type Box1 [field elem2] : Elem | +| B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | semmle.label | object creation of type Box1 : Box1 [field elem2] : Elem | | B.cs:15:33:15:33 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | -| B.cs:16:18:16:29 | object creation of type Box2 [field box1, field elem2] : Elem | semmle.label | object creation of type Box2 [field box1, field elem2] : Elem | -| B.cs:16:27:16:28 | access to local variable b1 [field elem2] : Elem | semmle.label | access to local variable b1 [field elem2] : Elem | -| B.cs:18:14:18:15 | access to local variable b2 [field box1, field elem2] : Elem | semmle.label | access to local variable b2 [field box1, field elem2] : Elem | -| B.cs:18:14:18:20 | access to field box1 [field elem2] : Elem | semmle.label | access to field box1 [field elem2] : Elem | +| B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | semmle.label | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | +| B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | semmle.label | access to local variable b1 : Box1 [field elem2] : Elem | +| B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | semmle.label | access to local variable b2 : Box2 [field box1, field elem2] : Elem | +| B.cs:18:14:18:20 | access to field box1 : Box1 [field elem2] : Elem | semmle.label | access to field box1 : Box1 [field elem2] : Elem | | B.cs:18:14:18:26 | access to field elem2 | semmle.label | access to field elem2 | | B.cs:29:26:29:27 | e1 : Elem | semmle.label | e1 : Elem | | B.cs:29:35:29:36 | e2 : Elem | semmle.label | e2 : Elem | -| B.cs:31:13:31:16 | [post] this access [field elem1] : Elem | semmle.label | [post] this access [field elem1] : Elem | +| B.cs:31:13:31:16 | [post] this access : Box1 [field elem1] : Elem | semmle.label | [post] this access : Box1 [field elem1] : Elem | | B.cs:31:26:31:27 | access to parameter e1 : Elem | semmle.label | access to parameter e1 : Elem | -| B.cs:32:13:32:16 | [post] this access [field elem2] : Elem | semmle.label | [post] this access [field elem2] : Elem | +| B.cs:32:13:32:16 | [post] this access : Box1 [field elem2] : Elem | semmle.label | [post] this access : Box1 [field elem2] : Elem | | B.cs:32:26:32:27 | access to parameter e2 : Elem | semmle.label | access to parameter e2 : Elem | -| B.cs:39:26:39:27 | b1 [field elem1] : Elem | semmle.label | b1 [field elem1] : Elem | -| B.cs:39:26:39:27 | b1 [field elem2] : Elem | semmle.label | b1 [field elem2] : Elem | -| B.cs:41:13:41:16 | [post] this access [field box1, field elem1] : Elem | semmle.label | [post] this access [field box1, field elem1] : Elem | -| B.cs:41:13:41:16 | [post] this access [field box1, field elem2] : Elem | semmle.label | [post] this access [field box1, field elem2] : Elem | -| B.cs:41:25:41:26 | access to parameter b1 [field elem1] : Elem | semmle.label | access to parameter b1 [field elem1] : Elem | -| B.cs:41:25:41:26 | access to parameter b1 [field elem2] : Elem | semmle.label | access to parameter b1 [field elem2] : Elem | -| C.cs:3:18:3:19 | [post] this access [field s1] : Elem | semmle.label | [post] this access [field s1] : Elem | +| B.cs:39:26:39:27 | b1 : Box1 [field elem1] : Elem | semmle.label | b1 : Box1 [field elem1] : Elem | +| B.cs:39:26:39:27 | b1 : Box1 [field elem2] : Elem | semmle.label | b1 : Box1 [field elem2] : Elem | +| B.cs:41:13:41:16 | [post] this access : Box2 [field box1, field elem1] : Elem | semmle.label | [post] this access : Box2 [field box1, field elem1] : Elem | +| B.cs:41:13:41:16 | [post] this access : Box2 [field box1, field elem2] : Elem | semmle.label | [post] this access : Box2 [field box1, field elem2] : Elem | +| B.cs:41:25:41:26 | access to parameter b1 : Box1 [field elem1] : Elem | semmle.label | access to parameter b1 : Box1 [field elem1] : Elem | +| B.cs:41:25:41:26 | access to parameter b1 : Box1 [field elem2] : Elem | semmle.label | access to parameter b1 : Box1 [field elem2] : Elem | +| C.cs:3:18:3:19 | [post] this access : C [field s1] : Elem | semmle.label | [post] this access : C [field s1] : Elem | | C.cs:3:23:3:37 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| C.cs:4:27:4:28 | [post] this access [field s2] : Elem | semmle.label | [post] this access [field s2] : Elem | +| C.cs:4:27:4:28 | [post] this access : C [field s2] : Elem | semmle.label | [post] this access : C [field s2] : Elem | | C.cs:4:32:4:46 | call to method Source : Elem | semmle.label | call to method Source : Elem | | C.cs:6:30:6:44 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| C.cs:7:18:7:19 | [post] this access [property s5] : Elem | semmle.label | [post] this access [property s5] : Elem | +| C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | semmle.label | [post] this access : C [property s5] : Elem | | C.cs:7:37:7:51 | call to method Source : Elem | semmle.label | call to method Source : Elem | | C.cs:8:30:8:44 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| C.cs:12:15:12:21 | object creation of type C [field s1] : Elem | semmle.label | object creation of type C [field s1] : Elem | -| C.cs:12:15:12:21 | object creation of type C [field s2] : Elem | semmle.label | object creation of type C [field s2] : Elem | -| C.cs:12:15:12:21 | object creation of type C [field s3] : Elem | semmle.label | object creation of type C [field s3] : Elem | -| C.cs:12:15:12:21 | object creation of type C [property s5] : Elem | semmle.label | object creation of type C [property s5] : Elem | -| C.cs:13:9:13:9 | access to local variable c [field s1] : Elem | semmle.label | access to local variable c [field s1] : Elem | -| C.cs:13:9:13:9 | access to local variable c [field s2] : Elem | semmle.label | access to local variable c [field s2] : Elem | -| C.cs:13:9:13:9 | access to local variable c [field s3] : Elem | semmle.label | access to local variable c [field s3] : Elem | -| C.cs:13:9:13:9 | access to local variable c [property s5] : Elem | semmle.label | access to local variable c [property s5] : Elem | -| C.cs:18:9:18:12 | [post] this access [field s3] : Elem | semmle.label | [post] this access [field s3] : Elem | +| C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | semmle.label | object creation of type C : C [field s1] : Elem | +| C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | semmle.label | object creation of type C : C [field s2] : Elem | +| C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | semmle.label | object creation of type C : C [field s3] : Elem | +| C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | semmle.label | object creation of type C : C [property s5] : Elem | +| C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | semmle.label | access to local variable c : C [field s1] : Elem | +| C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | semmle.label | access to local variable c : C [field s2] : Elem | +| C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | semmle.label | access to local variable c : C [field s3] : Elem | +| C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | semmle.label | access to local variable c : C [property s5] : Elem | +| C.cs:18:9:18:12 | [post] this access : C [field s3] : Elem | semmle.label | [post] this access : C [field s3] : Elem | | C.cs:18:19:18:33 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| C.cs:21:17:21:18 | this [field s1] : Elem | semmle.label | this [field s1] : Elem | -| C.cs:21:17:21:18 | this [field s2] : Elem | semmle.label | this [field s2] : Elem | -| C.cs:21:17:21:18 | this [field s3] : Elem | semmle.label | this [field s3] : Elem | -| C.cs:21:17:21:18 | this [property s5] : Elem | semmle.label | this [property s5] : Elem | +| C.cs:21:17:21:18 | this : C [field s1] : Elem | semmle.label | this : C [field s1] : Elem | +| C.cs:21:17:21:18 | this : C [field s2] : Elem | semmle.label | this : C [field s2] : Elem | +| C.cs:21:17:21:18 | this : C [field s3] : Elem | semmle.label | this : C [field s3] : Elem | +| C.cs:21:17:21:18 | this : C [property s5] : Elem | semmle.label | this : C [property s5] : Elem | | C.cs:23:14:23:15 | access to field s1 | semmle.label | access to field s1 | -| C.cs:23:14:23:15 | this access [field s1] : Elem | semmle.label | this access [field s1] : Elem | +| C.cs:23:14:23:15 | this access : C [field s1] : Elem | semmle.label | this access : C [field s1] : Elem | | C.cs:24:14:24:15 | access to field s2 | semmle.label | access to field s2 | -| C.cs:24:14:24:15 | this access [field s2] : Elem | semmle.label | this access [field s2] : Elem | +| C.cs:24:14:24:15 | this access : C [field s2] : Elem | semmle.label | this access : C [field s2] : Elem | | C.cs:25:14:25:15 | access to field s3 | semmle.label | access to field s3 | -| C.cs:25:14:25:15 | this access [field s3] : Elem | semmle.label | this access [field s3] : Elem | +| C.cs:25:14:25:15 | this access : C [field s3] : Elem | semmle.label | this access : C [field s3] : Elem | | C.cs:26:14:26:15 | access to field s4 | semmle.label | access to field s4 | | C.cs:27:14:27:15 | access to property s5 | semmle.label | access to property s5 | -| C.cs:27:14:27:15 | this access [property s5] : Elem | semmle.label | this access [property s5] : Elem | +| C.cs:27:14:27:15 | this access : C [property s5] : Elem | semmle.label | this access : C [property s5] : Elem | | C.cs:28:14:28:15 | access to property s6 | semmle.label | access to property s6 | -| C_ctor.cs:3:18:3:19 | [post] this access [field s1] : Elem | semmle.label | [post] this access [field s1] : Elem | +| C_ctor.cs:3:18:3:19 | [post] this access : C_no_ctor [field s1] : Elem | semmle.label | [post] this access : C_no_ctor [field s1] : Elem | | C_ctor.cs:3:23:3:42 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| C_ctor.cs:7:23:7:37 | object creation of type C_no_ctor [field s1] : Elem | semmle.label | object creation of type C_no_ctor [field s1] : Elem | -| C_ctor.cs:8:9:8:9 | access to local variable c [field s1] : Elem | semmle.label | access to local variable c [field s1] : Elem | -| C_ctor.cs:11:17:11:18 | this [field s1] : Elem | semmle.label | this [field s1] : Elem | +| C_ctor.cs:7:23:7:37 | object creation of type C_no_ctor : C_no_ctor [field s1] : Elem | semmle.label | object creation of type C_no_ctor : C_no_ctor [field s1] : Elem | +| C_ctor.cs:8:9:8:9 | access to local variable c : C_no_ctor [field s1] : Elem | semmle.label | access to local variable c : C_no_ctor [field s1] : Elem | +| C_ctor.cs:11:17:11:18 | this : C_no_ctor [field s1] : Elem | semmle.label | this : C_no_ctor [field s1] : Elem | | C_ctor.cs:13:19:13:20 | access to field s1 | semmle.label | access to field s1 | -| C_ctor.cs:13:19:13:20 | this access [field s1] : Elem | semmle.label | this access [field s1] : Elem | -| C_ctor.cs:19:18:19:19 | [post] this access [field s1] : Elem | semmle.label | [post] this access [field s1] : Elem | +| C_ctor.cs:13:19:13:20 | this access : C_no_ctor [field s1] : Elem | semmle.label | this access : C_no_ctor [field s1] : Elem | +| C_ctor.cs:19:18:19:19 | [post] this access : C_with_ctor [field s1] : Elem | semmle.label | [post] this access : C_with_ctor [field s1] : Elem | | C_ctor.cs:19:23:19:42 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| C_ctor.cs:23:25:23:41 | object creation of type C_with_ctor [field s1] : Elem | semmle.label | object creation of type C_with_ctor [field s1] : Elem | -| C_ctor.cs:24:9:24:9 | access to local variable c [field s1] : Elem | semmle.label | access to local variable c [field s1] : Elem | -| C_ctor.cs:29:17:29:18 | this [field s1] : Elem | semmle.label | this [field s1] : Elem | +| C_ctor.cs:23:25:23:41 | object creation of type C_with_ctor : C_with_ctor [field s1] : Elem | semmle.label | object creation of type C_with_ctor : C_with_ctor [field s1] : Elem | +| C_ctor.cs:24:9:24:9 | access to local variable c : C_with_ctor [field s1] : Elem | semmle.label | access to local variable c : C_with_ctor [field s1] : Elem | +| C_ctor.cs:29:17:29:18 | this : C_with_ctor [field s1] : Elem | semmle.label | this : C_with_ctor [field s1] : Elem | | C_ctor.cs:31:19:31:20 | access to field s1 | semmle.label | access to field s1 | -| C_ctor.cs:31:19:31:20 | this access [field s1] : Elem | semmle.label | this access [field s1] : Elem | -| D.cs:8:9:8:11 | this [field trivialPropField] : Object | semmle.label | this [field trivialPropField] : Object | -| D.cs:8:22:8:25 | this access [field trivialPropField] : Object | semmle.label | this access [field trivialPropField] : Object | +| C_ctor.cs:31:19:31:20 | this access : C_with_ctor [field s1] : Elem | semmle.label | this access : C_with_ctor [field s1] : Elem | +| D.cs:8:9:8:11 | this : D [field trivialPropField] : Object | semmle.label | this : D [field trivialPropField] : Object | +| D.cs:8:22:8:25 | this access : D [field trivialPropField] : Object | semmle.label | this access : D [field trivialPropField] : Object | | D.cs:8:22:8:42 | access to field trivialPropField : Object | semmle.label | access to field trivialPropField : Object | | D.cs:9:9:9:11 | value : Object | semmle.label | value : Object | -| D.cs:9:15:9:18 | [post] this access [field trivialPropField] : Object | semmle.label | [post] this access [field trivialPropField] : Object | +| D.cs:9:15:9:18 | [post] this access : D [field trivialPropField] : Object | semmle.label | [post] this access : D [field trivialPropField] : Object | | D.cs:9:39:9:43 | access to parameter value : Object | semmle.label | access to parameter value : Object | -| D.cs:14:9:14:11 | this [field trivialPropField] : Object | semmle.label | this [field trivialPropField] : Object | -| D.cs:14:22:14:25 | this access [field trivialPropField] : Object | semmle.label | this access [field trivialPropField] : Object | +| D.cs:14:9:14:11 | this : D [field trivialPropField] : Object | semmle.label | this : D [field trivialPropField] : Object | +| D.cs:14:22:14:25 | this access : D [field trivialPropField] : Object | semmle.label | this access : D [field trivialPropField] : Object | | D.cs:14:22:14:42 | access to field trivialPropField : Object | semmle.label | access to field trivialPropField : Object | | D.cs:15:9:15:11 | value : Object | semmle.label | value : Object | -| D.cs:15:15:15:18 | [post] this access [field trivialPropField] : Object | semmle.label | [post] this access [field trivialPropField] : Object | +| D.cs:15:15:15:18 | [post] this access : D [field trivialPropField] : Object | semmle.label | [post] this access : D [field trivialPropField] : Object | | D.cs:15:34:15:38 | access to parameter value : Object | semmle.label | access to parameter value : Object | | D.cs:18:28:18:29 | o1 : Object | semmle.label | o1 : Object | | D.cs:18:39:18:40 | o2 : Object | semmle.label | o2 : Object | | D.cs:18:50:18:51 | o3 : Object | semmle.label | o3 : Object | -| D.cs:21:9:21:11 | [post] access to local variable ret [property AutoProp] : Object | semmle.label | [post] access to local variable ret [property AutoProp] : Object | +| D.cs:21:9:21:11 | [post] access to local variable ret : D [property AutoProp] : Object | semmle.label | [post] access to local variable ret : D [property AutoProp] : Object | | D.cs:21:24:21:25 | access to parameter o1 : Object | semmle.label | access to parameter o1 : Object | -| D.cs:22:9:22:11 | [post] access to local variable ret [field trivialPropField] : Object | semmle.label | [post] access to local variable ret [field trivialPropField] : Object | +| D.cs:22:9:22:11 | [post] access to local variable ret : D [field trivialPropField] : Object | semmle.label | [post] access to local variable ret : D [field trivialPropField] : Object | | D.cs:22:27:22:28 | access to parameter o2 : Object | semmle.label | access to parameter o2 : Object | -| D.cs:23:9:23:11 | [post] access to local variable ret [field trivialPropField] : Object | semmle.label | [post] access to local variable ret [field trivialPropField] : Object | +| D.cs:23:9:23:11 | [post] access to local variable ret : D [field trivialPropField] : Object | semmle.label | [post] access to local variable ret : D [field trivialPropField] : Object | | D.cs:23:27:23:28 | access to parameter o3 : Object | semmle.label | access to parameter o3 : Object | -| D.cs:24:16:24:18 | access to local variable ret [field trivialPropField] : Object | semmle.label | access to local variable ret [field trivialPropField] : Object | -| D.cs:24:16:24:18 | access to local variable ret [field trivialPropField] : Object | semmle.label | access to local variable ret [field trivialPropField] : Object | -| D.cs:24:16:24:18 | access to local variable ret [property AutoProp] : Object | semmle.label | access to local variable ret [property AutoProp] : Object | +| D.cs:24:16:24:18 | access to local variable ret : D [field trivialPropField] : Object | semmle.label | access to local variable ret : D [field trivialPropField] : Object | +| D.cs:24:16:24:18 | access to local variable ret : D [field trivialPropField] : Object | semmle.label | access to local variable ret : D [field trivialPropField] : Object | +| D.cs:24:16:24:18 | access to local variable ret : D [property AutoProp] : Object | semmle.label | access to local variable ret : D [property AutoProp] : Object | | D.cs:29:17:29:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| D.cs:31:17:31:37 | call to method Create [property AutoProp] : Object | semmle.label | call to method Create [property AutoProp] : Object | +| D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | semmle.label | call to method Create : D [property AutoProp] : Object | | D.cs:31:24:31:24 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| D.cs:32:14:32:14 | access to local variable d [property AutoProp] : Object | semmle.label | access to local variable d [property AutoProp] : Object | +| D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | semmle.label | access to local variable d : D [property AutoProp] : Object | | D.cs:32:14:32:23 | access to property AutoProp | semmle.label | access to property AutoProp | -| D.cs:37:13:37:49 | call to method Create [field trivialPropField] : Object | semmle.label | call to method Create [field trivialPropField] : Object | +| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | semmle.label | call to method Create : D [field trivialPropField] : Object | | D.cs:37:26:37:42 | call to method Source : Object | semmle.label | call to method Source : Object | -| D.cs:39:14:39:14 | access to local variable d [field trivialPropField] : Object | semmle.label | access to local variable d [field trivialPropField] : Object | +| D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:39:14:39:26 | access to property TrivialProp | semmle.label | access to property TrivialProp | -| D.cs:40:14:40:14 | access to local variable d [field trivialPropField] : Object | semmle.label | access to local variable d [field trivialPropField] : Object | +| D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:40:14:40:31 | access to field trivialPropField | semmle.label | access to field trivialPropField | -| D.cs:41:14:41:14 | access to local variable d [field trivialPropField] : Object | semmle.label | access to local variable d [field trivialPropField] : Object | +| D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:41:14:41:26 | access to property ComplexProp | semmle.label | access to property ComplexProp | -| D.cs:43:13:43:49 | call to method Create [field trivialPropField] : Object | semmle.label | call to method Create [field trivialPropField] : Object | +| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | semmle.label | call to method Create : D [field trivialPropField] : Object | | D.cs:43:32:43:48 | call to method Source : Object | semmle.label | call to method Source : Object | -| D.cs:45:14:45:14 | access to local variable d [field trivialPropField] : Object | semmle.label | access to local variable d [field trivialPropField] : Object | +| D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:45:14:45:26 | access to property TrivialProp | semmle.label | access to property TrivialProp | -| D.cs:46:14:46:14 | access to local variable d [field trivialPropField] : Object | semmle.label | access to local variable d [field trivialPropField] : Object | +| D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:46:14:46:31 | access to field trivialPropField | semmle.label | access to field trivialPropField | -| D.cs:47:14:47:14 | access to local variable d [field trivialPropField] : Object | semmle.label | access to local variable d [field trivialPropField] : Object | +| D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:47:14:47:26 | access to property ComplexProp | semmle.label | access to property ComplexProp | | E.cs:8:29:8:29 | o : Object | semmle.label | o : Object | -| E.cs:11:9:11:11 | [post] access to local variable ret [field Field] : Object | semmle.label | [post] access to local variable ret [field Field] : Object | +| E.cs:11:9:11:11 | [post] access to local variable ret : S [field Field] : Object | semmle.label | [post] access to local variable ret : S [field Field] : Object | | E.cs:11:21:11:21 | access to parameter o : Object | semmle.label | access to parameter o : Object | -| E.cs:12:16:12:18 | access to local variable ret [field Field] : Object | semmle.label | access to local variable ret [field Field] : Object | +| E.cs:12:16:12:18 | access to local variable ret : S [field Field] : Object | semmle.label | access to local variable ret : S [field Field] : Object | | E.cs:22:17:22:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| E.cs:23:17:23:26 | call to method CreateS [field Field] : Object | semmle.label | call to method CreateS [field Field] : Object | +| E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | semmle.label | call to method CreateS : S [field Field] : Object | | E.cs:23:25:23:25 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| E.cs:24:14:24:14 | access to local variable s [field Field] : Object | semmle.label | access to local variable s [field Field] : Object | +| E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | semmle.label | access to local variable s : S [field Field] : Object | | E.cs:24:14:24:20 | access to field Field | semmle.label | access to field Field | | F.cs:6:28:6:29 | o1 : Object | semmle.label | o1 : Object | | F.cs:6:39:6:40 | o2 : Object | semmle.label | o2 : Object | -| F.cs:6:46:6:81 | object creation of type F [field Field1] : Object | semmle.label | object creation of type F [field Field1] : Object | -| F.cs:6:46:6:81 | object creation of type F [field Field2] : Object | semmle.label | object creation of type F [field Field2] : Object | -| F.cs:6:54:6:81 | { ..., ... } [field Field1] : Object | semmle.label | { ..., ... } [field Field1] : Object | -| F.cs:6:54:6:81 | { ..., ... } [field Field2] : Object | semmle.label | { ..., ... } [field Field2] : Object | +| F.cs:6:46:6:81 | object creation of type F : F [field Field1] : Object | semmle.label | object creation of type F : F [field Field1] : Object | +| F.cs:6:46:6:81 | object creation of type F : F [field Field2] : Object | semmle.label | object creation of type F : F [field Field2] : Object | +| F.cs:6:54:6:81 | { ..., ... } : F [field Field1] : Object | semmle.label | { ..., ... } : F [field Field1] : Object | +| F.cs:6:54:6:81 | { ..., ... } : F [field Field2] : Object | semmle.label | { ..., ... } : F [field Field2] : Object | | F.cs:6:65:6:66 | access to parameter o1 : Object | semmle.label | access to parameter o1 : Object | | F.cs:6:78:6:79 | access to parameter o2 : Object | semmle.label | access to parameter o2 : Object | | F.cs:10:17:10:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| F.cs:11:17:11:31 | call to method Create [field Field1] : Object | semmle.label | call to method Create [field Field1] : Object | +| F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | semmle.label | call to method Create : F [field Field1] : Object | | F.cs:11:24:11:24 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| F.cs:12:14:12:14 | access to local variable f [field Field1] : Object | semmle.label | access to local variable f [field Field1] : Object | +| F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | | F.cs:12:14:12:21 | access to field Field1 | semmle.label | access to field Field1 | -| F.cs:15:13:15:43 | call to method Create [field Field2] : Object | semmle.label | call to method Create [field Field2] : Object | +| F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | semmle.label | call to method Create : F [field Field2] : Object | | F.cs:15:26:15:42 | call to method Source : Object | semmle.label | call to method Source : Object | -| F.cs:17:14:17:14 | access to local variable f [field Field2] : Object | semmle.label | access to local variable f [field Field2] : Object | +| F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | | F.cs:17:14:17:21 | access to field Field2 | semmle.label | access to field Field2 | -| F.cs:19:21:19:50 | { ..., ... } [field Field1] : Object | semmle.label | { ..., ... } [field Field1] : Object | +| F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | semmle.label | { ..., ... } : F [field Field1] : Object | | F.cs:19:32:19:48 | call to method Source : Object | semmle.label | call to method Source : Object | -| F.cs:20:14:20:14 | access to local variable f [field Field1] : Object | semmle.label | access to local variable f [field Field1] : Object | +| F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | | F.cs:20:14:20:21 | access to field Field1 | semmle.label | access to field Field1 | -| F.cs:23:21:23:50 | { ..., ... } [field Field2] : Object | semmle.label | { ..., ... } [field Field2] : Object | +| F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | semmle.label | { ..., ... } : F [field Field2] : Object | | F.cs:23:32:23:48 | call to method Source : Object | semmle.label | call to method Source : Object | -| F.cs:25:14:25:14 | access to local variable f [field Field2] : Object | semmle.label | access to local variable f [field Field2] : Object | +| F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | | F.cs:25:14:25:21 | access to field Field2 | semmle.label | access to field Field2 | | F.cs:30:17:30:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| F.cs:32:17:32:40 | { ..., ... } [property X] : Object | semmle.label | { ..., ... } [property X] : Object | +| F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | semmle.label | { ..., ... } : <>__AnonType0 [property X] : Object | | F.cs:32:27:32:27 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| F.cs:33:14:33:14 | access to local variable a [property X] : Object | semmle.label | access to local variable a [property X] : Object | +| F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a : <>__AnonType0 [property X] : Object | | F.cs:33:14:33:16 | access to property X | semmle.label | access to property X | | G.cs:7:18:7:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| G.cs:9:9:9:9 | [post] access to local variable b [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b [field Box1, field Elem] : Elem | -| G.cs:9:9:9:14 | [post] access to field Box1 [field Elem] : Elem | semmle.label | [post] access to field Box1 [field Elem] : Elem | +| G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:9:9:9:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | semmle.label | [post] access to field Box1 : Box1 [field Elem] : Elem | | G.cs:9:23:9:23 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | -| G.cs:10:18:10:18 | access to local variable b [field Box1, field Elem] : Elem | semmle.label | access to local variable b [field Box1, field Elem] : Elem | +| G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | | G.cs:15:18:15:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| G.cs:17:9:17:9 | [post] access to local variable b [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b [field Box1, field Elem] : Elem | -| G.cs:17:9:17:14 | [post] access to field Box1 [field Elem] : Elem | semmle.label | [post] access to field Box1 [field Elem] : Elem | +| G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:17:9:17:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | semmle.label | [post] access to field Box1 : Box1 [field Elem] : Elem | | G.cs:17:24:17:24 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | -| G.cs:18:18:18:18 | access to local variable b [field Box1, field Elem] : Elem | semmle.label | access to local variable b [field Box1, field Elem] : Elem | +| G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | | G.cs:23:18:23:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| G.cs:25:9:25:9 | [post] access to local variable b [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b [field Box1, field Elem] : Elem | -| G.cs:25:9:25:19 | [post] call to method GetBox1 [field Elem] : Elem | semmle.label | [post] call to method GetBox1 [field Elem] : Elem | +| G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:25:9:25:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | semmle.label | [post] call to method GetBox1 : Box1 [field Elem] : Elem | | G.cs:25:28:25:28 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | -| G.cs:26:18:26:18 | access to local variable b [field Box1, field Elem] : Elem | semmle.label | access to local variable b [field Box1, field Elem] : Elem | +| G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | | G.cs:31:18:31:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| G.cs:33:9:33:9 | [post] access to local variable b [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b [field Box1, field Elem] : Elem | -| G.cs:33:9:33:19 | [post] call to method GetBox1 [field Elem] : Elem | semmle.label | [post] call to method GetBox1 [field Elem] : Elem | +| G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:33:9:33:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | semmle.label | [post] call to method GetBox1 : Box1 [field Elem] : Elem | | G.cs:33:29:33:29 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | -| G.cs:34:18:34:18 | access to local variable b [field Box1, field Elem] : Elem | semmle.label | access to local variable b [field Box1, field Elem] : Elem | -| G.cs:37:38:37:39 | b2 [field Box1, field Elem] : Elem | semmle.label | b2 [field Box1, field Elem] : Elem | -| G.cs:39:14:39:15 | access to parameter b2 [field Box1, field Elem] : Elem | semmle.label | access to parameter b2 [field Box1, field Elem] : Elem | -| G.cs:39:14:39:25 | call to method GetBox1 [field Elem] : Elem | semmle.label | call to method GetBox1 [field Elem] : Elem | +| G.cs:34:18:34:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | semmle.label | b2 : Box2 [field Box1, field Elem] : Elem | +| G.cs:39:14:39:15 | access to parameter b2 : Box2 [field Box1, field Elem] : Elem | semmle.label | access to parameter b2 : Box2 [field Box1, field Elem] : Elem | +| G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | semmle.label | call to method GetBox1 : Box1 [field Elem] : Elem | | G.cs:39:14:39:35 | call to method GetElem | semmle.label | call to method GetElem | | G.cs:44:18:44:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | -| G.cs:46:9:46:16 | [post] access to field boxfield [field Box1, field Elem] : Elem | semmle.label | [post] access to field boxfield [field Box1, field Elem] : Elem | -| G.cs:46:9:46:16 | [post] this access [field boxfield, field Box1, field Elem] : Elem | semmle.label | [post] this access [field boxfield, field Box1, field Elem] : Elem | -| G.cs:46:9:46:21 | [post] access to field Box1 [field Elem] : Elem | semmle.label | [post] access to field Box1 [field Elem] : Elem | +| G.cs:46:9:46:16 | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | +| G.cs:46:9:46:16 | [post] this access : G [field boxfield, field Box1, field Elem] : Elem | semmle.label | [post] this access : G [field boxfield, field Box1, field Elem] : Elem | +| G.cs:46:9:46:21 | [post] access to field Box1 : Box1 [field Elem] : Elem | semmle.label | [post] access to field Box1 : Box1 [field Elem] : Elem | | G.cs:46:30:46:30 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | -| G.cs:47:9:47:13 | this access [field boxfield, field Box1, field Elem] : Elem | semmle.label | this access [field boxfield, field Box1, field Elem] : Elem | -| G.cs:50:18:50:20 | this [field boxfield, field Box1, field Elem] : Elem | semmle.label | this [field boxfield, field Box1, field Elem] : Elem | -| G.cs:52:14:52:21 | access to field boxfield [field Box1, field Elem] : Elem | semmle.label | access to field boxfield [field Box1, field Elem] : Elem | -| G.cs:52:14:52:21 | this access [field boxfield, field Box1, field Elem] : Elem | semmle.label | this access [field boxfield, field Box1, field Elem] : Elem | -| G.cs:52:14:52:26 | access to field Box1 [field Elem] : Elem | semmle.label | access to field Box1 [field Elem] : Elem | +| G.cs:47:9:47:13 | this access : G [field boxfield, field Box1, field Elem] : Elem | semmle.label | this access : G [field boxfield, field Box1, field Elem] : Elem | +| G.cs:50:18:50:20 | this : G [field boxfield, field Box1, field Elem] : Elem | semmle.label | this : G [field boxfield, field Box1, field Elem] : Elem | +| G.cs:52:14:52:21 | access to field boxfield : Box2 [field Box1, field Elem] : Elem | semmle.label | access to field boxfield : Box2 [field Box1, field Elem] : Elem | +| G.cs:52:14:52:21 | this access : G [field boxfield, field Box1, field Elem] : Elem | semmle.label | this access : G [field boxfield, field Box1, field Elem] : Elem | +| G.cs:52:14:52:26 | access to field Box1 : Box1 [field Elem] : Elem | semmle.label | access to field Box1 : Box1 [field Elem] : Elem | | G.cs:52:14:52:31 | access to field Elem | semmle.label | access to field Elem | -| G.cs:63:21:63:27 | this [field Elem] : Elem | semmle.label | this [field Elem] : Elem | +| G.cs:63:21:63:27 | this : Box1 [field Elem] : Elem | semmle.label | this : Box1 [field Elem] : Elem | | G.cs:63:34:63:37 | access to field Elem : Elem | semmle.label | access to field Elem : Elem | -| G.cs:63:34:63:37 | this access [field Elem] : Elem | semmle.label | this access [field Elem] : Elem | +| G.cs:63:34:63:37 | this access : Box1 [field Elem] : Elem | semmle.label | this access : Box1 [field Elem] : Elem | | G.cs:64:34:64:34 | e : Elem | semmle.label | e : Elem | -| G.cs:64:39:64:42 | [post] this access [field Elem] : Elem | semmle.label | [post] this access [field Elem] : Elem | +| G.cs:64:39:64:42 | [post] this access : Box1 [field Elem] : Elem | semmle.label | [post] this access : Box1 [field Elem] : Elem | | G.cs:64:46:64:46 | access to parameter e : Elem | semmle.label | access to parameter e : Elem | -| G.cs:71:21:71:27 | this [field Box1, field Elem] : Elem | semmle.label | this [field Box1, field Elem] : Elem | -| G.cs:71:34:71:37 | access to field Box1 [field Elem] : Elem | semmle.label | access to field Box1 [field Elem] : Elem | -| G.cs:71:34:71:37 | this access [field Box1, field Elem] : Elem | semmle.label | this access [field Box1, field Elem] : Elem | -| H.cs:13:15:13:15 | a [field FieldA] : Object | semmle.label | a [field FieldA] : Object | -| H.cs:16:9:16:11 | [post] access to local variable ret [field FieldA] : Object | semmle.label | [post] access to local variable ret [field FieldA] : Object | -| H.cs:16:22:16:22 | access to parameter a [field FieldA] : Object | semmle.label | access to parameter a [field FieldA] : Object | +| G.cs:71:21:71:27 | this : Box2 [field Box1, field Elem] : Elem | semmle.label | this : Box2 [field Box1, field Elem] : Elem | +| G.cs:71:34:71:37 | access to field Box1 : Box1 [field Elem] : Elem | semmle.label | access to field Box1 : Box1 [field Elem] : Elem | +| G.cs:71:34:71:37 | this access : Box2 [field Box1, field Elem] : Elem | semmle.label | this access : Box2 [field Box1, field Elem] : Elem | +| H.cs:13:15:13:15 | a : A [field FieldA] : Object | semmle.label | a : A [field FieldA] : Object | +| H.cs:16:9:16:11 | [post] access to local variable ret : A [field FieldA] : Object | semmle.label | [post] access to local variable ret : A [field FieldA] : Object | +| H.cs:16:22:16:22 | access to parameter a : A [field FieldA] : Object | semmle.label | access to parameter a : A [field FieldA] : Object | | H.cs:16:22:16:29 | access to field FieldA : Object | semmle.label | access to field FieldA : Object | -| H.cs:17:16:17:18 | access to local variable ret [field FieldA] : Object | semmle.label | access to local variable ret [field FieldA] : Object | -| H.cs:23:9:23:9 | [post] access to local variable a [field FieldA] : Object | semmle.label | [post] access to local variable a [field FieldA] : Object | +| H.cs:17:16:17:18 | access to local variable ret : A [field FieldA] : Object | semmle.label | access to local variable ret : A [field FieldA] : Object | +| H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:23:20:23:36 | call to method Source : Object | semmle.label | call to method Source : Object | -| H.cs:24:21:24:28 | call to method Clone [field FieldA] : Object | semmle.label | call to method Clone [field FieldA] : Object | -| H.cs:24:27:24:27 | access to local variable a [field FieldA] : Object | semmle.label | access to local variable a [field FieldA] : Object | -| H.cs:25:14:25:18 | access to local variable clone [field FieldA] : Object | semmle.label | access to local variable clone [field FieldA] : Object | +| H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | semmle.label | call to method Clone : A [field FieldA] : Object | +| H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | +| H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | semmle.label | access to local variable clone : A [field FieldA] : Object | | H.cs:25:14:25:25 | access to field FieldA | semmle.label | access to field FieldA | -| H.cs:33:19:33:19 | a [field FieldA] : A | semmle.label | a [field FieldA] : A | -| H.cs:33:19:33:19 | a [field FieldA] : Object | semmle.label | a [field FieldA] : Object | -| H.cs:36:9:36:9 | [post] access to local variable b [field FieldB] : A | semmle.label | [post] access to local variable b [field FieldB] : A | -| H.cs:36:9:36:9 | [post] access to local variable b [field FieldB] : Object | semmle.label | [post] access to local variable b [field FieldB] : Object | -| H.cs:36:20:36:20 | access to parameter a [field FieldA] : A | semmle.label | access to parameter a [field FieldA] : A | -| H.cs:36:20:36:20 | access to parameter a [field FieldA] : Object | semmle.label | access to parameter a [field FieldA] : Object | +| H.cs:33:19:33:19 | a : A [field FieldA] : A | semmle.label | a : A [field FieldA] : A | +| H.cs:33:19:33:19 | a : A [field FieldA] : Object | semmle.label | a : A [field FieldA] : Object | +| H.cs:36:9:36:9 | [post] access to local variable b : B [field FieldB] : A | semmle.label | [post] access to local variable b : B [field FieldB] : A | +| H.cs:36:9:36:9 | [post] access to local variable b : B [field FieldB] : Object | semmle.label | [post] access to local variable b : B [field FieldB] : Object | +| H.cs:36:20:36:20 | access to parameter a : A [field FieldA] : A | semmle.label | access to parameter a : A [field FieldA] : A | +| H.cs:36:20:36:20 | access to parameter a : A [field FieldA] : Object | semmle.label | access to parameter a : A [field FieldA] : Object | | H.cs:36:20:36:27 | access to field FieldA : A | semmle.label | access to field FieldA : A | | H.cs:36:20:36:27 | access to field FieldA : Object | semmle.label | access to field FieldA : Object | -| H.cs:37:16:37:16 | access to local variable b [field FieldB] : A | semmle.label | access to local variable b [field FieldB] : A | -| H.cs:37:16:37:16 | access to local variable b [field FieldB] : Object | semmle.label | access to local variable b [field FieldB] : Object | -| H.cs:43:9:43:9 | [post] access to local variable a [field FieldA] : Object | semmle.label | [post] access to local variable a [field FieldA] : Object | +| H.cs:37:16:37:16 | access to local variable b : B [field FieldB] : A | semmle.label | access to local variable b : B [field FieldB] : A | +| H.cs:37:16:37:16 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | +| H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:43:20:43:36 | call to method Source : Object | semmle.label | call to method Source : Object | -| H.cs:44:17:44:28 | call to method Transform [field FieldB] : Object | semmle.label | call to method Transform [field FieldB] : Object | -| H.cs:44:27:44:27 | access to local variable a [field FieldA] : Object | semmle.label | access to local variable a [field FieldA] : Object | -| H.cs:45:14:45:14 | access to local variable b [field FieldB] : Object | semmle.label | access to local variable b [field FieldB] : Object | +| H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | semmle.label | call to method Transform : B [field FieldB] : Object | +| H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | +| H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:45:14:45:21 | access to field FieldB | semmle.label | access to field FieldB | -| H.cs:53:25:53:25 | a [field FieldA] : Object | semmle.label | a [field FieldA] : Object | -| H.cs:55:9:55:10 | [post] access to parameter b1 [field FieldB] : Object | semmle.label | [post] access to parameter b1 [field FieldB] : Object | -| H.cs:55:21:55:21 | access to parameter a [field FieldA] : Object | semmle.label | access to parameter a [field FieldA] : Object | +| H.cs:53:25:53:25 | a : A [field FieldA] : Object | semmle.label | a : A [field FieldA] : Object | +| H.cs:55:9:55:10 | [post] access to parameter b1 : B [field FieldB] : Object | semmle.label | [post] access to parameter b1 : B [field FieldB] : Object | +| H.cs:55:21:55:21 | access to parameter a : A [field FieldA] : Object | semmle.label | access to parameter a : A [field FieldA] : Object | | H.cs:55:21:55:28 | access to field FieldA : Object | semmle.label | access to field FieldA : Object | -| H.cs:63:9:63:9 | [post] access to local variable a [field FieldA] : Object | semmle.label | [post] access to local variable a [field FieldA] : Object | +| H.cs:63:9:63:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:63:20:63:36 | call to method Source : Object | semmle.label | call to method Source : Object | -| H.cs:64:22:64:22 | access to local variable a [field FieldA] : Object | semmle.label | access to local variable a [field FieldA] : Object | -| H.cs:64:25:64:26 | [post] access to local variable b1 [field FieldB] : Object | semmle.label | [post] access to local variable b1 [field FieldB] : Object | -| H.cs:65:14:65:15 | access to local variable b1 [field FieldB] : Object | semmle.label | access to local variable b1 [field FieldB] : Object | +| H.cs:64:22:64:22 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | +| H.cs:64:25:64:26 | [post] access to local variable b1 : B [field FieldB] : Object | semmle.label | [post] access to local variable b1 : B [field FieldB] : Object | +| H.cs:65:14:65:15 | access to local variable b1 : B [field FieldB] : Object | semmle.label | access to local variable b1 : B [field FieldB] : Object | | H.cs:65:14:65:22 | access to field FieldB | semmle.label | access to field FieldB | | H.cs:77:30:77:30 | o : Object | semmle.label | o : Object | -| H.cs:79:9:79:9 | [post] access to parameter a [field FieldA] : Object | semmle.label | [post] access to parameter a [field FieldA] : Object | +| H.cs:79:9:79:9 | [post] access to parameter a : A [field FieldA] : Object | semmle.label | [post] access to parameter a : A [field FieldA] : Object | | H.cs:79:20:79:20 | access to parameter o : Object | semmle.label | access to parameter o : Object | -| H.cs:80:22:80:22 | access to parameter a [field FieldA] : Object | semmle.label | access to parameter a [field FieldA] : Object | -| H.cs:80:25:80:26 | [post] access to parameter b1 [field FieldB] : Object | semmle.label | [post] access to parameter b1 [field FieldB] : Object | -| H.cs:88:17:88:17 | [post] access to local variable a [field FieldA] : Object | semmle.label | [post] access to local variable a [field FieldA] : Object | +| H.cs:80:22:80:22 | access to parameter a : A [field FieldA] : Object | semmle.label | access to parameter a : A [field FieldA] : Object | +| H.cs:80:25:80:26 | [post] access to parameter b1 : B [field FieldB] : Object | semmle.label | [post] access to parameter b1 : B [field FieldB] : Object | +| H.cs:88:17:88:17 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:88:20:88:36 | call to method Source : Object | semmle.label | call to method Source : Object | -| H.cs:88:39:88:40 | [post] access to local variable b1 [field FieldB] : Object | semmle.label | [post] access to local variable b1 [field FieldB] : Object | -| H.cs:89:14:89:14 | access to local variable a [field FieldA] : Object | semmle.label | access to local variable a [field FieldA] : Object | +| H.cs:88:39:88:40 | [post] access to local variable b1 : B [field FieldB] : Object | semmle.label | [post] access to local variable b1 : B [field FieldB] : Object | +| H.cs:89:14:89:14 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | | H.cs:89:14:89:21 | access to field FieldA | semmle.label | access to field FieldA | -| H.cs:90:14:90:15 | access to local variable b1 [field FieldB] : Object | semmle.label | access to local variable b1 [field FieldB] : Object | +| H.cs:90:14:90:15 | access to local variable b1 : B [field FieldB] : Object | semmle.label | access to local variable b1 : B [field FieldB] : Object | | H.cs:90:14:90:22 | access to field FieldB | semmle.label | access to field FieldB | -| H.cs:102:23:102:23 | a [field FieldA] : Object | semmle.label | a [field FieldA] : Object | -| H.cs:105:9:105:12 | [post] access to local variable temp [field FieldB, field FieldA] : Object | semmle.label | [post] access to local variable temp [field FieldB, field FieldA] : Object | -| H.cs:105:23:105:23 | access to parameter a [field FieldA] : Object | semmle.label | access to parameter a [field FieldA] : Object | -| H.cs:106:16:106:40 | call to method Transform [field FieldB] : Object | semmle.label | call to method Transform [field FieldB] : Object | -| H.cs:106:26:106:39 | (...) ... [field FieldA] : Object | semmle.label | (...) ... [field FieldA] : Object | -| H.cs:106:29:106:32 | access to local variable temp [field FieldB, field FieldA] : Object | semmle.label | access to local variable temp [field FieldB, field FieldA] : Object | -| H.cs:106:29:106:39 | access to field FieldB [field FieldA] : Object | semmle.label | access to field FieldB [field FieldA] : Object | -| H.cs:112:9:112:9 | [post] access to local variable a [field FieldA] : Object | semmle.label | [post] access to local variable a [field FieldA] : Object | +| H.cs:102:23:102:23 | a : A [field FieldA] : Object | semmle.label | a : A [field FieldA] : Object | +| H.cs:105:9:105:12 | [post] access to local variable temp : B [field FieldB, field FieldA] : Object | semmle.label | [post] access to local variable temp : B [field FieldB, field FieldA] : Object | +| H.cs:105:23:105:23 | access to parameter a : A [field FieldA] : Object | semmle.label | access to parameter a : A [field FieldA] : Object | +| H.cs:106:16:106:40 | call to method Transform : B [field FieldB] : Object | semmle.label | call to method Transform : B [field FieldB] : Object | +| H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | semmle.label | (...) ... : A [field FieldA] : Object | +| H.cs:106:29:106:32 | access to local variable temp : B [field FieldB, field FieldA] : Object | semmle.label | access to local variable temp : B [field FieldB, field FieldA] : Object | +| H.cs:106:29:106:39 | access to field FieldB : A [field FieldA] : Object | semmle.label | access to field FieldB : A [field FieldA] : Object | +| H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:112:20:112:36 | call to method Source : Object | semmle.label | call to method Source : Object | -| H.cs:113:17:113:32 | call to method TransformWrap [field FieldB] : Object | semmle.label | call to method TransformWrap [field FieldB] : Object | -| H.cs:113:31:113:31 | access to local variable a [field FieldA] : Object | semmle.label | access to local variable a [field FieldA] : Object | -| H.cs:114:14:114:14 | access to local variable b [field FieldB] : Object | semmle.label | access to local variable b [field FieldB] : Object | +| H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | semmle.label | call to method TransformWrap : B [field FieldB] : Object | +| H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | +| H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:114:14:114:21 | access to field FieldB | semmle.label | access to field FieldB | -| H.cs:122:18:122:18 | a [field FieldA] : Object | semmle.label | a [field FieldA] : Object | -| H.cs:124:16:124:27 | call to method Transform [field FieldB] : Object | semmle.label | call to method Transform [field FieldB] : Object | +| H.cs:122:18:122:18 | a : A [field FieldA] : Object | semmle.label | a : A [field FieldA] : Object | +| H.cs:124:16:124:27 | call to method Transform : B [field FieldB] : Object | semmle.label | call to method Transform : B [field FieldB] : Object | | H.cs:124:16:124:34 | access to field FieldB : Object | semmle.label | access to field FieldB : Object | -| H.cs:124:26:124:26 | access to parameter a [field FieldA] : Object | semmle.label | access to parameter a [field FieldA] : Object | -| H.cs:130:9:130:9 | [post] access to local variable a [field FieldA] : Object | semmle.label | [post] access to local variable a [field FieldA] : Object | +| H.cs:124:26:124:26 | access to parameter a : A [field FieldA] : Object | semmle.label | access to parameter a : A [field FieldA] : Object | +| H.cs:130:9:130:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:130:20:130:36 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:131:14:131:19 | call to method Get | semmle.label | call to method Get | -| H.cs:131:18:131:18 | access to local variable a [field FieldA] : Object | semmle.label | access to local variable a [field FieldA] : Object | +| H.cs:131:18:131:18 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | | H.cs:138:27:138:27 | o : A | semmle.label | o : A | -| H.cs:141:9:141:9 | [post] access to local variable a [field FieldA] : A | semmle.label | [post] access to local variable a [field FieldA] : A | +| H.cs:141:9:141:9 | [post] access to local variable a : A [field FieldA] : A | semmle.label | [post] access to local variable a : A [field FieldA] : A | | H.cs:141:20:141:25 | ... as ... : A | semmle.label | ... as ... : A | -| H.cs:142:16:142:27 | call to method Transform [field FieldB] : A | semmle.label | call to method Transform [field FieldB] : A | +| H.cs:142:16:142:27 | call to method Transform : B [field FieldB] : A | semmle.label | call to method Transform : B [field FieldB] : A | | H.cs:142:16:142:34 | access to field FieldB : A | semmle.label | access to field FieldB : A | -| H.cs:142:26:142:26 | access to local variable a [field FieldA] : A | semmle.label | access to local variable a [field FieldA] : A | +| H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | semmle.label | access to local variable a : A [field FieldA] : A | | H.cs:147:17:147:39 | call to method Through : A | semmle.label | call to method Through : A | | H.cs:147:25:147:38 | call to method Source : A | semmle.label | call to method Source : A | | H.cs:148:14:148:14 | access to local variable a | semmle.label | access to local variable a | | H.cs:153:32:153:32 | o : Object | semmle.label | o : Object | | H.cs:155:17:155:30 | call to method Source : B | semmle.label | call to method Source : B | -| H.cs:156:9:156:9 | [post] access to local variable b [field FieldB] : Object | semmle.label | [post] access to local variable b [field FieldB] : Object | +| H.cs:156:9:156:9 | [post] access to local variable b : B [field FieldB] : Object | semmle.label | [post] access to local variable b : B [field FieldB] : Object | | H.cs:156:9:156:9 | access to local variable b : B | semmle.label | access to local variable b : B | | H.cs:156:20:156:20 | access to parameter o : Object | semmle.label | access to parameter o : Object | -| H.cs:157:9:157:9 | [post] access to parameter a [field FieldA, field FieldB] : Object | semmle.label | [post] access to parameter a [field FieldA, field FieldB] : Object | -| H.cs:157:9:157:9 | [post] access to parameter a [field FieldA] : B | semmle.label | [post] access to parameter a [field FieldA] : B | +| H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | semmle.label | [post] access to parameter a : A [field FieldA, field FieldB] : Object | +| H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA] : B | semmle.label | [post] access to parameter a : A [field FieldA] : B | | H.cs:157:20:157:20 | access to local variable b : B | semmle.label | access to local variable b : B | -| H.cs:157:20:157:20 | access to local variable b [field FieldB] : Object | semmle.label | access to local variable b [field FieldB] : Object | +| H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:163:17:163:35 | call to method Source : Object | semmle.label | call to method Source : Object | -| H.cs:164:19:164:19 | [post] access to local variable a [field FieldA, field FieldB] : Object | semmle.label | [post] access to local variable a [field FieldA, field FieldB] : Object | -| H.cs:164:19:164:19 | [post] access to local variable a [field FieldA] : B | semmle.label | [post] access to local variable a [field FieldA] : B | +| H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | semmle.label | [post] access to local variable a : A [field FieldA, field FieldB] : Object | +| H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA] : B | semmle.label | [post] access to local variable a : A [field FieldA] : B | | H.cs:164:22:164:22 | access to local variable o : Object | semmle.label | access to local variable o : Object | | H.cs:165:17:165:27 | (...) ... : B | semmle.label | (...) ... : B | -| H.cs:165:17:165:27 | (...) ... [field FieldB] : Object | semmle.label | (...) ... [field FieldB] : Object | -| H.cs:165:20:165:20 | access to local variable a [field FieldA, field FieldB] : Object | semmle.label | access to local variable a [field FieldA, field FieldB] : Object | -| H.cs:165:20:165:20 | access to local variable a [field FieldA] : B | semmle.label | access to local variable a [field FieldA] : B | +| H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | semmle.label | (...) ... : B [field FieldB] : Object | +| H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | semmle.label | access to local variable a : A [field FieldA, field FieldB] : Object | +| H.cs:165:20:165:20 | access to local variable a : A [field FieldA] : B | semmle.label | access to local variable a : A [field FieldA] : B | | H.cs:165:20:165:27 | access to field FieldA : B | semmle.label | access to field FieldA : B | -| H.cs:165:20:165:27 | access to field FieldA [field FieldB] : Object | semmle.label | access to field FieldA [field FieldB] : Object | +| H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | semmle.label | access to field FieldA : B [field FieldB] : Object | | H.cs:166:14:166:14 | access to local variable b | semmle.label | access to local variable b | -| H.cs:167:14:167:14 | access to local variable b [field FieldB] : Object | semmle.label | access to local variable b [field FieldB] : Object | +| H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:167:14:167:21 | access to field FieldB | semmle.label | access to field FieldB | -| I.cs:7:9:7:14 | [post] this access [field Field1] : Object | semmle.label | [post] this access [field Field1] : Object | +| I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | semmle.label | [post] this access : I [field Field1] : Object | | I.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:13:17:13:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| I.cs:15:9:15:9 | [post] access to local variable i [field Field1] : Object | semmle.label | [post] access to local variable i [field Field1] : Object | +| I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | semmle.label | [post] access to local variable i : I [field Field1] : Object | | I.cs:15:20:15:20 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| I.cs:16:9:16:9 | access to local variable i [field Field1] : Object | semmle.label | access to local variable i [field Field1] : Object | -| I.cs:17:9:17:9 | access to local variable i [field Field1] : Object | semmle.label | access to local variable i [field Field1] : Object | -| I.cs:18:14:18:14 | access to local variable i [field Field1] : Object | semmle.label | access to local variable i [field Field1] : Object | +| I.cs:16:9:16:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | +| I.cs:17:9:17:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | +| I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:18:14:18:21 | access to field Field1 | semmle.label | access to field Field1 | -| I.cs:21:13:21:19 | object creation of type I [field Field1] : Object | semmle.label | object creation of type I [field Field1] : Object | -| I.cs:22:9:22:9 | access to local variable i [field Field1] : Object | semmle.label | access to local variable i [field Field1] : Object | -| I.cs:23:14:23:14 | access to local variable i [field Field1] : Object | semmle.label | access to local variable i [field Field1] : Object | +| I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | semmle.label | object creation of type I : I [field Field1] : Object | +| I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | +| I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:23:14:23:21 | access to field Field1 | semmle.label | access to field Field1 | -| I.cs:26:13:26:37 | [pre-initializer] object creation of type I [field Field1] : Object | semmle.label | [pre-initializer] object creation of type I [field Field1] : Object | -| I.cs:27:14:27:14 | access to local variable i [field Field1] : Object | semmle.label | access to local variable i [field Field1] : Object | +| I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | semmle.label | [pre-initializer] object creation of type I : I [field Field1] : Object | +| I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:27:14:27:21 | access to field Field1 | semmle.label | access to field Field1 | | I.cs:31:13:31:29 | call to method Source : Object | semmle.label | call to method Source : Object | -| I.cs:32:9:32:9 | [post] access to local variable i [field Field1] : Object | semmle.label | [post] access to local variable i [field Field1] : Object | +| I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | semmle.label | [post] access to local variable i : I [field Field1] : Object | | I.cs:32:20:32:20 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| I.cs:33:9:33:9 | access to local variable i [field Field1] : Object | semmle.label | access to local variable i [field Field1] : Object | -| I.cs:34:12:34:12 | access to local variable i [field Field1] : Object | semmle.label | access to local variable i [field Field1] : Object | -| I.cs:37:23:37:23 | i [field Field1] : Object | semmle.label | i [field Field1] : Object | -| I.cs:39:9:39:9 | access to parameter i [field Field1] : Object | semmle.label | access to parameter i [field Field1] : Object | -| I.cs:40:14:40:14 | access to parameter i [field Field1] : Object | semmle.label | access to parameter i [field Field1] : Object | +| I.cs:33:9:33:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | +| I.cs:34:12:34:12 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | +| I.cs:37:23:37:23 | i : I [field Field1] : Object | semmle.label | i : I [field Field1] : Object | +| I.cs:39:9:39:9 | access to parameter i : I [field Field1] : Object | semmle.label | access to parameter i : I [field Field1] : Object | +| I.cs:40:14:40:14 | access to parameter i : I [field Field1] : Object | semmle.label | access to parameter i : I [field Field1] : Object | | I.cs:40:14:40:21 | access to field Field1 | semmle.label | access to field Field1 | | J.cs:14:26:14:30 | field : Object | semmle.label | field : Object | | J.cs:14:40:14:43 | prop : Object | semmle.label | prop : Object | -| J.cs:14:50:14:54 | [post] this access [field Field] : Object | semmle.label | [post] this access [field Field] : Object | -| J.cs:14:57:14:60 | [post] this access [property Prop] : Object | semmle.label | [post] this access [property Prop] : Object | +| J.cs:14:50:14:54 | [post] this access : Struct [field Field] : Object | semmle.label | [post] this access : Struct [field Field] : Object | +| J.cs:14:57:14:60 | [post] this access : Struct [property Prop] : Object | semmle.label | [post] this access : Struct [property Prop] : Object | | J.cs:14:66:14:70 | access to parameter field : Object | semmle.label | access to parameter field : Object | | J.cs:14:73:14:76 | access to parameter prop : Object | semmle.label | access to parameter prop : Object | | J.cs:21:17:21:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| J.cs:22:18:22:41 | object creation of type RecordClass [property Prop1] : Object | semmle.label | object creation of type RecordClass [property Prop1] : Object | +| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | semmle.label | object creation of type RecordClass : RecordClass [property Prop1] : Object | | J.cs:22:34:22:34 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| J.cs:23:14:23:15 | access to local variable r1 [property Prop1] : Object | semmle.label | access to local variable r1 [property Prop1] : Object | +| J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r1 : RecordClass [property Prop1] : Object | | J.cs:23:14:23:21 | access to property Prop1 | semmle.label | access to property Prop1 | -| J.cs:27:14:27:15 | access to local variable r2 [property Prop1] : Object | semmle.label | access to local variable r2 [property Prop1] : Object | +| J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r2 : RecordClass [property Prop1] : Object | | J.cs:27:14:27:21 | access to property Prop1 | semmle.label | access to property Prop1 | -| J.cs:30:18:30:54 | ... with { ... } [property Prop2] : Object | semmle.label | ... with { ... } [property Prop2] : Object | +| J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | semmle.label | ... with { ... } : RecordClass [property Prop2] : Object | | J.cs:30:36:30:52 | call to method Source : Object | semmle.label | call to method Source : Object | -| J.cs:31:14:31:15 | access to local variable r3 [property Prop1] : Object | semmle.label | access to local variable r3 [property Prop1] : Object | +| J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop1] : Object | | J.cs:31:14:31:21 | access to property Prop1 | semmle.label | access to property Prop1 | -| J.cs:32:14:32:15 | access to local variable r3 [property Prop2] : Object | semmle.label | access to local variable r3 [property Prop2] : Object | +| J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop2] : Object | | J.cs:32:14:32:21 | access to property Prop2 | semmle.label | access to property Prop2 | | J.cs:41:17:41:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| J.cs:42:18:42:42 | object creation of type RecordStruct [property Prop1] : Object | semmle.label | object creation of type RecordStruct [property Prop1] : Object | +| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | semmle.label | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | | J.cs:42:35:42:35 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| J.cs:43:14:43:15 | access to local variable r1 [property Prop1] : Object | semmle.label | access to local variable r1 [property Prop1] : Object | +| J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r1 : RecordStruct [property Prop1] : Object | | J.cs:43:14:43:21 | access to property Prop1 | semmle.label | access to property Prop1 | -| J.cs:47:14:47:15 | access to local variable r2 [property Prop1] : Object | semmle.label | access to local variable r2 [property Prop1] : Object | +| J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r2 : RecordStruct [property Prop1] : Object | | J.cs:47:14:47:21 | access to property Prop1 | semmle.label | access to property Prop1 | -| J.cs:50:18:50:54 | ... with { ... } [property Prop2] : Object | semmle.label | ... with { ... } [property Prop2] : Object | +| J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | semmle.label | ... with { ... } : RecordStruct [property Prop2] : Object | | J.cs:50:36:50:52 | call to method Source : Object | semmle.label | call to method Source : Object | -| J.cs:51:14:51:15 | access to local variable r3 [property Prop1] : Object | semmle.label | access to local variable r3 [property Prop1] : Object | +| J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop1] : Object | | J.cs:51:14:51:21 | access to property Prop1 | semmle.label | access to property Prop1 | -| J.cs:52:14:52:15 | access to local variable r3 [property Prop2] : Object | semmle.label | access to local variable r3 [property Prop2] : Object | +| J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop2] : Object | | J.cs:52:14:52:21 | access to property Prop2 | semmle.label | access to property Prop2 | | J.cs:61:17:61:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| J.cs:62:18:62:36 | object creation of type Struct [field Field] : Object | semmle.label | object creation of type Struct [field Field] : Object | +| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | semmle.label | object creation of type Struct : Struct [field Field] : Object | | J.cs:62:29:62:29 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| J.cs:65:14:65:15 | access to local variable s2 [field Field] : Object | semmle.label | access to local variable s2 [field Field] : Object | +| J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | semmle.label | access to local variable s2 : Struct [field Field] : Object | | J.cs:65:14:65:21 | access to field Field | semmle.label | access to field Field | -| J.cs:68:18:68:53 | ... with { ... } [property Prop] : Object | semmle.label | ... with { ... } [property Prop] : Object | +| J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | semmle.label | ... with { ... } : Struct [property Prop] : Object | | J.cs:68:35:68:51 | call to method Source : Object | semmle.label | call to method Source : Object | -| J.cs:69:14:69:15 | access to local variable s3 [field Field] : Object | semmle.label | access to local variable s3 [field Field] : Object | +| J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | semmle.label | access to local variable s3 : Struct [field Field] : Object | | J.cs:69:14:69:21 | access to field Field | semmle.label | access to field Field | -| J.cs:70:14:70:15 | access to local variable s3 [property Prop] : Object | semmle.label | access to local variable s3 [property Prop] : Object | +| J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | | J.cs:70:14:70:20 | access to property Prop | semmle.label | access to property Prop | | J.cs:79:17:79:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| J.cs:80:18:80:36 | object creation of type Struct [property Prop] : Object | semmle.label | object creation of type Struct [property Prop] : Object | +| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | semmle.label | object creation of type Struct : Struct [property Prop] : Object | | J.cs:80:35:80:35 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| J.cs:84:14:84:15 | access to local variable s2 [property Prop] : Object | semmle.label | access to local variable s2 [property Prop] : Object | +| J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | semmle.label | access to local variable s2 : Struct [property Prop] : Object | | J.cs:84:14:84:20 | access to property Prop | semmle.label | access to property Prop | -| J.cs:86:18:86:54 | ... with { ... } [field Field] : Object | semmle.label | ... with { ... } [field Field] : Object | +| J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | semmle.label | ... with { ... } : Struct [field Field] : Object | | J.cs:86:36:86:52 | call to method Source : Object | semmle.label | call to method Source : Object | -| J.cs:87:14:87:15 | access to local variable s3 [field Field] : Object | semmle.label | access to local variable s3 [field Field] : Object | +| J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | semmle.label | access to local variable s3 : Struct [field Field] : Object | | J.cs:87:14:87:21 | access to field Field | semmle.label | access to field Field | -| J.cs:88:14:88:15 | access to local variable s3 [property Prop] : Object | semmle.label | access to local variable s3 [property Prop] : Object | +| J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | | J.cs:88:14:88:20 | access to property Prop | semmle.label | access to property Prop | | J.cs:97:17:97:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| J.cs:99:18:99:41 | { ..., ... } [property X] : Object | semmle.label | { ..., ... } [property X] : Object | +| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | semmle.label | { ..., ... } : <>__AnonType0 [property X] : Object | | J.cs:99:28:99:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | -| J.cs:102:14:102:15 | access to local variable a2 [property X] : Object | semmle.label | access to local variable a2 [property X] : Object | +| J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a2 : <>__AnonType0 [property X] : Object | | J.cs:102:14:102:17 | access to property X | semmle.label | access to property X | -| J.cs:105:18:105:50 | ... with { ... } [property Y] : Object | semmle.label | ... with { ... } [property Y] : Object | +| J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | semmle.label | ... with { ... } : <>__AnonType0 [property Y] : Object | | J.cs:105:32:105:48 | call to method Source : Object | semmle.label | call to method Source : Object | -| J.cs:106:14:106:15 | access to local variable a3 [property X] : Object | semmle.label | access to local variable a3 [property X] : Object | +| J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a3 : <>__AnonType0 [property X] : Object | | J.cs:106:14:106:17 | access to property X | semmle.label | access to property X | -| J.cs:107:14:107:15 | access to local variable a3 [property Y] : Object | semmle.label | access to local variable a3 [property Y] : Object | +| J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | semmle.label | access to local variable a3 : <>__AnonType0 [property Y] : Object | | J.cs:107:14:107:17 | access to property Y | semmle.label | access to property Y | -| J.cs:119:13:119:13 | [post] access to local variable a [element] : Int32 | semmle.label | [post] access to local variable a [element] : Int32 | +| J.cs:119:13:119:13 | [post] access to local variable a : Int32[] [element] : Int32 | semmle.label | [post] access to local variable a : Int32[] [element] : Int32 | | J.cs:119:20:119:34 | call to method Source : Int32 | semmle.label | call to method Source : Int32 | -| J.cs:125:14:125:14 | access to local variable a [element] : Int32 | semmle.label | access to local variable a [element] : Int32 | +| J.cs:125:14:125:14 | access to local variable a : Int32[] [element] : Int32 | semmle.label | access to local variable a : Int32[] [element] : Int32 | | J.cs:125:14:125:17 | (...) ... | semmle.label | (...) ... | | J.cs:125:14:125:17 | access to array element : Int32 | semmle.label | access to array element : Int32 | subpaths -| A.cs:6:24:6:24 | access to local variable c : C | A.cs:147:32:147:32 | c : C | A.cs:149:20:149:27 | object creation of type B [field c] : C | A.cs:6:17:6:25 | call to method Make [field c] : C | -| A.cs:13:15:13:29 | call to method Source : C1 | A.cs:145:27:145:27 | c : C1 | A.cs:145:32:145:35 | [post] this access [field c] : C1 | A.cs:13:9:13:9 | [post] access to local variable b [field c] : C1 | -| A.cs:14:14:14:14 | access to local variable b [field c] : C1 | A.cs:146:18:146:20 | this [field c] : C1 | A.cs:146:33:146:38 | access to field c : C1 | A.cs:14:14:14:20 | call to method Get | -| A.cs:15:15:15:35 | object creation of type B [field c] : C | A.cs:146:18:146:20 | this [field c] : C | A.cs:146:33:146:38 | access to field c : C | A.cs:15:14:15:42 | call to method Get | -| A.cs:15:21:15:34 | call to method Source : C | A.cs:141:20:141:20 | c : C | A.cs:143:13:143:16 | [post] this access [field c] : C | A.cs:15:15:15:35 | object creation of type B [field c] : C | -| A.cs:22:25:22:37 | call to method Source : C2 | A.cs:42:29:42:29 | c : C2 | A.cs:48:20:48:21 | access to local variable b2 [field c] : C2 | A.cs:22:14:22:38 | call to method SetOnB [field c] : C2 | -| A.cs:31:29:31:41 | call to method Source : C2 | A.cs:36:33:36:33 | c : C2 | A.cs:39:16:39:28 | ... ? ... : ... [field c] : C2 | A.cs:31:14:31:42 | call to method SetOnBWrap [field c] : C2 | -| A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:42:29:42:29 | c : C2 | A.cs:48:20:48:21 | access to local variable b2 [field c] : C2 | A.cs:38:18:38:30 | call to method SetOnB [field c] : C2 | -| A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:145:27:145:27 | c : C2 | A.cs:145:32:145:35 | [post] this access [field c] : C2 | A.cs:47:13:47:14 | [post] access to local variable b2 [field c] : C2 | -| A.cs:83:15:83:26 | call to method Source : C | A.cs:145:27:145:27 | c : C | A.cs:145:32:145:35 | [post] this access [field c] : C | A.cs:83:9:83:9 | [post] access to parameter b [field c] : C | -| A.cs:105:23:105:23 | access to local variable b : B | A.cs:95:20:95:20 | b : B | A.cs:98:13:98:16 | [post] this access [field b] : B | A.cs:105:17:105:29 | object creation of type D [field b] : B | -| A.cs:114:29:114:29 | access to local variable b : B | A.cs:157:25:157:28 | head : B | A.cs:159:13:159:16 | [post] this access [field head] : B | A.cs:114:18:114:54 | object creation of type MyList [field head] : B | -| A.cs:115:35:115:36 | access to local variable l1 [field head] : B | A.cs:157:38:157:41 | next [field head] : B | A.cs:160:13:160:16 | [post] this access [field next, field head] : B | A.cs:115:18:115:37 | object creation of type MyList [field next, field head] : B | -| A.cs:116:35:116:36 | access to local variable l2 [field next, field head] : B | A.cs:157:38:157:41 | next [field next, field head] : B | A.cs:160:13:160:16 | [post] this access [field next, field next, field head] : B | A.cs:116:18:116:37 | object creation of type MyList [field next, field next, field head] : B | -| A.cs:149:26:149:26 | access to parameter c : C | A.cs:141:20:141:20 | c : C | A.cs:143:13:143:16 | [post] this access [field c] : C | A.cs:149:20:149:27 | object creation of type B [field c] : C | -| B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:29:26:29:27 | e1 : Elem | B.cs:31:13:31:16 | [post] this access [field elem1] : Elem | B.cs:6:18:6:34 | object creation of type Box1 [field elem1] : Elem | -| B.cs:7:27:7:28 | access to local variable b1 [field elem1] : Elem | B.cs:39:26:39:27 | b1 [field elem1] : Elem | B.cs:41:13:41:16 | [post] this access [field box1, field elem1] : Elem | B.cs:7:18:7:29 | object creation of type Box2 [field box1, field elem1] : Elem | -| B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:29:35:29:36 | e2 : Elem | B.cs:32:13:32:16 | [post] this access [field elem2] : Elem | B.cs:15:18:15:34 | object creation of type Box1 [field elem2] : Elem | -| B.cs:16:27:16:28 | access to local variable b1 [field elem2] : Elem | B.cs:39:26:39:27 | b1 [field elem2] : Elem | B.cs:41:13:41:16 | [post] this access [field box1, field elem2] : Elem | B.cs:16:18:16:29 | object creation of type Box2 [field box1, field elem2] : Elem | -| D.cs:15:34:15:38 | access to parameter value : Object | D.cs:9:9:9:11 | value : Object | D.cs:9:15:9:18 | [post] this access [field trivialPropField] : Object | D.cs:15:15:15:18 | [post] this access [field trivialPropField] : Object | -| D.cs:22:27:22:28 | access to parameter o2 : Object | D.cs:9:9:9:11 | value : Object | D.cs:9:15:9:18 | [post] this access [field trivialPropField] : Object | D.cs:22:9:22:11 | [post] access to local variable ret [field trivialPropField] : Object | -| D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:15:9:15:11 | value : Object | D.cs:15:15:15:18 | [post] this access [field trivialPropField] : Object | D.cs:23:9:23:11 | [post] access to local variable ret [field trivialPropField] : Object | -| D.cs:31:24:31:24 | access to local variable o : Object | D.cs:18:28:18:29 | o1 : Object | D.cs:24:16:24:18 | access to local variable ret [property AutoProp] : Object | D.cs:31:17:31:37 | call to method Create [property AutoProp] : Object | -| D.cs:37:26:37:42 | call to method Source : Object | D.cs:18:39:18:40 | o2 : Object | D.cs:24:16:24:18 | access to local variable ret [field trivialPropField] : Object | D.cs:37:13:37:49 | call to method Create [field trivialPropField] : Object | -| D.cs:39:14:39:14 | access to local variable d [field trivialPropField] : Object | D.cs:8:9:8:11 | this [field trivialPropField] : Object | D.cs:8:22:8:42 | access to field trivialPropField : Object | D.cs:39:14:39:26 | access to property TrivialProp | -| D.cs:41:14:41:14 | access to local variable d [field trivialPropField] : Object | D.cs:14:9:14:11 | this [field trivialPropField] : Object | D.cs:14:22:14:42 | access to field trivialPropField : Object | D.cs:41:14:41:26 | access to property ComplexProp | -| D.cs:43:32:43:48 | call to method Source : Object | D.cs:18:50:18:51 | o3 : Object | D.cs:24:16:24:18 | access to local variable ret [field trivialPropField] : Object | D.cs:43:13:43:49 | call to method Create [field trivialPropField] : Object | -| D.cs:45:14:45:14 | access to local variable d [field trivialPropField] : Object | D.cs:8:9:8:11 | this [field trivialPropField] : Object | D.cs:8:22:8:42 | access to field trivialPropField : Object | D.cs:45:14:45:26 | access to property TrivialProp | -| D.cs:47:14:47:14 | access to local variable d [field trivialPropField] : Object | D.cs:14:9:14:11 | this [field trivialPropField] : Object | D.cs:14:22:14:42 | access to field trivialPropField : Object | D.cs:47:14:47:26 | access to property ComplexProp | -| E.cs:23:25:23:25 | access to local variable o : Object | E.cs:8:29:8:29 | o : Object | E.cs:12:16:12:18 | access to local variable ret [field Field] : Object | E.cs:23:17:23:26 | call to method CreateS [field Field] : Object | -| F.cs:11:24:11:24 | access to local variable o : Object | F.cs:6:28:6:29 | o1 : Object | F.cs:6:46:6:81 | object creation of type F [field Field1] : Object | F.cs:11:17:11:31 | call to method Create [field Field1] : Object | -| F.cs:15:26:15:42 | call to method Source : Object | F.cs:6:39:6:40 | o2 : Object | F.cs:6:46:6:81 | object creation of type F [field Field2] : Object | F.cs:15:13:15:43 | call to method Create [field Field2] : Object | -| G.cs:17:24:17:24 | access to local variable e : Elem | G.cs:64:34:64:34 | e : Elem | G.cs:64:39:64:42 | [post] this access [field Elem] : Elem | G.cs:17:9:17:14 | [post] access to field Box1 [field Elem] : Elem | -| G.cs:33:29:33:29 | access to local variable e : Elem | G.cs:64:34:64:34 | e : Elem | G.cs:64:39:64:42 | [post] this access [field Elem] : Elem | G.cs:33:9:33:19 | [post] call to method GetBox1 [field Elem] : Elem | -| G.cs:39:14:39:15 | access to parameter b2 [field Box1, field Elem] : Elem | G.cs:71:21:71:27 | this [field Box1, field Elem] : Elem | G.cs:71:34:71:37 | access to field Box1 [field Elem] : Elem | G.cs:39:14:39:25 | call to method GetBox1 [field Elem] : Elem | -| G.cs:39:14:39:25 | call to method GetBox1 [field Elem] : Elem | G.cs:63:21:63:27 | this [field Elem] : Elem | G.cs:63:34:63:37 | access to field Elem : Elem | G.cs:39:14:39:35 | call to method GetElem | -| H.cs:24:27:24:27 | access to local variable a [field FieldA] : Object | H.cs:13:15:13:15 | a [field FieldA] : Object | H.cs:17:16:17:18 | access to local variable ret [field FieldA] : Object | H.cs:24:21:24:28 | call to method Clone [field FieldA] : Object | -| H.cs:44:27:44:27 | access to local variable a [field FieldA] : Object | H.cs:33:19:33:19 | a [field FieldA] : Object | H.cs:37:16:37:16 | access to local variable b [field FieldB] : Object | H.cs:44:17:44:28 | call to method Transform [field FieldB] : Object | -| H.cs:64:22:64:22 | access to local variable a [field FieldA] : Object | H.cs:53:25:53:25 | a [field FieldA] : Object | H.cs:55:9:55:10 | [post] access to parameter b1 [field FieldB] : Object | H.cs:64:25:64:26 | [post] access to local variable b1 [field FieldB] : Object | -| H.cs:80:22:80:22 | access to parameter a [field FieldA] : Object | H.cs:53:25:53:25 | a [field FieldA] : Object | H.cs:55:9:55:10 | [post] access to parameter b1 [field FieldB] : Object | H.cs:80:25:80:26 | [post] access to parameter b1 [field FieldB] : Object | -| H.cs:88:20:88:36 | call to method Source : Object | H.cs:77:30:77:30 | o : Object | H.cs:79:9:79:9 | [post] access to parameter a [field FieldA] : Object | H.cs:88:17:88:17 | [post] access to local variable a [field FieldA] : Object | -| H.cs:88:20:88:36 | call to method Source : Object | H.cs:77:30:77:30 | o : Object | H.cs:80:25:80:26 | [post] access to parameter b1 [field FieldB] : Object | H.cs:88:39:88:40 | [post] access to local variable b1 [field FieldB] : Object | -| H.cs:106:26:106:39 | (...) ... [field FieldA] : Object | H.cs:33:19:33:19 | a [field FieldA] : Object | H.cs:37:16:37:16 | access to local variable b [field FieldB] : Object | H.cs:106:16:106:40 | call to method Transform [field FieldB] : Object | -| H.cs:113:31:113:31 | access to local variable a [field FieldA] : Object | H.cs:102:23:102:23 | a [field FieldA] : Object | H.cs:106:16:106:40 | call to method Transform [field FieldB] : Object | H.cs:113:17:113:32 | call to method TransformWrap [field FieldB] : Object | -| H.cs:124:26:124:26 | access to parameter a [field FieldA] : Object | H.cs:33:19:33:19 | a [field FieldA] : Object | H.cs:37:16:37:16 | access to local variable b [field FieldB] : Object | H.cs:124:16:124:27 | call to method Transform [field FieldB] : Object | -| H.cs:131:18:131:18 | access to local variable a [field FieldA] : Object | H.cs:122:18:122:18 | a [field FieldA] : Object | H.cs:124:16:124:34 | access to field FieldB : Object | H.cs:131:14:131:19 | call to method Get | -| H.cs:142:26:142:26 | access to local variable a [field FieldA] : A | H.cs:33:19:33:19 | a [field FieldA] : A | H.cs:37:16:37:16 | access to local variable b [field FieldB] : A | H.cs:142:16:142:27 | call to method Transform [field FieldB] : A | +| A.cs:6:24:6:24 | access to local variable c : C | A.cs:147:32:147:32 | c : C | A.cs:149:20:149:27 | object creation of type B : B [field c] : C | A.cs:6:17:6:25 | call to method Make : B [field c] : C | +| A.cs:13:15:13:29 | call to method Source : C1 | A.cs:145:27:145:27 | c : C1 | A.cs:145:32:145:35 | [post] this access : B [field c] : C1 | A.cs:13:9:13:9 | [post] access to local variable b : B [field c] : C1 | +| A.cs:14:14:14:14 | access to local variable b : B [field c] : C1 | A.cs:146:18:146:20 | this : B [field c] : C1 | A.cs:146:33:146:38 | access to field c : C1 | A.cs:14:14:14:20 | call to method Get | +| A.cs:15:15:15:35 | object creation of type B : B [field c] : C | A.cs:146:18:146:20 | this : B [field c] : C | A.cs:146:33:146:38 | access to field c : C | A.cs:15:14:15:42 | call to method Get | +| A.cs:15:21:15:34 | call to method Source : C | A.cs:141:20:141:20 | c : C | A.cs:143:13:143:16 | [post] this access : B [field c] : C | A.cs:15:15:15:35 | object creation of type B : B [field c] : C | +| A.cs:22:25:22:37 | call to method Source : C2 | A.cs:42:29:42:29 | c : C2 | A.cs:48:20:48:21 | access to local variable b2 : B [field c] : C2 | A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | +| A.cs:31:29:31:41 | call to method Source : C2 | A.cs:36:33:36:33 | c : C2 | A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | +| A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:42:29:42:29 | c : C2 | A.cs:48:20:48:21 | access to local variable b2 : B [field c] : C2 | A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | +| A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:145:27:145:27 | c : C2 | A.cs:145:32:145:35 | [post] this access : B [field c] : C2 | A.cs:47:13:47:14 | [post] access to local variable b2 : B [field c] : C2 | +| A.cs:83:15:83:26 | call to method Source : C | A.cs:145:27:145:27 | c : C | A.cs:145:32:145:35 | [post] this access : B [field c] : C | A.cs:83:9:83:9 | [post] access to parameter b : B [field c] : C | +| A.cs:105:23:105:23 | access to local variable b : B | A.cs:95:20:95:20 | b : B | A.cs:98:13:98:16 | [post] this access : D [field b] : B | A.cs:105:17:105:29 | object creation of type D : D [field b] : B | +| A.cs:114:29:114:29 | access to local variable b : B | A.cs:157:25:157:28 | head : B | A.cs:159:13:159:16 | [post] this access : MyList [field head] : B | A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | +| A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:157:38:157:41 | next : MyList [field head] : B | A.cs:160:13:160:16 | [post] this access : MyList [field next, field head] : B | A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | +| A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | A.cs:157:38:157:41 | next : MyList [field next, field head] : B | A.cs:160:13:160:16 | [post] this access : MyList [field next, field next, field head] : B | A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | +| A.cs:149:26:149:26 | access to parameter c : C | A.cs:141:20:141:20 | c : C | A.cs:143:13:143:16 | [post] this access : B [field c] : C | A.cs:149:20:149:27 | object creation of type B : B [field c] : C | +| B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:29:26:29:27 | e1 : Elem | B.cs:31:13:31:16 | [post] this access : Box1 [field elem1] : Elem | B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | +| B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:39:26:39:27 | b1 : Box1 [field elem1] : Elem | B.cs:41:13:41:16 | [post] this access : Box2 [field box1, field elem1] : Elem | B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | +| B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:29:35:29:36 | e2 : Elem | B.cs:32:13:32:16 | [post] this access : Box1 [field elem2] : Elem | B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | +| B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:39:26:39:27 | b1 : Box1 [field elem2] : Elem | B.cs:41:13:41:16 | [post] this access : Box2 [field box1, field elem2] : Elem | B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | +| D.cs:15:34:15:38 | access to parameter value : Object | D.cs:9:9:9:11 | value : Object | D.cs:9:15:9:18 | [post] this access : D [field trivialPropField] : Object | D.cs:15:15:15:18 | [post] this access : D [field trivialPropField] : Object | +| D.cs:22:27:22:28 | access to parameter o2 : Object | D.cs:9:9:9:11 | value : Object | D.cs:9:15:9:18 | [post] this access : D [field trivialPropField] : Object | D.cs:22:9:22:11 | [post] access to local variable ret : D [field trivialPropField] : Object | +| D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:15:9:15:11 | value : Object | D.cs:15:15:15:18 | [post] this access : D [field trivialPropField] : Object | D.cs:23:9:23:11 | [post] access to local variable ret : D [field trivialPropField] : Object | +| D.cs:31:24:31:24 | access to local variable o : Object | D.cs:18:28:18:29 | o1 : Object | D.cs:24:16:24:18 | access to local variable ret : D [property AutoProp] : Object | D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | +| D.cs:37:26:37:42 | call to method Source : Object | D.cs:18:39:18:40 | o2 : Object | D.cs:24:16:24:18 | access to local variable ret : D [field trivialPropField] : Object | D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | +| D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:8:9:8:11 | this : D [field trivialPropField] : Object | D.cs:8:22:8:42 | access to field trivialPropField : Object | D.cs:39:14:39:26 | access to property TrivialProp | +| D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:14:9:14:11 | this : D [field trivialPropField] : Object | D.cs:14:22:14:42 | access to field trivialPropField : Object | D.cs:41:14:41:26 | access to property ComplexProp | +| D.cs:43:32:43:48 | call to method Source : Object | D.cs:18:50:18:51 | o3 : Object | D.cs:24:16:24:18 | access to local variable ret : D [field trivialPropField] : Object | D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | +| D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:8:9:8:11 | this : D [field trivialPropField] : Object | D.cs:8:22:8:42 | access to field trivialPropField : Object | D.cs:45:14:45:26 | access to property TrivialProp | +| D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:14:9:14:11 | this : D [field trivialPropField] : Object | D.cs:14:22:14:42 | access to field trivialPropField : Object | D.cs:47:14:47:26 | access to property ComplexProp | +| E.cs:23:25:23:25 | access to local variable o : Object | E.cs:8:29:8:29 | o : Object | E.cs:12:16:12:18 | access to local variable ret : S [field Field] : Object | E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | +| F.cs:11:24:11:24 | access to local variable o : Object | F.cs:6:28:6:29 | o1 : Object | F.cs:6:46:6:81 | object creation of type F : F [field Field1] : Object | F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | +| F.cs:15:26:15:42 | call to method Source : Object | F.cs:6:39:6:40 | o2 : Object | F.cs:6:46:6:81 | object creation of type F : F [field Field2] : Object | F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | +| G.cs:17:24:17:24 | access to local variable e : Elem | G.cs:64:34:64:34 | e : Elem | G.cs:64:39:64:42 | [post] this access : Box1 [field Elem] : Elem | G.cs:17:9:17:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | +| G.cs:33:29:33:29 | access to local variable e : Elem | G.cs:64:34:64:34 | e : Elem | G.cs:64:39:64:42 | [post] this access : Box1 [field Elem] : Elem | G.cs:33:9:33:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | +| G.cs:39:14:39:15 | access to parameter b2 : Box2 [field Box1, field Elem] : Elem | G.cs:71:21:71:27 | this : Box2 [field Box1, field Elem] : Elem | G.cs:71:34:71:37 | access to field Box1 : Box1 [field Elem] : Elem | G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | +| G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:63:21:63:27 | this : Box1 [field Elem] : Elem | G.cs:63:34:63:37 | access to field Elem : Elem | G.cs:39:14:39:35 | call to method GetElem | +| H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | H.cs:13:15:13:15 | a : A [field FieldA] : Object | H.cs:17:16:17:18 | access to local variable ret : A [field FieldA] : Object | H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | +| H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | H.cs:37:16:37:16 | access to local variable b : B [field FieldB] : Object | H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | +| H.cs:64:22:64:22 | access to local variable a : A [field FieldA] : Object | H.cs:53:25:53:25 | a : A [field FieldA] : Object | H.cs:55:9:55:10 | [post] access to parameter b1 : B [field FieldB] : Object | H.cs:64:25:64:26 | [post] access to local variable b1 : B [field FieldB] : Object | +| H.cs:80:22:80:22 | access to parameter a : A [field FieldA] : Object | H.cs:53:25:53:25 | a : A [field FieldA] : Object | H.cs:55:9:55:10 | [post] access to parameter b1 : B [field FieldB] : Object | H.cs:80:25:80:26 | [post] access to parameter b1 : B [field FieldB] : Object | +| H.cs:88:20:88:36 | call to method Source : Object | H.cs:77:30:77:30 | o : Object | H.cs:79:9:79:9 | [post] access to parameter a : A [field FieldA] : Object | H.cs:88:17:88:17 | [post] access to local variable a : A [field FieldA] : Object | +| H.cs:88:20:88:36 | call to method Source : Object | H.cs:77:30:77:30 | o : Object | H.cs:80:25:80:26 | [post] access to parameter b1 : B [field FieldB] : Object | H.cs:88:39:88:40 | [post] access to local variable b1 : B [field FieldB] : Object | +| H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | H.cs:37:16:37:16 | access to local variable b : B [field FieldB] : Object | H.cs:106:16:106:40 | call to method Transform : B [field FieldB] : Object | +| H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | H.cs:102:23:102:23 | a : A [field FieldA] : Object | H.cs:106:16:106:40 | call to method Transform : B [field FieldB] : Object | H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | +| H.cs:124:26:124:26 | access to parameter a : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | H.cs:37:16:37:16 | access to local variable b : B [field FieldB] : Object | H.cs:124:16:124:27 | call to method Transform : B [field FieldB] : Object | +| H.cs:131:18:131:18 | access to local variable a : A [field FieldA] : Object | H.cs:122:18:122:18 | a : A [field FieldA] : Object | H.cs:124:16:124:34 | access to field FieldB : Object | H.cs:131:14:131:19 | call to method Get | +| H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | H.cs:33:19:33:19 | a : A [field FieldA] : A | H.cs:37:16:37:16 | access to local variable b : B [field FieldB] : A | H.cs:142:16:142:27 | call to method Transform : B [field FieldB] : A | | H.cs:147:25:147:38 | call to method Source : A | H.cs:138:27:138:27 | o : A | H.cs:142:16:142:34 | access to field FieldB : A | H.cs:147:17:147:39 | call to method Through : A | -| H.cs:164:22:164:22 | access to local variable o : Object | H.cs:153:32:153:32 | o : Object | H.cs:157:9:157:9 | [post] access to parameter a [field FieldA, field FieldB] : Object | H.cs:164:19:164:19 | [post] access to local variable a [field FieldA, field FieldB] : Object | -| J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | J.cs:14:50:14:54 | [post] this access [field Field] : Object | J.cs:62:18:62:36 | object creation of type Struct [field Field] : Object | -| J.cs:80:35:80:35 | access to local variable o : Object | J.cs:14:40:14:43 | prop : Object | J.cs:14:57:14:60 | [post] this access [property Prop] : Object | J.cs:80:18:80:36 | object creation of type Struct [property Prop] : Object | +| H.cs:164:22:164:22 | access to local variable o : Object | H.cs:153:32:153:32 | o : Object | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | +| J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | J.cs:14:50:14:54 | [post] this access : Struct [field Field] : Object | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | +| J.cs:80:35:80:35 | access to local variable o : Object | J.cs:14:40:14:43 | prop : Object | J.cs:14:57:14:60 | [post] this access : Struct [property Prop] : Object | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | #select | A.cs:7:14:7:16 | access to field c | A.cs:5:17:5:28 | call to method Source : C | A.cs:7:14:7:16 | access to field c | $@ | A.cs:5:17:5:28 | call to method Source : C | call to method Source : C | | A.cs:14:14:14:20 | call to method Get | A.cs:13:15:13:29 | call to method Source : C1 | A.cs:14:14:14:20 | call to method Get | $@ | A.cs:13:15:13:29 | call to method Source : C1 | call to method Source : C1 | diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected index 64f0c8f37b9..bce1914e42b 100644 --- a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected @@ -125,32 +125,32 @@ edges | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | -| GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven [element] : String | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | +| GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | -| GlobalDataFlow.cs:81:23:81:65 | (...) ... [element] : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven [element] : String | -| GlobalDataFlow.cs:81:23:81:65 | (...) ... [element] : String | GlobalDataFlow.cs:570:71:570:71 | e [element] : String | -| GlobalDataFlow.cs:81:57:81:65 | { ..., ... } [element] : String | GlobalDataFlow.cs:81:23:81:65 | (...) ... [element] : String | -| GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } [element] : String | +| GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | +| GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:570:71:570:71 | e : null [element] : String | +| GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | +| GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:81:79:81:79 | x : String | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | -| GlobalDataFlow.cs:83:22:83:87 | call to method Select [element] : String | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | +| GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | -| GlobalDataFlow.cs:83:23:83:66 | (...) ... [element] : String | GlobalDataFlow.cs:83:22:83:87 | call to method Select [element] : String | -| GlobalDataFlow.cs:83:23:83:66 | (...) ... [element] : String | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | -| GlobalDataFlow.cs:83:57:83:66 | { ..., ... } [element] : String | GlobalDataFlow.cs:83:23:83:66 | (...) ... [element] : String | -| GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } [element] : String | -| GlobalDataFlow.cs:85:22:85:128 | call to method Zip [element] : String | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | +| GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | +| GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | +| GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | +| GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | +| GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | -| GlobalDataFlow.cs:85:23:85:66 | (...) ... [element] : String | GlobalDataFlow.cs:85:22:85:128 | call to method Zip [element] : String | -| GlobalDataFlow.cs:85:57:85:66 | { ..., ... } [element] : String | GlobalDataFlow.cs:85:23:85:66 | (...) ... [element] : String | -| GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } [element] : String | -| GlobalDataFlow.cs:87:22:87:128 | call to method Zip [element] : String | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | +| GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | +| GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | +| GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | +| GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | -| GlobalDataFlow.cs:87:70:87:113 | (...) ... [element] : String | GlobalDataFlow.cs:87:22:87:128 | call to method Zip [element] : String | -| GlobalDataFlow.cs:87:104:87:113 | { ..., ... } [element] : String | GlobalDataFlow.cs:87:70:87:113 | (...) ... [element] : String | -| GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } [element] : String | +| GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | +| GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | +| GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | @@ -164,42 +164,42 @@ edges | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | -| GlobalDataFlow.cs:165:22:165:31 | call to method OutYield [element] : String | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | +| GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | -| GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy [property Value] : String | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | +| GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | -| GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] [element] : String | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable [element] : String | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:211:44:211:61 | { ..., ... } [element] : String | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] [element] : String | -| GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } [element] : String | +| GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | +| GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | | GlobalDataFlow.cs:215:71:215:71 | x : String | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | -| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | -| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:216:22:216:39 | call to method Select [element] : String | -| GlobalDataFlow.cs:216:22:216:39 | call to method Select [element] : String | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | +| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | +| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | +| GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | -| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:215:71:215:71 | x : String | -| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:218:22:218:39 | call to method Select [element] : String | -| GlobalDataFlow.cs:218:22:218:39 | call to method Select [element] : String | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | +| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:215:71:215:71 | x : String | +| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | +| GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | -| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:220:22:220:49 | call to method Select [element] : String | -| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | -| GlobalDataFlow.cs:220:22:220:49 | call to method Select [element] : String | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | +| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | +| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | +| GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task [property Result] : String | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task [property Result] : String | -| GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:241:20:241:49 | call to method Run [property Result] : String | -| GlobalDataFlow.cs:242:22:242:25 | access to local variable task [property Result] : String | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | +| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | +| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | +| GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | +| GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | | GlobalDataFlow.cs:244:22:244:31 | await ... : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | -| GlobalDataFlow.cs:244:28:244:31 | access to local variable task [property Result] : String | GlobalDataFlow.cs:244:22:244:31 | await ... : String | +| GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:244:22:244:31 | await ... : String | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:259:16:259:25 | access to parameter sinkParam0 : String | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | | GlobalDataFlow.cs:259:16:259:25 | access to parameter sinkParam0 : String | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | @@ -220,12 +220,12 @@ edges | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | GlobalDataFlow.cs:323:15:323:24 | access to parameter sinkParam9 | | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | GlobalDataFlow.cs:329:15:329:25 | access to parameter sinkParam11 | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | -| GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy [property Value] : String | +| GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | | GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | | GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | | GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | | GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | -| GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield [element] : String | +| GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | GlobalDataFlow.cs:54:15:54:15 | x : String | @@ -250,61 +250,61 @@ edges | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | | GlobalDataFlow.cs:427:9:427:11 | value : String | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | -| GlobalDataFlow.cs:474:20:474:49 | call to method Run [property Result] : String | GlobalDataFlow.cs:475:25:475:28 | access to local variable task [property Result] : String | -| GlobalDataFlow.cs:474:35:474:48 | "taint source" : String | GlobalDataFlow.cs:474:20:474:49 | call to method Run [property Result] : String | -| GlobalDataFlow.cs:475:25:475:28 | access to local variable task [property Result] : String | GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter [synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:477:22:477:40 | call to method GetResult : String | +| GlobalDataFlow.cs:474:20:474:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:475:25:475:28 | access to local variable task : Task [property Result] : String | +| GlobalDataFlow.cs:474:35:474:48 | "taint source" : String | GlobalDataFlow.cs:474:20:474:49 | call to method Run : Task [property Result] : String | +| GlobalDataFlow.cs:475:25:475:28 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:477:22:477:40 | call to method GetResult : String | | GlobalDataFlow.cs:477:22:477:40 | call to method GetResult : String | GlobalDataFlow.cs:478:15:478:20 | access to local variable sink45 | | GlobalDataFlow.cs:483:53:483:55 | arg : String | GlobalDataFlow.cs:487:15:487:17 | access to parameter arg : String | | GlobalDataFlow.cs:486:21:486:21 | s : String | GlobalDataFlow.cs:486:32:486:32 | access to parameter s | | GlobalDataFlow.cs:487:15:487:17 | access to parameter arg : String | GlobalDataFlow.cs:486:21:486:21 | s : String | | GlobalDataFlow.cs:490:28:490:41 | "taint source" : String | GlobalDataFlow.cs:483:53:483:55 | arg : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:500:20:500:33 | "taint source" : String | GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | -| GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 [field field] : String | GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 [field field] : String | -| GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 [field field] : String | GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 [field field] : String | -| GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 [field field] : String | GlobalDataFlow.cs:508:15:508:22 | access to field field | -| GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 [field field] : String | GlobalDataFlow.cs:509:15:509:22 | access to field field | -| GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 [field field] : String | GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 [field field] : String | -| GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 [field field] : String | GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 [field field] : String | -| GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 [field field] : String | GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 [field field] : String | -| GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 [field field] : String | GlobalDataFlow.cs:515:15:515:22 | access to field field | -| GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 [field field] : String | GlobalDataFlow.cs:516:15:516:22 | access to field field | -| GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 [field field] : String | GlobalDataFlow.cs:517:15:517:22 | access to field field | -| GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x [field field] : String | GlobalDataFlow.cs:526:15:526:15 | access to local variable x [field field] : String | -| GlobalDataFlow.cs:526:15:526:15 | access to local variable x [field field] : String | GlobalDataFlow.cs:526:15:526:21 | access to field field | -| GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x [field field] : String | GlobalDataFlow.cs:533:15:533:15 | access to parameter x [field field] : String | -| GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y [field field] : String | GlobalDataFlow.cs:534:15:534:15 | access to local variable y [field field] : String | -| GlobalDataFlow.cs:533:15:533:15 | access to parameter x [field field] : String | GlobalDataFlow.cs:533:15:533:21 | access to field field | -| GlobalDataFlow.cs:534:15:534:15 | access to local variable y [field field] : String | GlobalDataFlow.cs:534:15:534:21 | access to field field | -| GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x [field field] : String | GlobalDataFlow.cs:548:15:548:15 | access to local variable x [field field] : String | -| GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y [field field] : String | GlobalDataFlow.cs:549:15:549:15 | access to local variable y [field field] : String | -| GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z [field field] : String | GlobalDataFlow.cs:550:15:550:15 | access to local variable z [field field] : String | -| GlobalDataFlow.cs:548:15:548:15 | access to local variable x [field field] : String | GlobalDataFlow.cs:548:15:548:21 | access to field field | -| GlobalDataFlow.cs:549:15:549:15 | access to local variable y [field field] : String | GlobalDataFlow.cs:549:15:549:21 | access to field field | -| GlobalDataFlow.cs:550:15:550:15 | access to local variable z [field field] : String | GlobalDataFlow.cs:550:15:550:21 | access to field field | -| GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:556:15:556:16 | access to parameter sc [field field] : String | -| GlobalDataFlow.cs:556:15:556:16 | access to parameter sc [field field] : String | GlobalDataFlow.cs:556:15:556:22 | access to field field | -| GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x [field field] : String | GlobalDataFlow.cs:564:15:564:15 | access to local variable x [field field] : String | -| GlobalDataFlow.cs:564:15:564:15 | access to local variable x [field field] : String | GlobalDataFlow.cs:564:15:564:21 | access to field field | -| GlobalDataFlow.cs:570:71:570:71 | e [element] : String | GlobalDataFlow.cs:573:27:573:27 | access to parameter e [element] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:20:500:33 | "taint source" : String | GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | +| GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 : SimpleClass [field field] : String | GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 : SimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 : SimpleClass [field field] : String | GlobalDataFlow.cs:508:15:508:22 | access to field field | +| GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 : SimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:22 | access to field field | +| GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 : SimpleClass [field field] : String | GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 : SimpleClass [field field] : String | GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 : SimpleClass [field field] : String | GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 : SimpleClass [field field] : String | GlobalDataFlow.cs:515:15:515:22 | access to field field | +| GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 : SimpleClass [field field] : String | GlobalDataFlow.cs:516:15:516:22 | access to field field | +| GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 : SimpleClass [field field] : String | GlobalDataFlow.cs:517:15:517:22 | access to field field | +| GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:526:15:526:15 | access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:526:15:526:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:526:15:526:21 | access to field field | +| GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x : SimpleClass [field field] : String | GlobalDataFlow.cs:533:15:533:15 | access to parameter x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:534:15:534:15 | access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:533:15:533:15 | access to parameter x : SimpleClass [field field] : String | GlobalDataFlow.cs:533:15:533:21 | access to field field | +| GlobalDataFlow.cs:534:15:534:15 | access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:534:15:534:21 | access to field field | +| GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:548:15:548:15 | access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:549:15:549:15 | access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z : SimpleClass [field field] : String | GlobalDataFlow.cs:550:15:550:15 | access to local variable z : SimpleClass [field field] : String | +| GlobalDataFlow.cs:548:15:548:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:548:15:548:21 | access to field field | +| GlobalDataFlow.cs:549:15:549:15 | access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:549:15:549:21 | access to field field | +| GlobalDataFlow.cs:550:15:550:15 | access to local variable z : SimpleClass [field field] : String | GlobalDataFlow.cs:550:15:550:21 | access to field field | +| GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:556:15:556:16 | access to parameter sc : SimpleClass [field field] : String | +| GlobalDataFlow.cs:556:15:556:16 | access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:556:15:556:22 | access to field field | +| GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:564:15:564:15 | access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:564:15:564:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:564:15:564:21 | access to field field | +| GlobalDataFlow.cs:570:71:570:71 | e : null [element] : String | GlobalDataFlow.cs:573:27:573:27 | access to parameter e : null [element] : String | | GlobalDataFlow.cs:573:22:573:22 | SSA def(x) : String | GlobalDataFlow.cs:575:46:575:46 | access to local variable x : String | -| GlobalDataFlow.cs:573:27:573:27 | access to parameter e [element] : String | GlobalDataFlow.cs:573:22:573:22 | SSA def(x) : String | +| GlobalDataFlow.cs:573:27:573:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:573:22:573:22 | SSA def(x) : String | | GlobalDataFlow.cs:575:46:575:46 | access to local variable x : String | GlobalDataFlow.cs:81:79:81:79 | x : String | | GlobalDataFlow.cs:575:46:575:46 | access to local variable x : String | GlobalDataFlow.cs:575:44:575:47 | delegate call : String | | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | @@ -404,30 +404,30 @@ nodes | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | semmle.label | SSA def(sink3) : String | | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | semmle.label | access to local variable sink3 | -| GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven [element] : String | semmle.label | call to method SelectEven [element] : String | +| GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | semmle.label | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | semmle.label | call to method First : String | -| GlobalDataFlow.cs:81:23:81:65 | (...) ... [element] : String | semmle.label | (...) ... [element] : String | -| GlobalDataFlow.cs:81:57:81:65 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | +| GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlow.cs:81:79:81:79 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | semmle.label | access to local variable sink13 | -| GlobalDataFlow.cs:83:22:83:87 | call to method Select [element] : String | semmle.label | call to method Select [element] : String | +| GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | semmle.label | call to method First : String | -| GlobalDataFlow.cs:83:23:83:66 | (...) ... [element] : String | semmle.label | (...) ... [element] : String | -| GlobalDataFlow.cs:83:57:83:66 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | +| GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | semmle.label | access to local variable sink13 : String | | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | semmle.label | access to local variable sink14 | -| GlobalDataFlow.cs:85:22:85:128 | call to method Zip [element] : String | semmle.label | call to method Zip [element] : String | +| GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | semmle.label | call to method First : String | -| GlobalDataFlow.cs:85:23:85:66 | (...) ... [element] : String | semmle.label | (...) ... [element] : String | -| GlobalDataFlow.cs:85:57:85:66 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | +| GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | semmle.label | access to local variable sink15 | -| GlobalDataFlow.cs:87:22:87:128 | call to method Zip [element] : String | semmle.label | call to method Zip [element] : String | +| GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | semmle.label | call to method First : String | -| GlobalDataFlow.cs:87:70:87:113 | (...) ... [element] : String | semmle.label | (...) ... [element] : String | -| GlobalDataFlow.cs:87:104:87:113 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | +| GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | semmle.label | access to local variable sink15 : String | | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | semmle.label | access to local variable sink16 | | GlobalDataFlow.cs:138:40:138:40 | x : String | semmle.label | x : String | @@ -445,7 +445,7 @@ nodes | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | semmle.label | access to local variable sink7 | | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | semmle.label | SSA def(sink8) : String | | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | semmle.label | access to local variable sink8 | -| GlobalDataFlow.cs:165:22:165:31 | call to method OutYield [element] : String | semmle.label | call to method OutYield [element] : String | +| GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | semmle.label | call to method OutYield : IEnumerable [element] : String | | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | semmle.label | access to local variable sink12 | | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | semmle.label | call to method TaintedParam : String | @@ -453,38 +453,38 @@ nodes | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | semmle.label | access to local variable sink9 | -| GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy [property Value] : String | semmle.label | object creation of type Lazy [property Value] : String | +| GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | semmle.label | object creation of type Lazy : Lazy [property Value] : String | | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | semmle.label | access to property Value : String | | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | semmle.label | access to local variable sink10 | | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | semmle.label | access to property OutProperty : String | | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | semmle.label | access to local variable sink19 | -| GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] [element] : String | semmle.label | array creation of type String[] [element] : String | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable [element] : String | semmle.label | call to method AsQueryable [element] : String | -| GlobalDataFlow.cs:211:44:211:61 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | semmle.label | array creation of type String[] : null [element] : String | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | semmle.label | call to method AsQueryable : IQueryable [element] : String | +| GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | semmle.label | sinkParam10 : String | | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | semmle.label | access to parameter sinkParam10 | | GlobalDataFlow.cs:215:71:215:71 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | semmle.label | access to parameter x : String | -| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted [element] : String | semmle.label | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:216:22:216:39 | call to method Select [element] : String | semmle.label | call to method Select [element] : String | +| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | semmle.label | access to local variable sink24 | -| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted [element] : String | semmle.label | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:218:22:218:39 | call to method Select [element] : String | semmle.label | call to method Select [element] : String | +| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | semmle.label | call to method Select : IQueryable [element] : String | | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | semmle.label | access to local variable sink25 | -| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted [element] : String | semmle.label | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:220:22:220:49 | call to method Select [element] : String | semmle.label | call to method Select [element] : String | +| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | semmle.label | access to local variable sink26 | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run [property Result] : String | semmle.label | call to method Run [property Result] : String | +| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:242:22:242:25 | access to local variable task [property Result] : String | semmle.label | access to local variable task [property Result] : String | +| GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | semmle.label | access to property Result : String | | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | semmle.label | access to local variable sink41 | | GlobalDataFlow.cs:244:22:244:31 | await ... : String | semmle.label | await ... : String | -| GlobalDataFlow.cs:244:28:244:31 | access to local variable task [property Result] : String | semmle.label | access to local variable task [property Result] : String | +| GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | semmle.label | access to local variable sink42 | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | semmle.label | sinkParam0 : String | | GlobalDataFlow.cs:259:16:259:25 | access to parameter sinkParam0 : String | semmle.label | access to parameter sinkParam0 : String | @@ -548,13 +548,13 @@ nodes | GlobalDataFlow.cs:427:9:427:11 | value : String | semmle.label | value : String | | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | semmle.label | access to local variable sink20 | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:474:20:474:49 | call to method Run [property Result] : String | semmle.label | call to method Run [property Result] : String | +| GlobalDataFlow.cs:474:20:474:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:474:35:474:48 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:475:25:475:28 | access to local variable task [property Result] : String | semmle.label | access to local variable task [property Result] : String | -| GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method ConfigureAwait [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method GetAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:475:25:475:28 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | +| GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:477:22:477:40 | call to method GetResult : String | semmle.label | call to method GetResult : String | | GlobalDataFlow.cs:478:15:478:20 | access to local variable sink45 | semmle.label | access to local variable sink45 | | GlobalDataFlow.cs:483:53:483:55 | arg : String | semmle.label | arg : String | @@ -562,50 +562,50 @@ nodes | GlobalDataFlow.cs:486:32:486:32 | access to parameter s | semmle.label | access to parameter s | | GlobalDataFlow.cs:487:15:487:17 | access to parameter arg : String | semmle.label | access to parameter arg : String | | GlobalDataFlow.cs:490:28:490:41 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | semmle.label | [post] access to parameter sc [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | semmle.label | [post] access to parameter sc : SimpleClass [field field] : String | | GlobalDataFlow.cs:500:20:500:33 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 [field field] : String | semmle.label | [post] access to local variable x1 [field field] : String | -| GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 [field field] : String | semmle.label | [post] access to local variable x2 [field field] : String | -| GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 [field field] : String | semmle.label | access to local variable x1 [field field] : String | +| GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 : SimpleClass [field field] : String | semmle.label | [post] access to local variable x1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 : SimpleClass [field field] : String | semmle.label | [post] access to local variable x2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 : SimpleClass [field field] : String | semmle.label | access to local variable x1 : SimpleClass [field field] : String | | GlobalDataFlow.cs:508:15:508:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 [field field] : String | semmle.label | access to local variable x2 [field field] : String | +| GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 : SimpleClass [field field] : String | semmle.label | access to local variable x2 : SimpleClass [field field] : String | | GlobalDataFlow.cs:509:15:509:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 [field field] : String | semmle.label | [post] access to local variable y1 [field field] : String | -| GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 [field field] : String | semmle.label | [post] access to local variable y2 [field field] : String | -| GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 [field field] : String | semmle.label | [post] access to local variable y3 [field field] : String | -| GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 [field field] : String | semmle.label | access to local variable y1 [field field] : String | +| GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y3 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 : SimpleClass [field field] : String | semmle.label | access to local variable y1 : SimpleClass [field field] : String | | GlobalDataFlow.cs:515:15:515:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 [field field] : String | semmle.label | access to local variable y2 [field field] : String | +| GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 : SimpleClass [field field] : String | semmle.label | access to local variable y2 : SimpleClass [field field] : String | | GlobalDataFlow.cs:516:15:516:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 [field field] : String | semmle.label | access to local variable y3 [field field] : String | +| GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 : SimpleClass [field field] : String | semmle.label | access to local variable y3 : SimpleClass [field field] : String | | GlobalDataFlow.cs:517:15:517:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x [field field] : String | semmle.label | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:526:15:526:15 | access to local variable x [field field] : String | semmle.label | access to local variable x [field field] : String | +| GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x : SimpleClass [field field] : String | semmle.label | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:526:15:526:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String | | GlobalDataFlow.cs:526:15:526:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x [field field] : String | semmle.label | [post] access to parameter x [field field] : String | -| GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y [field field] : String | semmle.label | [post] access to local variable y [field field] : String | -| GlobalDataFlow.cs:533:15:533:15 | access to parameter x [field field] : String | semmle.label | access to parameter x [field field] : String | +| GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x : SimpleClass [field field] : String | semmle.label | [post] access to parameter x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y : SimpleClass [field field] : String | semmle.label | [post] access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:533:15:533:15 | access to parameter x : SimpleClass [field field] : String | semmle.label | access to parameter x : SimpleClass [field field] : String | | GlobalDataFlow.cs:533:15:533:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:534:15:534:15 | access to local variable y [field field] : String | semmle.label | access to local variable y [field field] : String | +| GlobalDataFlow.cs:534:15:534:15 | access to local variable y : SimpleClass [field field] : String | semmle.label | access to local variable y : SimpleClass [field field] : String | | GlobalDataFlow.cs:534:15:534:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x [field field] : String | semmle.label | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y [field field] : String | semmle.label | [post] access to local variable y [field field] : String | -| GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z [field field] : String | semmle.label | [post] access to local variable z [field field] : String | -| GlobalDataFlow.cs:548:15:548:15 | access to local variable x [field field] : String | semmle.label | access to local variable x [field field] : String | +| GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x : SimpleClass [field field] : String | semmle.label | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y : SimpleClass [field field] : String | semmle.label | [post] access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z : SimpleClass [field field] : String | semmle.label | [post] access to local variable z : SimpleClass [field field] : String | +| GlobalDataFlow.cs:548:15:548:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String | | GlobalDataFlow.cs:548:15:548:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:549:15:549:15 | access to local variable y [field field] : String | semmle.label | access to local variable y [field field] : String | +| GlobalDataFlow.cs:549:15:549:15 | access to local variable y : SimpleClass [field field] : String | semmle.label | access to local variable y : SimpleClass [field field] : String | | GlobalDataFlow.cs:549:15:549:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:550:15:550:15 | access to local variable z [field field] : String | semmle.label | access to local variable z [field field] : String | +| GlobalDataFlow.cs:550:15:550:15 | access to local variable z : SimpleClass [field field] : String | semmle.label | access to local variable z : SimpleClass [field field] : String | | GlobalDataFlow.cs:550:15:550:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc [field field] : String | semmle.label | [post] access to parameter sc [field field] : String | -| GlobalDataFlow.cs:556:15:556:16 | access to parameter sc [field field] : String | semmle.label | access to parameter sc [field field] : String | +| GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc : SimpleClass [field field] : String | semmle.label | [post] access to parameter sc : SimpleClass [field field] : String | +| GlobalDataFlow.cs:556:15:556:16 | access to parameter sc : SimpleClass [field field] : String | semmle.label | access to parameter sc : SimpleClass [field field] : String | | GlobalDataFlow.cs:556:15:556:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x [field field] : String | semmle.label | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:564:15:564:15 | access to local variable x [field field] : String | semmle.label | access to local variable x [field field] : String | +| GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x : SimpleClass [field field] : String | semmle.label | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:564:15:564:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String | | GlobalDataFlow.cs:564:15:564:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:570:71:570:71 | e [element] : String | semmle.label | e [element] : String | +| GlobalDataFlow.cs:570:71:570:71 | e : null [element] : String | semmle.label | e : null [element] : String | | GlobalDataFlow.cs:573:22:573:22 | SSA def(x) : String | semmle.label | SSA def(x) : String | -| GlobalDataFlow.cs:573:27:573:27 | access to parameter e [element] : String | semmle.label | access to parameter e [element] : String | +| GlobalDataFlow.cs:573:27:573:27 | access to parameter e : null [element] : String | semmle.label | access to parameter e : null [element] : String | | GlobalDataFlow.cs:575:44:575:47 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:575:46:575:46 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:3:28:3:34 | tainted : String | semmle.label | tainted : String | @@ -645,7 +645,7 @@ subpaths | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | -| GlobalDataFlow.cs:81:23:81:65 | (...) ... [element] : String | GlobalDataFlow.cs:570:71:570:71 | e [element] : String | GlobalDataFlow.cs:575:44:575:47 | delegate call : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven [element] : String | +| GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:570:71:570:71 | e : null [element] : String | GlobalDataFlow.cs:575:44:575:47 | delegate call : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:387:46:387:46 | x : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected index 781316937f1..5dae90d82a6 100644 --- a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected @@ -125,38 +125,38 @@ edges | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | -| GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven [element] : String | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | +| GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | -| GlobalDataFlow.cs:81:23:81:65 | (...) ... [element] : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven [element] : String | -| GlobalDataFlow.cs:81:23:81:65 | (...) ... [element] : String | GlobalDataFlow.cs:570:71:570:71 | e [element] : String | -| GlobalDataFlow.cs:81:57:81:65 | { ..., ... } [element] : String | GlobalDataFlow.cs:81:23:81:65 | (...) ... [element] : String | -| GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } [element] : String | +| GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | +| GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:570:71:570:71 | e : null [element] : String | +| GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | +| GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:81:79:81:79 | x : String | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | -| GlobalDataFlow.cs:83:22:83:87 | call to method Select [element] : String | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | +| GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | -| GlobalDataFlow.cs:83:23:83:66 | (...) ... [element] : String | GlobalDataFlow.cs:83:22:83:87 | call to method Select [element] : String | -| GlobalDataFlow.cs:83:23:83:66 | (...) ... [element] : String | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | -| GlobalDataFlow.cs:83:57:83:66 | { ..., ... } [element] : String | GlobalDataFlow.cs:83:23:83:66 | (...) ... [element] : String | -| GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } [element] : String | -| GlobalDataFlow.cs:85:22:85:128 | call to method Zip [element] : String | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | +| GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | +| GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | +| GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | +| GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | +| GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | -| GlobalDataFlow.cs:85:23:85:66 | (...) ... [element] : String | GlobalDataFlow.cs:85:22:85:128 | call to method Zip [element] : String | -| GlobalDataFlow.cs:85:57:85:66 | { ..., ... } [element] : String | GlobalDataFlow.cs:85:23:85:66 | (...) ... [element] : String | -| GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } [element] : String | -| GlobalDataFlow.cs:87:22:87:128 | call to method Zip [element] : String | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | +| GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | +| GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | +| GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | +| GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | -| GlobalDataFlow.cs:87:70:87:113 | (...) ... [element] : String | GlobalDataFlow.cs:87:22:87:128 | call to method Zip [element] : String | -| GlobalDataFlow.cs:87:104:87:113 | { ..., ... } [element] : String | GlobalDataFlow.cs:87:70:87:113 | (...) ... [element] : String | -| GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } [element] : String | +| GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | +| GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | +| GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | GlobalDataFlow.cs:90:15:90:20 | access to local variable sink17 | -| GlobalDataFlow.cs:89:23:89:66 | (...) ... [element] : String | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | -| GlobalDataFlow.cs:89:57:89:66 | { ..., ... } [element] : String | GlobalDataFlow.cs:89:23:89:66 | (...) ... [element] : String | -| GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | GlobalDataFlow.cs:89:57:89:66 | { ..., ... } [element] : String | +| GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | +| GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | +| GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:92:15:92:20 | access to local variable sink18 | | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | @@ -181,42 +181,42 @@ edges | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | -| GlobalDataFlow.cs:165:22:165:31 | call to method OutYield [element] : String | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | +| GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | -| GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy [property Value] : String | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | +| GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | -| GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] [element] : String | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable [element] : String | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:211:44:211:61 | { ..., ... } [element] : String | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] [element] : String | -| GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } [element] : String | +| GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | +| GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | | GlobalDataFlow.cs:215:71:215:71 | x : String | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | -| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | -| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:216:22:216:39 | call to method Select [element] : String | -| GlobalDataFlow.cs:216:22:216:39 | call to method Select [element] : String | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | +| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | +| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | +| GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | -| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:215:71:215:71 | x : String | -| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:218:22:218:39 | call to method Select [element] : String | -| GlobalDataFlow.cs:218:22:218:39 | call to method Select [element] : String | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | +| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:215:71:215:71 | x : String | +| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | +| GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | -| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:220:22:220:49 | call to method Select [element] : String | -| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted [element] : String | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | -| GlobalDataFlow.cs:220:22:220:49 | call to method Select [element] : String | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | +| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | +| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | +| GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task [property Result] : String | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task [property Result] : String | -| GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:241:20:241:49 | call to method Run [property Result] : String | -| GlobalDataFlow.cs:242:22:242:25 | access to local variable task [property Result] : String | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | +| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | +| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | +| GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | +| GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | | GlobalDataFlow.cs:244:22:244:31 | await ... : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | -| GlobalDataFlow.cs:244:28:244:31 | access to local variable task [property Result] : String | GlobalDataFlow.cs:244:22:244:31 | await ... : String | +| GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:244:22:244:31 | await ... : String | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:259:16:259:25 | access to parameter sinkParam0 : String | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | | GlobalDataFlow.cs:259:16:259:25 | access to parameter sinkParam0 : String | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | @@ -237,12 +237,12 @@ edges | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | GlobalDataFlow.cs:323:15:323:24 | access to parameter sinkParam9 | | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | GlobalDataFlow.cs:329:15:329:25 | access to parameter sinkParam11 | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | -| GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy [property Value] : String | +| GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | | GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | | GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | | GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | | GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | -| GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield [element] : String | +| GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | GlobalDataFlow.cs:54:15:54:15 | x : String | @@ -268,69 +268,69 @@ edges | GlobalDataFlow.cs:427:9:427:11 | value : String | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | | GlobalDataFlow.cs:446:64:446:64 | s : String | GlobalDataFlow.cs:448:19:448:19 | access to parameter s : String | -| GlobalDataFlow.cs:448:19:448:19 | access to parameter s : String | GlobalDataFlow.cs:448:9:448:10 | [post] access to parameter sb [element] : String | -| GlobalDataFlow.cs:454:31:454:32 | [post] access to local variable sb [element] : String | GlobalDataFlow.cs:455:22:455:23 | access to local variable sb [element] : String | +| GlobalDataFlow.cs:448:19:448:19 | access to parameter s : String | GlobalDataFlow.cs:448:9:448:10 | [post] access to parameter sb : StringBuilder [element] : String | +| GlobalDataFlow.cs:454:31:454:32 | [post] access to local variable sb : StringBuilder [element] : String | GlobalDataFlow.cs:455:22:455:23 | access to local variable sb : StringBuilder [element] : String | | GlobalDataFlow.cs:454:35:454:48 | "taint source" : String | GlobalDataFlow.cs:446:64:446:64 | s : String | -| GlobalDataFlow.cs:454:35:454:48 | "taint source" : String | GlobalDataFlow.cs:454:31:454:32 | [post] access to local variable sb [element] : String | -| GlobalDataFlow.cs:455:22:455:23 | access to local variable sb [element] : String | GlobalDataFlow.cs:455:22:455:34 | call to method ToString : String | +| GlobalDataFlow.cs:454:35:454:48 | "taint source" : String | GlobalDataFlow.cs:454:31:454:32 | [post] access to local variable sb : StringBuilder [element] : String | +| GlobalDataFlow.cs:455:22:455:23 | access to local variable sb : StringBuilder [element] : String | GlobalDataFlow.cs:455:22:455:34 | call to method ToString : String | | GlobalDataFlow.cs:455:22:455:34 | call to method ToString : String | GlobalDataFlow.cs:456:15:456:20 | access to local variable sink43 | | GlobalDataFlow.cs:465:22:465:65 | call to method Join : String | GlobalDataFlow.cs:466:15:466:20 | access to local variable sink44 | | GlobalDataFlow.cs:465:51:465:64 | "taint source" : String | GlobalDataFlow.cs:465:22:465:65 | call to method Join : String | -| GlobalDataFlow.cs:474:20:474:49 | call to method Run [property Result] : String | GlobalDataFlow.cs:475:25:475:28 | access to local variable task [property Result] : String | -| GlobalDataFlow.cs:474:35:474:48 | "taint source" : String | GlobalDataFlow.cs:474:20:474:49 | call to method Run [property Result] : String | -| GlobalDataFlow.cs:475:25:475:28 | access to local variable task [property Result] : String | GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter [synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:477:22:477:40 | call to method GetResult : String | +| GlobalDataFlow.cs:474:20:474:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:475:25:475:28 | access to local variable task : Task [property Result] : String | +| GlobalDataFlow.cs:474:35:474:48 | "taint source" : String | GlobalDataFlow.cs:474:20:474:49 | call to method Run : Task [property Result] : String | +| GlobalDataFlow.cs:475:25:475:28 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:477:22:477:40 | call to method GetResult : String | | GlobalDataFlow.cs:477:22:477:40 | call to method GetResult : String | GlobalDataFlow.cs:478:15:478:20 | access to local variable sink45 | | GlobalDataFlow.cs:483:53:483:55 | arg : String | GlobalDataFlow.cs:487:15:487:17 | access to parameter arg : String | | GlobalDataFlow.cs:486:21:486:21 | s : String | GlobalDataFlow.cs:486:32:486:32 | access to parameter s | | GlobalDataFlow.cs:487:15:487:17 | access to parameter arg : String | GlobalDataFlow.cs:486:21:486:21 | s : String | | GlobalDataFlow.cs:490:28:490:41 | "taint source" : String | GlobalDataFlow.cs:483:53:483:55 | arg : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc [field field] : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:500:20:500:33 | "taint source" : String | GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | -| GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 [field field] : String | GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 [field field] : String | -| GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 [field field] : String | GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 [field field] : String | -| GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 [field field] : String | GlobalDataFlow.cs:508:15:508:22 | access to field field | -| GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 [field field] : String | GlobalDataFlow.cs:509:15:509:22 | access to field field | -| GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 [field field] : String | GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 [field field] : String | -| GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 [field field] : String | GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 [field field] : String | -| GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 [field field] : String | GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 [field field] : String | -| GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 [field field] : String | GlobalDataFlow.cs:515:15:515:22 | access to field field | -| GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 [field field] : String | GlobalDataFlow.cs:516:15:516:22 | access to field field | -| GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 [field field] : String | GlobalDataFlow.cs:517:15:517:22 | access to field field | -| GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x [field field] : String | GlobalDataFlow.cs:526:15:526:15 | access to local variable x [field field] : String | -| GlobalDataFlow.cs:526:15:526:15 | access to local variable x [field field] : String | GlobalDataFlow.cs:526:15:526:21 | access to field field | -| GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x [field field] : String | GlobalDataFlow.cs:533:15:533:15 | access to parameter x [field field] : String | -| GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y [field field] : String | GlobalDataFlow.cs:534:15:534:15 | access to local variable y [field field] : String | -| GlobalDataFlow.cs:533:15:533:15 | access to parameter x [field field] : String | GlobalDataFlow.cs:533:15:533:21 | access to field field | -| GlobalDataFlow.cs:534:15:534:15 | access to local variable y [field field] : String | GlobalDataFlow.cs:534:15:534:21 | access to field field | -| GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x [field field] : String | GlobalDataFlow.cs:548:15:548:15 | access to local variable x [field field] : String | -| GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y [field field] : String | GlobalDataFlow.cs:549:15:549:15 | access to local variable y [field field] : String | -| GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z [field field] : String | GlobalDataFlow.cs:550:15:550:15 | access to local variable z [field field] : String | -| GlobalDataFlow.cs:548:15:548:15 | access to local variable x [field field] : String | GlobalDataFlow.cs:548:15:548:21 | access to field field | -| GlobalDataFlow.cs:549:15:549:15 | access to local variable y [field field] : String | GlobalDataFlow.cs:549:15:549:21 | access to field field | -| GlobalDataFlow.cs:550:15:550:15 | access to local variable z [field field] : String | GlobalDataFlow.cs:550:15:550:21 | access to field field | -| GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc [field field] : String | GlobalDataFlow.cs:556:15:556:16 | access to parameter sc [field field] : String | -| GlobalDataFlow.cs:556:15:556:16 | access to parameter sc [field field] : String | GlobalDataFlow.cs:556:15:556:22 | access to field field | -| GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x [field field] : String | GlobalDataFlow.cs:564:15:564:15 | access to local variable x [field field] : String | -| GlobalDataFlow.cs:564:15:564:15 | access to local variable x [field field] : String | GlobalDataFlow.cs:564:15:564:21 | access to field field | -| GlobalDataFlow.cs:570:71:570:71 | e [element] : String | GlobalDataFlow.cs:573:27:573:27 | access to parameter e [element] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:500:20:500:33 | "taint source" : String | GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | +| GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 : SimpleClass [field field] : String | GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 : SimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 : SimpleClass [field field] : String | GlobalDataFlow.cs:508:15:508:22 | access to field field | +| GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 : SimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:22 | access to field field | +| GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 : SimpleClass [field field] : String | GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 : SimpleClass [field field] : String | GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 : SimpleClass [field field] : String | GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 : SimpleClass [field field] : String | GlobalDataFlow.cs:515:15:515:22 | access to field field | +| GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 : SimpleClass [field field] : String | GlobalDataFlow.cs:516:15:516:22 | access to field field | +| GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 : SimpleClass [field field] : String | GlobalDataFlow.cs:517:15:517:22 | access to field field | +| GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:526:15:526:15 | access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:526:15:526:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:526:15:526:21 | access to field field | +| GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x : SimpleClass [field field] : String | GlobalDataFlow.cs:533:15:533:15 | access to parameter x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:534:15:534:15 | access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:533:15:533:15 | access to parameter x : SimpleClass [field field] : String | GlobalDataFlow.cs:533:15:533:21 | access to field field | +| GlobalDataFlow.cs:534:15:534:15 | access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:534:15:534:21 | access to field field | +| GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:548:15:548:15 | access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:549:15:549:15 | access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z : SimpleClass [field field] : String | GlobalDataFlow.cs:550:15:550:15 | access to local variable z : SimpleClass [field field] : String | +| GlobalDataFlow.cs:548:15:548:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:548:15:548:21 | access to field field | +| GlobalDataFlow.cs:549:15:549:15 | access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:549:15:549:21 | access to field field | +| GlobalDataFlow.cs:550:15:550:15 | access to local variable z : SimpleClass [field field] : String | GlobalDataFlow.cs:550:15:550:21 | access to field field | +| GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:556:15:556:16 | access to parameter sc : SimpleClass [field field] : String | +| GlobalDataFlow.cs:556:15:556:16 | access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:556:15:556:22 | access to field field | +| GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:564:15:564:15 | access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:564:15:564:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:564:15:564:21 | access to field field | +| GlobalDataFlow.cs:570:71:570:71 | e : null [element] : String | GlobalDataFlow.cs:573:27:573:27 | access to parameter e : null [element] : String | | GlobalDataFlow.cs:573:22:573:22 | SSA def(x) : String | GlobalDataFlow.cs:575:46:575:46 | access to local variable x : String | -| GlobalDataFlow.cs:573:27:573:27 | access to parameter e [element] : String | GlobalDataFlow.cs:573:22:573:22 | SSA def(x) : String | +| GlobalDataFlow.cs:573:27:573:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:573:22:573:22 | SSA def(x) : String | | GlobalDataFlow.cs:575:46:575:46 | access to local variable x : String | GlobalDataFlow.cs:81:79:81:79 | x : String | | GlobalDataFlow.cs:575:46:575:46 | access to local variable x : String | GlobalDataFlow.cs:575:44:575:47 | delegate call : String | | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | @@ -430,35 +430,35 @@ nodes | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | semmle.label | SSA def(sink3) : String | | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | semmle.label | access to local variable sink3 | -| GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven [element] : String | semmle.label | call to method SelectEven [element] : String | +| GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | semmle.label | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | semmle.label | call to method First : String | -| GlobalDataFlow.cs:81:23:81:65 | (...) ... [element] : String | semmle.label | (...) ... [element] : String | -| GlobalDataFlow.cs:81:57:81:65 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | +| GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlow.cs:81:79:81:79 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | semmle.label | access to local variable sink13 | -| GlobalDataFlow.cs:83:22:83:87 | call to method Select [element] : String | semmle.label | call to method Select [element] : String | +| GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | semmle.label | call to method First : String | -| GlobalDataFlow.cs:83:23:83:66 | (...) ... [element] : String | semmle.label | (...) ... [element] : String | -| GlobalDataFlow.cs:83:57:83:66 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | +| GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | semmle.label | access to local variable sink13 : String | | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | semmle.label | access to local variable sink14 | -| GlobalDataFlow.cs:85:22:85:128 | call to method Zip [element] : String | semmle.label | call to method Zip [element] : String | +| GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | semmle.label | call to method First : String | -| GlobalDataFlow.cs:85:23:85:66 | (...) ... [element] : String | semmle.label | (...) ... [element] : String | -| GlobalDataFlow.cs:85:57:85:66 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | +| GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | semmle.label | access to local variable sink15 | -| GlobalDataFlow.cs:87:22:87:128 | call to method Zip [element] : String | semmle.label | call to method Zip [element] : String | +| GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | semmle.label | call to method First : String | -| GlobalDataFlow.cs:87:70:87:113 | (...) ... [element] : String | semmle.label | (...) ... [element] : String | -| GlobalDataFlow.cs:87:104:87:113 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | +| GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | semmle.label | access to local variable sink15 : String | | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | semmle.label | access to local variable sink16 | | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | semmle.label | call to method Aggregate : String | -| GlobalDataFlow.cs:89:23:89:66 | (...) ... [element] : String | semmle.label | (...) ... [element] : String | -| GlobalDataFlow.cs:89:57:89:66 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | +| GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:90:15:90:20 | access to local variable sink17 | semmle.label | access to local variable sink17 | | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | semmle.label | call to method Aggregate : String | @@ -488,7 +488,7 @@ nodes | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | semmle.label | access to local variable sink7 | | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | semmle.label | SSA def(sink8) : String | | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | semmle.label | access to local variable sink8 | -| GlobalDataFlow.cs:165:22:165:31 | call to method OutYield [element] : String | semmle.label | call to method OutYield [element] : String | +| GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | semmle.label | call to method OutYield : IEnumerable [element] : String | | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | semmle.label | access to local variable sink12 | | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | semmle.label | call to method TaintedParam : String | @@ -496,38 +496,38 @@ nodes | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | semmle.label | access to local variable sink9 | -| GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy [property Value] : String | semmle.label | object creation of type Lazy [property Value] : String | +| GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | semmle.label | object creation of type Lazy : Lazy [property Value] : String | | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | semmle.label | access to property Value : String | | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | semmle.label | access to local variable sink10 | | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | semmle.label | access to property OutProperty : String | | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | semmle.label | access to local variable sink19 | -| GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] [element] : String | semmle.label | array creation of type String[] [element] : String | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable [element] : String | semmle.label | call to method AsQueryable [element] : String | -| GlobalDataFlow.cs:211:44:211:61 | { ..., ... } [element] : String | semmle.label | { ..., ... } [element] : String | +| GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | semmle.label | array creation of type String[] : null [element] : String | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | semmle.label | call to method AsQueryable : IQueryable [element] : String | +| GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | semmle.label | sinkParam10 : String | | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | semmle.label | access to parameter sinkParam10 | | GlobalDataFlow.cs:215:71:215:71 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | semmle.label | access to parameter x : String | -| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted [element] : String | semmle.label | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:216:22:216:39 | call to method Select [element] : String | semmle.label | call to method Select [element] : String | +| GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | semmle.label | access to local variable sink24 | -| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted [element] : String | semmle.label | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:218:22:218:39 | call to method Select [element] : String | semmle.label | call to method Select [element] : String | +| GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | semmle.label | call to method Select : IQueryable [element] : String | | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | semmle.label | access to local variable sink25 | -| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted [element] : String | semmle.label | access to local variable tainted [element] : String | -| GlobalDataFlow.cs:220:22:220:49 | call to method Select [element] : String | semmle.label | call to method Select [element] : String | +| GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | +| GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | semmle.label | access to local variable sink26 | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run [property Result] : String | semmle.label | call to method Run [property Result] : String | +| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:242:22:242:25 | access to local variable task [property Result] : String | semmle.label | access to local variable task [property Result] : String | +| GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | semmle.label | access to property Result : String | | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | semmle.label | access to local variable sink41 | | GlobalDataFlow.cs:244:22:244:31 | await ... : String | semmle.label | await ... : String | -| GlobalDataFlow.cs:244:28:244:31 | access to local variable task [property Result] : String | semmle.label | access to local variable task [property Result] : String | +| GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | semmle.label | access to local variable sink42 | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | semmle.label | sinkParam0 : String | | GlobalDataFlow.cs:259:16:259:25 | access to parameter sinkParam0 : String | semmle.label | access to parameter sinkParam0 : String | @@ -592,23 +592,23 @@ nodes | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | semmle.label | access to local variable sink20 | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:446:64:446:64 | s : String | semmle.label | s : String | -| GlobalDataFlow.cs:448:9:448:10 | [post] access to parameter sb [element] : String | semmle.label | [post] access to parameter sb [element] : String | +| GlobalDataFlow.cs:448:9:448:10 | [post] access to parameter sb : StringBuilder [element] : String | semmle.label | [post] access to parameter sb : StringBuilder [element] : String | | GlobalDataFlow.cs:448:19:448:19 | access to parameter s : String | semmle.label | access to parameter s : String | -| GlobalDataFlow.cs:454:31:454:32 | [post] access to local variable sb [element] : String | semmle.label | [post] access to local variable sb [element] : String | +| GlobalDataFlow.cs:454:31:454:32 | [post] access to local variable sb : StringBuilder [element] : String | semmle.label | [post] access to local variable sb : StringBuilder [element] : String | | GlobalDataFlow.cs:454:35:454:48 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:455:22:455:23 | access to local variable sb [element] : String | semmle.label | access to local variable sb [element] : String | +| GlobalDataFlow.cs:455:22:455:23 | access to local variable sb : StringBuilder [element] : String | semmle.label | access to local variable sb : StringBuilder [element] : String | | GlobalDataFlow.cs:455:22:455:34 | call to method ToString : String | semmle.label | call to method ToString : String | | GlobalDataFlow.cs:456:15:456:20 | access to local variable sink43 | semmle.label | access to local variable sink43 | | GlobalDataFlow.cs:465:22:465:65 | call to method Join : String | semmle.label | call to method Join : String | | GlobalDataFlow.cs:465:51:465:64 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:466:15:466:20 | access to local variable sink44 | semmle.label | access to local variable sink44 | -| GlobalDataFlow.cs:474:20:474:49 | call to method Run [property Result] : String | semmle.label | call to method Run [property Result] : String | +| GlobalDataFlow.cs:474:20:474:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:474:35:474:48 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:475:25:475:28 | access to local variable task [property Result] : String | semmle.label | access to local variable task [property Result] : String | -| GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method ConfigureAwait [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method GetAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | -| GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:475:25:475:28 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | +| GlobalDataFlow.cs:475:25:475:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:476:23:476:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:476:23:476:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:477:22:477:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:477:22:477:40 | call to method GetResult : String | semmle.label | call to method GetResult : String | | GlobalDataFlow.cs:478:15:478:20 | access to local variable sink45 | semmle.label | access to local variable sink45 | | GlobalDataFlow.cs:483:53:483:55 | arg : String | semmle.label | arg : String | @@ -616,50 +616,50 @@ nodes | GlobalDataFlow.cs:486:32:486:32 | access to parameter s | semmle.label | access to parameter s | | GlobalDataFlow.cs:487:15:487:17 | access to parameter arg : String | semmle.label | access to parameter arg : String | | GlobalDataFlow.cs:490:28:490:41 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc [field field] : String | semmle.label | [post] access to parameter sc [field field] : String | +| GlobalDataFlow.cs:500:9:500:10 | [post] access to parameter sc : SimpleClass [field field] : String | semmle.label | [post] access to parameter sc : SimpleClass [field field] : String | | GlobalDataFlow.cs:500:20:500:33 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 [field field] : String | semmle.label | [post] access to local variable x1 [field field] : String | -| GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 [field field] : String | semmle.label | [post] access to local variable x2 [field field] : String | -| GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 [field field] : String | semmle.label | access to local variable x1 [field field] : String | +| GlobalDataFlow.cs:507:25:507:26 | [post] access to local variable x1 : SimpleClass [field field] : String | semmle.label | [post] access to local variable x1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:507:30:507:31 | [post] access to local variable x2 : SimpleClass [field field] : String | semmle.label | [post] access to local variable x2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:508:15:508:16 | access to local variable x1 : SimpleClass [field field] : String | semmle.label | access to local variable x1 : SimpleClass [field field] : String | | GlobalDataFlow.cs:508:15:508:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 [field field] : String | semmle.label | access to local variable x2 [field field] : String | +| GlobalDataFlow.cs:509:15:509:16 | access to local variable x2 : SimpleClass [field field] : String | semmle.label | access to local variable x2 : SimpleClass [field field] : String | | GlobalDataFlow.cs:509:15:509:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 [field field] : String | semmle.label | [post] access to local variable y1 [field field] : String | -| GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 [field field] : String | semmle.label | [post] access to local variable y2 [field field] : String | -| GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 [field field] : String | semmle.label | [post] access to local variable y3 [field field] : String | -| GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 [field field] : String | semmle.label | access to local variable y1 [field field] : String | +| GlobalDataFlow.cs:514:31:514:32 | [post] access to local variable y1 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y1 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:514:36:514:37 | [post] access to local variable y2 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y2 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:514:42:514:43 | [post] access to local variable y3 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y3 : SimpleClass [field field] : String | +| GlobalDataFlow.cs:515:15:515:16 | access to local variable y1 : SimpleClass [field field] : String | semmle.label | access to local variable y1 : SimpleClass [field field] : String | | GlobalDataFlow.cs:515:15:515:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 [field field] : String | semmle.label | access to local variable y2 [field field] : String | +| GlobalDataFlow.cs:516:15:516:16 | access to local variable y2 : SimpleClass [field field] : String | semmle.label | access to local variable y2 : SimpleClass [field field] : String | | GlobalDataFlow.cs:516:15:516:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 [field field] : String | semmle.label | access to local variable y3 [field field] : String | +| GlobalDataFlow.cs:517:15:517:16 | access to local variable y3 : SimpleClass [field field] : String | semmle.label | access to local variable y3 : SimpleClass [field field] : String | | GlobalDataFlow.cs:517:15:517:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x [field field] : String | semmle.label | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:526:15:526:15 | access to local variable x [field field] : String | semmle.label | access to local variable x [field field] : String | +| GlobalDataFlow.cs:525:33:525:33 | [post] access to local variable x : SimpleClass [field field] : String | semmle.label | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:526:15:526:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String | | GlobalDataFlow.cs:526:15:526:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x [field field] : String | semmle.label | [post] access to parameter x [field field] : String | -| GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y [field field] : String | semmle.label | [post] access to local variable y [field field] : String | -| GlobalDataFlow.cs:533:15:533:15 | access to parameter x [field field] : String | semmle.label | access to parameter x [field field] : String | +| GlobalDataFlow.cs:532:20:532:20 | [post] access to parameter x : SimpleClass [field field] : String | semmle.label | [post] access to parameter x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:532:25:532:25 | [post] access to local variable y : SimpleClass [field field] : String | semmle.label | [post] access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:533:15:533:15 | access to parameter x : SimpleClass [field field] : String | semmle.label | access to parameter x : SimpleClass [field field] : String | | GlobalDataFlow.cs:533:15:533:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:534:15:534:15 | access to local variable y [field field] : String | semmle.label | access to local variable y [field field] : String | +| GlobalDataFlow.cs:534:15:534:15 | access to local variable y : SimpleClass [field field] : String | semmle.label | access to local variable y : SimpleClass [field field] : String | | GlobalDataFlow.cs:534:15:534:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x [field field] : String | semmle.label | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y [field field] : String | semmle.label | [post] access to local variable y [field field] : String | -| GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z [field field] : String | semmle.label | [post] access to local variable z [field field] : String | -| GlobalDataFlow.cs:548:15:548:15 | access to local variable x [field field] : String | semmle.label | access to local variable x [field field] : String | +| GlobalDataFlow.cs:544:20:544:20 | [post] access to local variable x : SimpleClass [field field] : String | semmle.label | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:545:20:545:20 | [post] access to local variable y : SimpleClass [field field] : String | semmle.label | [post] access to local variable y : SimpleClass [field field] : String | +| GlobalDataFlow.cs:546:18:546:18 | [post] access to local variable z : SimpleClass [field field] : String | semmle.label | [post] access to local variable z : SimpleClass [field field] : String | +| GlobalDataFlow.cs:548:15:548:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String | | GlobalDataFlow.cs:548:15:548:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:549:15:549:15 | access to local variable y [field field] : String | semmle.label | access to local variable y [field field] : String | +| GlobalDataFlow.cs:549:15:549:15 | access to local variable y : SimpleClass [field field] : String | semmle.label | access to local variable y : SimpleClass [field field] : String | | GlobalDataFlow.cs:549:15:549:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:550:15:550:15 | access to local variable z [field field] : String | semmle.label | access to local variable z [field field] : String | +| GlobalDataFlow.cs:550:15:550:15 | access to local variable z : SimpleClass [field field] : String | semmle.label | access to local variable z : SimpleClass [field field] : String | | GlobalDataFlow.cs:550:15:550:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc [field field] : String | semmle.label | [post] access to parameter sc [field field] : String | -| GlobalDataFlow.cs:556:15:556:16 | access to parameter sc [field field] : String | semmle.label | access to parameter sc [field field] : String | +| GlobalDataFlow.cs:555:20:555:21 | [post] access to parameter sc : SimpleClass [field field] : String | semmle.label | [post] access to parameter sc : SimpleClass [field field] : String | +| GlobalDataFlow.cs:556:15:556:16 | access to parameter sc : SimpleClass [field field] : String | semmle.label | access to parameter sc : SimpleClass [field field] : String | | GlobalDataFlow.cs:556:15:556:22 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x [field field] : String | semmle.label | [post] access to local variable x [field field] : String | -| GlobalDataFlow.cs:564:15:564:15 | access to local variable x [field field] : String | semmle.label | access to local variable x [field field] : String | +| GlobalDataFlow.cs:563:24:563:24 | [post] access to local variable x : SimpleClass [field field] : String | semmle.label | [post] access to local variable x : SimpleClass [field field] : String | +| GlobalDataFlow.cs:564:15:564:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String | | GlobalDataFlow.cs:564:15:564:21 | access to field field | semmle.label | access to field field | -| GlobalDataFlow.cs:570:71:570:71 | e [element] : String | semmle.label | e [element] : String | +| GlobalDataFlow.cs:570:71:570:71 | e : null [element] : String | semmle.label | e : null [element] : String | | GlobalDataFlow.cs:573:22:573:22 | SSA def(x) : String | semmle.label | SSA def(x) : String | -| GlobalDataFlow.cs:573:27:573:27 | access to parameter e [element] : String | semmle.label | access to parameter e [element] : String | +| GlobalDataFlow.cs:573:27:573:27 | access to parameter e : null [element] : String | semmle.label | access to parameter e : null [element] : String | | GlobalDataFlow.cs:575:44:575:47 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:575:46:575:46 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:3:28:3:34 | tainted : String | semmle.label | tainted : String | @@ -699,7 +699,7 @@ subpaths | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | -| GlobalDataFlow.cs:81:23:81:65 | (...) ... [element] : String | GlobalDataFlow.cs:570:71:570:71 | e [element] : String | GlobalDataFlow.cs:575:44:575:47 | delegate call : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven [element] : String | +| GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:570:71:570:71 | e : null [element] : String | GlobalDataFlow.cs:575:44:575:47 | delegate call : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:387:46:387:46 | x : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | @@ -707,7 +707,7 @@ subpaths | GlobalDataFlow.cs:389:18:389:18 | access to parameter x : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | | GlobalDataFlow.cs:389:18:389:18 | access to parameter x : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | | GlobalDataFlow.cs:389:18:389:18 | access to parameter x : String | GlobalDataFlow.cs:300:27:300:28 | x0 : String | GlobalDataFlow.cs:300:33:300:34 | access to parameter x0 : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | -| GlobalDataFlow.cs:454:35:454:48 | "taint source" : String | GlobalDataFlow.cs:446:64:446:64 | s : String | GlobalDataFlow.cs:448:9:448:10 | [post] access to parameter sb [element] : String | GlobalDataFlow.cs:454:31:454:32 | [post] access to local variable sb [element] : String | +| GlobalDataFlow.cs:454:35:454:48 | "taint source" : String | GlobalDataFlow.cs:446:64:446:64 | s : String | GlobalDataFlow.cs:448:9:448:10 | [post] access to parameter sb : StringBuilder [element] : String | GlobalDataFlow.cs:454:31:454:32 | [post] access to local variable sb : StringBuilder [element] : String | | GlobalDataFlow.cs:575:46:575:46 | access to local variable x : String | GlobalDataFlow.cs:81:79:81:79 | x : String | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | GlobalDataFlow.cs:575:44:575:47 | delegate call : String | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | diff --git a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected index 8e418be049c..dae85aa45aa 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected @@ -2,80 +2,80 @@ failures edges | Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | | Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) [field Item1] : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) [field Item1] : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) [field Item1] : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x [field Item1] : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x [field Item1] : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) [field Item2, field Item2] : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) [field Item2, field Item2] : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) [field Item2, field Item2] : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x [field Item2, field Item2] : Object | -| Tuples.cs:10:21:10:22 | access to local variable o1 : Object | Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | -| Tuples.cs:10:25:10:31 | (..., ...) [field Item2] : Object | Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | -| Tuples.cs:10:29:10:30 | access to local variable o2 : Object | Tuples.cs:10:25:10:31 | (..., ...) [field Item2] : Object | -| Tuples.cs:11:9:11:23 | (..., ...) [field Item1] : Object | Tuples.cs:11:9:11:27 | SSA def(a) : Object | -| Tuples.cs:11:9:11:23 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) [field Item2] : Object | -| Tuples.cs:11:9:11:23 | (..., ...) [field Item2] : Object | Tuples.cs:11:9:11:27 | SSA def(c) : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | +| Tuples.cs:10:21:10:22 | access to local variable o1 : Object | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | +| Tuples.cs:10:29:10:30 | access to local variable o2 : Object | Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:11:9:11:27 | SSA def(c) : Object | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:27 | SSA def(a) : Object | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:11:9:11:27 | SSA def(a) : Object | Tuples.cs:12:14:12:14 | access to local variable a | | Tuples.cs:11:9:11:27 | SSA def(c) : Object | Tuples.cs:14:14:14:14 | access to local variable c | -| Tuples.cs:16:9:16:19 | (..., ...) [field Item1] : Object | Tuples.cs:16:9:16:23 | SSA def(a) : Object | -| Tuples.cs:16:9:16:19 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:16:13:16:18 | (..., ...) [field Item2] : Object | +| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:23 | SSA def(a) : Object | +| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:16:9:16:23 | SSA def(a) : Object | Tuples.cs:17:14:17:14 | access to local variable a | | Tuples.cs:16:9:16:23 | SSA def(c) : Object | Tuples.cs:19:14:19:14 | access to local variable c | -| Tuples.cs:16:13:16:18 | (..., ...) [field Item2] : Object | Tuples.cs:16:9:16:23 | SSA def(c) : Object | -| Tuples.cs:21:9:21:22 | (..., ...) [field Item1] : Object | Tuples.cs:21:9:21:26 | SSA def(p) : Object | -| Tuples.cs:21:9:21:22 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:21:9:21:26 | SSA def(q) [field Item2] : Object | +| Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:16:9:16:23 | SSA def(c) : Object | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:26 | SSA def(p) : Object | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | | Tuples.cs:21:9:21:26 | SSA def(p) : Object | Tuples.cs:22:14:22:14 | access to local variable p | -| Tuples.cs:21:9:21:26 | SSA def(q) [field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q [field Item2] : Object | -| Tuples.cs:24:14:24:14 | access to local variable q [field Item2] : Object | Tuples.cs:24:14:24:20 | access to field Item2 | -| Tuples.cs:26:14:26:14 | access to local variable x [field Item1] : Object | Tuples.cs:26:14:26:20 | access to field Item1 | -| Tuples.cs:27:14:27:14 | access to local variable x [field Item1] : Object | Tuples.cs:27:14:27:16 | access to field Item1 | -| Tuples.cs:29:14:29:14 | access to local variable x [field Item2, field Item2] : Object | Tuples.cs:29:14:29:20 | access to field Item2 [field Item2] : Object | -| Tuples.cs:29:14:29:20 | access to field Item2 [field Item2] : Object | Tuples.cs:29:14:29:26 | access to field Item2 | +| Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | +| Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | Tuples.cs:24:14:24:20 | access to field Item2 | +| Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:20 | access to field Item1 | +| Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:27:14:27:16 | access to field Item1 | +| Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | +| Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | Tuples.cs:29:14:29:26 | access to field Item2 | | Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | | Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | -| Tuples.cs:37:17:37:48 | (..., ...) [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x [field Item1] : Object | -| Tuples.cs:37:17:37:48 | (..., ...) [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x [field Item10] : Object | -| Tuples.cs:37:18:37:19 | access to local variable o1 : Object | Tuples.cs:37:17:37:48 | (..., ...) [field Item1] : Object | -| Tuples.cs:37:46:37:47 | access to local variable o2 : Object | Tuples.cs:37:17:37:48 | (..., ...) [field Item10] : Object | -| Tuples.cs:38:14:38:14 | access to local variable x [field Item1] : Object | Tuples.cs:38:14:38:20 | access to field Item1 | -| Tuples.cs:40:14:40:14 | access to local variable x [field Item10] : Object | Tuples.cs:40:14:40:21 | access to field Item10 | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | +| Tuples.cs:37:18:37:19 | access to local variable o1 : Object | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | +| Tuples.cs:37:46:37:47 | access to local variable o2 : Object | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | +| Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:20 | access to field Item1 | +| Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:21 | access to field Item10 | | Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:46:48:46:48 | access to local variable o : String | -| Tuples.cs:46:17:46:55 | (...) ... [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x [field Item1] : String | -| Tuples.cs:46:47:46:55 | (..., ...) [field Item1] : String | Tuples.cs:46:17:46:55 | (...) ... [field Item1] : String | -| Tuples.cs:46:48:46:48 | access to local variable o : String | Tuples.cs:46:47:46:55 | (..., ...) [field Item1] : String | -| Tuples.cs:47:14:47:14 | access to local variable x [field Item1] : String | Tuples.cs:47:14:47:20 | access to field Item1 | +| Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | +| Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | +| Tuples.cs:46:48:46:48 | access to local variable o : String | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | +| Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:20 | access to field Item1 | | Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | | Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | -| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | Tuples.cs:62:18:62:57 | SSA def(t) [field Item1] : String | -| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) [field Item1] : String | -| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) [field Item1] : String | -| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:62:18:62:57 | SSA def(t) [field Item2, field Item2] : String | -| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:59:18:59:19 | access to local variable o1 : String | Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | -| Tuples.cs:59:22:59:28 | (..., ...) [field Item2] : String | Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:59:26:59:27 | access to local variable o2 : String | Tuples.cs:59:22:59:28 | (..., ...) [field Item2] : String | -| Tuples.cs:62:18:62:57 | SSA def(t) [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t [field Item1] : String | -| Tuples.cs:62:18:62:57 | SSA def(t) [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t [field Item2, field Item2] : String | -| Tuples.cs:63:22:63:22 | access to local variable t [field Item1] : String | Tuples.cs:63:22:63:28 | access to field Item1 | -| Tuples.cs:64:22:64:22 | access to local variable t [field Item2, field Item2] : String | Tuples.cs:64:22:64:28 | access to field Item2 [field Item2] : String | -| Tuples.cs:64:22:64:28 | access to field Item2 [field Item2] : String | Tuples.cs:64:22:64:34 | access to field Item2 | -| Tuples.cs:67:18:67:35 | (..., ...) [field Item1] : String | Tuples.cs:67:23:67:23 | SSA def(a) : String | -| Tuples.cs:67:18:67:35 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) [field Item2] : String | -| Tuples.cs:67:18:67:35 | (..., ...) [field Item2] : String | Tuples.cs:67:30:67:30 | SSA def(c) : String | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | +| Tuples.cs:59:18:59:19 | access to local variable o1 : String | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | +| Tuples.cs:59:26:59:27 | access to local variable o2 : String | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | +| Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:28 | access to field Item1 | +| Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | +| Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | Tuples.cs:64:22:64:34 | access to field Item2 | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:67:30:67:30 | SSA def(c) : String | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:23:67:23 | SSA def(a) : String | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | | Tuples.cs:67:23:67:23 | SSA def(a) : String | Tuples.cs:68:22:68:22 | access to local variable a | | Tuples.cs:67:30:67:30 | SSA def(c) : String | Tuples.cs:69:22:69:22 | access to local variable c | -| Tuples.cs:87:18:87:35 | (..., ...) [field Item1] : String | Tuples.cs:87:23:87:23 | SSA def(p) : String | -| Tuples.cs:87:18:87:35 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) [field Item2] : String | -| Tuples.cs:87:18:87:35 | (..., ...) [field Item2] : String | Tuples.cs:87:30:87:30 | SSA def(r) : String | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:87:30:87:30 | SSA def(r) : String | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:23:87:23 | SSA def(p) : String | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | | Tuples.cs:87:23:87:23 | SSA def(p) : String | Tuples.cs:89:18:89:18 | access to local variable p | | Tuples.cs:87:30:87:30 | SSA def(r) : String | Tuples.cs:90:18:90:18 | access to local variable r | | Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:100:24:100:24 | access to local variable o : String | -| Tuples.cs:100:17:100:28 | object creation of type R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r [property i] : String | -| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:100:17:100:28 | object creation of type R1 [property i] : String | -| Tuples.cs:101:14:101:14 | access to local variable r [property i] : String | Tuples.cs:101:14:101:16 | access to property i | +| Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | +| Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | Tuples.cs:101:14:101:16 | access to property i | | Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | | Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | | Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | @@ -84,126 +84,126 @@ edges | Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | | Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | | Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | -| Tuples.cs:121:9:121:23 | (..., ...) [field Item1] : Object | Tuples.cs:121:9:121:32 | SSA def(x1) : Object | +| Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:121:9:121:32 | SSA def(x1) : Object | | Tuples.cs:121:9:121:32 | SSA def(x1) : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | -| Tuples.cs:121:27:121:32 | (..., ...) [field Item1] : Object | Tuples.cs:121:9:121:23 | (..., ...) [field Item1] : Object | -| Tuples.cs:121:28:121:28 | access to local variable o : Object | Tuples.cs:121:27:121:32 | (..., ...) [field Item1] : Object | -| Tuples.cs:125:9:125:20 | (..., ...) [field Item1] : Object | Tuples.cs:125:9:125:29 | SSA def(x2) : Object | +| Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | +| Tuples.cs:121:28:121:28 | access to local variable o : Object | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | +| Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:9:125:29 | SSA def(x2) : Object | | Tuples.cs:125:9:125:29 | SSA def(x2) : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | -| Tuples.cs:125:24:125:29 | (..., ...) [field Item1] : Object | Tuples.cs:125:9:125:20 | (..., ...) [field Item1] : Object | -| Tuples.cs:125:25:125:25 | access to local variable o : Object | Tuples.cs:125:24:125:29 | (..., ...) [field Item1] : Object | -| Tuples.cs:129:9:129:23 | (..., ...) [field Item2] : Object | Tuples.cs:129:9:129:32 | SSA def(y3) : Object | +| Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | +| Tuples.cs:125:25:125:25 | access to local variable o : Object | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | +| Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:129:9:129:32 | SSA def(y3) : Object | | Tuples.cs:129:9:129:32 | SSA def(y3) : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | -| Tuples.cs:129:27:129:32 | (..., ...) [field Item2] : Object | Tuples.cs:129:9:129:23 | (..., ...) [field Item2] : Object | -| Tuples.cs:129:31:129:31 | access to local variable o : Object | Tuples.cs:129:27:129:32 | (..., ...) [field Item2] : Object | -| Tuples.cs:133:9:133:20 | (..., ...) [field Item2] : Object | Tuples.cs:133:9:133:29 | SSA def(y4) : Object | +| Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | +| Tuples.cs:129:31:129:31 | access to local variable o : Object | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | +| Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:9:133:29 | SSA def(y4) : Object | | Tuples.cs:133:9:133:29 | SSA def(y4) : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | -| Tuples.cs:133:24:133:29 | (..., ...) [field Item2] : Object | Tuples.cs:133:9:133:20 | (..., ...) [field Item2] : Object | -| Tuples.cs:133:28:133:28 | access to local variable o : Object | Tuples.cs:133:24:133:29 | (..., ...) [field Item2] : Object | +| Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | +| Tuples.cs:133:28:133:28 | access to local variable o : Object | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | nodes | Tuples.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:8:18:8:34 | call to method Source : Object | semmle.label | call to method Source : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | -| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | -| Tuples.cs:10:25:10:31 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | -| Tuples.cs:11:9:11:23 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | -| Tuples.cs:11:9:11:23 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | -| Tuples.cs:11:9:11:23 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:11:9:11:27 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | | Tuples.cs:11:9:11:27 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | | Tuples.cs:12:14:12:14 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:14:14:14:14 | access to local variable c | semmle.label | access to local variable c | -| Tuples.cs:16:9:16:19 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | -| Tuples.cs:16:9:16:19 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | +| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:16:9:16:23 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | | Tuples.cs:16:9:16:23 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | -| Tuples.cs:16:13:16:18 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:17:14:17:14 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:19:14:19:14 | access to local variable c | semmle.label | access to local variable c | -| Tuples.cs:21:9:21:22 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | -| Tuples.cs:21:9:21:22 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:21:9:21:26 | SSA def(p) : Object | semmle.label | SSA def(p) : Object | -| Tuples.cs:21:9:21:26 | SSA def(q) [field Item2] : Object | semmle.label | SSA def(q) [field Item2] : Object | +| Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | semmle.label | SSA def(q) : ValueTuple [field Item2] : Object | | Tuples.cs:22:14:22:14 | access to local variable p | semmle.label | access to local variable p | -| Tuples.cs:24:14:24:14 | access to local variable q [field Item2] : Object | semmle.label | access to local variable q [field Item2] : Object | +| Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | semmle.label | access to local variable q : ValueTuple [field Item2] : Object | | Tuples.cs:24:14:24:20 | access to field Item2 | semmle.label | access to field Item2 | -| Tuples.cs:26:14:26:14 | access to local variable x [field Item1] : Object | semmle.label | access to local variable x [field Item1] : Object | +| Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | | Tuples.cs:26:14:26:20 | access to field Item1 | semmle.label | access to field Item1 | -| Tuples.cs:27:14:27:14 | access to local variable x [field Item1] : Object | semmle.label | access to local variable x [field Item1] : Object | +| Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | | Tuples.cs:27:14:27:16 | access to field Item1 | semmle.label | access to field Item1 | -| Tuples.cs:29:14:29:14 | access to local variable x [field Item2, field Item2] : Object | semmle.label | access to local variable x [field Item2, field Item2] : Object | -| Tuples.cs:29:14:29:20 | access to field Item2 [field Item2] : Object | semmle.label | access to field Item2 [field Item2] : Object | +| Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | semmle.label | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | +| Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | semmle.label | access to field Item2 : ValueTuple [field Item2] : Object | | Tuples.cs:29:14:29:26 | access to field Item2 | semmle.label | access to field Item2 | | Tuples.cs:34:18:34:34 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:35:18:35:34 | call to method Source : Object | semmle.label | call to method Source : Object | -| Tuples.cs:37:17:37:48 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | -| Tuples.cs:37:17:37:48 | (..., ...) [field Item10] : Object | semmle.label | (..., ...) [field Item10] : Object | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | semmle.label | (..., ...) : ValueTuple> [field Item10] : Object | | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | -| Tuples.cs:38:14:38:14 | access to local variable x [field Item1] : Object | semmle.label | access to local variable x [field Item1] : Object | +| Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | | Tuples.cs:38:14:38:20 | access to field Item1 | semmle.label | access to field Item1 | -| Tuples.cs:40:14:40:14 | access to local variable x [field Item10] : Object | semmle.label | access to local variable x [field Item10] : Object | +| Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | semmle.label | access to local variable x : ValueTuple> [field Item10] : Object | | Tuples.cs:40:14:40:21 | access to field Item10 | semmle.label | access to field Item10 | | Tuples.cs:45:17:45:33 | call to method Source : String | semmle.label | call to method Source : String | -| Tuples.cs:46:17:46:55 | (...) ... [field Item1] : String | semmle.label | (...) ... [field Item1] : String | -| Tuples.cs:46:47:46:55 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | semmle.label | (...) ... : ValueTuple [field Item1] : String | +| Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | Tuples.cs:46:48:46:48 | access to local variable o : String | semmle.label | access to local variable o : String | -| Tuples.cs:47:14:47:14 | access to local variable x [field Item1] : String | semmle.label | access to local variable x [field Item1] : String | +| Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | semmle.label | access to local variable x : ValueTuple [field Item1] : String | | Tuples.cs:47:14:47:20 | access to field Item1 | semmle.label | access to field Item1 | | Tuples.cs:57:18:57:34 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:58:18:58:34 | call to method Source : String | semmle.label | call to method Source : String | -| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:59:18:59:19 | access to local variable o1 : String | semmle.label | access to local variable o1 : String | -| Tuples.cs:59:22:59:28 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | +| Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | semmle.label | (..., ...) : ValueTuple [field Item2] : String | | Tuples.cs:59:26:59:27 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | -| Tuples.cs:62:18:62:57 | SSA def(t) [field Item1] : String | semmle.label | SSA def(t) [field Item1] : String | -| Tuples.cs:62:18:62:57 | SSA def(t) [field Item2, field Item2] : String | semmle.label | SSA def(t) [field Item2, field Item2] : String | -| Tuples.cs:63:22:63:22 | access to local variable t [field Item1] : String | semmle.label | access to local variable t [field Item1] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | semmle.label | SSA def(t) : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | +| Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | semmle.label | access to local variable t : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:63:22:63:28 | access to field Item1 | semmle.label | access to field Item1 | -| Tuples.cs:64:22:64:22 | access to local variable t [field Item2, field Item2] : String | semmle.label | access to local variable t [field Item2, field Item2] : String | -| Tuples.cs:64:22:64:28 | access to field Item2 [field Item2] : String | semmle.label | access to field Item2 [field Item2] : String | +| Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | +| Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | semmle.label | access to field Item2 : ValueTuple [field Item2] : String | | Tuples.cs:64:22:64:34 | access to field Item2 | semmle.label | access to field Item2 | -| Tuples.cs:67:18:67:35 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:67:18:67:35 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:67:18:67:35 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | semmle.label | (..., ...) : ValueTuple [field Item2] : String | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:67:23:67:23 | SSA def(a) : String | semmle.label | SSA def(a) : String | | Tuples.cs:67:30:67:30 | SSA def(c) : String | semmle.label | SSA def(c) : String | | Tuples.cs:68:22:68:22 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:69:22:69:22 | access to local variable c | semmle.label | access to local variable c | -| Tuples.cs:87:18:87:35 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:87:18:87:35 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:87:18:87:35 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | semmle.label | (..., ...) : ValueTuple [field Item2] : String | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:87:23:87:23 | SSA def(p) : String | semmle.label | SSA def(p) : String | | Tuples.cs:87:30:87:30 | SSA def(r) : String | semmle.label | SSA def(r) : String | | Tuples.cs:89:18:89:18 | access to local variable p | semmle.label | access to local variable p | | Tuples.cs:90:18:90:18 | access to local variable r | semmle.label | access to local variable r | | Tuples.cs:99:17:99:33 | call to method Source : String | semmle.label | call to method Source : String | -| Tuples.cs:100:17:100:28 | object creation of type R1 [property i] : String | semmle.label | object creation of type R1 [property i] : String | +| Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | semmle.label | object creation of type R1 : R1 [property i] : String | | Tuples.cs:100:24:100:24 | access to local variable o : String | semmle.label | access to local variable o : String | -| Tuples.cs:101:14:101:14 | access to local variable r [property i] : String | semmle.label | access to local variable r [property i] : String | +| Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | semmle.label | access to local variable r : R1 [property i] : String | | Tuples.cs:101:14:101:16 | access to property i | semmle.label | access to property i | | Tuples.cs:118:17:118:33 | call to method Source : Object | semmle.label | call to method Source : Object | -| Tuples.cs:121:9:121:23 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:121:9:121:32 | SSA def(x1) : Object | semmle.label | SSA def(x1) : Object | -| Tuples.cs:121:27:121:32 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:121:28:121:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | | Tuples.cs:122:14:122:15 | access to local variable x1 | semmle.label | access to local variable x1 | -| Tuples.cs:125:9:125:20 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:125:9:125:29 | SSA def(x2) : Object | semmle.label | SSA def(x2) : Object | -| Tuples.cs:125:24:125:29 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:125:25:125:25 | access to local variable o : Object | semmle.label | access to local variable o : Object | | Tuples.cs:126:14:126:15 | access to local variable x2 | semmle.label | access to local variable x2 | -| Tuples.cs:129:9:129:23 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:129:9:129:32 | SSA def(y3) : Object | semmle.label | SSA def(y3) : Object | -| Tuples.cs:129:27:129:32 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:129:31:129:31 | access to local variable o : Object | semmle.label | access to local variable o : Object | | Tuples.cs:130:14:130:15 | access to local variable y3 | semmle.label | access to local variable y3 | -| Tuples.cs:133:9:133:20 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:133:9:133:29 | SSA def(y4) : Object | semmle.label | SSA def(y4) : Object | -| Tuples.cs:133:24:133:29 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:133:28:133:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | | Tuples.cs:134:14:134:15 | access to local variable y4 | semmle.label | access to local variable y4 | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/types/Types.expected b/csharp/ql/test/library-tests/dataflow/types/Types.expected index faf7fbf0b08..5cf9e17191f 100644 --- a/csharp/ql/test/library-tests/dataflow/types/Types.expected +++ b/csharp/ql/test/library-tests/dataflow/types/Types.expected @@ -33,12 +33,12 @@ edges | Types.cs:77:22:77:22 | a : C | Types.cs:79:18:79:25 | SSA def(b) : C | | Types.cs:79:18:79:25 | SSA def(b) : C | Types.cs:80:18:80:18 | access to local variable b | | Types.cs:90:22:90:22 | e : Types+E.E2 | Types.cs:92:26:92:26 | access to parameter e : Types+E.E2 | -| Types.cs:92:13:92:16 | [post] this access [field Field] : Types+E.E2 | Types.cs:93:13:93:16 | this access [field Field] : Types+E.E2 | -| Types.cs:92:26:92:26 | access to parameter e : Types+E.E2 | Types.cs:92:13:92:16 | [post] this access [field Field] : Types+E.E2 | -| Types.cs:93:13:93:16 | this access [field Field] : Types+E.E2 | Types.cs:113:34:113:34 | this [field Field] : Types+E.E2 | +| Types.cs:92:13:92:16 | [post] this access : Types+E [field Field] : Types+E.E2 | Types.cs:93:13:93:16 | this access : Types+E [field Field] : Types+E.E2 | +| Types.cs:92:26:92:26 | access to parameter e : Types+E.E2 | Types.cs:92:13:92:16 | [post] this access : Types+E [field Field] : Types+E.E2 | +| Types.cs:93:13:93:16 | this access : Types+E [field Field] : Types+E.E2 | Types.cs:113:34:113:34 | this : Types+E [field Field] : Types+E.E2 | | Types.cs:110:25:110:32 | object creation of type E2 : Types+E.E2 | Types.cs:90:22:90:22 | e : Types+E.E2 | -| Types.cs:113:34:113:34 | this [field Field] : Types+E.E2 | Types.cs:115:22:115:25 | this access [field Field] : Types+E.E2 | -| Types.cs:115:22:115:25 | this access [field Field] : Types+E.E2 | Types.cs:115:22:115:31 | access to field Field | +| Types.cs:113:34:113:34 | this : Types+E [field Field] : Types+E.E2 | Types.cs:115:22:115:25 | this access : Types+E [field Field] : Types+E.E2 | +| Types.cs:115:22:115:25 | this access : Types+E [field Field] : Types+E.E2 | Types.cs:115:22:115:31 | access to field Field | | Types.cs:120:25:120:31 | object creation of type A : A | Types.cs:122:30:122:30 | access to local variable a : A | | Types.cs:121:26:121:33 | object creation of type E2 : Types+E.E2 | Types.cs:123:30:123:31 | access to local variable e2 : Types+E.E2 | | Types.cs:122:30:122:30 | access to local variable a : A | Types.cs:122:22:122:31 | call to method Through | @@ -47,13 +47,13 @@ edges | Types.cs:123:30:123:31 | access to local variable e2 : Types+E.E2 | Types.cs:130:34:130:34 | x : Types+E.E2 | | Types.cs:130:34:130:34 | x : A | Types.cs:130:40:130:40 | access to parameter x : A | | Types.cs:130:34:130:34 | x : Types+E.E2 | Types.cs:130:40:130:40 | access to parameter x : Types+E.E2 | -| Types.cs:138:21:138:25 | this [field Field] : Object | Types.cs:138:32:138:35 | this access [field Field] : Object | -| Types.cs:138:32:138:35 | this access [field Field] : Object | Types.cs:153:30:153:30 | this [field Field] : Object | -| Types.cs:144:13:144:13 | [post] access to parameter c [field Field] : Object | Types.cs:145:13:145:13 | access to parameter c [field Field] : Object | -| Types.cs:144:23:144:34 | object creation of type Object : Object | Types.cs:144:13:144:13 | [post] access to parameter c [field Field] : Object | -| Types.cs:145:13:145:13 | access to parameter c [field Field] : Object | Types.cs:138:21:138:25 | this [field Field] : Object | -| Types.cs:153:30:153:30 | this [field Field] : Object | Types.cs:153:42:153:45 | this access [field Field] : Object | -| Types.cs:153:42:153:45 | this access [field Field] : Object | Types.cs:153:42:153:51 | access to field Field | +| Types.cs:138:21:138:25 | this : FieldC [field Field] : Object | Types.cs:138:32:138:35 | this access : FieldC [field Field] : Object | +| Types.cs:138:32:138:35 | this access : FieldC [field Field] : Object | Types.cs:153:30:153:30 | this : FieldC [field Field] : Object | +| Types.cs:144:13:144:13 | [post] access to parameter c : FieldC [field Field] : Object | Types.cs:145:13:145:13 | access to parameter c : FieldC [field Field] : Object | +| Types.cs:144:23:144:34 | object creation of type Object : Object | Types.cs:144:13:144:13 | [post] access to parameter c : FieldC [field Field] : Object | +| Types.cs:145:13:145:13 | access to parameter c : FieldC [field Field] : Object | Types.cs:138:21:138:25 | this : FieldC [field Field] : Object | +| Types.cs:153:30:153:30 | this : FieldC [field Field] : Object | Types.cs:153:42:153:45 | this access : FieldC [field Field] : Object | +| Types.cs:153:42:153:45 | this access : FieldC [field Field] : Object | Types.cs:153:42:153:51 | access to field Field | nodes | Types.cs:7:21:7:25 | this : D | semmle.label | this : D | | Types.cs:7:32:7:35 | this access : D | semmle.label | this access : D | @@ -98,12 +98,12 @@ nodes | Types.cs:79:18:79:25 | SSA def(b) : C | semmle.label | SSA def(b) : C | | Types.cs:80:18:80:18 | access to local variable b | semmle.label | access to local variable b | | Types.cs:90:22:90:22 | e : Types+E.E2 | semmle.label | e : Types+E.E2 | -| Types.cs:92:13:92:16 | [post] this access [field Field] : Types+E.E2 | semmle.label | [post] this access [field Field] : Types+E.E2 | +| Types.cs:92:13:92:16 | [post] this access : Types+E [field Field] : Types+E.E2 | semmle.label | [post] this access : Types+E [field Field] : Types+E.E2 | | Types.cs:92:26:92:26 | access to parameter e : Types+E.E2 | semmle.label | access to parameter e : Types+E.E2 | -| Types.cs:93:13:93:16 | this access [field Field] : Types+E.E2 | semmle.label | this access [field Field] : Types+E.E2 | +| Types.cs:93:13:93:16 | this access : Types+E [field Field] : Types+E.E2 | semmle.label | this access : Types+E [field Field] : Types+E.E2 | | Types.cs:110:25:110:32 | object creation of type E2 : Types+E.E2 | semmle.label | object creation of type E2 : Types+E.E2 | -| Types.cs:113:34:113:34 | this [field Field] : Types+E.E2 | semmle.label | this [field Field] : Types+E.E2 | -| Types.cs:115:22:115:25 | this access [field Field] : Types+E.E2 | semmle.label | this access [field Field] : Types+E.E2 | +| Types.cs:113:34:113:34 | this : Types+E [field Field] : Types+E.E2 | semmle.label | this : Types+E [field Field] : Types+E.E2 | +| Types.cs:115:22:115:25 | this access : Types+E [field Field] : Types+E.E2 | semmle.label | this access : Types+E [field Field] : Types+E.E2 | | Types.cs:115:22:115:31 | access to field Field | semmle.label | access to field Field | | Types.cs:120:25:120:31 | object creation of type A : A | semmle.label | object creation of type A : A | | Types.cs:121:26:121:33 | object creation of type E2 : Types+E.E2 | semmle.label | object creation of type E2 : Types+E.E2 | @@ -115,13 +115,13 @@ nodes | Types.cs:130:34:130:34 | x : Types+E.E2 | semmle.label | x : Types+E.E2 | | Types.cs:130:40:130:40 | access to parameter x : A | semmle.label | access to parameter x : A | | Types.cs:130:40:130:40 | access to parameter x : Types+E.E2 | semmle.label | access to parameter x : Types+E.E2 | -| Types.cs:138:21:138:25 | this [field Field] : Object | semmle.label | this [field Field] : Object | -| Types.cs:138:32:138:35 | this access [field Field] : Object | semmle.label | this access [field Field] : Object | -| Types.cs:144:13:144:13 | [post] access to parameter c [field Field] : Object | semmle.label | [post] access to parameter c [field Field] : Object | +| Types.cs:138:21:138:25 | this : FieldC [field Field] : Object | semmle.label | this : FieldC [field Field] : Object | +| Types.cs:138:32:138:35 | this access : FieldC [field Field] : Object | semmle.label | this access : FieldC [field Field] : Object | +| Types.cs:144:13:144:13 | [post] access to parameter c : FieldC [field Field] : Object | semmle.label | [post] access to parameter c : FieldC [field Field] : Object | | Types.cs:144:23:144:34 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | -| Types.cs:145:13:145:13 | access to parameter c [field Field] : Object | semmle.label | access to parameter c [field Field] : Object | -| Types.cs:153:30:153:30 | this [field Field] : Object | semmle.label | this [field Field] : Object | -| Types.cs:153:42:153:45 | this access [field Field] : Object | semmle.label | this access [field Field] : Object | +| Types.cs:145:13:145:13 | access to parameter c : FieldC [field Field] : Object | semmle.label | access to parameter c : FieldC [field Field] : Object | +| Types.cs:153:30:153:30 | this : FieldC [field Field] : Object | semmle.label | this : FieldC [field Field] : Object | +| Types.cs:153:42:153:45 | this access : FieldC [field Field] : Object | semmle.label | this access : FieldC [field Field] : Object | | Types.cs:153:42:153:51 | access to field Field | semmle.label | access to field Field | subpaths | Types.cs:122:30:122:30 | access to local variable a : A | Types.cs:130:34:130:34 | x : A | Types.cs:130:40:130:40 | access to parameter x : A | Types.cs:122:22:122:31 | call to method Through | diff --git a/csharp/ql/test/library-tests/dataflow/types/Types.ql b/csharp/ql/test/library-tests/dataflow/types/Types.ql index 99242b82652..3b11ab505e3 100644 --- a/csharp/ql/test/library-tests/dataflow/types/Types.ql +++ b/csharp/ql/test/library-tests/dataflow/types/Types.ql @@ -3,17 +3,15 @@ */ import csharp -import DataFlow::PathGraph +import Types::PathGraph -class Conf extends DataFlow::Configuration { - Conf() { this = "TypesConf" } - - override predicate isSource(DataFlow::Node src) { +module TypesConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ObjectCreation or src.asExpr() instanceof NullLiteral } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodCall mc | mc.getTarget().hasUndecoratedName("Sink") and mc.getAnArgument() = sink.asExpr() @@ -21,6 +19,8 @@ class Conf extends DataFlow::Configuration { } } -from DataFlow::PathNode source, DataFlow::PathNode sink, Conf conf -where conf.hasFlowPath(source, sink) +module Types = DataFlow::Global; + +from Types::PathNode source, Types::PathNode sink +where Types::flowPath(source, sink) select source, source, sink, "$@", sink, sink.toString() diff --git a/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected b/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected index 5f7866b09d1..811f1a04d8b 100644 --- a/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected +++ b/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected @@ -1,87 +1,87 @@ edges -| EntityFramework.cs:59:13:62:13 | { ..., ... } [property Name] : String | EntityFramework.cs:66:29:66:30 | access to local variable p1 [property Name] : String | -| EntityFramework.cs:61:24:61:32 | "tainted" : String | EntityFramework.cs:59:13:62:13 | { ..., ... } [property Name] : String | -| EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFramework.cs:68:13:68:15 | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:66:13:66:23 | [post] access to property Persons [element, property Name] : String | EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:66:29:66:30 | access to local variable p1 [property Name] : String | EntityFramework.cs:66:13:66:23 | [post] access to property Persons [element, property Name] : String | -| EntityFramework.cs:68:13:68:15 | access to local variable ctx [property Persons, element, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons [element, property Name] : String | -| EntityFramework.cs:81:13:84:13 | { ..., ... } [property Name] : String | EntityFramework.cs:88:29:88:30 | access to local variable p1 [property Name] : String | -| EntityFramework.cs:83:24:83:32 | "tainted" : String | EntityFramework.cs:81:13:84:13 | { ..., ... } [property Name] : String | -| EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFramework.cs:90:19:90:21 | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:88:13:88:23 | [post] access to property Persons [element, property Name] : String | EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:88:29:88:30 | access to local variable p1 [property Name] : String | EntityFramework.cs:88:13:88:23 | [post] access to property Persons [element, property Name] : String | -| EntityFramework.cs:90:19:90:21 | access to local variable ctx [property Persons, element, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons [element, property Name] : String | -| EntityFramework.cs:103:13:106:13 | { ..., ... } [property Name] : String | EntityFramework.cs:109:27:109:28 | access to local variable p1 [property Name] : String | -| EntityFramework.cs:105:24:105:32 | "tainted" : String | EntityFramework.cs:103:13:106:13 | { ..., ... } [property Name] : String | -| EntityFramework.cs:109:27:109:28 | access to local variable p1 [property Name] : String | EntityFramework.cs:193:35:193:35 | p [property Name] : String | -| EntityFramework.cs:122:13:125:13 | { ..., ... } [property Title] : String | EntityFramework.cs:129:18:129:19 | access to local variable p1 [property Title] : String | -| EntityFramework.cs:124:25:124:33 | "tainted" : String | EntityFramework.cs:122:13:125:13 | { ..., ... } [property Title] : String | -| EntityFramework.cs:129:18:129:19 | access to local variable p1 [property Title] : String | EntityFramework.cs:129:18:129:25 | access to property Title | -| EntityFramework.cs:141:13:148:13 | { ..., ... } [property Addresses, element, property Street] : String | EntityFramework.cs:149:29:149:30 | access to local variable p1 [property Addresses, element, property Street] : String | -| EntityFramework.cs:142:29:147:17 | array creation of type Address[] [element, property Street] : String | EntityFramework.cs:141:13:148:13 | { ..., ... } [property Addresses, element, property Street] : String | -| EntityFramework.cs:142:35:147:17 | { ..., ... } [element, property Street] : String | EntityFramework.cs:142:29:147:17 | array creation of type Address[] [element, property Street] : String | -| EntityFramework.cs:143:21:146:21 | object creation of type Address [property Street] : String | EntityFramework.cs:142:35:147:17 | { ..., ... } [element, property Street] : String | -| EntityFramework.cs:143:33:146:21 | { ..., ... } [property Street] : String | EntityFramework.cs:143:21:146:21 | object creation of type Address [property Street] : String | -| EntityFramework.cs:145:34:145:42 | "tainted" : String | EntityFramework.cs:143:33:146:21 | { ..., ... } [property Street] : String | -| EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:150:13:150:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:154:13:154:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:162:13:162:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:166:13:166:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFramework.cs:149:13:149:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFramework.cs:149:29:149:30 | access to local variable p1 [property Addresses, element, property Street] : String | EntityFramework.cs:149:13:149:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:150:13:150:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:150:13:150:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:154:13:154:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:154:13:154:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:157:13:160:13 | { ..., ... } [property Street] : String | EntityFramework.cs:161:31:161:32 | access to local variable a1 [property Street] : String | -| EntityFramework.cs:159:26:159:34 | "tainted" : String | EntityFramework.cs:157:13:160:13 | { ..., ... } [property Street] : String | -| EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | EntityFramework.cs:162:13:162:15 | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | EntityFramework.cs:166:13:166:15 | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFramework.cs:161:13:161:25 | [post] access to property Addresses [element, property Street] : String | EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFramework.cs:161:31:161:32 | access to local variable a1 [property Street] : String | EntityFramework.cs:161:13:161:25 | [post] access to property Addresses [element, property Street] : String | -| EntityFramework.cs:162:13:162:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:162:13:162:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:162:13:162:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:162:13:162:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:166:13:166:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:166:13:166:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:166:13:166:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:166:13:166:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:173:13:176:13 | { ..., ... } [property Name] : String | EntityFramework.cs:182:71:182:72 | access to local variable p1 [property Name] : String | -| EntityFramework.cs:175:24:175:32 | "tainted" : String | EntityFramework.cs:173:13:176:13 | { ..., ... } [property Name] : String | -| EntityFramework.cs:178:13:181:13 | { ..., ... } [property Street] : String | EntityFramework.cs:182:85:182:86 | access to local variable a1 [property Street] : String | -| EntityFramework.cs:180:26:180:34 | "tainted" : String | EntityFramework.cs:178:13:181:13 | { ..., ... } [property Street] : String | -| EntityFramework.cs:182:60:182:88 | { ..., ... } [property Address, property Street] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 [property Address, property Street] : String | -| EntityFramework.cs:182:60:182:88 | { ..., ... } [property Person, property Name] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 [property Person, property Name] : String | -| EntityFramework.cs:182:71:182:72 | access to local variable p1 [property Name] : String | EntityFramework.cs:182:60:182:88 | { ..., ... } [property Person, property Name] : String | -| EntityFramework.cs:182:85:182:86 | access to local variable a1 [property Street] : String | EntityFramework.cs:182:60:182:88 | { ..., ... } [property Address, property Street] : String | -| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:184:13:184:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:190:13:190:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFramework.cs:184:13:184:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFramework.cs:190:13:190:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 [property Address, property Street] : String | EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | -| EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 [property Person, property Name] : String | EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | -| EntityFramework.cs:184:13:184:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:184:13:184:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:184:13:184:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons [element, property Name] : String | -| EntityFramework.cs:190:13:190:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:190:13:190:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:190:13:190:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons [element, property Name] : String | -| EntityFramework.cs:193:35:193:35 | p [property Name] : String | EntityFramework.cs:196:29:196:29 | access to parameter p [property Name] : String | -| EntityFramework.cs:196:13:196:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFramework.cs:197:13:197:15 | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:196:13:196:23 | [post] access to property Persons [element, property Name] : String | EntityFramework.cs:196:13:196:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:196:29:196:29 | access to parameter p [property Name] : String | EntityFramework.cs:196:13:196:23 | [post] access to property Persons [element, property Name] : String | -| EntityFramework.cs:197:13:197:15 | access to local variable ctx [property Persons, element, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons [element, property Name] : String | -| EntityFramework.cs:204:18:204:28 | access to property Persons [element, property Name] : String | EntityFramework.cs:204:18:204:36 | call to method First [property Name] : String | -| EntityFramework.cs:204:18:204:36 | call to method First [property Name] : String | EntityFramework.cs:204:18:204:41 | access to property Name | -| EntityFramework.cs:212:18:212:30 | access to property Addresses [element, property Street] : String | EntityFramework.cs:212:18:212:38 | call to method First
    [property Street] : String | -| EntityFramework.cs:212:18:212:38 | call to method First
    [property Street] : String | EntityFramework.cs:212:18:212:45 | access to property Street | -| EntityFramework.cs:219:18:219:28 | access to property Persons [element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:36 | call to method First [property Addresses, element, property Street] : String | -| EntityFramework.cs:219:18:219:36 | call to method First [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:46 | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:219:18:219:46 | access to property Addresses [element, property Street] : String | EntityFramework.cs:219:18:219:54 | call to method First
    [property Street] : String | -| EntityFramework.cs:219:18:219:54 | call to method First
    [property Street] : String | EntityFramework.cs:219:18:219:61 | access to property Street | +| EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | +| EntityFramework.cs:61:24:61:32 | "tainted" : String | EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | +| EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:68:13:68:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:66:13:66:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:66:13:66:23 | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:68:13:68:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | +| EntityFramework.cs:83:24:83:32 | "tainted" : String | EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | +| EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:90:19:90:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:88:13:88:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:88:13:88:23 | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:90:19:90:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | +| EntityFramework.cs:105:24:105:32 | "tainted" : String | EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | +| EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:193:35:193:35 | p : Person [property Name] : String | +| EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | +| EntityFramework.cs:124:25:124:33 | "tainted" : String | EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | +| EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | EntityFramework.cs:129:18:129:25 | access to property Title | +| EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | EntityFramework.cs:149:29:149:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | +| EntityFramework.cs:142:29:147:17 | array creation of type Address[] : null [element, property Street] : String | EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | +| EntityFramework.cs:142:35:147:17 | { ..., ... } : null [element, property Street] : String | EntityFramework.cs:142:29:147:17 | array creation of type Address[] : null [element, property Street] : String | +| EntityFramework.cs:143:21:146:21 | object creation of type Address : Address [property Street] : String | EntityFramework.cs:142:35:147:17 | { ..., ... } : null [element, property Street] : String | +| EntityFramework.cs:143:33:146:21 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:143:21:146:21 | object creation of type Address : Address [property Street] : String | +| EntityFramework.cs:145:34:145:42 | "tainted" : String | EntityFramework.cs:143:33:146:21 | { ..., ... } : Address [property Street] : String | +| EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:150:13:150:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:154:13:154:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:149:13:149:23 | [post] access to property Persons : DbSet [element, property Addresses, element, property Street] : String | EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:149:29:149:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | EntityFramework.cs:149:13:149:23 | [post] access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:150:13:150:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFramework.cs:150:13:150:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:154:13:154:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFramework.cs:154:13:154:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:161:31:161:32 | access to local variable a1 : Address [property Street] : String | +| EntityFramework.cs:159:26:159:34 | "tainted" : String | EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | +| EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFramework.cs:161:13:161:25 | [post] access to property Addresses : DbSet [element, property Street] : String | EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFramework.cs:161:31:161:32 | access to local variable a1 : Address [property Street] : String | EntityFramework.cs:161:13:161:25 | [post] access to property Addresses : DbSet [element, property Street] : String | +| EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | +| EntityFramework.cs:175:24:175:32 | "tainted" : String | EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | +| EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:182:85:182:86 | access to local variable a1 : Address [property Street] : String | +| EntityFramework.cs:180:26:180:34 | "tainted" : String | EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | +| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | +| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | +| EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | +| EntityFramework.cs:182:85:182:86 | access to local variable a1 : Address [property Street] : String | EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | +| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:184:13:184:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:190:13:190:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | EntityFramework.cs:184:13:184:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | EntityFramework.cs:190:13:190:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses : DbSet [element, property Address, property Street] : String | EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses : DbSet [element, property Person, property Name] : String | EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses : DbSet [element, property Address, property Street] : String | +| EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses : DbSet [element, property Person, property Name] : String | +| EntityFramework.cs:184:13:184:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFramework.cs:184:13:184:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:184:13:184:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:190:13:190:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFramework.cs:190:13:190:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:190:13:190:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:193:35:193:35 | p : Person [property Name] : String | EntityFramework.cs:196:29:196:29 | access to parameter p : Person [property Name] : String | +| EntityFramework.cs:196:13:196:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:197:13:197:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:196:13:196:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFramework.cs:196:13:196:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:196:29:196:29 | access to parameter p : Person [property Name] : String | EntityFramework.cs:196:13:196:23 | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:197:13:197:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | EntityFramework.cs:204:18:204:36 | call to method First : Object [property Name] : String | +| EntityFramework.cs:204:18:204:36 | call to method First : Object [property Name] : String | EntityFramework.cs:204:18:204:41 | access to property Name | +| EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | EntityFramework.cs:212:18:212:38 | call to method First
    : Object [property Street] : String | +| EntityFramework.cs:212:18:212:38 | call to method First
    : Object [property Street] : String | EntityFramework.cs:212:18:212:45 | access to property Street | +| EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:36 | call to method First : Object [property Addresses, element, property Street] : String | +| EntityFramework.cs:219:18:219:36 | call to method First : Object [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:46 | access to property Addresses : ICollection
    [element, property Street] : String | +| EntityFramework.cs:219:18:219:46 | access to property Addresses : ICollection
    [element, property Street] : String | EntityFramework.cs:219:18:219:54 | call to method First
    : Object [property Street] : String | +| EntityFramework.cs:219:18:219:54 | call to method First
    : Object [property Street] : String | EntityFramework.cs:219:18:219:61 | access to property Street | | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | @@ -90,162 +90,162 @@ edges | EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | EntityFrameworkCore.cs:84:18:84:46 | object creation of type RawSqlString : RawSqlString | | EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | -| EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:226:35:226:35 | p [property Name] : String | -| EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } [property Title] : String | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 [property Title] : String | -| EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } [property Title] : String | -| EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 [property Title] : String | EntityFrameworkCore.cs:162:18:162:25 | access to property Title | -| EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] [element, property Street] : String | EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } [element, property Street] : String | EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] [element, property Street] : String | -| EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address [property Street] : String | EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } [element, property Street] : String | -| EntityFrameworkCore.cs:176:33:179:21 | { ..., ... } [property Street] : String | EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address [property Street] : String | -| EntityFrameworkCore.cs:178:34:178:42 | "tainted" : String | EntityFrameworkCore.cs:176:33:179:21 | { ..., ... } [property Street] : String | -| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:182:13:182:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:13:182:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } [property Street] : String | EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 [property Street] : String | -| EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } [property Street] : String | -| EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:194:13:194:25 | [post] access to property Addresses [element, property Street] : String | EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 [property Street] : String | EntityFrameworkCore.cs:194:13:194:25 | [post] access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } [property Street] : String | EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 [property Street] : String | -| EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } [property Street] : String | -| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Address, property Street] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Address, property Street] : String | -| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Person, property Name] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Person, property Name] : String | -| EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Person, property Name] : String | -| EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 [property Street] : String | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Address, property Street] : String | -| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Address, property Street] : String | EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | -| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Person, property Name] : String | EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | -| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:226:35:226:35 | p [property Name] : String | EntityFrameworkCore.cs:229:29:229:29 | access to parameter p [property Name] : String | -| EntityFrameworkCore.cs:229:13:229:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:230:13:230:15 | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:229:13:229:23 | [post] access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:229:13:229:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:229:29:229:29 | access to parameter p [property Name] : String | EntityFrameworkCore.cs:229:13:229:23 | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:230:13:230:15 | access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:237:18:237:36 | call to method First [property Name] : String | -| EntityFrameworkCore.cs:237:18:237:36 | call to method First [property Name] : String | EntityFrameworkCore.cs:237:18:237:41 | access to property Name | -| EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | EntityFrameworkCore.cs:245:18:245:38 | call to method First
    [property Street] : String | -| EntityFrameworkCore.cs:245:18:245:38 | call to method First
    [property Street] : String | EntityFrameworkCore.cs:245:18:245:45 | access to property Street | -| EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:36 | call to method First [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:252:18:252:36 | call to method First [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses [element, property Street] : String | EntityFrameworkCore.cs:252:18:252:54 | call to method First
    [property Street] : String | -| EntityFrameworkCore.cs:252:18:252:54 | call to method First
    [property Street] : String | EntityFrameworkCore.cs:252:18:252:61 | access to property Street | +| EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | +| EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | +| EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | +| EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | +| EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | +| EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | +| EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:226:35:226:35 | p : Person [property Name] : String | +| EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | +| EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | +| EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | EntityFrameworkCore.cs:162:18:162:25 | access to property Title | +| EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] : null [element, property Street] : String | EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } : null [element, property Street] : String | EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] : null [element, property Street] : String | +| EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address : Address [property Street] : String | EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } : null [element, property Street] : String | +| EntityFrameworkCore.cs:176:33:179:21 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address : Address [property Street] : String | +| EntityFrameworkCore.cs:178:34:178:42 | "tainted" : String | EntityFrameworkCore.cs:176:33:179:21 | { ..., ... } : Address [property Street] : String | +| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:13:182:23 | [post] access to property Persons : DbSet [element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:13:182:23 | [post] access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 : Address [property Street] : String | +| EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | +| EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:194:13:194:25 | [post] access to property Addresses : DbSet [element, property Street] : String | EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 : Address [property Street] : String | EntityFrameworkCore.cs:194:13:194:25 | [post] access to property Addresses : DbSet [element, property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | +| EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | +| EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 : Address [property Street] : String | +| EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | +| EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | +| EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 : Address [property Street] : String | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses : DbSet [element, property Address, property Street] : String | EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses : DbSet [element, property Person, property Name] : String | EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses : DbSet [element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses : DbSet [element, property Person, property Name] : String | +| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:226:35:226:35 | p : Person [property Name] : String | EntityFrameworkCore.cs:229:29:229:29 | access to parameter p : Person [property Name] : String | +| EntityFrameworkCore.cs:229:13:229:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:230:13:230:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:229:13:229:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFrameworkCore.cs:229:13:229:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:229:29:229:29 | access to parameter p : Person [property Name] : String | EntityFrameworkCore.cs:229:13:229:23 | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:230:13:230:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | EntityFrameworkCore.cs:237:18:237:36 | call to method First : Object [property Name] : String | +| EntityFrameworkCore.cs:237:18:237:36 | call to method First : Object [property Name] : String | EntityFrameworkCore.cs:237:18:237:41 | access to property Name | +| EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | EntityFrameworkCore.cs:245:18:245:38 | call to method First
    : Object [property Street] : String | +| EntityFrameworkCore.cs:245:18:245:38 | call to method First
    : Object [property Street] : String | EntityFrameworkCore.cs:245:18:245:45 | access to property Street | +| EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:36 | call to method First : Object [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:252:18:252:36 | call to method First : Object [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses : ICollection
    [element, property Street] : String | +| EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses : ICollection
    [element, property Street] : String | EntityFrameworkCore.cs:252:18:252:54 | call to method First
    : Object [property Street] : String | +| EntityFrameworkCore.cs:252:18:252:54 | call to method First
    : Object [property Street] : String | EntityFrameworkCore.cs:252:18:252:61 | access to property Street | nodes -| EntityFramework.cs:59:13:62:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:61:24:61:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:66:13:66:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | -| EntityFramework.cs:66:29:66:30 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFramework.cs:68:13:68:15 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:81:13:84:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:66:13:66:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFramework.cs:68:13:68:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:83:24:83:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:88:13:88:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | -| EntityFramework.cs:88:29:88:30 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFramework.cs:90:19:90:21 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:103:13:106:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:88:13:88:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFramework.cs:90:19:90:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:105:24:105:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFramework.cs:109:27:109:28 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFramework.cs:122:13:125:13 | { ..., ... } [property Title] : String | semmle.label | { ..., ... } [property Title] : String | +| EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | semmle.label | { ..., ... } : Person [property Title] : String | | EntityFramework.cs:124:25:124:33 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFramework.cs:129:18:129:19 | access to local variable p1 [property Title] : String | semmle.label | access to local variable p1 [property Title] : String | +| EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | semmle.label | access to local variable p1 : Person [property Title] : String | | EntityFramework.cs:129:18:129:25 | access to property Title | semmle.label | access to property Title | -| EntityFramework.cs:141:13:148:13 | { ..., ... } [property Addresses, element, property Street] : String | semmle.label | { ..., ... } [property Addresses, element, property Street] : String | -| EntityFramework.cs:142:29:147:17 | array creation of type Address[] [element, property Street] : String | semmle.label | array creation of type Address[] [element, property Street] : String | -| EntityFramework.cs:142:35:147:17 | { ..., ... } [element, property Street] : String | semmle.label | { ..., ... } [element, property Street] : String | -| EntityFramework.cs:143:21:146:21 | object creation of type Address [property Street] : String | semmle.label | object creation of type Address [property Street] : String | -| EntityFramework.cs:143:33:146:21 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | +| EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | semmle.label | { ..., ... } : Person [property Addresses, element, property Street] : String | +| EntityFramework.cs:142:29:147:17 | array creation of type Address[] : null [element, property Street] : String | semmle.label | array creation of type Address[] : null [element, property Street] : String | +| EntityFramework.cs:142:35:147:17 | { ..., ... } : null [element, property Street] : String | semmle.label | { ..., ... } : null [element, property Street] : String | +| EntityFramework.cs:143:21:146:21 | object creation of type Address : Address [property Street] : String | semmle.label | object creation of type Address : Address [property Street] : String | +| EntityFramework.cs:143:33:146:21 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFramework.cs:145:34:145:42 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFramework.cs:149:13:149:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | semmle.label | [post] access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:149:29:149:30 | access to local variable p1 [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 [property Addresses, element, property Street] : String | -| EntityFramework.cs:150:13:150:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFramework.cs:154:13:154:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFramework.cs:157:13:160:13 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | +| EntityFramework.cs:149:13:149:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:149:13:149:23 | [post] access to property Persons : DbSet [element, property Addresses, element, property Street] : String | semmle.label | [post] access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:149:29:149:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 : Person [property Addresses, element, property Street] : String | +| EntityFramework.cs:150:13:150:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:154:13:154:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFramework.cs:159:26:159:34 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFramework.cs:161:13:161:25 | [post] access to property Addresses [element, property Street] : String | semmle.label | [post] access to property Addresses [element, property Street] : String | -| EntityFramework.cs:161:31:161:32 | access to local variable a1 [property Street] : String | semmle.label | access to local variable a1 [property Street] : String | -| EntityFramework.cs:162:13:162:15 | access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFramework.cs:162:13:162:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFramework.cs:166:13:166:15 | access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFramework.cs:166:13:166:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFramework.cs:173:13:176:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFramework.cs:161:13:161:25 | [post] access to property Addresses : DbSet [element, property Street] : String | semmle.label | [post] access to property Addresses : DbSet [element, property Street] : String | +| EntityFramework.cs:161:31:161:32 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | +| EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:175:24:175:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFramework.cs:178:13:181:13 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | +| EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFramework.cs:180:26:180:34 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFramework.cs:182:60:182:88 | { ..., ... } [property Address, property Street] : String | semmle.label | { ..., ... } [property Address, property Street] : String | -| EntityFramework.cs:182:60:182:88 | { ..., ... } [property Person, property Name] : String | semmle.label | { ..., ... } [property Person, property Name] : String | -| EntityFramework.cs:182:71:182:72 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFramework.cs:182:85:182:86 | access to local variable a1 [property Street] : String | semmle.label | access to local variable a1 [property Street] : String | -| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | semmle.label | [post] access to property PersonAddresses [element, property Address, property Street] : String | -| EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | semmle.label | [post] access to property PersonAddresses [element, property Person, property Name] : String | -| EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 [property Address, property Street] : String | semmle.label | access to local variable personAddressMap1 [property Address, property Street] : String | -| EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 [property Person, property Name] : String | semmle.label | access to local variable personAddressMap1 [property Person, property Name] : String | -| EntityFramework.cs:184:13:184:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFramework.cs:184:13:184:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFramework.cs:190:13:190:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFramework.cs:190:13:190:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFramework.cs:193:35:193:35 | p [property Name] : String | semmle.label | p [property Name] : String | -| EntityFramework.cs:196:13:196:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:196:13:196:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | -| EntityFramework.cs:196:29:196:29 | access to parameter p [property Name] : String | semmle.label | access to parameter p [property Name] : String | -| EntityFramework.cs:197:13:197:15 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFramework.cs:204:18:204:28 | access to property Persons [element, property Name] : String | semmle.label | access to property Persons [element, property Name] : String | -| EntityFramework.cs:204:18:204:36 | call to method First [property Name] : String | semmle.label | call to method First [property Name] : String | +| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | semmle.label | { ..., ... } : PersonAddressMap [property Address, property Street] : String | +| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | semmle.label | { ..., ... } : PersonAddressMap [property Person, property Name] : String | +| EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFramework.cs:182:85:182:86 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | +| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | semmle.label | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses : DbSet [element, property Address, property Street] : String | semmle.label | [post] access to property PersonAddresses : DbSet [element, property Address, property Street] : String | +| EntityFramework.cs:183:13:183:31 | [post] access to property PersonAddresses : DbSet [element, property Person, property Name] : String | semmle.label | [post] access to property PersonAddresses : DbSet [element, property Person, property Name] : String | +| EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | +| EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | +| EntityFramework.cs:184:13:184:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFramework.cs:184:13:184:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFramework.cs:190:13:190:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFramework.cs:190:13:190:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFramework.cs:193:35:193:35 | p : Person [property Name] : String | semmle.label | p : Person [property Name] : String | +| EntityFramework.cs:196:13:196:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:196:13:196:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:196:29:196:29 | access to parameter p : Person [property Name] : String | semmle.label | access to parameter p : Person [property Name] : String | +| EntityFramework.cs:197:13:197:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | semmle.label | access to property Persons : DbSet [element, property Name] : String | +| EntityFramework.cs:204:18:204:36 | call to method First : Object [property Name] : String | semmle.label | call to method First : Object [property Name] : String | | EntityFramework.cs:204:18:204:41 | access to property Name | semmle.label | access to property Name | -| EntityFramework.cs:212:18:212:30 | access to property Addresses [element, property Street] : String | semmle.label | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:212:18:212:38 | call to method First
    [property Street] : String | semmle.label | call to method First
    [property Street] : String | +| EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | semmle.label | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFramework.cs:212:18:212:38 | call to method First
    : Object [property Street] : String | semmle.label | call to method First
    : Object [property Street] : String | | EntityFramework.cs:212:18:212:45 | access to property Street | semmle.label | access to property Street | -| EntityFramework.cs:219:18:219:28 | access to property Persons [element, property Addresses, element, property Street] : String | semmle.label | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFramework.cs:219:18:219:36 | call to method First [property Addresses, element, property Street] : String | semmle.label | call to method First [property Addresses, element, property Street] : String | -| EntityFramework.cs:219:18:219:46 | access to property Addresses [element, property Street] : String | semmle.label | access to property Addresses [element, property Street] : String | -| EntityFramework.cs:219:18:219:54 | call to method First
    [property Street] : String | semmle.label | call to method First
    [property Street] : String | +| EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | semmle.label | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFramework.cs:219:18:219:36 | call to method First : Object [property Addresses, element, property Street] : String | semmle.label | call to method First : Object [property Addresses, element, property Street] : String | +| EntityFramework.cs:219:18:219:46 | access to property Addresses : ICollection
    [element, property Street] : String | semmle.label | access to property Addresses : ICollection
    [element, property Street] : String | +| EntityFramework.cs:219:18:219:54 | call to method First
    : Object [property Street] : String | semmle.label | call to method First
    : Object [property Street] : String | | EntityFramework.cs:219:18:219:61 | access to property Street | semmle.label | access to property Street | | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | semmle.label | access to local variable taintSource | @@ -255,78 +255,78 @@ nodes | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | semmle.label | (...) ... | | EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | semmle.label | call to operator implicit conversion : RawSqlString | | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | semmle.label | access to local variable taintSource : String | -| EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } [property Title] : String | semmle.label | { ..., ... } [property Title] : String | +| EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | semmle.label | { ..., ... } : Person [property Title] : String | | EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 [property Title] : String | semmle.label | access to local variable p1 [property Title] : String | +| EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | semmle.label | access to local variable p1 : Person [property Title] : String | | EntityFrameworkCore.cs:162:18:162:25 | access to property Title | semmle.label | access to property Title | -| EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } [property Addresses, element, property Street] : String | semmle.label | { ..., ... } [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] [element, property Street] : String | semmle.label | array creation of type Address[] [element, property Street] : String | -| EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } [element, property Street] : String | semmle.label | { ..., ... } [element, property Street] : String | -| EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address [property Street] : String | semmle.label | object creation of type Address [property Street] : String | -| EntityFrameworkCore.cs:176:33:179:21 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | +| EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | semmle.label | { ..., ... } : Person [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] : null [element, property Street] : String | semmle.label | array creation of type Address[] : null [element, property Street] : String | +| EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } : null [element, property Street] : String | semmle.label | { ..., ... } : null [element, property Street] : String | +| EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address : Address [property Street] : String | semmle.label | object creation of type Address : Address [property Street] : String | +| EntityFrameworkCore.cs:176:33:179:21 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFrameworkCore.cs:178:34:178:42 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:182:13:182:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | semmle.label | [post] access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | +| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:13:182:23 | [post] access to property Persons : DbSet [element, property Addresses, element, property Street] : String | semmle.label | [post] access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 : Person [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:194:13:194:25 | [post] access to property Addresses [element, property Street] : String | semmle.label | [post] access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 [property Street] : String | semmle.label | access to local variable a1 [property Street] : String | -| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:194:13:194:25 | [post] access to property Addresses : DbSet [element, property Street] : String | semmle.label | [post] access to property Addresses : DbSet [element, property Street] : String | +| EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | +| EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Address, property Street] : String | semmle.label | { ..., ... } [property Address, property Street] : String | -| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Person, property Name] : String | semmle.label | { ..., ... } [property Person, property Name] : String | -| EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 [property Street] : String | semmle.label | access to local variable a1 [property Street] : String | -| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | semmle.label | [post] access to property PersonAddresses [element, property Address, property Street] : String | -| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | semmle.label | [post] access to property PersonAddresses [element, property Person, property Name] : String | -| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Address, property Street] : String | semmle.label | access to local variable personAddressMap1 [property Address, property Street] : String | -| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Person, property Name] : String | semmle.label | access to local variable personAddressMap1 [property Person, property Name] : String | -| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:226:35:226:35 | p [property Name] : String | semmle.label | p [property Name] : String | -| EntityFrameworkCore.cs:229:13:229:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:229:13:229:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:229:29:229:29 | access to parameter p [property Name] : String | semmle.label | access to parameter p [property Name] : String | -| EntityFrameworkCore.cs:230:13:230:15 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | semmle.label | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:237:18:237:36 | call to method First [property Name] : String | semmle.label | call to method First [property Name] : String | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | semmle.label | { ..., ... } : PersonAddressMap [property Address, property Street] : String | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | semmle.label | { ..., ... } : PersonAddressMap [property Person, property Name] : String | +| EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | semmle.label | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses : DbSet [element, property Address, property Street] : String | semmle.label | [post] access to property PersonAddresses : DbSet [element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses : DbSet [element, property Person, property Name] : String | semmle.label | [post] access to property PersonAddresses : DbSet [element, property Person, property Name] : String | +| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | +| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | +| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx : MyContext [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:226:35:226:35 | p : Person [property Name] : String | semmle.label | p : Person [property Name] : String | +| EntityFrameworkCore.cs:229:13:229:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:229:13:229:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:229:29:229:29 | access to parameter p : Person [property Name] : String | semmle.label | access to parameter p : Person [property Name] : String | +| EntityFrameworkCore.cs:230:13:230:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | semmle.label | access to property Persons : DbSet [element, property Name] : String | +| EntityFrameworkCore.cs:237:18:237:36 | call to method First : Object [property Name] : String | semmle.label | call to method First : Object [property Name] : String | | EntityFrameworkCore.cs:237:18:237:41 | access to property Name | semmle.label | access to property Name | -| EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | semmle.label | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:245:18:245:38 | call to method First
    [property Street] : String | semmle.label | call to method First
    [property Street] : String | +| EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | semmle.label | access to property Addresses : DbSet
    [element, property Street] : String | +| EntityFrameworkCore.cs:245:18:245:38 | call to method First
    : Object [property Street] : String | semmle.label | call to method First
    : Object [property Street] : String | | EntityFrameworkCore.cs:245:18:245:45 | access to property Street | semmle.label | access to property Street | -| EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | semmle.label | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:252:18:252:36 | call to method First [property Addresses, element, property Street] : String | semmle.label | call to method First [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses [element, property Street] : String | semmle.label | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:252:18:252:54 | call to method First
    [property Street] : String | semmle.label | call to method First
    [property Street] : String | +| EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | semmle.label | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:252:18:252:36 | call to method First : Object [property Addresses, element, property Street] : String | semmle.label | call to method First : Object [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses : ICollection
    [element, property Street] : String | semmle.label | access to property Addresses : ICollection
    [element, property Street] : String | +| EntityFrameworkCore.cs:252:18:252:54 | call to method First
    : Object [property Street] : String | semmle.label | call to method First
    : Object [property Street] : String | | EntityFrameworkCore.cs:252:18:252:61 | access to property Street | semmle.label | access to property Street | subpaths #select diff --git a/csharp/ql/test/queries.xml b/csharp/ql/test/queries.xml deleted file mode 100644 index 56abe7737ac..00000000000 --- a/csharp/ql/test/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected b/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected index 297cfee7c34..e47404352b7 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected @@ -1,13 +1,8 @@ edges | ZipSlip.cs:15:44:15:75 | call to method GetFullPath : String | ZipSlip.cs:30:71:30:87 | access to local variable fullPath_relative : String | -| ZipSlip.cs:15:44:15:75 | call to method GetFullPath : String | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | | ZipSlip.cs:15:44:15:75 | call to method GetFullPath : String | ZipSlip.cs:39:45:39:73 | access to local variable destFilePath_notCanonicalized | | ZipSlip.cs:15:61:15:74 | access to property FullName : String | ZipSlip.cs:15:44:15:75 | call to method GetFullPath : String | -| ZipSlip.cs:15:61:15:74 | access to property FullName : String | ZipSlip.cs:30:71:30:87 | access to local variable fullPath_relative : String | -| ZipSlip.cs:15:61:15:74 | access to property FullName : String | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | -| ZipSlip.cs:15:61:15:74 | access to property FullName : String | ZipSlip.cs:39:45:39:73 | access to local variable destFilePath_notCanonicalized | | ZipSlip.cs:18:53:18:66 | access to property FullName : String | ZipSlip.cs:22:71:22:96 | access to local variable file_badDirectoryTraversal : String | -| ZipSlip.cs:18:53:18:66 | access to property FullName : String | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | | ZipSlip.cs:22:43:22:97 | call to method Combine : String | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | | ZipSlip.cs:22:71:22:96 | access to local variable file_badDirectoryTraversal : String | ZipSlip.cs:22:43:22:97 | call to method Combine : String | | ZipSlip.cs:30:43:30:88 | call to method Combine : String | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | @@ -15,20 +10,13 @@ edges | ZipSlip.cs:58:31:58:75 | call to method Combine : String | ZipSlip.cs:62:33:62:40 | access to local variable fullpath | | ZipSlip.cs:58:31:58:75 | call to method Combine : String | ZipSlip.cs:71:37:71:44 | access to local variable fullpath | | ZipSlip.cs:58:61:58:74 | access to property FullName : String | ZipSlip.cs:58:31:58:75 | call to method Combine : String | -| ZipSlip.cs:58:61:58:74 | access to property FullName : String | ZipSlip.cs:62:33:62:40 | access to local variable fullpath | -| ZipSlip.cs:58:61:58:74 | access to property FullName : String | ZipSlip.cs:71:37:71:44 | access to local variable fullpath | | ZipSlip.cs:105:47:105:86 | call to method Combine : String | ZipSlip.cs:112:74:112:85 | access to local variable destFilePath | | ZipSlip.cs:105:47:105:86 | call to method Combine : String | ZipSlip.cs:119:71:119:82 | access to local variable destFilePath | | ZipSlip.cs:105:47:105:86 | call to method Combine : String | ZipSlip.cs:126:57:126:68 | access to local variable destFilePath | | ZipSlip.cs:105:47:105:86 | call to method Combine : String | ZipSlip.cs:134:58:134:69 | access to local variable destFilePath | | ZipSlip.cs:105:72:105:85 | access to property FullName : String | ZipSlip.cs:105:47:105:86 | call to method Combine : String | -| ZipSlip.cs:105:72:105:85 | access to property FullName : String | ZipSlip.cs:112:74:112:85 | access to local variable destFilePath | -| ZipSlip.cs:105:72:105:85 | access to property FullName : String | ZipSlip.cs:119:71:119:82 | access to local variable destFilePath | -| ZipSlip.cs:105:72:105:85 | access to property FullName : String | ZipSlip.cs:126:57:126:68 | access to local variable destFilePath | -| ZipSlip.cs:105:72:105:85 | access to property FullName : String | ZipSlip.cs:134:58:134:69 | access to local variable destFilePath | | ZipSlipBad.cs:9:31:9:73 | call to method Combine : String | ZipSlipBad.cs:10:29:10:40 | access to local variable destFileName | | ZipSlipBad.cs:9:59:9:72 | access to property FullName : String | ZipSlipBad.cs:9:31:9:73 | call to method Combine : String | -| ZipSlipBad.cs:9:59:9:72 | access to property FullName : String | ZipSlipBad.cs:10:29:10:40 | access to local variable destFileName | nodes | ZipSlip.cs:15:44:15:75 | call to method GetFullPath : String | semmle.label | call to method GetFullPath : String | | ZipSlip.cs:15:61:15:74 | access to property FullName : String | semmle.label | access to property FullName : String | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-079/StoredXSS/XSS.expected b/csharp/ql/test/query-tests/Security Features/CWE-079/StoredXSS/XSS.expected index 859767e8b29..f1f4c631769 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-079/StoredXSS/XSS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-079/StoredXSS/XSS.expected @@ -1,12 +1,12 @@ edges -| XSS.cs:25:13:25:21 | [post] access to local variable userInput [element] : String | XSS.cs:26:32:26:40 | access to local variable userInput [element] : String | -| XSS.cs:25:13:25:21 | [post] access to local variable userInput [element] : String | XSS.cs:27:29:27:37 | access to local variable userInput [element] : String | -| XSS.cs:25:13:25:21 | [post] access to local variable userInput [element] : String | XSS.cs:28:26:28:34 | access to local variable userInput [element] : String | +| XSS.cs:25:13:25:21 | [post] access to local variable userInput : StringBuilder [element] : String | XSS.cs:26:32:26:40 | access to local variable userInput : StringBuilder [element] : String | +| XSS.cs:25:13:25:21 | [post] access to local variable userInput : StringBuilder [element] : String | XSS.cs:27:29:27:37 | access to local variable userInput : StringBuilder [element] : String | +| XSS.cs:25:13:25:21 | [post] access to local variable userInput : StringBuilder [element] : String | XSS.cs:28:26:28:34 | access to local variable userInput : StringBuilder [element] : String | | XSS.cs:25:48:25:62 | access to field categoryTextBox : TextBox | XSS.cs:25:48:25:67 | access to property Text : String | -| XSS.cs:25:48:25:67 | access to property Text : String | XSS.cs:25:13:25:21 | [post] access to local variable userInput [element] : String | -| XSS.cs:26:32:26:40 | access to local variable userInput [element] : String | XSS.cs:26:32:26:51 | call to method ToString | -| XSS.cs:27:29:27:37 | access to local variable userInput [element] : String | XSS.cs:27:29:27:48 | call to method ToString | -| XSS.cs:28:26:28:34 | access to local variable userInput [element] : String | XSS.cs:28:26:28:45 | call to method ToString | +| XSS.cs:25:48:25:67 | access to property Text : String | XSS.cs:25:13:25:21 | [post] access to local variable userInput : StringBuilder [element] : String | +| XSS.cs:26:32:26:40 | access to local variable userInput : StringBuilder [element] : String | XSS.cs:26:32:26:51 | call to method ToString | +| XSS.cs:27:29:27:37 | access to local variable userInput : StringBuilder [element] : String | XSS.cs:27:29:27:48 | call to method ToString | +| XSS.cs:28:26:28:34 | access to local variable userInput : StringBuilder [element] : String | XSS.cs:28:26:28:45 | call to method ToString | | XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | XSS.cs:37:27:37:61 | access to indexer : String | | XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | XSS.cs:38:36:38:39 | access to local variable name | | XSS.cs:37:27:37:61 | access to indexer : String | XSS.cs:38:36:38:39 | access to local variable name | @@ -29,14 +29,14 @@ edges | script.aspx:16:1:16:34 | <%= ... %> | script.aspx:16:1:16:34 | <%= ... %> | | script.aspx:20:1:20:41 | <%= ... %> | script.aspx:20:1:20:41 | <%= ... %> | nodes -| XSS.cs:25:13:25:21 | [post] access to local variable userInput [element] : String | semmle.label | [post] access to local variable userInput [element] : String | +| XSS.cs:25:13:25:21 | [post] access to local variable userInput : StringBuilder [element] : String | semmle.label | [post] access to local variable userInput : StringBuilder [element] : String | | XSS.cs:25:48:25:62 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox | | XSS.cs:25:48:25:67 | access to property Text : String | semmle.label | access to property Text : String | -| XSS.cs:26:32:26:40 | access to local variable userInput [element] : String | semmle.label | access to local variable userInput [element] : String | +| XSS.cs:26:32:26:40 | access to local variable userInput : StringBuilder [element] : String | semmle.label | access to local variable userInput : StringBuilder [element] : String | | XSS.cs:26:32:26:51 | call to method ToString | semmle.label | call to method ToString | -| XSS.cs:27:29:27:37 | access to local variable userInput [element] : String | semmle.label | access to local variable userInput [element] : String | +| XSS.cs:27:29:27:37 | access to local variable userInput : StringBuilder [element] : String | semmle.label | access to local variable userInput : StringBuilder [element] : String | | XSS.cs:27:29:27:48 | call to method ToString | semmle.label | call to method ToString | -| XSS.cs:28:26:28:34 | access to local variable userInput [element] : String | semmle.label | access to local variable userInput [element] : String | +| XSS.cs:28:26:28:34 | access to local variable userInput : StringBuilder [element] : String | semmle.label | access to local variable userInput : StringBuilder [element] : String | | XSS.cs:28:26:28:45 | call to method ToString | semmle.label | call to method ToString | | XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:37:27:37:61 | access to indexer : String | semmle.label | access to indexer : String | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-312/CleartextStorage.cs b/csharp/ql/test/query-tests/Security Features/CWE-312/CleartextStorage.cs index e8dd58c0d4f..74a5568b668 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-312/CleartextStorage.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-312/CleartextStorage.cs @@ -2,6 +2,8 @@ using System.Text; using System.Web; using System.Web.Security; using System.Windows.Forms; +using System.IO; +using System.Security.Cryptography; public class ClearTextStorageHandler : IHttpHandler { @@ -24,6 +26,22 @@ public class ClearTextStorageHandler : IHttpHandler logger.Warn(GetPassword()); // GOOD: Logging encrypted sensitive data logger.Warn(Encode(GetPassword(), "Password")); + + // BAD: Storing sensitive data in local file + using (var writeStream = File.Open("passwords.txt", FileMode.Create)) + { + var writer = new StreamWriter(writeStream); + writer.Write(GetPassword()); + writer.Close(); + } + + // GOOD: Storing encrypted sensitive data + using (var writeStream = File.Open("passwords.txt", FileMode.Create)) + { + var writer = new StreamWriter(new CryptoStream(writeStream, GetEncryptor(), CryptoStreamMode.Write)); + writer.Write(GetPassword()); + writer.Close(); + } } public string Encode(string value, string type) @@ -31,6 +49,10 @@ public class ClearTextStorageHandler : IHttpHandler return Encoding.UTF8.GetString(MachineKey.Protect(Encoding.UTF8.GetBytes(value), type)); } + public ICryptoTransform GetEncryptor(){ + return null; + } + public string GetPassword() { return "password"; diff --git a/csharp/ql/test/query-tests/Security Features/CWE-312/CleartextStorage.expected b/csharp/ql/test/query-tests/Security Features/CWE-312/CleartextStorage.expected index d8a6cbf5534..74b546faa65 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-312/CleartextStorage.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-312/CleartextStorage.expected @@ -1,20 +1,22 @@ edges nodes -| CleartextStorage.cs:13:50:13:59 | access to field accountKey | semmle.label | access to field accountKey | -| CleartextStorage.cs:14:62:14:74 | call to method GetPassword | semmle.label | call to method GetPassword | -| CleartextStorage.cs:15:69:15:81 | call to method GetPassword | semmle.label | call to method GetPassword | -| CleartextStorage.cs:16:50:16:63 | call to method GetAccountID | semmle.label | call to method GetAccountID | -| CleartextStorage.cs:24:21:24:33 | call to method GetPassword | semmle.label | call to method GetPassword | -| CleartextStorage.cs:72:21:72:33 | access to property Text | semmle.label | access to property Text | -| CleartextStorage.cs:73:21:73:29 | access to property Text | semmle.label | access to property Text | -| CleartextStorage.cs:74:21:74:29 | access to property Text | semmle.label | access to property Text | +| CleartextStorage.cs:15:50:15:59 | access to field accountKey | semmle.label | access to field accountKey | +| CleartextStorage.cs:16:62:16:74 | call to method GetPassword | semmle.label | call to method GetPassword | +| CleartextStorage.cs:17:69:17:81 | call to method GetPassword | semmle.label | call to method GetPassword | +| CleartextStorage.cs:18:50:18:63 | call to method GetAccountID | semmle.label | call to method GetAccountID | +| CleartextStorage.cs:26:21:26:33 | call to method GetPassword | semmle.label | call to method GetPassword | +| CleartextStorage.cs:34:26:34:38 | call to method GetPassword | semmle.label | call to method GetPassword | +| CleartextStorage.cs:94:21:94:33 | access to property Text | semmle.label | access to property Text | +| CleartextStorage.cs:95:21:95:29 | access to property Text | semmle.label | access to property Text | +| CleartextStorage.cs:96:21:96:29 | access to property Text | semmle.label | access to property Text | subpaths #select -| CleartextStorage.cs:13:50:13:59 | access to field accountKey | CleartextStorage.cs:13:50:13:59 | access to field accountKey | CleartextStorage.cs:13:50:13:59 | access to field accountKey | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:13:50:13:59 | access to field accountKey | access to field accountKey | -| CleartextStorage.cs:14:62:14:74 | call to method GetPassword | CleartextStorage.cs:14:62:14:74 | call to method GetPassword | CleartextStorage.cs:14:62:14:74 | call to method GetPassword | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:14:62:14:74 | call to method GetPassword | call to method GetPassword | -| CleartextStorage.cs:15:69:15:81 | call to method GetPassword | CleartextStorage.cs:15:69:15:81 | call to method GetPassword | CleartextStorage.cs:15:69:15:81 | call to method GetPassword | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:15:69:15:81 | call to method GetPassword | call to method GetPassword | -| CleartextStorage.cs:16:50:16:63 | call to method GetAccountID | CleartextStorage.cs:16:50:16:63 | call to method GetAccountID | CleartextStorage.cs:16:50:16:63 | call to method GetAccountID | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:16:50:16:63 | call to method GetAccountID | call to method GetAccountID | -| CleartextStorage.cs:24:21:24:33 | call to method GetPassword | CleartextStorage.cs:24:21:24:33 | call to method GetPassword | CleartextStorage.cs:24:21:24:33 | call to method GetPassword | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:24:21:24:33 | call to method GetPassword | call to method GetPassword | -| CleartextStorage.cs:72:21:72:33 | access to property Text | CleartextStorage.cs:72:21:72:33 | access to property Text | CleartextStorage.cs:72:21:72:33 | access to property Text | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:72:21:72:33 | access to property Text | access to property Text | -| CleartextStorage.cs:73:21:73:29 | access to property Text | CleartextStorage.cs:73:21:73:29 | access to property Text | CleartextStorage.cs:73:21:73:29 | access to property Text | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:73:21:73:29 | access to property Text | access to property Text | -| CleartextStorage.cs:74:21:74:29 | access to property Text | CleartextStorage.cs:74:21:74:29 | access to property Text | CleartextStorage.cs:74:21:74:29 | access to property Text | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:74:21:74:29 | access to property Text | access to property Text | +| CleartextStorage.cs:15:50:15:59 | access to field accountKey | CleartextStorage.cs:15:50:15:59 | access to field accountKey | CleartextStorage.cs:15:50:15:59 | access to field accountKey | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:15:50:15:59 | access to field accountKey | access to field accountKey | +| CleartextStorage.cs:16:62:16:74 | call to method GetPassword | CleartextStorage.cs:16:62:16:74 | call to method GetPassword | CleartextStorage.cs:16:62:16:74 | call to method GetPassword | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:16:62:16:74 | call to method GetPassword | call to method GetPassword | +| CleartextStorage.cs:17:69:17:81 | call to method GetPassword | CleartextStorage.cs:17:69:17:81 | call to method GetPassword | CleartextStorage.cs:17:69:17:81 | call to method GetPassword | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:17:69:17:81 | call to method GetPassword | call to method GetPassword | +| CleartextStorage.cs:18:50:18:63 | call to method GetAccountID | CleartextStorage.cs:18:50:18:63 | call to method GetAccountID | CleartextStorage.cs:18:50:18:63 | call to method GetAccountID | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:18:50:18:63 | call to method GetAccountID | call to method GetAccountID | +| CleartextStorage.cs:26:21:26:33 | call to method GetPassword | CleartextStorage.cs:26:21:26:33 | call to method GetPassword | CleartextStorage.cs:26:21:26:33 | call to method GetPassword | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:26:21:26:33 | call to method GetPassword | call to method GetPassword | +| CleartextStorage.cs:34:26:34:38 | call to method GetPassword | CleartextStorage.cs:34:26:34:38 | call to method GetPassword | CleartextStorage.cs:34:26:34:38 | call to method GetPassword | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:34:26:34:38 | call to method GetPassword | call to method GetPassword | +| CleartextStorage.cs:94:21:94:33 | access to property Text | CleartextStorage.cs:94:21:94:33 | access to property Text | CleartextStorage.cs:94:21:94:33 | access to property Text | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:94:21:94:33 | access to property Text | access to property Text | +| CleartextStorage.cs:95:21:95:29 | access to property Text | CleartextStorage.cs:95:21:95:29 | access to property Text | CleartextStorage.cs:95:21:95:29 | access to property Text | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:95:21:95:29 | access to property Text | access to property Text | +| CleartextStorage.cs:96:21:96:29 | access to property Text | CleartextStorage.cs:96:21:96:29 | access to property Text | CleartextStorage.cs:96:21:96:29 | access to property Text | This stores sensitive data returned by $@ as clear text. | CleartextStorage.cs:96:21:96:29 | access to property Text | access to property Text | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-312/options b/csharp/ql/test/query-tests/Security Features/CWE-312/options index da018b1a099..4b3bf418201 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-312/options +++ b/csharp/ql/test/query-tests/Security Features/CWE-312/options @@ -1 +1 @@ -semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.cs /r:System.Collections.Specialized.dll {testdir}/../../../../resources/stubs/System.Windows.cs +semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.cs /r:System.Collections.Specialized.dll /r:System.Security.Cryptography.dll {testdir}/../../../../resources/stubs/System.Windows.cs diff --git a/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected b/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected index 07cdf34f0c9..4cc2e788074 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected @@ -1,11 +1,11 @@ edges -| InsecureRandomness.cs:28:13:28:16 | [post] access to local variable data [element] : Int32 | InsecureRandomness.cs:29:57:29:60 | access to local variable data [element] : Int32 | -| InsecureRandomness.cs:28:23:28:43 | (...) ... : Int32 | InsecureRandomness.cs:28:13:28:16 | [post] access to local variable data [element] : Int32 | +| InsecureRandomness.cs:28:13:28:16 | [post] access to local variable data : Byte[] [element] : Int32 | InsecureRandomness.cs:29:57:29:60 | access to local variable data : Byte[] [element] : Int32 | +| InsecureRandomness.cs:28:23:28:43 | (...) ... : Int32 | InsecureRandomness.cs:28:13:28:16 | [post] access to local variable data : Byte[] [element] : Int32 | | InsecureRandomness.cs:28:29:28:43 | call to method Next : Int32 | InsecureRandomness.cs:28:23:28:43 | (...) ... : Int32 | -| InsecureRandomness.cs:29:13:29:18 | [post] access to local variable result [element] : String | InsecureRandomness.cs:31:16:31:21 | access to local variable result [element] : String | -| InsecureRandomness.cs:29:27:29:61 | call to method GetString : String | InsecureRandomness.cs:29:13:29:18 | [post] access to local variable result [element] : String | -| InsecureRandomness.cs:29:57:29:60 | access to local variable data [element] : Int32 | InsecureRandomness.cs:29:27:29:61 | call to method GetString : String | -| InsecureRandomness.cs:31:16:31:21 | access to local variable result [element] : String | InsecureRandomness.cs:31:16:31:32 | call to method ToString : String | +| InsecureRandomness.cs:29:13:29:18 | [post] access to local variable result : StringBuilder [element] : String | InsecureRandomness.cs:31:16:31:21 | access to local variable result : StringBuilder [element] : String | +| InsecureRandomness.cs:29:27:29:61 | call to method GetString : String | InsecureRandomness.cs:29:13:29:18 | [post] access to local variable result : StringBuilder [element] : String | +| InsecureRandomness.cs:29:57:29:60 | access to local variable data : Byte[] [element] : Int32 | InsecureRandomness.cs:29:27:29:61 | call to method GetString : String | +| InsecureRandomness.cs:31:16:31:21 | access to local variable result : StringBuilder [element] : String | InsecureRandomness.cs:31:16:31:32 | call to method ToString : String | | InsecureRandomness.cs:31:16:31:32 | call to method ToString : String | InsecureRandomness.cs:12:27:12:50 | call to method InsecureRandomString | | InsecureRandomness.cs:60:31:60:39 | call to method Next : Int32 | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | InsecureRandomness.cs:62:16:62:32 | call to method ToString : String | @@ -16,13 +16,13 @@ nodes | InsecureRandomness.cs:12:27:12:50 | call to method InsecureRandomString | semmle.label | call to method InsecureRandomString | | InsecureRandomness.cs:13:20:13:56 | call to method InsecureRandomStringFromSelection | semmle.label | call to method InsecureRandomStringFromSelection | | InsecureRandomness.cs:14:20:14:54 | call to method InsecureRandomStringFromIndexer | semmle.label | call to method InsecureRandomStringFromIndexer | -| InsecureRandomness.cs:28:13:28:16 | [post] access to local variable data [element] : Int32 | semmle.label | [post] access to local variable data [element] : Int32 | +| InsecureRandomness.cs:28:13:28:16 | [post] access to local variable data : Byte[] [element] : Int32 | semmle.label | [post] access to local variable data : Byte[] [element] : Int32 | | InsecureRandomness.cs:28:23:28:43 | (...) ... : Int32 | semmle.label | (...) ... : Int32 | | InsecureRandomness.cs:28:29:28:43 | call to method Next : Int32 | semmle.label | call to method Next : Int32 | -| InsecureRandomness.cs:29:13:29:18 | [post] access to local variable result [element] : String | semmle.label | [post] access to local variable result [element] : String | +| InsecureRandomness.cs:29:13:29:18 | [post] access to local variable result : StringBuilder [element] : String | semmle.label | [post] access to local variable result : StringBuilder [element] : String | | InsecureRandomness.cs:29:27:29:61 | call to method GetString : String | semmle.label | call to method GetString : String | -| InsecureRandomness.cs:29:57:29:60 | access to local variable data [element] : Int32 | semmle.label | access to local variable data [element] : Int32 | -| InsecureRandomness.cs:31:16:31:21 | access to local variable result [element] : String | semmle.label | access to local variable result [element] : String | +| InsecureRandomness.cs:29:57:29:60 | access to local variable data : Byte[] [element] : Int32 | semmle.label | access to local variable data : Byte[] [element] : Int32 | +| InsecureRandomness.cs:31:16:31:21 | access to local variable result : StringBuilder [element] : String | semmle.label | access to local variable result : StringBuilder [element] : String | | InsecureRandomness.cs:31:16:31:32 | call to method ToString : String | semmle.label | call to method ToString : String | | InsecureRandomness.cs:60:31:60:39 | call to method Next : Int32 | semmle.label | call to method Next : Int32 | | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | semmle.label | access to local variable result : String | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-359/ExposureOfPrivateInformation.cs b/csharp/ql/test/query-tests/Security Features/CWE-359/ExposureOfPrivateInformation.cs index f7d0755d65e..675b05c29de 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-359/ExposureOfPrivateInformation.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-359/ExposureOfPrivateInformation.cs @@ -1,4 +1,6 @@ using System.Web; +using System.Security.Cryptography; +using System.IO; public class Person { @@ -21,9 +23,29 @@ public class ExposureOfPrivateInformationHandler : IHttpHandler ILogger logger = new ILogger(); logger.Warn(p.getTelephone()); + // BAD: Storing sensitive data in unencrypted local file + using (var writeStream = File.Open("telephones.txt", FileMode.Create)) + { + var writer = new StreamWriter(writeStream); + writer.Write(p.getTelephone()); + writer.Close(); + } + + // GOOD: Storing encrypted sensitive data + using (var writeStream = File.Open("telephones.txt", FileMode.Create)) + { + var writer = new StreamWriter(new CryptoStream(writeStream, GetEncryptor(), CryptoStreamMode.Write)); + writer.Write(p.getTelephone()); + writer.Close(); + } + // GOOD: Don't write these values to sensitive locations in the first place } + public ICryptoTransform GetEncryptor(){ + return null; + } + public bool IsReusable { get diff --git a/csharp/ql/test/query-tests/Security Features/CWE-359/ExposureOfPrivateInformation.expected b/csharp/ql/test/query-tests/Security Features/CWE-359/ExposureOfPrivateInformation.expected index d9f5ee50ee1..417692ff79e 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-359/ExposureOfPrivateInformation.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-359/ExposureOfPrivateInformation.expected @@ -1,12 +1,14 @@ edges nodes -| ExposureOfPrivateInformation.cs:16:50:16:84 | access to indexer | semmle.label | access to indexer | -| ExposureOfPrivateInformation.cs:18:50:18:65 | call to method getTelephone | semmle.label | call to method getTelephone | -| ExposureOfPrivateInformation.cs:22:21:22:36 | call to method getTelephone | semmle.label | call to method getTelephone | -| ExposureOfPrivateInformation.cs:40:21:40:33 | access to property Text | semmle.label | access to property Text | +| ExposureOfPrivateInformation.cs:18:50:18:84 | access to indexer | semmle.label | access to indexer | +| ExposureOfPrivateInformation.cs:20:50:20:65 | call to method getTelephone | semmle.label | call to method getTelephone | +| ExposureOfPrivateInformation.cs:24:21:24:36 | call to method getTelephone | semmle.label | call to method getTelephone | +| ExposureOfPrivateInformation.cs:30:26:30:41 | call to method getTelephone | semmle.label | call to method getTelephone | +| ExposureOfPrivateInformation.cs:62:21:62:33 | access to property Text | semmle.label | access to property Text | subpaths #select -| ExposureOfPrivateInformation.cs:16:50:16:84 | access to indexer | ExposureOfPrivateInformation.cs:16:50:16:84 | access to indexer | ExposureOfPrivateInformation.cs:16:50:16:84 | access to indexer | Private data returned by $@ is written to an external location. | ExposureOfPrivateInformation.cs:16:50:16:84 | access to indexer | access to indexer | -| ExposureOfPrivateInformation.cs:18:50:18:65 | call to method getTelephone | ExposureOfPrivateInformation.cs:18:50:18:65 | call to method getTelephone | ExposureOfPrivateInformation.cs:18:50:18:65 | call to method getTelephone | Private data returned by $@ is written to an external location. | ExposureOfPrivateInformation.cs:18:50:18:65 | call to method getTelephone | call to method getTelephone | -| ExposureOfPrivateInformation.cs:22:21:22:36 | call to method getTelephone | ExposureOfPrivateInformation.cs:22:21:22:36 | call to method getTelephone | ExposureOfPrivateInformation.cs:22:21:22:36 | call to method getTelephone | Private data returned by $@ is written to an external location. | ExposureOfPrivateInformation.cs:22:21:22:36 | call to method getTelephone | call to method getTelephone | -| ExposureOfPrivateInformation.cs:40:21:40:33 | access to property Text | ExposureOfPrivateInformation.cs:40:21:40:33 | access to property Text | ExposureOfPrivateInformation.cs:40:21:40:33 | access to property Text | Private data returned by $@ is written to an external location. | ExposureOfPrivateInformation.cs:40:21:40:33 | access to property Text | access to property Text | +| ExposureOfPrivateInformation.cs:18:50:18:84 | access to indexer | ExposureOfPrivateInformation.cs:18:50:18:84 | access to indexer | ExposureOfPrivateInformation.cs:18:50:18:84 | access to indexer | Private data returned by $@ is written to an external location. | ExposureOfPrivateInformation.cs:18:50:18:84 | access to indexer | access to indexer | +| ExposureOfPrivateInformation.cs:20:50:20:65 | call to method getTelephone | ExposureOfPrivateInformation.cs:20:50:20:65 | call to method getTelephone | ExposureOfPrivateInformation.cs:20:50:20:65 | call to method getTelephone | Private data returned by $@ is written to an external location. | ExposureOfPrivateInformation.cs:20:50:20:65 | call to method getTelephone | call to method getTelephone | +| ExposureOfPrivateInformation.cs:24:21:24:36 | call to method getTelephone | ExposureOfPrivateInformation.cs:24:21:24:36 | call to method getTelephone | ExposureOfPrivateInformation.cs:24:21:24:36 | call to method getTelephone | Private data returned by $@ is written to an external location. | ExposureOfPrivateInformation.cs:24:21:24:36 | call to method getTelephone | call to method getTelephone | +| ExposureOfPrivateInformation.cs:30:26:30:41 | call to method getTelephone | ExposureOfPrivateInformation.cs:30:26:30:41 | call to method getTelephone | ExposureOfPrivateInformation.cs:30:26:30:41 | call to method getTelephone | Private data returned by $@ is written to an external location. | ExposureOfPrivateInformation.cs:30:26:30:41 | call to method getTelephone | call to method getTelephone | +| ExposureOfPrivateInformation.cs:62:21:62:33 | access to property Text | ExposureOfPrivateInformation.cs:62:21:62:33 | access to property Text | ExposureOfPrivateInformation.cs:62:21:62:33 | access to property Text | Private data returned by $@ is written to an external location. | ExposureOfPrivateInformation.cs:62:21:62:33 | access to property Text | access to property Text | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-359/options b/csharp/ql/test/query-tests/Security Features/CWE-359/options index 35e6ec9b23f..aa088071c5d 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-359/options +++ b/csharp/ql/test/query-tests/Security Features/CWE-359/options @@ -1 +1 @@ -semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.cs /r:System.Collections.Specialized.dll ${testdir}/../../../resources/stubs/System.Windows.cs +semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.cs /r:System.Collections.Specialized.dll /r:System.Security.Cryptography.dll ${testdir}/../../../resources/stubs/System.Windows.cs diff --git a/docs/codeql/query-help/index.rst b/docs/codeql/query-help/index.rst index 6dad02ce2b1..66971dfef6a 100644 --- a/docs/codeql/query-help/index.rst +++ b/docs/codeql/query-help/index.rst @@ -1,7 +1,7 @@ CodeQL query help ----------------- -View the query help for the queries included in the ``code-scanning``, ``security-extended``, and ``security-and-quality`` query suites for the languages supported by CodeQL. +View the query help for the queries included in the ``default``, ``security-extended``, and ``security-and-quality`` query suites for the languages supported by CodeQL. - :doc:`CodeQL query help for C and C++ ` - :doc:`CodeQL query help for C# ` @@ -15,20 +15,20 @@ View the query help for the queries included in the ``code-scanning``, ``securit .. pull-quote:: Information - Each query help article includes: - + Each query help article includes: + - A summary of key metadata for the query. - Information about which query suites the query is included in. - A link to the query in the `CodeQL repository `__. - A description of the potential vulnerability that the query identifies and a recommendation for how to avoid introducing the problem to your code. -For a full list of the CWEs covered by these queries, see ":doc:`CodeQL CWE coverage `." +For a full list of the CWEs covered by these queries, see ":doc:`CodeQL CWE coverage `." .. toctree:: :hidden: :titlesonly: - + cpp csharp go @@ -37,4 +37,3 @@ For a full list of the CWEs covered by these queries, see ":doc:`CodeQL CWE cove python ruby codeql-cwe-coverage - diff --git a/docs/codeql/reusables/query-help-overview.rst b/docs/codeql/reusables/query-help-overview.rst index 52bc65fef5b..252f79700d3 100644 --- a/docs/codeql/reusables/query-help-overview.rst +++ b/docs/codeql/reusables/query-help-overview.rst @@ -1,5 +1,5 @@ Visit the articles below to see the documentation for the queries included in the following query suites: -- ``code-scanning``: queries run by default in CodeQL code scanning on GitHub. -- ``security-extended``: queries from ``code-scanning``, plus extra security queries with slightly lower precision and severity. -- ``security-and-quality``: queries from ``code-scanning``, ``security-extended``, plus extra maintainability and reliability queries. +- ``default``: queries run by default in CodeQL code scanning on GitHub. +- ``security-extended``: queries from ``default``, plus extra security queries with slightly lower precision and severity. +- ``security-and-quality``: queries from ``default``, ``security-extended``, plus extra maintainability and reliability queries. diff --git a/go/extractor/cli/go-autobuilder/go-autobuilder.go b/go/extractor/cli/go-autobuilder/go-autobuilder.go index eeb82ee54e5..5add9a17e19 100644 --- a/go/extractor/cli/go-autobuilder/go-autobuilder.go +++ b/go/extractor/cli/go-autobuilder/go-autobuilder.go @@ -221,17 +221,9 @@ func checkVendor() bool { return true } -func main() { - if len(os.Args) > 1 { - usage() - os.Exit(2) - } - - log.Printf("Autobuilder was built with %s, environment has %s\n", runtime.Version(), getEnvGoVersion()) - +func getSourceDir() string { srcdir := os.Getenv("LGTM_SRC") - inLGTM := srcdir != "" - if inLGTM { + if srcdir != "" { log.Printf("LGTM_SRC is %s\n", srcdir) } else { cwd, err := os.Getwd() @@ -241,57 +233,39 @@ func main() { log.Printf("LGTM_SRC is not set; defaulting to current working directory %s\n", cwd) srcdir = cwd } + return srcdir +} - // we set `SEMMLE_PATH_TRANSFORMER` ourselves in some cases, so blank it out first for consistency - os.Setenv("SEMMLE_PATH_TRANSFORMER", "") - - // determine how to install dependencies and whether a GOPATH needs to be set up before - // extraction - depMode := GoGetNoModules - modMode := ModUnset - needGopath := true - goDirectiveFound := false - if _, present := os.LookupEnv("GO111MODULE"); !present { - os.Setenv("GO111MODULE", "auto") - } +func getDepMode() DependencyInstallerMode { if util.FileExists("go.mod") { - depMode = GoGetWithModules - needGopath = false - versionRe := regexp.MustCompile(`(?m)^go[ \t\r]+([0-9]+\.[0-9]+)$`) - goMod, err := ioutil.ReadFile("go.mod") - if err != nil { - log.Println("Failed to read go.mod to check for missing Go version") - } else { - matches := versionRe.FindSubmatch(goMod) - if matches != nil { - goDirectiveFound = true - if len(matches) > 1 { - goDirectiveVersion := "v" + string(matches[1]) - if semver.Compare(goDirectiveVersion, getEnvGoSemVer()) >= 0 { - diagnostics.EmitNewerGoVersionNeeded() - } - } - } - } log.Println("Found go.mod, enabling go modules") - } else if util.FileExists("Gopkg.toml") { - depMode = Dep - log.Println("Found Gopkg.toml, using dep instead of go get") - } else if util.FileExists("glide.yaml") { - depMode = Glide - log.Println("Found glide.yaml, enabling go modules") + return GoGetWithModules } + if util.FileExists("Gopkg.toml") { + log.Println("Found Gopkg.toml, using dep instead of go get") + return Dep + } + if util.FileExists("glide.yaml") { + log.Println("Found glide.yaml, enabling go modules") + return Glide + } + return GoGetNoModules +} +func getModMode(depMode DependencyInstallerMode) ModMode { if depMode == GoGetWithModules { // if a vendor/modules.txt file exists, we assume that there are vendored Go dependencies, and // skip the dependency installation step and run the extractor with `-mod=vendor` if util.FileExists("vendor/modules.txt") { - modMode = ModVendor + return ModVendor } else if util.DirExists("vendor") { - modMode = ModMod + return ModMod } } + return ModUnset +} +func fixGoVendorIssues(modMode ModMode, depMode DependencyInstallerMode, goDirectiveFound bool) ModMode { if modMode == ModVendor { // fix go vendor issues with go versions >= 1.14 when no go version is specified in the go.mod // if this is the case, and dependencies were vendored with an old go version (and therefore @@ -311,15 +285,40 @@ func main() { log.Println("Adding a version directive to the go.mod file as the modules.txt does not have explicit annotations") if !addVersionToMod("1.13") { log.Println("Failed to add a version to the go.mod file to fix explicitly required package bug; not using vendored dependencies") - modMode = ModMod + return ModMod } } } } } + return modMode +} +func getNeedGopath(depMode DependencyInstallerMode, importpath string) bool { + needGopath := true + if depMode == GoGetWithModules { + needGopath = false + } + // if `LGTM_INDEX_NEED_GOPATH` is set, it overrides the value for `needGopath` inferred above + if needGopathOverride := os.Getenv("LGTM_INDEX_NEED_GOPATH"); needGopathOverride != "" { + if needGopathOverride == "true" { + needGopath = true + } else if needGopathOverride == "false" { + needGopath = false + } else { + log.Fatalf("Unexpected value for Boolean environment variable LGTM_NEED_GOPATH: %v.\n", needGopathOverride) + } + } + if needGopath && importpath == "" { + log.Printf("Failed to determine import path, not setting up GOPATH") + needGopath = false + } + return needGopath +} + +func tryUpdateGoModAndGoSum(modMode ModMode, depMode DependencyInstallerMode) { // Go 1.16 and later won't automatically attempt to update go.mod / go.sum during package loading, so try to update them here: - if modMode != ModVendor && depMode == GoGetWithModules && semver.Compare(getEnvGoSemVer(), "1.16") >= 0 { + if modMode != ModVendor && depMode == GoGetWithModules && semver.Compare(getEnvGoSemVer(), "v1.16") >= 0 { // stat go.mod and go.sum beforeGoModFileInfo, beforeGoModErr := os.Stat("go.mod") if beforeGoModErr != nil { @@ -355,240 +354,227 @@ func main() { } } } +} - // if `LGTM_INDEX_NEED_GOPATH` is set, it overrides the value for `needGopath` inferred above - if needGopathOverride := os.Getenv("LGTM_INDEX_NEED_GOPATH"); needGopathOverride != "" { - inLGTM = true - if needGopathOverride == "true" { - needGopath = true - } else if needGopathOverride == "false" { - needGopath = false - } else { - log.Fatalf("Unexpected value for Boolean environment variable LGTM_NEED_GOPATH: %v.\n", needGopathOverride) - } +type moveGopathInfo struct { + scratch, realSrc, root, newdir string + files []string +} + +func moveToTemporaryGopath(srcdir string, importpath string) moveGopathInfo { + // a temporary directory where everything is moved while the correct + // directory structure is created. + scratch, err := ioutil.TempDir(srcdir, "scratch") + if err != nil { + log.Fatalf("Failed to create temporary directory %s in directory %s: %s\n", + scratch, srcdir, err.Error()) } + log.Printf("Temporary directory is %s.\n", scratch) - importpath := getImportPath() - if needGopath && importpath == "" { - log.Printf("Failed to determine import path, not setting up GOPATH") - needGopath = false + // move all files in `srcdir` to `scratch` + dir, err := os.Open(srcdir) + if err != nil { + log.Fatalf("Failed to open source directory %s for reading: %s\n", srcdir, err.Error()) } - - if inLGTM && needGopath { - // a temporary directory where everything is moved while the correct - // directory structure is created. - scratch, err := ioutil.TempDir(srcdir, "scratch") - if err != nil { - log.Fatalf("Failed to create temporary directory %s in directory %s: %s\n", - scratch, srcdir, err.Error()) - } - log.Printf("Temporary directory is %s.\n", scratch) - - // move all files in `srcdir` to `scratch` - dir, err := os.Open(srcdir) - if err != nil { - log.Fatalf("Failed to open source directory %s for reading: %s\n", srcdir, err.Error()) - } - files, err := dir.Readdirnames(-1) - if err != nil { - log.Fatalf("Failed to read source directory %s: %s\n", srcdir, err.Error()) - } - for _, file := range files { - if file != filepath.Base(scratch) { - log.Printf("Moving %s/%s to %s/%s.\n", srcdir, file, scratch, file) - err := os.Rename(filepath.Join(srcdir, file), filepath.Join(scratch, file)) - if err != nil { - log.Fatalf("Failed to move file %s to the temporary directory: %s\n", file, err.Error()) - } + files, err := dir.Readdirnames(-1) + if err != nil { + log.Fatalf("Failed to read source directory %s: %s\n", srcdir, err.Error()) + } + for _, file := range files { + if file != filepath.Base(scratch) { + log.Printf("Moving %s/%s to %s/%s.\n", srcdir, file, scratch, file) + err := os.Rename(filepath.Join(srcdir, file), filepath.Join(scratch, file)) + if err != nil { + log.Fatalf("Failed to move file %s to the temporary directory: %s\n", file, err.Error()) } } - - // create a new folder which we will add to GOPATH below - // Note we evaluate all symlinks here for consistency: otherwise os.Chdir below - // will follow links but other references to the path may not, which can lead to - // disagreements between GOPATH and the working directory. - realSrc, err := filepath.EvalSymlinks(srcdir) - if err != nil { - log.Fatalf("Failed to evaluate symlinks in %s: %s\n", srcdir, err.Error()) - } - - root := filepath.Join(realSrc, "root") - - // move source files to where Go expects them to be - newdir := filepath.Join(root, "src", importpath) - err = os.MkdirAll(filepath.Dir(newdir), 0755) - if err != nil { - log.Fatalf("Failed to create directory %s: %s\n", newdir, err.Error()) - } - log.Printf("Moving %s to %s.\n", scratch, newdir) - err = os.Rename(scratch, newdir) - if err != nil { - log.Fatalf("Failed to rename %s to %s: %s\n", scratch, newdir, err.Error()) - } - - // schedule restoring the contents of newdir to their original location after this function completes: - defer restoreRepoLayout(newdir, files, filepath.Base(scratch), srcdir) - - err = os.Chdir(newdir) - if err != nil { - log.Fatalf("Failed to chdir into %s: %s\n", newdir, err.Error()) - } - - // set up SEMMLE_PATH_TRANSFORMER to ensure paths in the source archive and the snapshot - // match the original source location, not the location we moved it to - pt, err := ioutil.TempFile("", "path-transformer") - if err != nil { - log.Fatalf("Unable to create path transformer file: %s.", err.Error()) - } - defer os.Remove(pt.Name()) - _, err = pt.WriteString("#" + realSrc + "\n" + newdir + "//\n") - if err != nil { - log.Fatalf("Unable to write path transformer file: %s.", err.Error()) - } - err = pt.Close() - if err != nil { - log.Fatalf("Unable to close path transformer file: %s.", err.Error()) - } - err = os.Setenv("SEMMLE_PATH_TRANSFORMER", pt.Name()) - if err != nil { - log.Fatalf("Unable to set SEMMLE_PATH_TRANSFORMER environment variable: %s.\n", err.Error()) - } - - // set/extend GOPATH - oldGopath := os.Getenv("GOPATH") - var newGopath string - if oldGopath != "" { - newGopath = strings.Join( - []string{root, oldGopath}, - string(os.PathListSeparator), - ) - } else { - newGopath = root - } - err = os.Setenv("GOPATH", newGopath) - if err != nil { - log.Fatalf("Unable to set GOPATH to %s: %s\n", newGopath, err.Error()) - } - log.Printf("GOPATH set to %s.\n", newGopath) } - // check whether an explicit dependency installation command was provided - inst := util.Getenv("CODEQL_EXTRACTOR_GO_BUILD_COMMAND", "LGTM_INDEX_BUILD_COMMAND") - shouldInstallDependencies := false - if inst == "" { - // try to build the project - buildSucceeded := autobuilder.Autobuild() + // create a new folder which we will add to GOPATH below + // Note we evaluate all symlinks here for consistency: otherwise os.Chdir below + // will follow links but other references to the path may not, which can lead to + // disagreements between GOPATH and the working directory. + realSrc, err := filepath.EvalSymlinks(srcdir) + if err != nil { + log.Fatalf("Failed to evaluate symlinks in %s: %s\n", srcdir, err.Error()) + } - // Build failed or there are still dependency errors; we'll try to install dependencies - // ourselves - if !buildSucceeded { - log.Println("Build failed, continuing to install dependencies.") + root := filepath.Join(realSrc, "root") - shouldInstallDependencies = true - } else if util.DepErrors("./...", modMode.argsForGoVersion(getEnvGoSemVer())...) { - log.Println("Dependencies are still not resolving after the build, continuing to install dependencies.") + // move source files to where Go expects them to be + newdir := filepath.Join(root, "src", importpath) + err = os.MkdirAll(filepath.Dir(newdir), 0755) + if err != nil { + log.Fatalf("Failed to create directory %s: %s\n", newdir, err.Error()) + } + log.Printf("Moving %s to %s.\n", scratch, newdir) + err = os.Rename(scratch, newdir) + if err != nil { + log.Fatalf("Failed to rename %s to %s: %s\n", scratch, newdir, err.Error()) + } - shouldInstallDependencies = true - } - } else { - // write custom build commands into a script, then run it - var ( - ext = "" - header = "" - footer = "" + return moveGopathInfo{ + scratch: scratch, + realSrc: realSrc, + root: root, + newdir: newdir, + files: files, + } +} + +func createPathTransformerFile(newdir string) *os.File { + err := os.Chdir(newdir) + if err != nil { + log.Fatalf("Failed to chdir into %s: %s\n", newdir, err.Error()) + } + + // set up SEMMLE_PATH_TRANSFORMER to ensure paths in the source archive and the snapshot + // match the original source location, not the location we moved it to + pt, err := ioutil.TempFile("", "path-transformer") + if err != nil { + log.Fatalf("Unable to create path transformer file: %s.", err.Error()) + } + return pt +} + +func writePathTransformerFile(pt *os.File, realSrc, root, newdir string) { + _, err := pt.WriteString("#" + realSrc + "\n" + newdir + "//\n") + if err != nil { + log.Fatalf("Unable to write path transformer file: %s.", err.Error()) + } + err = pt.Close() + if err != nil { + log.Fatalf("Unable to close path transformer file: %s.", err.Error()) + } + err = os.Setenv("SEMMLE_PATH_TRANSFORMER", pt.Name()) + if err != nil { + log.Fatalf("Unable to set SEMMLE_PATH_TRANSFORMER environment variable: %s.\n", err.Error()) + } +} + +func setGopath(root string) { + // set/extend GOPATH + oldGopath := os.Getenv("GOPATH") + var newGopath string + if oldGopath != "" { + newGopath = strings.Join( + []string{root, oldGopath}, + string(os.PathListSeparator), ) - if runtime.GOOS == "windows" { - ext = ".cmd" - header = "@echo on\n@prompt +$S\n" - footer = "\nIF %ERRORLEVEL% NEQ 0 EXIT" - } else { - ext = ".sh" - header = "#! /bin/bash\nset -xe +u\n" - } - script, err := ioutil.TempFile("", "go-build-command-*"+ext) - if err != nil { - log.Fatalf("Unable to create temporary script holding custom build commands: %s\n", err.Error()) - } - defer os.Remove(script.Name()) - _, err = script.WriteString(header + inst + footer) - if err != nil { - log.Fatalf("Unable to write to temporary script holding custom build commands: %s\n", err.Error()) - } - err = script.Close() - if err != nil { - log.Fatalf("Unable to close temporary script holding custom build commands: %s\n", err.Error()) - } - os.Chmod(script.Name(), 0700) - log.Println("Installing dependencies using custom build command.") - util.RunCmd(exec.Command(script.Name())) + } else { + newGopath = root } - - if modMode == ModVendor { - // test if running `go` with -mod=vendor works, and if it doesn't, try to fallback to -mod=mod - // or not set if the go version < 1.14. Note we check this post-build in case the build brings - // the vendor directory up to date. - if !checkVendor() { - modMode = ModMod - log.Println("The vendor directory is not consistent with the go.mod; not using vendored dependencies.") - } + err := os.Setenv("GOPATH", newGopath) + if err != nil { + log.Fatalf("Unable to set GOPATH to %s: %s\n", newGopath, err.Error()) } + log.Printf("GOPATH set to %s.\n", newGopath) +} - if shouldInstallDependencies { - if modMode == ModVendor { - log.Printf("Skipping dependency installation because a Go vendor directory was found.") - } else { - // automatically determine command to install dependencies - var install *exec.Cmd - if depMode == Dep { - // set up the dep cache if SEMMLE_CACHE is set - cacheDir := os.Getenv("SEMMLE_CACHE") - if cacheDir != "" { - depCacheDir := filepath.Join(cacheDir, "go", "dep") - log.Printf("Attempting to create dep cache dir %s\n", depCacheDir) - err := os.MkdirAll(depCacheDir, 0755) +func buildWithoutCustomCommands(modMode ModMode) bool { + shouldInstallDependencies := false + // try to build the project + buildSucceeded := autobuilder.Autobuild() + + // Build failed or there are still dependency errors; we'll try to install dependencies + // ourselves + if !buildSucceeded { + log.Println("Build failed, continuing to install dependencies.") + + shouldInstallDependencies = true + } else if util.DepErrors("./...", modMode.argsForGoVersion(getEnvGoSemVer())...) { + log.Println("Dependencies are still not resolving after the build, continuing to install dependencies.") + + shouldInstallDependencies = true + } + return shouldInstallDependencies +} + +func buildWithCustomCommands(inst string) { + // write custom build commands into a script, then run it + var ( + ext = "" + header = "" + footer = "" + ) + if runtime.GOOS == "windows" { + ext = ".cmd" + header = "@echo on\n@prompt +$S\n" + footer = "\nIF %ERRORLEVEL% NEQ 0 EXIT" + } else { + ext = ".sh" + header = "#! /bin/bash\nset -xe +u\n" + } + script, err := ioutil.TempFile("", "go-build-command-*"+ext) + if err != nil { + log.Fatalf("Unable to create temporary script holding custom build commands: %s\n", err.Error()) + } + defer os.Remove(script.Name()) + _, err = script.WriteString(header + inst + footer) + if err != nil { + log.Fatalf("Unable to write to temporary script holding custom build commands: %s\n", err.Error()) + } + err = script.Close() + if err != nil { + log.Fatalf("Unable to close temporary script holding custom build commands: %s\n", err.Error()) + } + os.Chmod(script.Name(), 0700) + log.Println("Installing dependencies using custom build command.") + util.RunCmd(exec.Command(script.Name())) +} + +func installDependencies(depMode DependencyInstallerMode) { + // automatically determine command to install dependencies + var install *exec.Cmd + if depMode == Dep { + // set up the dep cache if SEMMLE_CACHE is set + cacheDir := os.Getenv("SEMMLE_CACHE") + if cacheDir != "" { + depCacheDir := filepath.Join(cacheDir, "go", "dep") + log.Printf("Attempting to create dep cache dir %s\n", depCacheDir) + err := os.MkdirAll(depCacheDir, 0755) + if err != nil { + log.Printf("Failed to create dep cache directory: %s\n", err.Error()) + } else { + log.Printf("Setting dep cache directory to %s\n", depCacheDir) + err = os.Setenv("DEPCACHEDIR", depCacheDir) + if err != nil { + log.Println("Failed to set dep cache directory") + } else { + err = os.Setenv("DEPCACHEAGE", "720h") // 30 days if err != nil { - log.Printf("Failed to create dep cache directory: %s\n", err.Error()) - } else { - log.Printf("Setting dep cache directory to %s\n", depCacheDir) - err = os.Setenv("DEPCACHEDIR", depCacheDir) - if err != nil { - log.Println("Failed to set dep cache directory") - } else { - err = os.Setenv("DEPCACHEAGE", "720h") // 30 days - if err != nil { - log.Println("Failed to set dep cache age") - } - } + log.Println("Failed to set dep cache age") } } - - if util.FileExists("Gopkg.lock") { - // if Gopkg.lock exists, don't update it and only vendor dependencies - install = exec.Command("dep", "ensure", "-v", "-vendor-only") - } else { - install = exec.Command("dep", "ensure", "-v") - } - log.Println("Installing dependencies using `dep ensure`.") - } else if depMode == Glide { - install = exec.Command("glide", "install") - log.Println("Installing dependencies using `glide install`") - } else { - // explicitly set go module support - if depMode == GoGetWithModules { - os.Setenv("GO111MODULE", "on") - } else if depMode == GoGetNoModules { - os.Setenv("GO111MODULE", "off") - } - - // get dependencies - install = exec.Command("go", "get", "-v", "./...") - log.Println("Installing dependencies using `go get -v ./...`.") } - util.RunCmd(install) } - } - // extract + if util.FileExists("Gopkg.lock") { + // if Gopkg.lock exists, don't update it and only vendor dependencies + install = exec.Command("dep", "ensure", "-v", "-vendor-only") + } else { + install = exec.Command("dep", "ensure", "-v") + } + log.Println("Installing dependencies using `dep ensure`.") + } else if depMode == Glide { + install = exec.Command("glide", "install") + log.Println("Installing dependencies using `glide install`") + } else { + // explicitly set go module support + if depMode == GoGetWithModules { + os.Setenv("GO111MODULE", "on") + } else if depMode == GoGetNoModules { + os.Setenv("GO111MODULE", "off") + } + + // get dependencies + install = exec.Command("go", "get", "-v", "./...") + log.Println("Installing dependencies using `go get -v ./...`.") + } + util.RunCmd(install) +} + +func extract(depMode DependencyInstallerMode, modMode ModMode) { extractor, err := util.GetExtractorPath() if err != nil { log.Fatalf("Could not determine path of extractor: %v.\n", err) @@ -614,3 +600,95 @@ func main() { log.Fatalf("Extraction failed: %s\n", err.Error()) } } + +func main() { + if len(os.Args) > 1 { + usage() + os.Exit(2) + } + + log.Printf("Autobuilder was built with %s, environment has %s\n", runtime.Version(), getEnvGoVersion()) + + srcdir := getSourceDir() + + // we set `SEMMLE_PATH_TRANSFORMER` ourselves in some cases, so blank it out first for consistency + os.Setenv("SEMMLE_PATH_TRANSFORMER", "") + + // determine how to install dependencies and whether a GOPATH needs to be set up before + // extraction + depMode := getDepMode() + goDirectiveFound := false + if _, present := os.LookupEnv("GO111MODULE"); !present { + os.Setenv("GO111MODULE", "auto") + } + if depMode == GoGetWithModules { + versionRe := regexp.MustCompile(`(?m)^go[ \t\r]+([0-9]+\.[0-9]+)$`) + goMod, err := ioutil.ReadFile("go.mod") + if err != nil { + log.Println("Failed to read go.mod to check for missing Go version") + } else { + matches := versionRe.FindSubmatch(goMod) + if matches != nil { + goDirectiveFound = true + if len(matches) > 1 { + goDirectiveVersion := "v" + string(matches[1]) + if semver.Compare(goDirectiveVersion, getEnvGoSemVer()) >= 0 { + diagnostics.EmitNewerGoVersionNeeded() + } + } + } + } + } + + modMode := getModMode(depMode) + modMode = fixGoVendorIssues(modMode, depMode, goDirectiveFound) + + tryUpdateGoModAndGoSum(modMode, depMode) + + importpath := getImportPath() + needGopath := getNeedGopath(depMode, importpath) + + inLGTM := os.Getenv("LGTM_SRC") != "" || os.Getenv("LGTM_INDEX_NEED_GOPATH") != "" + + if inLGTM && needGopath { + paths := moveToTemporaryGopath(srcdir, importpath) + + // schedule restoring the contents of newdir to their original location after this function completes: + defer restoreRepoLayout(paths.newdir, paths.files, filepath.Base(paths.scratch), srcdir) + + pt := createPathTransformerFile(paths.newdir) + defer os.Remove(pt.Name()) + + writePathTransformerFile(pt, paths.realSrc, paths.root, paths.newdir) + setGopath(paths.root) + } + + // check whether an explicit dependency installation command was provided + inst := util.Getenv("CODEQL_EXTRACTOR_GO_BUILD_COMMAND", "LGTM_INDEX_BUILD_COMMAND") + shouldInstallDependencies := false + if inst == "" { + shouldInstallDependencies = buildWithoutCustomCommands(modMode) + } else { + buildWithCustomCommands(inst) + } + + if modMode == ModVendor { + // test if running `go` with -mod=vendor works, and if it doesn't, try to fallback to -mod=mod + // or not set if the go version < 1.14. Note we check this post-build in case the build brings + // the vendor directory up to date. + if !checkVendor() { + modMode = ModMod + log.Println("The vendor directory is not consistent with the go.mod; not using vendored dependencies.") + } + } + + if shouldInstallDependencies { + if modMode == ModVendor { + log.Printf("Skipping dependency installation because a Go vendor directory was found.") + } else { + installDependencies(depMode) + } + } + + extract(depMode, modMode) +} diff --git a/go/extractor/util/util.go b/go/extractor/util/util.go index 4417419db6a..813938e1f73 100644 --- a/go/extractor/util/util.go +++ b/go/extractor/util/util.go @@ -183,7 +183,7 @@ func DepErrors(pkgpath string, flags ...string) bool { // FileExists tests whether the file at `filename` exists and is not a directory. func FileExists(filename string) bool { info, err := os.Stat(filename) - if err != nil && !os.IsNotExist(err) { + if err != nil && !errors.Is(err, fs.ErrNotExist) { log.Printf("Unable to stat %s: %s\n", filename, err.Error()) } return err == nil && !info.IsDir() @@ -192,7 +192,7 @@ func FileExists(filename string) bool { // DirExists tests whether `filename` exists and is a directory. func DirExists(filename string) bool { info, err := os.Stat(filename) - if err != nil && !os.IsNotExist(err) { + if err != nil && !errors.Is(err, fs.ErrNotExist) { log.Printf("Unable to stat %s: %s\n", filename, err.Error()) } return err == nil && info.IsDir() diff --git a/go/ql/examples/queries.xml b/go/ql/examples/queries.xml deleted file mode 100644 index 6a456b21d09..00000000000 --- a/go/ql/examples/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 6cd077aa51d..e144655e159 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.5.1 + +### Minor Analysis Improvements + +* Taking a slice is now considered a sanitizer for `SafeUrlFlow`. + ## 0.5.0 ### Deprecated APIs diff --git a/go/ql/lib/change-notes/released/0.5.1.md b/go/ql/lib/change-notes/released/0.5.1.md new file mode 100644 index 00000000000..53c95c4a1ad --- /dev/null +++ b/go/ql/lib/change-notes/released/0.5.1.md @@ -0,0 +1,5 @@ +## 0.5.1 + +### Minor Analysis Improvements + +* Taking a slice is now considered a sanitizer for `SafeUrlFlow`. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index 30e271c5361..0bf7024c337 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.0 +lastReleaseVersion: 0.5.1 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 66e136a2d94..0216cd89318 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 0.5.0 +version: 0.5.1 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll index 865d7b4d6ce..f34554d6eea 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll @@ -361,3 +361,52 @@ module MergePathGraph< } } } + +/** + * Constructs a `PathGraph` from three `PathGraph`s by disjoint union. + */ +module MergePathGraph3< + PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3, + PathGraphSig Graph1, PathGraphSig Graph2, PathGraphSig Graph3> +{ + private module MergedInner = MergePathGraph; + + private module Merged = + MergePathGraph; + + /** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */ + class PathNode instanceof Merged::PathNode { + /** Gets this as a projection on the first given `PathGraph`. */ + PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() } + + /** Gets this as a projection on the second given `PathGraph`. */ + PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() } + + /** Gets this as a projection on the third given `PathGraph`. */ + PathNode3 asPathNode3() { result = super.asPathNode2() } + + /** Gets a textual representation of this element. */ + string toString() { result = super.toString() } + + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + Node getNode() { result = super.getNode() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PathGraph = Merged::PathGraph; +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll index 6ea97954bdf..cd8e992c980 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll @@ -3031,6 +3031,17 @@ module Impl { this instanceof PathNodeSinkGroup } + private string ppType() { + this instanceof PathNodeSink and result = "" + or + this.(PathNodeMid).getAp() instanceof AccessPathNil and result = "" + or + exists(DataFlowType t | t = this.(PathNodeMid).getAp().getHead().getContainerType() | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { this instanceof PathNodeSink and result = "" or @@ -3046,14 +3057,14 @@ module Impl { } /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -3998,14 +4009,14 @@ module Impl { */ class PartialPathNode extends TPartialPathNode { /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -4046,6 +4057,19 @@ module Impl { */ int getSinkDistance() { result = distSink(this.getNodeEx().getEnclosingCallable()) } + private string ppType() { + this instanceof PartialPathNodeRev and result = "" + or + this.(PartialPathNodeFwd).getAp() instanceof PartialAccessPathNil and result = "" + or + exists(DataFlowType t | + t = this.(PartialPathNodeFwd).getAp().(PartialAccessPathCons).getType() + | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { exists(string s | s = this.(PartialPathNodeFwd).getAp().toString() or diff --git a/go/ql/lib/semmle/go/security/SafeUrlFlowCustomizations.qll b/go/ql/lib/semmle/go/security/SafeUrlFlowCustomizations.qll index efe063fddca..5f0572db11e 100644 --- a/go/ql/lib/semmle/go/security/SafeUrlFlowCustomizations.qll +++ b/go/ql/lib/semmle/go/security/SafeUrlFlowCustomizations.qll @@ -35,4 +35,9 @@ module SafeUrlFlow { private class UnsafeUrlMethodEdge extends SanitizerEdge { UnsafeUrlMethodEdge() { this = any(UnsafeUrlMethod um).getACall().getReceiver() } } + + /** Any slicing of the URL, considered as a sanitizer for safe URL flow. */ + private class StringSlicingEdge extends SanitizerEdge { + StringSlicingEdge() { this = any(DataFlow::SliceNode sn) } + } } diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 02f0597c37d..81ce4f00d02 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.1 + +No user-facing changes. + ## 0.5.0 ### Minor Analysis Improvements diff --git a/go/ql/src/change-notes/released/0.5.1.md b/go/ql/src/change-notes/released/0.5.1.md new file mode 100644 index 00000000000..0275d38f63c --- /dev/null +++ b/go/ql/src/change-notes/released/0.5.1.md @@ -0,0 +1,3 @@ +## 0.5.1 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 30e271c5361..0bf7024c337 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.0 +lastReleaseVersion: 0.5.1 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index f0a69cc7853..afdc8326bbb 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 0.5.0 +version: 0.5.1 groups: - go - queries diff --git a/go/ql/src/queries.xml b/go/ql/src/queries.xml deleted file mode 100644 index 6a456b21d09..00000000000 --- a/go/ql/src/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected index a5be0fa2d73..54091adf7d1 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected @@ -73,7 +73,6 @@ | file://:0:0:0:0 | parameter 0 of Store | file://:0:0:0:0 | [summary] to write: argument -1 in Store | | file://:0:0:0:0 | parameter 0 of StringBytePtr | file://:0:0:0:0 | [summary] to write: return (return[0]) in StringBytePtr | | file://:0:0:0:0 | parameter 0 of StringByteSlice | file://:0:0:0:0 | [summary] to write: return (return[0]) in StringByteSlice | -| file://:0:0:0:0 | parameter 0 of StringSlicePtr | file://:0:0:0:0 | [summary] to write: return (return[0]) in StringSlicePtr | | file://:0:0:0:0 | parameter 0 of Sub | file://:0:0:0:0 | [summary] to write: return (return[0]) in Sub | | file://:0:0:0:0 | parameter 0 of Swap | file://:0:0:0:0 | [summary] to write: argument -1 in Swap | | file://:0:0:0:0 | parameter 0 of Swap | file://:0:0:0:0 | [summary] to write: argument -1 in Swap | @@ -184,7 +183,6 @@ | file://:0:0:0:0 | parameter -1 of Info | file://:0:0:0:0 | [summary] to write: return (return[0]) in Info | | file://:0:0:0:0 | parameter -1 of Info | file://:0:0:0:0 | [summary] to write: return (return[0]) in Info | | file://:0:0:0:0 | parameter -1 of Info | file://:0:0:0:0 | [summary] to write: return (return[0]) in Info | -| file://:0:0:0:0 | parameter -1 of Info | file://:0:0:0:0 | [summary] to write: return (return[0]) in Info | | file://:0:0:0:0 | parameter -1 of Interface | file://:0:0:0:0 | [summary] to write: return (return[0]) in Interface | | file://:0:0:0:0 | parameter -1 of InterfaceData | file://:0:0:0:0 | [summary] to write: return (return[0]) in InterfaceData | | file://:0:0:0:0 | parameter -1 of Key | file://:0:0:0:0 | [summary] to write: return (return[0]) in Key | @@ -203,7 +201,6 @@ | file://:0:0:0:0 | parameter -1 of Name | file://:0:0:0:0 | [summary] to write: return (return[0]) in Name | | file://:0:0:0:0 | parameter -1 of Name | file://:0:0:0:0 | [summary] to write: return (return[0]) in Name | | file://:0:0:0:0 | parameter -1 of Name | file://:0:0:0:0 | [summary] to write: return (return[0]) in Name | -| file://:0:0:0:0 | parameter -1 of Name | file://:0:0:0:0 | [summary] to write: return (return[0]) in Name | | file://:0:0:0:0 | parameter -1 of Open | file://:0:0:0:0 | [summary] to write: return (return[0]) in Open | | file://:0:0:0:0 | parameter -1 of Open | file://:0:0:0:0 | [summary] to write: return (return[0]) in Open | | file://:0:0:0:0 | parameter -1 of Open | file://:0:0:0:0 | [summary] to write: return (return[0]) in Open | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.ql b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.ql index f9f3b594542..1f920b6b241 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.ql +++ b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.ql @@ -4,5 +4,17 @@ from DataFlow::Node nd, DataFlow::Node succ where TaintTracking::localTaintStep(nd, succ) and // exclude data-flow steps - not DataFlow::localFlowStep(nd, succ) + not DataFlow::localFlowStep(nd, succ) and + // Exclude results which only appear on unix to avoid platform-specific results + not exists(string pkg, string name | + nd.(DataFlow::SummarizedParameterNode) + .getCallable() + .asSummarizedCallable() + .asFunction() + .hasQualifiedName(pkg, name) + | + pkg = "syscall" and name = "StringSlicePtr" + or + pkg = ["os.dirEntry", "os.unixDirent"] and name = ["Info", "Name"] + ) select nd, succ diff --git a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected index 4d86bb15d4a..325c5c60a36 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected @@ -191,7 +191,6 @@ | file://:0:0:0:0 | parameter 0 of Store | file://:0:0:0:0 | [summary] to write: argument -1 in Store | | file://:0:0:0:0 | parameter 0 of StringBytePtr | file://:0:0:0:0 | [summary] to write: return (return[0]) in StringBytePtr | | file://:0:0:0:0 | parameter 0 of StringByteSlice | file://:0:0:0:0 | [summary] to write: return (return[0]) in StringByteSlice | -| file://:0:0:0:0 | parameter 0 of StringSlicePtr | file://:0:0:0:0 | [summary] to write: return (return[0]) in StringSlicePtr | | file://:0:0:0:0 | parameter 0 of Sub | file://:0:0:0:0 | [summary] to write: return (return[0]) in Sub | | file://:0:0:0:0 | parameter 0 of Swap | file://:0:0:0:0 | [summary] to write: argument -1 in Swap | | file://:0:0:0:0 | parameter 0 of Swap | file://:0:0:0:0 | [summary] to write: argument -1 in Swap | @@ -338,6 +337,7 @@ | file://:0:0:0:0 | parameter 0 of Write | file://:0:0:0:0 | [summary] to write: argument -1 in Write | | file://:0:0:0:0 | parameter 0 of Write | file://:0:0:0:0 | [summary] to write: argument -1 in Write | | file://:0:0:0:0 | parameter 0 of Write | file://:0:0:0:0 | [summary] to write: argument -1 in Write | +| file://:0:0:0:0 | parameter 0 of Write | file://:0:0:0:0 | [summary] to write: argument -1 in Write | | file://:0:0:0:0 | parameter 0 of WriteAt | file://:0:0:0:0 | [summary] to write: argument -1 in WriteAt | | file://:0:0:0:0 | parameter 0 of WriteAt | file://:0:0:0:0 | [summary] to write: argument -1 in WriteAt | | file://:0:0:0:0 | parameter 0 of WriteAt | file://:0:0:0:0 | [summary] to write: argument -1 in WriteAt | @@ -537,7 +537,6 @@ | file://:0:0:0:0 | parameter -1 of Info | file://:0:0:0:0 | [summary] to write: return (return[0]) in Info | | file://:0:0:0:0 | parameter -1 of Info | file://:0:0:0:0 | [summary] to write: return (return[0]) in Info | | file://:0:0:0:0 | parameter -1 of Info | file://:0:0:0:0 | [summary] to write: return (return[0]) in Info | -| file://:0:0:0:0 | parameter -1 of Info | file://:0:0:0:0 | [summary] to write: return (return[0]) in Info | | file://:0:0:0:0 | parameter -1 of Init | file://:0:0:0:0 | [summary] to write: return (return[0]) in Init | | file://:0:0:0:0 | parameter -1 of Interface | file://:0:0:0:0 | [summary] to write: return (return[0]) in Interface | | file://:0:0:0:0 | parameter -1 of InterfaceData | file://:0:0:0:0 | [summary] to write: return (return[0]) in InterfaceData | @@ -583,7 +582,6 @@ | file://:0:0:0:0 | parameter -1 of Name | file://:0:0:0:0 | [summary] to write: return (return[0]) in Name | | file://:0:0:0:0 | parameter -1 of Name | file://:0:0:0:0 | [summary] to write: return (return[0]) in Name | | file://:0:0:0:0 | parameter -1 of Name | file://:0:0:0:0 | [summary] to write: return (return[0]) in Name | -| file://:0:0:0:0 | parameter -1 of Name | file://:0:0:0:0 | [summary] to write: return (return[0]) in Name | | file://:0:0:0:0 | parameter -1 of Next | file://:0:0:0:0 | [summary] to write: return (return[0]) in Next | | file://:0:0:0:0 | parameter -1 of Next | file://:0:0:0:0 | [summary] to write: return (return[0]) in Next | | file://:0:0:0:0 | parameter -1 of NextPart | file://:0:0:0:0 | [summary] to write: return (return[0]) in NextPart | @@ -673,8 +671,6 @@ | file://:0:0:0:0 | parameter -1 of Read | file://:0:0:0:0 | [summary] to write: argument 0 in Read | | file://:0:0:0:0 | parameter -1 of Read | file://:0:0:0:0 | [summary] to write: argument 0 in Read | | file://:0:0:0:0 | parameter -1 of Read | file://:0:0:0:0 | [summary] to write: argument 0 in Read | -| file://:0:0:0:0 | parameter -1 of Read | file://:0:0:0:0 | [summary] to write: argument 0 in Read | -| file://:0:0:0:0 | parameter -1 of Read | file://:0:0:0:0 | [summary] to write: argument 0 in Read | | file://:0:0:0:0 | parameter -1 of ReadAt | file://:0:0:0:0 | [summary] to write: argument 0 in ReadAt | | file://:0:0:0:0 | parameter -1 of ReadAt | file://:0:0:0:0 | [summary] to write: argument 0 in ReadAt | | file://:0:0:0:0 | parameter -1 of ReadAt | file://:0:0:0:0 | [summary] to write: argument 0 in ReadAt | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.ql b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.ql index 2016803c693..0ff6ee875de 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.ql +++ b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.ql @@ -3,5 +3,20 @@ import go from DataFlow::Node pred, DataFlow::Node succ where TaintTracking::localTaintStep(pred, succ) and - not DataFlow::localFlowStep(pred, succ) + not DataFlow::localFlowStep(pred, succ) and + // Exclude results which only appear on unix to avoid platform-specific results + not exists(string pkg, string name | + pred.(DataFlow::SummarizedParameterNode) + .getCallable() + .asSummarizedCallable() + .asFunction() + .hasQualifiedName(pkg, name) + | + pkg = "syscall" and name = "StringSlicePtr" + or + pkg.matches("crypto/rand.%") and + name = "Read" + or + pkg = ["os.dirEntry", "os.unixDirent"] and name = ["Info", "Name"] + ) select pred, succ diff --git a/go/ql/test/queries.xml b/go/ql/test/queries.xml deleted file mode 100644 index 6a456b21d09..00000000000 --- a/go/ql/test/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index 745fb6ff9ba..c65e08c51f7 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -37,7 +37,7 @@ hudson,44,,16,,19,,,,,,,,,,,,,6,,17,,,,,,,,,,,,,2,,,,,,,,16, io.netty.bootstrap,3,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,, io.netty.buffer,,,207,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,77 io.netty.channel,9,2,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,,,,,,,,2,, -io.netty.handler.codec,3,13,260,,,,,,,,,,,,,,,2,,1,,,,,,,,,,,,,,,,,,,,13,144,116 +io.netty.handler.codec,4,13,259,,,,,,,,,,,,,,,3,,1,,,,,,,,,,,,,,,,,,,,13,143,116 io.netty.handler.ssl,2,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,, io.netty.handler.stream,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,, io.netty.resolver,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, @@ -52,9 +52,9 @@ java.beans,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, java.io,44,,45,,18,,,,,,,,,,,,,,,4,,,,,,,,,,,,,22,,,,,,,,43,2 java.lang,18,,92,,,,,,,,,,,,8,,,,,5,,4,,,1,,,,,,,,,,,,,,,,56,36 java.net,13,3,20,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,3,20, -java.nio,35,,31,,21,,,,,,,,,,,,,,,12,,,,,,,,,,,,,2,,,,,,,,31, +java.nio,36,,31,,21,,,,,,,,,,,,,,,12,,,,,,,,,,,,,3,,,,,,,,31, java.sql,13,,3,,,,,,,,4,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,2,1 -java.util,44,,478,,,,,,,,,,,,34,,,,,,,,5,2,,1,2,,,,,,,,,,,,,,41,437 +java.util,44,,484,,,,,,,,,,,,34,,,,,,,,5,2,,1,2,,,,,,,,,,,,,,44,440 javafx.scene.web,1,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, javax.faces.context,2,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,7,, javax.imageio.stream,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, @@ -91,12 +91,16 @@ org.apache.commons.ognl,6,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,, org.apache.commons.text,,,272,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,220,52 org.apache.directory.ldap.client.api,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.apache.hadoop.hive.metastore,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,, +org.apache.hc.client5.http.async.methods,84,,,,,,,,,,,,,,,,,84,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.hc.client5.http.classic.methods,37,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.hc.client5.http.fluent,19,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.hc.core5.benchmark,1,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, org.apache.hc.core5.function,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.hc.core5.http,1,2,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,2,39, -org.apache.hc.core5.net,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2, +org.apache.hc.core5.http,73,2,45,,,,,,,,,,,,,,,72,,,,,,,,,,,,,,,,,,1,,,,2,45, +org.apache.hc.core5.net,,,18,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18, org.apache.hc.core5.util,,,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18,6 org.apache.hive.hcatalog.templeton,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,, -org.apache.http,30,3,77,,,,,,,,,,,,,,,28,,,,,,,,,,,,,,,,,,2,,,,3,69,8 +org.apache.http,48,3,94,,,,,,,,,,,,,,,46,,,,,,,,,,,,,,,,,,2,,,,3,86,8 org.apache.ibatis.jdbc,6,,57,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,57, org.apache.log4j,11,,,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,, org.apache.logging.log4j,359,,8,,,,,,,,,,,,359,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 @@ -134,7 +138,7 @@ org.springframework.jndi,1,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.springframework.ldap,47,,,,,,,,,,,,33,14,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.springframework.security.web.savedrequest,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,, org.springframework.ui,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32 -org.springframework.util,,,139,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87,52 +org.springframework.util,3,,142,,2,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,90,52 org.springframework.validation,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13, org.springframework.web.client,13,3,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,3,, org.springframework.web.context.request,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,, diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index 544fb82a3d8..c4355c5cdcb 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -13,15 +13,15 @@ Java framework & library support `Apache Commons IO `_,``org.apache.commons.io``,,560,111,93,,,,,,15 `Apache Commons Lang `_,``org.apache.commons.lang3``,,424,6,,,,,,, `Apache Commons Text `_,``org.apache.commons.text``,,272,,,,,,,, - `Apache HttpComponents `_,"``org.apache.hc.core5.*``, ``org.apache.http``",5,143,31,,,3,,,,28 + `Apache HttpComponents `_,"``org.apache.hc.core5.*``, ``org.apache.http``",5,182,122,,,3,,,,119 `Apache Log4j 2 `_,``org.apache.logging.log4j``,,8,359,,,,,,, `Google Guava `_,``com.google.common.*``,,730,47,2,6,,,,, JBoss Logging,``org.jboss.logging``,,,324,,,,,,, `JSON-java `_,``org.json``,,236,,,,,,,, - Java Standard Library,``java.*``,3,673,167,39,,,9,,,13 + Java Standard Library,``java.*``,3,679,168,39,,,9,,,13 Java extensions,"``javax.*``, ``jakarta.*``",63,611,34,1,,4,,1,1,2 Kotlin Standard Library,``kotlin*``,,1843,16,11,,,,,,2 - `Spring `_,``org.springframework.*``,29,480,101,,,,19,14,,29 - Others,"``cn.hutool.core.codec``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.hubspot.jinjava``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2.ognl``, ``com.rabbitmq.client``, ``com.thoughtworks.xstream``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.util``, ``hudson``, ``io.netty.bootstrap``, ``io.netty.buffer``, ``io.netty.channel``, ``io.netty.handler.codec``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util``, ``javafx.scene.web``, ``jodd.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.logging``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.eclipse.jetty.client``, ``org.geogebra.web.full.main``, ``org.hibernate``, ``org.jdbi.v3.core``, ``org.jooq``, ``org.kohsuke.stapler``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``",75,814,365,26,,,18,18,,34 - Totals,,232,9058,1718,172,6,10,113,33,1,123 + `Spring `_,``org.springframework.*``,29,483,104,2,,,19,14,,29 + Others,"``cn.hutool.core.codec``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.hubspot.jinjava``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2.ognl``, ``com.rabbitmq.client``, ``com.thoughtworks.xstream``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.util``, ``hudson``, ``io.netty.bootstrap``, ``io.netty.buffer``, ``io.netty.channel``, ``io.netty.handler.codec``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util``, ``javafx.scene.web``, ``jodd.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.logging``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.eclipse.jetty.client``, ``org.geogebra.web.full.main``, ``org.hibernate``, ``org.jdbi.v3.core``, ``org.jooq``, ``org.kohsuke.stapler``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``",75,813,506,26,,,18,18,,175 + Totals,,232,9105,1954,174,6,10,113,33,1,355 diff --git a/java/ql/examples/queries.xml b/java/ql/examples/queries.xml deleted file mode 100644 index 0d33187fe86..00000000000 --- a/java/ql/examples/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/java/ql/integration-tests/all-platforms/kotlin/default-parameter-mad-flow/test.ql b/java/ql/integration-tests/all-platforms/kotlin/default-parameter-mad-flow/test.ql index 771d467a3ad..78afdd7bb66 100644 --- a/java/ql/integration-tests/all-platforms/kotlin/default-parameter-mad-flow/test.ql +++ b/java/ql/integration-tests/all-platforms/kotlin/default-parameter-mad-flow/test.ql @@ -3,22 +3,22 @@ import semmle.code.java.dataflow.TaintTracking import TestUtilities.InlineExpectationsTest private import semmle.code.java.dataflow.ExternalFlow -class Config extends TaintTracking::Configuration { - Config() { this = "Config" } - - override predicate isSource(DataFlow::Node n) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getCallee().getName() = "source" or sourceNode(n, "kotlinMadFlowTest") } - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().getName() = "sink" or sinkNode(n, "kotlinMadFlowTest") } } +module Flow = TaintTracking::Global; + class InlineFlowTest extends InlineExpectationsTest { InlineFlowTest() { this = "HasFlowTest" } @@ -26,7 +26,7 @@ class InlineFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "flow" and - exists(DataFlow::Node sink, Config c | c.hasFlowTo(sink) | + exists(DataFlow::Node sink | Flow::flowTo(sink) | sink.getLocation() = location and element = sink.toString() and value = "" diff --git a/java/ql/integration-tests/all-platforms/kotlin/kotlin-interface-inherited-default/test.ql b/java/ql/integration-tests/all-platforms/kotlin/kotlin-interface-inherited-default/test.ql index 4e6a7e9518d..9654060ab67 100644 --- a/java/ql/integration-tests/all-platforms/kotlin/kotlin-interface-inherited-default/test.ql +++ b/java/ql/integration-tests/all-platforms/kotlin/kotlin-interface-inherited-default/test.ql @@ -19,18 +19,18 @@ query predicate superAccesses( enclosingType = enclosingCallable.getDeclaringType() } -class Config extends DataFlow::Configuration { - Config() { this = "testconfig" } - - override predicate isSource(DataFlow::Node x) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node x) { x.asExpr() instanceof IntegerLiteral and x.getEnclosingCallable().fromSource() } - override predicate isSink(DataFlow::Node x) { + predicate isSink(DataFlow::Node x) { x.asExpr().(Argument).getCall().getCallee().getName() = "sink" } } -from Config c, DataFlow::Node source, DataFlow::Node sink -where c.hasFlow(source, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node source, DataFlow::Node sink +where Flow::flow(source, sink) select source, sink diff --git a/java/ql/integration-tests/all-platforms/kotlin/kotlin_java_static_fields/test.ql b/java/ql/integration-tests/all-platforms/kotlin/kotlin_java_static_fields/test.ql index f7702b2ac38..d24969a8291 100644 --- a/java/ql/integration-tests/all-platforms/kotlin/kotlin_java_static_fields/test.ql +++ b/java/ql/integration-tests/all-platforms/kotlin/kotlin_java_static_fields/test.ql @@ -1,17 +1,17 @@ import java import semmle.code.java.dataflow.DataFlow -import DataFlow::PathGraph +import Flow::PathGraph -class Config extends DataFlow::Configuration { - Config() { this = "Config" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(StringLiteral).getValue() = "taint" } - override predicate isSource(DataFlow::Node n) { n.asExpr().(StringLiteral).getValue() = "taint" } - - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().getName() = "sink" } } -from DataFlow::PathNode source, DataFlow::PathNode sink, Config c -where c.hasFlowPath(source, sink) +module Flow = DataFlow::Global; + +from Flow::PathNode source, Flow::PathNode sink +where Flow::flowPath(source, sink) select source, source, sink, "flow path" diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index b97b38386b0..03907f74b89 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,18 @@ +## 0.6.1 + +### Deprecated APIs + +* The `sensitiveResultReceiver` predicate in `SensitiveResultReceiverQuery.qll` has been deprecated and replaced with `isSensitiveResultReceiver` in order to use the new dataflow API. + +### Minor Analysis Improvements + +* Changed some models of Spring's `FileCopyUtils.copy` to be path injection sinks instead of summaries. +* Added models for the following packages: + * java.nio.file +* Added models for [Apache HttpComponents](https://hc.apache.org/) versions 4 and 5. +* Added sanitizers that recognize line breaks to the query `java/log-injection`. +* Added new flow steps for `java.util.StringJoiner`. + ## 0.6.0 ### Deprecated APIs diff --git a/java/ql/lib/change-notes/released/0.6.1.md b/java/ql/lib/change-notes/released/0.6.1.md new file mode 100644 index 00000000000..7c6aa8f5b09 --- /dev/null +++ b/java/ql/lib/change-notes/released/0.6.1.md @@ -0,0 +1,14 @@ +## 0.6.1 + +### Deprecated APIs + +* The `sensitiveResultReceiver` predicate in `SensitiveResultReceiverQuery.qll` has been deprecated and replaced with `isSensitiveResultReceiver` in order to use the new dataflow API. + +### Minor Analysis Improvements + +* Changed some models of Spring's `FileCopyUtils.copy` to be path injection sinks instead of summaries. +* Added models for the following packages: + * java.nio.file +* Added models for [Apache HttpComponents](https://hc.apache.org/) versions 4 and 5. +* Added sanitizers that recognize line breaks to the query `java/log-injection`. +* Added new flow steps for `java.util.StringJoiner`. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index a3f820f884d..80fb0899f64 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.0 +lastReleaseVersion: 0.6.1 diff --git a/java/ql/lib/ext/io.netty.handler.codec.http.model.yml b/java/ql/lib/ext/io.netty.handler.codec.http.model.yml index 1c7089b4c18..2912bdce85a 100644 --- a/java/ql/lib/ext/io.netty.handler.codec.http.model.yml +++ b/java/ql/lib/ext/io.netty.handler.codec.http.model.yml @@ -5,6 +5,7 @@ extensions: data: - ["io.netty.handler.codec.http", "DefaultFullHttpRequest", True, "DefaultFullHttpRequest", "(HttpVersion,HttpMethod,String,ByteBuf)", "", "Argument[2]", "open-url", "ai-manual"] - ["io.netty.handler.codec.http", "DefaultHttpRequest", True, "DefaultHttpRequest", "(HttpVersion,HttpMethod,String)", "", "Argument[2]", "open-url", "ai-manual"] + - ["io.netty.handler.codec.http", "HttpRequest", True, "setUri", "", "", "Argument[0]", "open-url", "manual"] - addsTo: pack: codeql/java-all extensible: summaryModel @@ -67,12 +68,11 @@ extensions: - ["io.netty.handler.codec.http", "HttpHeaders", True, "valueCharSequenceIterator", "(CharSequence)", "", "Argument[this].Element.MapValue", "ReturnValue.Element", "taint", "manual"] - ["io.netty.handler.codec.http", "HttpHeaders", True, "toString", "", "", "Argument[this].Element.MapKey", "ReturnValue", "taint", "manual"] - ["io.netty.handler.codec.http", "HttpHeaders", True, "toString", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"] - # Currently all write steps to http messages are taint flow. It may reduce FPs to use a synthetic field for headers instead. + # Currently all write steps to http messages are taint flow. It may reduce FPs to use a synthetic field for headers instead. - ["io.netty.handler.codec.http", "HttpMessage", True, "headers", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["io.netty.handler.codec.http", "LastHttpContent", True, "trailingHeaders", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["io.netty.handler.codec.http", "HttpRequest", True, "getUri", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["io.netty.handler.codec.http", "HttpRequest", True, "uri", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.netty.handler.codec.http", "HttpRequest", True, "setUri", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["io.netty.handler.codec.http", "QueryStringDecoder", True, "QueryStringDecoder", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["io.netty.handler.codec.http", "QueryStringDecoder", True, "decodeComponent", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["io.netty.handler.codec.http", "QueryStringDecoder", True, "parameters", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/lib/ext/java.nio.file.model.yml b/java/ql/lib/ext/java.nio.file.model.yml index 5c4b7ab0796..64f1491940f 100644 --- a/java/ql/lib/ext/java.nio.file.model.yml +++ b/java/ql/lib/ext/java.nio.file.model.yml @@ -4,6 +4,7 @@ extensions: extensible: sinkModel data: - ["java.nio.file", "Files", False, "copy", "", "", "Argument[0]", "read-file", "manual"] + - ["java.nio.file", "Files", False, "copy", "(InputStream,Path,CopyOption[])", "", "Argument[0]", "write-file", "manual"] - ["java.nio.file", "Files", False, "copy", "", "", "Argument[1]", "create-file", "manual"] - ["java.nio.file", "Files", False, "createDirectories", "", "", "Argument[0]", "create-file", "manual"] - ["java.nio.file", "Files", False, "createDirectory", "", "", "Argument[0]", "create-file", "manual"] diff --git a/java/ql/lib/ext/java.util.model.yml b/java/ql/lib/ext/java.util.model.yml index 5df5b1bf4bc..84e79020496 100644 --- a/java/ql/lib/ext/java.util.model.yml +++ b/java/ql/lib/ext/java.util.model.yml @@ -338,8 +338,14 @@ extensions: - ["java.util", "Stack", True, "peek", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util", "Stack", True, "pop", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util", "Stack", True, "push", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - - ["java.util", "StringJoiner", False, "add", "(CharSequence)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["java.util", "StringJoiner", False, "add", "(CharSequence)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.util", "StringJoiner", False, "StringJoiner", "", "", "Argument[0..2]", "Argument[this]", "taint", "manual"] + - ["java.util", "StringJoiner", False, "add", "(CharSequence)", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["java.util", "StringJoiner", False, "add", "(CharSequence)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.util", "StringJoiner", False, "merge", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.util", "StringJoiner", False, "merge", "", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["java.util", "StringJoiner", False, "setEmptyValue", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.util", "StringJoiner", False, "setEmptyValue", "", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["java.util", "StringJoiner", False, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.util", "StringTokenizer", False, "StringTokenizer", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.util", "StringTokenizer", False, "nextElement", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.util", "StringTokenizer", False, "nextToken", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/lib/ext/org.apache.hc.client5.http.async.methods.model.yml b/java/ql/lib/ext/org.apache.hc.client5.http.async.methods.model.yml new file mode 100644 index 00000000000..0b0e040c054 --- /dev/null +++ b/java/ql/lib/ext/org.apache.hc.client5.http.async.methods.model.yml @@ -0,0 +1,89 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "create", "(Method,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "create", "(Method,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "create", "(Method,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "create", "(String,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "create", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "delete", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "delete", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "delete", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "get", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "get", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "get", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "head", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "head", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "head", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "options", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "options", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "options", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "patch", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "patch", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "patch", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "post", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "post", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "post", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "put", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "put", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "put", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "trace", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "trace", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "BasicHttpRequests", True, "trace", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "ConfigurableHttpRequest", True, "ConfigurableHttpRequest", "(String,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "ConfigurableHttpRequest", True, "ConfigurableHttpRequest", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequest", True, "SimpleHttpRequest", "(Method,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequest", True, "SimpleHttpRequest", "(Method,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequest", True, "SimpleHttpRequest", "(String,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequest", True, "SimpleHttpRequest", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequest", True, "create", "(Method,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequest", True, "create", "(Method,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequest", True, "create", "(String,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequest", True, "create", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "create", "(Method,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "create", "(Method,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "create", "(Method,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "create", "(String,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "create", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "delete", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "delete", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "delete", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "get", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "get", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "get", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "head", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "head", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "head", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "options", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "options", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "options", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "patch", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "patch", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "patch", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "post", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "post", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "post", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "put", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "put", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "put", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "trace", "(HttpHost,String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "trace", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleHttpRequests", True, "trace", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "delete", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "delete", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "get", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "get", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "head", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "head", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "options", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "options", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "patch", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "patch", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "post", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "post", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "put", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "put", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "trace", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.async.methods", "SimpleRequestBuilder", True, "trace", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.hc.client5.http.classic.methods.model.yml b/java/ql/lib/ext/org.apache.hc.client5.http.classic.methods.model.yml new file mode 100644 index 00000000000..513a4e7eb7a --- /dev/null +++ b/java/ql/lib/ext/org.apache.hc.client5.http.classic.methods.model.yml @@ -0,0 +1,42 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "create", "(Method,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "create", "(Method,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "create", "(String,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "create", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "delete", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "delete", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "get", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "get", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "head", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "head", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "options", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "options", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "patch", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "patch", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "post", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "post", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "put", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "put", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "trace", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "ClassicHttpRequests", True, "trace", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpDelete", True, "HttpDelete", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpDelete", True, "HttpDelete", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpGet", True, "HttpGet", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpGet", True, "HttpGet", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpHead", True, "HttpHead", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpHead", True, "HttpHead", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpOptions", True, "HttpOptions", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpOptions", True, "HttpOptions", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpPatch", True, "HttpPatch", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpPatch", True, "HttpPatch", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpPost", True, "HttpPost", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpPost", True, "HttpPost", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpPut", True, "HttpPut", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpPut", True, "HttpPut", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpTrace", True, "HttpTrace", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpTrace", True, "HttpTrace", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.classic.methods", "HttpUriRequestBase", True, "HttpUriRequestBase", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.hc.client5.http.fluent.model.yml b/java/ql/lib/ext/org.apache.hc.client5.http.fluent.model.yml new file mode 100644 index 00000000000..ce3b5567b7b --- /dev/null +++ b/java/ql/lib/ext/org.apache.hc.client5.http.fluent.model.yml @@ -0,0 +1,24 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.hc.client5.http.fluent", "Request", True, "create", "(Method,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "create", "(String,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "create", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "delete", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "delete", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "get", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "get", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "head", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "head", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "options", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "options", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "patch", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "patch", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "post", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "post", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "put", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "put", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "trace", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.client5.http.fluent", "Request", True, "trace", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.hc.client5.http.protocol.yml b/java/ql/lib/ext/org.apache.hc.client5.http.protocol.yml new file mode 100644 index 00000000000..9289e53f587 --- /dev/null +++ b/java/ql/lib/ext/org.apache.hc.client5.http.protocol.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["org.apache.hc.client5.http.protocol", "RedirectLocations", True, "add", "(URI)", "", "Argument[0]", "Argument[this].Element", "value", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.hc.client5.http.utils.yml b/java/ql/lib/ext/org.apache.hc.client5.http.utils.yml new file mode 100644 index 00000000000..0f9e1ae2349 --- /dev/null +++ b/java/ql/lib/ext/org.apache.hc.client5.http.utils.yml @@ -0,0 +1,12 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["org.apache.hc.client5.http.utils", "URIUtils", True, "extractHost", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.hc.client5.http.utils", "URIUtils", True, "resolve", "(URI,HttpHost,List)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.hc.client5.http.utils", "URIUtils", True, "resolve", "(URI,String)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.hc.client5.http.utils", "URIUtils", True, "resolve", "(URI,URI)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.hc.client5.http.utils", "URIUtils", True, "rewriteURI", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.hc.client5.http.utils", "URIUtils", True, "rewriteURI", "(URI,HttpHost)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.hc.client5.http.utils", "URIUtils", True, "rewriteURI", "(URI,HttpHost,boolean)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.hc.core5.benchmark.model.yml b/java/ql/lib/ext/org.apache.hc.core5.benchmark.model.yml new file mode 100644 index 00000000000..450a46cd1ec --- /dev/null +++ b/java/ql/lib/ext/org.apache.hc.core5.benchmark.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.hc.core5.benchmark", "BenchmarkConfig$Builder", True, "setUri", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.hc.core5.http.impl.bootstrap.model.yml b/java/ql/lib/ext/org.apache.hc.core5.http.impl.bootstrap.model.yml new file mode 100644 index 00000000000..a2789520908 --- /dev/null +++ b/java/ql/lib/ext/org.apache.hc.core5.http.impl.bootstrap.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/java-tests + extensible: sinkModel + data: + - ["org.apache.hc.core5.http.impl.bootstrap", "HttpAsyncRequester", True, "connect", "(HttpHost,Timeout)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.impl.bootstrap", "HttpAsyncRequester", True, "connect", "(HttpHost,Timeout,Object,FutureCallback)", "", "Argument[0]", "open-url", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.hc.core5.http.io.support.model.yml b/java/ql/lib/ext/org.apache.hc.core5.http.io.support.model.yml new file mode 100644 index 00000000000..86d55853d8f --- /dev/null +++ b/java/ql/lib/ext/org.apache.hc.core5.http.io.support.model.yml @@ -0,0 +1,21 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "delete", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "delete", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "get", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "get", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "head", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "head", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "options", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "options", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "patch", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "patch", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "post", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "post", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "put", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "put", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "trace", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.io.support", "ClassicRequestBuilder", True, "trace", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.hc.core5.http.message.model.yml b/java/ql/lib/ext/org.apache.hc.core5.http.message.model.yml index 0aacdae643b..e8cc56f35a5 100644 --- a/java/ql/lib/ext/org.apache.hc.core5.http.message.model.yml +++ b/java/ql/lib/ext/org.apache.hc.core5.http.message.model.yml @@ -1,4 +1,17 @@ extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.hc.core5.http.message", "BasicClassicHttpRequest", True, "BasicClassicHttpRequest", "(Method,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.message", "BasicClassicHttpRequest", True, "BasicClassicHttpRequest", "(Method,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.message", "BasicClassicHttpRequest", True, "BasicClassicHttpRequest", "(String,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.message", "BasicClassicHttpRequest", True, "BasicClassicHttpRequest", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.message", "BasicHttpRequest", True, "BasicHttpRequest", "(Method,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.message", "BasicHttpRequest", True, "BasicHttpRequest", "(Method,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.message", "BasicHttpRequest", True, "BasicHttpRequest", "(String,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.message", "BasicHttpRequest", True, "BasicHttpRequest", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - addsTo: pack: codeql/java-all extensible: summaryModel diff --git a/java/ql/lib/ext/org.apache.hc.core5.http.model.yml b/java/ql/lib/ext/org.apache.hc.core5.http.model.yml index 6dbb7bf51de..6c1c6d63efe 100644 --- a/java/ql/lib/ext/org.apache.hc.core5.http.model.yml +++ b/java/ql/lib/ext/org.apache.hc.core5.http.model.yml @@ -4,6 +4,9 @@ extensions: extensible: sinkModel data: - ["org.apache.hc.core5.http", "HttpEntityContainer", True, "setEntity", "(HttpEntity)", "", "Argument[0]", "xss", "manual"] + - ["org.apache.hc.core5.http", "HttpRequest", True, "setUri", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http", "HttpRequestFactory", True, "newHttpRequest", "(String,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http", "HttpRequestFactory", True, "newHttpRequest", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] - addsTo: pack: codeql/java-all extensible: summaryModel @@ -14,6 +17,12 @@ extensions: - ["org.apache.hc.core5.http", "HttpEntity", True, "getContent", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.apache.hc.core5.http", "HttpEntity", True, "getTrailers", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.apache.hc.core5.http", "HttpEntityContainer", True, "getEntity", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.apache.hc.core5.http", "HttpHost", True, "HttpHost", "(String)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.http", "HttpHost", True, "HttpHost", "(String,InetAddress,String,int)", "", "Argument[2]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.http", "HttpHost", True, "HttpHost", "(String,String)", "", "Argument[1]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.http", "HttpHost", True, "HttpHost", "(String,String,int)", "", "Argument[1]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.http", "HttpHost", True, "HttpHost", "(String,int)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.http", "HttpHost", True, "create", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] - ["org.apache.hc.core5.http", "HttpRequest", True, "getAuthority", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.apache.hc.core5.http", "HttpRequest", True, "getMethod", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.apache.hc.core5.http", "HttpRequest", True, "getPath", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/lib/ext/org.apache.hc.core5.http.nio.support.model.yml b/java/ql/lib/ext/org.apache.hc.core5.http.nio.support.model.yml new file mode 100644 index 00000000000..263ca830720 --- /dev/null +++ b/java/ql/lib/ext/org.apache.hc.core5.http.nio.support.model.yml @@ -0,0 +1,29 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "delete", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "delete", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "get", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "get", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "head", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "head", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "options", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "options", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "patch", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "patch", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "post", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "post", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "put", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "put", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "trace", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "AsyncRequestBuilder", True, "trace", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "BasicRequestProducer", True, "BasicRequestProducer", "(Method,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "BasicRequestProducer", True, "BasicRequestProducer", "(Method,HttpHost,String,AsyncEntityProducer)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "BasicRequestProducer", True, "BasicRequestProducer", "(Method,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "BasicRequestProducer", True, "BasicRequestProducer", "(Method,URI,AsyncEntityProducer)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "BasicRequestProducer", True, "BasicRequestProducer", "(String,HttpHost,String)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "BasicRequestProducer", True, "BasicRequestProducer", "(String,HttpHost,String,AsyncEntityProducer)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "BasicRequestProducer", True, "BasicRequestProducer", "(String,URI)", "", "Argument[1]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.nio.support", "BasicRequestProducer", True, "BasicRequestProducer", "(String,URI,AsyncEntityProducer)", "", "Argument[1]", "open-url", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.hc.core5.http.support.model.yml b/java/ql/lib/ext/org.apache.hc.core5.http.support.model.yml new file mode 100644 index 00000000000..eee42d496f3 --- /dev/null +++ b/java/ql/lib/ext/org.apache.hc.core5.http.support.model.yml @@ -0,0 +1,24 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.hc.core5.http.support", "AbstractRequestBuilder", True, "setHttpHost", "(HttpHost)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "AbstractRequestBuilder", True, "setUri", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "AbstractRequestBuilder", True, "setUri", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "delete", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "delete", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "get", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "get", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "head", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "head", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "options", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "options", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "patch", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "patch", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "post", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "post", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "put", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "put", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "trace", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.hc.core5.http.support", "BasicRequestBuilder", True, "trace", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.hc.core5.net.model.yml b/java/ql/lib/ext/org.apache.hc.core5.net.model.yml index f779d62053c..647c5f9c73c 100644 --- a/java/ql/lib/ext/org.apache.hc.core5.net.model.yml +++ b/java/ql/lib/ext/org.apache.hc.core5.net.model.yml @@ -3,5 +3,21 @@ extensions: pack: codeql/java-all extensible: summaryModel data: + - ["org.apache.hc.core5.net", "URIAuthority", True, "URIAuthority", "(Host)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIAuthority", True, "URIAuthority", "(String)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIAuthority", True, "URIAuthority", "(String,Host)", "", "Argument[1]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIAuthority", True, "URIAuthority", "(String,String,int)", "", "Argument[1]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIAuthority", True, "URIAuthority", "(String,int)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] - ["org.apache.hc.core5.net", "URIAuthority", True, "getHostName", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.apache.hc.core5.net", "URIAuthority", True, "toString", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.apache.hc.core5.net", "URIBuilder", True, "URIBuilder", "(String)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIBuilder", True, "URIBuilder", "(String,Charset)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIBuilder", True, "URIBuilder", "(URI)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIBuilder", True, "URIBuilder", "(URI,Charset)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIBuilder", True, "setHost", "(InetAddress)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIBuilder", True, "setHost", "(InetAddress)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIBuilder", True, "setHost", "(String)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIBuilder", True, "setHost", "(String)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIBuilder", True, "setHttpHost", "(HttpHost)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URIBuilder", True, "setHttpHost", "(HttpHost)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.hc.core5.net", "URLEncodedUtils", True, "parse", "(URI,Charset)", "", "Argument[0]", "ReturnValue.Element", "taint", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.http.client.fluent.model.yml b/java/ql/lib/ext/org.apache.http.client.fluent.model.yml new file mode 100644 index 00000000000..924ab14fc5e --- /dev/null +++ b/java/ql/lib/ext/org.apache.http.client.fluent.model.yml @@ -0,0 +1,21 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.http.client.fluent", "Request", True, "Delete", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Delete", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Get", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Get", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Head", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Head", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Options", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Options", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Patch", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Patch", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Post", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Post", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Put", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Put", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Trace", "(String)", "", "Argument[0]", "open-url", "hq-manual"] + - ["org.apache.http.client.fluent", "Request", True, "Trace", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.http.client.methods.model.yml b/java/ql/lib/ext/org.apache.http.client.methods.model.yml index c90298bddf8..5db791422c8 100644 --- a/java/ql/lib/ext/org.apache.http.client.methods.model.yml +++ b/java/ql/lib/ext/org.apache.http.client.methods.model.yml @@ -11,6 +11,7 @@ extensions: - ["org.apache.http.client.methods", "HttpPost", False, "HttpPost", "", "", "Argument[0]", "open-url", "manual"] - ["org.apache.http.client.methods", "HttpPut", False, "HttpPut", "", "", "Argument[0]", "open-url", "manual"] - ["org.apache.http.client.methods", "HttpRequestBase", True, "setURI", "", "", "Argument[0]", "open-url", "manual"] + - ["org.apache.http.client.methods", "HttpRequestWrapper", True, "setURI", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] - ["org.apache.http.client.methods", "HttpTrace", False, "HttpTrace", "", "", "Argument[0]", "open-url", "manual"] - ["org.apache.http.client.methods", "RequestBuilder", False, "delete", "", "", "Argument[0]", "open-url", "manual"] - ["org.apache.http.client.methods", "RequestBuilder", False, "get", "", "", "Argument[0]", "open-url", "manual"] diff --git a/java/ql/lib/ext/org.apache.http.client.utils.model.yml b/java/ql/lib/ext/org.apache.http.client.utils.model.yml index 7a5758b98f1..84eb805afac 100644 --- a/java/ql/lib/ext/org.apache.http.client.utils.model.yml +++ b/java/ql/lib/ext/org.apache.http.client.utils.model.yml @@ -3,10 +3,22 @@ extensions: pack: codeql/java-all extensible: summaryModel data: + - ["org.apache.http.client.utils", "URIBuilder", True, "URIBuilder", "(String)", "", "Argument[0]", "Argument[this]", "taint", "ai-manual"] + - ["org.apache.http.client.utils", "URIBuilder", True, "URIBuilder", "(URI)", "", "Argument[0]", "Argument[this]", "taint", "ai-manual"] + - ["org.apache.http.client.utils", "URIBuilder", True, "URIBuilder", "(URI,Charset)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] - ["org.apache.http.client.utils", "URIBuilder", True, "setHost", "(String)", "", "Argument[0]", "Argument[this]", "taint", "ai-manual"] - ["org.apache.http.client.utils", "URIBuilder", True, "setHost", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] - ["org.apache.http.client.utils", "URIBuilder", True, "setPath", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[org.apache.http.client.utils.URIBuilder.path]", "taint", "ai-manual"] - ["org.apache.http.client.utils", "URIBuilder", True, "setPathSegments", "(List)", "", "Argument[0]", "Argument[this].SyntheticField[org.apache.http.client.utils.URIBuilder.path]", "taint", "ai-manual"] - - ["org.apache.http.client.utils", "URIBuilder", True, "URIBuilder", "(String)", "", "Argument[0]", "Argument[this]", "taint", "ai-manual"] - - ["org.apache.http.client.utils", "URIBuilder", True, "URIBuilder", "(URI)", "", "Argument[0]", "Argument[this]", "taint", "ai-manual"] - ["org.apache.http.client.utils", "URLEncodedUtils", True, "parse", "(URI,String)", "", "Argument[0]", "ReturnValue.Element", "taint", "ai-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "createURI", "(String,String,int,String,String,String)", "", "Argument[1]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "extractHost", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "resolve", "(URI,HttpHost,List)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "resolve", "(URI,String)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "resolve", "(URI,URI)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "rewriteURI", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "rewriteURI", "(URI,HttpHost)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "rewriteURI", "(URI,HttpHost,EnumSet)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "rewriteURI", "(URI,HttpHost,boolean)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "rewriteURIForRoute", "(URI,RouteInfo)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] + - ["org.apache.http.client.utils", "URIUtils", True, "rewriteURIForRoute", "(URI,RouteInfo,boolean)", "", "Argument[0]", "ReturnValue", "taint", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.http.impl.client.model.yml b/java/ql/lib/ext/org.apache.http.impl.client.model.yml new file mode 100644 index 00000000000..5cc1aca7498 --- /dev/null +++ b/java/ql/lib/ext/org.apache.http.impl.client.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.http.impl.client", "RequestWrapper", True, "setURI", "(URI)", "", "Argument[0]", "open-url", "hq-manual"] diff --git a/java/ql/lib/ext/org.apache.http.model.yml b/java/ql/lib/ext/org.apache.http.model.yml index 3e902ae7217..466fe9d15a4 100644 --- a/java/ql/lib/ext/org.apache.http.model.yml +++ b/java/ql/lib/ext/org.apache.http.model.yml @@ -9,7 +9,7 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["org.apache.http", "HttpRequest", True, "setURI", "", "", "Argument[0]", "open-url", "manual"] + - ["org.apache.http", "HttpRequestFactory", True, "newHttpRequest", "(String,String)", "", "Argument[1]", "open-url", "hq-manual"] - ["org.apache.http", "HttpResponse", True, "setEntity", "(HttpEntity)", "", "Argument[0]", "xss", "manual"] - addsTo: pack: codeql/java-all @@ -21,6 +21,11 @@ extensions: - ["org.apache.http", "HeaderElement", True, "getParameterByName", "(String)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.apache.http", "HeaderElement", True, "getParameters", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.apache.http", "HeaderElement", True, "getValue", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.apache.http", "HttpHost", True, "HttpHost", "(HttpHost)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.http", "HttpHost", True, "HttpHost", "(InetAddress,String,int,String)", "", "Argument[1]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.http", "HttpHost", True, "HttpHost", "(String)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.http", "HttpHost", True, "HttpHost", "(String,int)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] + - ["org.apache.http", "HttpHost", True, "HttpHost", "(String,int,String)", "", "Argument[0]", "Argument[this]", "taint", "hq-manual"] - ["org.apache.http", "HeaderIterator", True, "nextHeader", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.apache.http", "HttpEntity", True, "getContent", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.apache.http", "HttpEntity", True, "getContentEncoding", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/lib/ext/org.springframework.util.model.yml b/java/ql/lib/ext/org.springframework.util.model.yml index 5cc903bdc7e..a0203a0ce9e 100644 --- a/java/ql/lib/ext/org.springframework.util.model.yml +++ b/java/ql/lib/ext/org.springframework.util.model.yml @@ -1,4 +1,12 @@ extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.springframework.util", "FileCopyUtils", False, "copy", "(byte[],File)", "", "Argument[1]", "create-file", "manual"] + - ["org.springframework.util", "FileCopyUtils", False, "copy", "(File,File)", "", "Argument[0]", "read-file", "manual"] + - ["org.springframework.util", "FileCopyUtils", False, "copy", "(File,File)", "", "Argument[1]", "create-file", "manual"] + - addsTo: pack: codeql/java-all extensible: summaryModel @@ -42,7 +50,10 @@ extensions: - ["org.springframework.util", "FastByteArrayOutputStream", False, "toByteArray", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.springframework.util", "FastByteArrayOutputStream", False, "write", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["org.springframework.util", "FastByteArrayOutputStream", False, "writeTo", "", "", "Argument[this]", "Argument[0]", "taint", "manual"] - - ["org.springframework.util", "FileCopyUtils", False, "copy", "", "", "Argument[0]", "Argument[1]", "taint", "manual"] + - ["org.springframework.util", "FileCopyUtils", False, "copy", "(byte[],OutputStream)", "", "Argument[0]", "Argument[1]", "taint", "manual"] + - ["org.springframework.util", "FileCopyUtils", False, "copy", "(InputStream,OutputStream)", "", "Argument[0]", "Argument[1]", "taint", "manual"] + - ["org.springframework.util", "FileCopyUtils", False, "copy", "(Reader,Writer)", "", "Argument[0]", "Argument[1]", "taint", "manual"] + - ["org.springframework.util", "FileCopyUtils", False, "copy", "(String,Writer)", "", "Argument[0]", "Argument[1]", "taint", "manual"] - ["org.springframework.util", "FileCopyUtils", False, "copyToByteArray", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["org.springframework.util", "FileCopyUtils", False, "copyToString", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["org.springframework.util", "FileSystemUtils", False, "copyRecursively", "(java.io.File,java.io.File)", "", "Argument[0]", "Argument[1]", "taint", "manual"] diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index cc9d92a88ac..2b7fa7dcfaf 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 0.6.0 +version: 0.6.1 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/lib/semmle/code/java/Member.qll b/java/ql/lib/semmle/code/java/Member.qll index 00c9648c9a4..d09fa9042d9 100644 --- a/java/ql/lib/semmle/code/java/Member.qll +++ b/java/ql/lib/semmle/code/java/Member.qll @@ -340,6 +340,60 @@ class Callable extends StmtParent, Member, @callable { } } +/** + * Holds if the given type is public and, if it is a nested type, that all of + * its enclosing types are public as well. + */ +private predicate veryPublic(RefType t) { + t.isPublic() and + ( + not t instanceof NestedType or + veryPublic(t.(NestedType).getEnclosingType()) + ) +} + +/** A callable that is the same as its source declaration. */ +class SrcCallable extends Callable { + SrcCallable() { this.isSourceDeclaration() } + + /** + * Holds if this callable is effectively public in the sense that it can be + * called from outside the codebase. This means either a `public` callable on + * a sufficiently public type or a `protected` callable on a sufficiently + * public non-`final` type. + */ + predicate isEffectivelyPublic() { + exists(RefType t | t = this.getDeclaringType() | + this.isPublic() and veryPublic(t) + or + this.isProtected() and not t.isFinal() and veryPublic(t) + ) + or + exists(SrcRefType tsub, Method m | + veryPublic(tsub) and + tsub.hasMethod(m, _) and + m.getSourceDeclaration() = this + | + this.isPublic() + or + this.isProtected() and not tsub.isFinal() + ) + } + + /** + * Holds if this callable is implicitly public in the sense that it can be the + * target of virtual dispatch by a call from outside the codebase. + */ + predicate isImplicitlyPublic() { + this.isEffectivelyPublic() + or + exists(SrcMethod m | + m.(SrcCallable).isEffectivelyPublic() and + m.getAPossibleImplementationOfSrcMethod() = this + ) + } +} + /** Gets the erasure of `t1` if it is a raw type, or `t1` itself otherwise. */ private Type eraseRaw(Type t1) { if t1 instanceof RawType then result = t1.getErasure() else result = t1 diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll index 865d7b4d6ce..f34554d6eea 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll @@ -361,3 +361,52 @@ module MergePathGraph< } } } + +/** + * Constructs a `PathGraph` from three `PathGraph`s by disjoint union. + */ +module MergePathGraph3< + PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3, + PathGraphSig Graph1, PathGraphSig Graph2, PathGraphSig Graph3> +{ + private module MergedInner = MergePathGraph; + + private module Merged = + MergePathGraph; + + /** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */ + class PathNode instanceof Merged::PathNode { + /** Gets this as a projection on the first given `PathGraph`. */ + PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() } + + /** Gets this as a projection on the second given `PathGraph`. */ + PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() } + + /** Gets this as a projection on the third given `PathGraph`. */ + PathNode3 asPathNode3() { result = super.asPathNode2() } + + /** Gets a textual representation of this element. */ + string toString() { result = super.toString() } + + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + Node getNode() { result = super.getNode() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PathGraph = Merged::PathGraph; +} diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll index 6ea97954bdf..cd8e992c980 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll @@ -3031,6 +3031,17 @@ module Impl { this instanceof PathNodeSinkGroup } + private string ppType() { + this instanceof PathNodeSink and result = "" + or + this.(PathNodeMid).getAp() instanceof AccessPathNil and result = "" + or + exists(DataFlowType t | t = this.(PathNodeMid).getAp().getHead().getContainerType() | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { this instanceof PathNodeSink and result = "" or @@ -3046,14 +3057,14 @@ module Impl { } /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -3998,14 +4009,14 @@ module Impl { */ class PartialPathNode extends TPartialPathNode { /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -4046,6 +4057,19 @@ module Impl { */ int getSinkDistance() { result = distSink(this.getNodeEx().getEnclosingCallable()) } + private string ppType() { + this instanceof PartialPathNodeRev and result = "" + or + this.(PartialPathNodeFwd).getAp() instanceof PartialAccessPathNil and result = "" + or + exists(DataFlowType t | + t = this.(PartialPathNodeFwd).getAp().(PartialAccessPathCons).getType() + | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { exists(string s | s = this.(PartialPathNodeFwd).getAp().toString() or diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll b/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll new file mode 100644 index 00000000000..745cf7934f0 --- /dev/null +++ b/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll @@ -0,0 +1,77 @@ +/** Provides classes and predicates for exclusions related to MaD models. */ + +import java + +/** Holds if the given package `p` is a test package. */ +pragma[nomagic] +private predicate isTestPackage(Package p) { + p.getName() + .matches([ + "org.junit%", "junit.%", "org.mockito%", "org.assertj%", + "com.github.tomakehurst.wiremock%", "org.hamcrest%", "org.springframework.test.%", + "org.springframework.mock.%", "org.springframework.boot.test.%", "reactor.test%", + "org.xmlunit%", "org.testcontainers.%", "org.opentest4j%", "org.mockserver%", + "org.powermock%", "org.skyscreamer.jsonassert%", "org.rnorth.visibleassertions", + "org.openqa.selenium%", "com.gargoylesoftware.htmlunit%", "org.jboss.arquillian.testng%", + "org.testng%" + ]) +} + +/** + * A test library. + */ +class TestLibrary extends RefType { + TestLibrary() { isTestPackage(this.getPackage()) } +} + +/** Holds if the given file is a test file. */ +private predicate isInTestFile(File file) { + file.getAbsolutePath().matches(["%/test/%", "%/guava-tests/%", "%/guava-testlib/%"]) and + not file.getAbsolutePath().matches("%/ql/test/%") // allows our test cases to work +} + +/** Holds if the given compilation unit's package is a JDK internal. */ +private predicate isJdkInternal(CompilationUnit cu) { + cu.getPackage().getName().matches("org.graalvm%") or + cu.getPackage().getName().matches("com.sun%") or + cu.getPackage().getName().matches("sun%") or + cu.getPackage().getName().matches("jdk%") or + cu.getPackage().getName().matches("java2d%") or + cu.getPackage().getName().matches("build.tools%") or + cu.getPackage().getName().matches("propertiesparser%") or + cu.getPackage().getName().matches("org.jcp%") or + cu.getPackage().getName().matches("org.w3c%") or + cu.getPackage().getName().matches("org.ietf.jgss%") or + cu.getPackage().getName().matches("org.xml.sax%") or + cu.getPackage().getName().matches("com.oracle%") or + cu.getPackage().getName().matches("org.omg%") or + cu.getPackage().getName().matches("org.relaxng%") or + cu.getPackage().getName() = "compileproperties" or + cu.getPackage().getName() = "transparentruler" or + cu.getPackage().getName() = "genstubs" or + cu.getPackage().getName() = "netscape.javascript" or + cu.getPackage().getName() = "" +} + +/** Holds if the given callable is not worth modeling. */ +predicate isUninterestingForModels(Callable c) { + isInTestFile(c.getCompilationUnit().getFile()) or + isJdkInternal(c.getCompilationUnit()) or + c instanceof MainMethod or + c instanceof StaticInitializer or + exists(FunctionalExpr funcExpr | c = funcExpr.asMethod()) or + c.getDeclaringType() instanceof TestLibrary or + c.(Constructor).isParameterless() +} + +/** + * A class that represents all callables for which we might be + * interested in having a MaD model. + */ +class ModelApi extends SrcCallable { + ModelApi() { + this.fromSource() and + this.isEffectivelyPublic() and + not isUninterestingForModels(this) + } +} diff --git a/java/ql/lib/semmle/code/java/security/HardcodedCredentialsSourceCallQuery.qll b/java/ql/lib/semmle/code/java/security/HardcodedCredentialsSourceCallQuery.qll index 7125ffda088..e41bbeb622d 100644 --- a/java/ql/lib/semmle/code/java/security/HardcodedCredentialsSourceCallQuery.qll +++ b/java/ql/lib/semmle/code/java/security/HardcodedCredentialsSourceCallQuery.qll @@ -8,10 +8,12 @@ import semmle.code.java.dataflow.DataFlow2 import HardcodedCredentials /** + * DEPRECATED: Use `HardcodedCredentialSourceCallFlow` instead. + * * A data-flow configuration that tracks hardcoded expressions flowing to a parameter whose name suggests * it may be a credential, excluding those which flow on to other such insecure usage sites. */ -class HardcodedCredentialSourceCallConfiguration extends DataFlow::Configuration { +deprecated class HardcodedCredentialSourceCallConfiguration extends DataFlow::Configuration { HardcodedCredentialSourceCallConfiguration() { this = "HardcodedCredentialSourceCallConfiguration" } @@ -22,10 +24,28 @@ class HardcodedCredentialSourceCallConfiguration extends DataFlow::Configuration } /** + * A data-flow configuration that tracks hardcoded expressions flowing to a parameter whose name suggests + * it may be a credential, excluding those which flow on to other such insecure usage sites. + */ +module HardcodedCredentialSourceCallConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr() instanceof HardcodedExpr } + + predicate isSink(DataFlow::Node n) { n.asExpr() instanceof FinalCredentialsSourceSink } +} + +/** + * Tracks hardcoded expressions flowing to a parameter whose name suggests + * it may be a credential, excluding those which flow on to other such insecure usage sites. + */ +module HardcodedCredentialSourceCallFlow = DataFlow::Global; + +/** + * DEPRECATED: Use `HardcodedCredentialParameterSourceCallFlow` instead. + * * A data-flow configuration that tracks flow from an argument whose corresponding parameter name suggests * a credential, to an argument to a sensitive call. */ -class HardcodedCredentialSourceCallConfiguration2 extends DataFlow2::Configuration { +deprecated class HardcodedCredentialSourceCallConfiguration2 extends DataFlow2::Configuration { HardcodedCredentialSourceCallConfiguration2() { this = "HardcodedCredentialSourceCallConfiguration2" } @@ -35,6 +55,23 @@ class HardcodedCredentialSourceCallConfiguration2 extends DataFlow2::Configurati override predicate isSink(DataFlow::Node n) { n.asExpr() instanceof CredentialsSink } } +/** + * A data-flow configuration that tracks flow from an argument whose corresponding parameter name suggests + * a credential, to an argument to a sensitive call. + */ +module HardcodedCredentialParameterSourceCallConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr() instanceof CredentialsSourceSink } + + predicate isSink(DataFlow::Node n) { n.asExpr() instanceof CredentialsSink } +} + +/** + * Tracks flow from an argument whose corresponding parameter name suggests + * a credential, to an argument to a sensitive call. + */ +module HardcodedCredentialParameterSourceCallFlow = + DataFlow::Global; + /** * An argument to a call, where the parameter name corresponding * to the argument indicates that it may contain credentials, and @@ -42,10 +79,9 @@ class HardcodedCredentialSourceCallConfiguration2 extends DataFlow2::Configurati */ class FinalCredentialsSourceSink extends CredentialsSourceSink { FinalCredentialsSourceSink() { - not exists(HardcodedCredentialSourceCallConfiguration2 conf, CredentialsSink other | - this != other - | - conf.hasFlow(DataFlow::exprNode(this), DataFlow::exprNode(other)) + not exists(CredentialsSink other | this != other | + HardcodedCredentialParameterSourceCallFlow::flow(DataFlow::exprNode(this), + DataFlow::exprNode(other)) ) } } diff --git a/java/ql/lib/semmle/code/java/security/LogInjection.qll b/java/ql/lib/semmle/code/java/security/LogInjection.qll index 55e4a785d4b..e60e6ed9a7f 100644 --- a/java/ql/lib/semmle/code/java/security/LogInjection.qll +++ b/java/ql/lib/semmle/code/java/security/LogInjection.qll @@ -1,8 +1,9 @@ /** Provides classes and predicates related to Log Injection vulnerabilities. */ import java -import semmle.code.java.dataflow.DataFlow +private import semmle.code.java.dataflow.DataFlow private import semmle.code.java.dataflow.ExternalFlow +private import semmle.code.java.controlflow.Guards /** A data flow sink for unvalidated user input that is used to log messages. */ abstract class LogInjectionSink extends DataFlow::Node { } @@ -31,6 +32,90 @@ private class DefaultLogInjectionSink extends LogInjectionSink { private class DefaultLogInjectionSanitizer extends LogInjectionSanitizer { DefaultLogInjectionSanitizer() { - this.getType() instanceof BoxedType or this.getType() instanceof PrimitiveType + this.getType() instanceof BoxedType or + this.getType() instanceof PrimitiveType or + this.getType() instanceof NumericType } } + +private class LineBreaksLogInjectionSanitizer extends LogInjectionSanitizer { + LineBreaksLogInjectionSanitizer() { + logInjectionSanitizer(this.asExpr()) + or + this = DataFlow::BarrierGuard::getABarrierNode() + } +} + +/** + * Holds if the return value of `ma` is sanitized against log injection attacks + * by removing line breaks from it. + */ +private predicate logInjectionSanitizer(MethodAccess ma) { + exists(CompileTimeConstantExpr target, CompileTimeConstantExpr replacement | + ma.getMethod().getDeclaringType() instanceof TypeString and + target = ma.getArgument(0) and + replacement = ma.getArgument(1) and + not replacement.getStringValue().matches(["%\n%", "%\r%"]) + | + ma.getMethod().hasName("replace") and + not replacement.getIntValue() = [10, 13] and + ( + target.getIntValue() = [10, 13] or // 10 == '\n', 13 == '\r' + target.getStringValue() = ["\n", "\r"] + ) + or + ma.getMethod().hasName("replaceAll") and + ( + // Replace anything not in an allow list + target.getStringValue().matches("[^%]") and + not target.getStringValue().matches("%" + ["\n", "\r", "\\n", "\\r", "\\R"] + "%") + or + // Replace line breaks + target.getStringValue() = ["\n", "\r", "\\n", "\\r", "\\R"] + ) + ) +} + +/** + * Holds if `g` guards `e` in branch `branch` against log injection attacks + * by checking if there are line breaks in `e`. + */ +private predicate logInjectionGuard(Guard g, Expr e, boolean branch) { + exists(MethodAccess ma, CompileTimeConstantExpr target | + ma = g and + target = ma.getArgument(0) + | + ma.getMethod().getDeclaringType() instanceof TypeString and + ma.getMethod().hasName("contains") and + target.getStringValue() = ["\n", "\r"] and + e = ma.getQualifier() and + branch = false + or + ma.getMethod().hasName("matches") and + ( + ma.getMethod().getDeclaringType() instanceof TypeString and + e = ma.getQualifier() + or + ma.getMethod().getDeclaringType().hasQualifiedName("java.util.regex", "Pattern") and + e = ma.getArgument(1) + ) and + ( + // Allow anything except line breaks + ( + not target.getStringValue().matches("%[^%]%") and + not target.getStringValue().matches("%" + ["\n", "\r", "\\n", "\\r", "\\R"] + "%") + or + target.getStringValue().matches("%[^%" + ["\n", "\r", "\\n", "\\r", "\\R"] + "%]%") + ) and + branch = true + or + // Disallow line breaks + ( + not target.getStringValue().matches("%[^%" + ["\n", "\r", "\\n", "\\r", "\\R"] + "%]%") and + // Assuming a regex containing line breaks is correctly matching line breaks in a string + target.getStringValue().matches("%" + ["\n", "\r", "\\n", "\\r", "\\R"] + "%") + ) and + branch = false + ) + ) +} diff --git a/java/ql/lib/semmle/code/java/security/SensitiveResultReceiverQuery.qll b/java/ql/lib/semmle/code/java/security/SensitiveResultReceiverQuery.qll index 0679f66b575..ca3b385239b 100644 --- a/java/ql/lib/semmle/code/java/security/SensitiveResultReceiverQuery.qll +++ b/java/ql/lib/semmle/code/java/security/SensitiveResultReceiverQuery.qll @@ -1,7 +1,7 @@ /** Definitions for the sensitive result receiver query. */ import java -import semmle.code.java.dataflow.TaintTracking2 +import semmle.code.java.dataflow.TaintTracking import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.SensitiveActions @@ -17,21 +17,21 @@ private class ResultReceiverSendCall extends MethodAccess { Expr getSentData() { result = this.getArgument(1) } } -private class UntrustedResultReceiverConf extends TaintTracking2::Configuration { - UntrustedResultReceiverConf() { this = "UntrustedResultReceiverConf" } +private module UntrustedResultReceiverConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { node instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node node) { node instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node node) { + predicate isSink(DataFlow::Node node) { node.asExpr() = any(ResultReceiverSendCall c).getReceiver() } } +private module UntrustedResultReceiverFlow = TaintTracking::Global; + private predicate untrustedResultReceiverSend(DataFlow::Node src, ResultReceiverSendCall call) { - any(UntrustedResultReceiverConf c).hasFlow(src, DataFlow::exprNode(call.getReceiver())) + UntrustedResultReceiverFlow::flow(src, DataFlow::exprNode(call.getReceiver())) } -private class SensitiveResultReceiverConf extends TaintTracking::Configuration { +deprecated private class SensitiveResultReceiverConf extends TaintTracking::Configuration { SensitiveResultReceiverConf() { this = "SensitiveResultReceiverConf" } override predicate isSource(DataFlow::Node node) { node.asExpr() instanceof SensitiveExpr } @@ -50,12 +50,46 @@ private class SensitiveResultReceiverConf extends TaintTracking::Configuration { } } -/** Holds if there is a path from sensitive data at `src` to a result receiver at `sink`, and the receiver was obtained from an untrusted source `recSrc`. */ -predicate sensitiveResultReceiver( +private module SensitiveResultReceiverConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { node.asExpr() instanceof SensitiveExpr } + + predicate isSink(DataFlow::Node node) { + exists(ResultReceiverSendCall call | + untrustedResultReceiverSend(_, call) and + node.asExpr() = call.getSentData() + ) + } + + predicate allowImplicitRead(DataFlow::Node n, DataFlow::ContentSet c) { isSink(n) and exists(c) } +} + +/** Taint tracking flow for sensitive expressions flowing to untrusted result receivers. */ +module SensitiveResultReceiverFlow = TaintTracking::Global; + +/** + * DEPRECATED: Use `isSensitiveResultReceiver` instead. + * + * Holds if there is a path from sensitive data at `src` to a result receiver at `sink`, and the receiver was obtained from an untrusted source `recSrc`. + */ +deprecated predicate sensitiveResultReceiver( DataFlow::PathNode src, DataFlow::PathNode sink, DataFlow::Node recSrc ) { - exists(ResultReceiverSendCall call, SensitiveResultReceiverConf conf | - conf.hasFlowPath(src, sink) and + exists(ResultReceiverSendCall call | + any(SensitiveResultReceiverConf c).hasFlowPath(src, sink) and + sink.getNode().asExpr() = call.getSentData() and + untrustedResultReceiverSend(recSrc, call) + ) +} + +/** + * Holds if there is a path from sensitive data at `src` to a result receiver at `sink`, and the receiver was obtained from an untrusted source `recSrc`. + */ +predicate isSensitiveResultReceiver( + SensitiveResultReceiverFlow::PathNode src, SensitiveResultReceiverFlow::PathNode sink, + DataFlow::Node recSrc +) { + exists(ResultReceiverSendCall call | + SensitiveResultReceiverFlow::flowPath(src, sink) and sink.getNode().asExpr() = call.getSentData() and untrustedResultReceiverSend(recSrc, call) ) diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 54dfb86d77f..744ac866083 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.1 + +No user-facing changes. + ## 0.6.0 ### New Queries diff --git a/java/ql/src/Metrics/Summaries/GeneratedVsManualCoverageQuery.qll b/java/ql/src/Metrics/Summaries/GeneratedVsManualCoverageQuery.qll index d069b20fc56..b5eeaacfdd9 100644 --- a/java/ql/src/Metrics/Summaries/GeneratedVsManualCoverageQuery.qll +++ b/java/ql/src/Metrics/Summaries/GeneratedVsManualCoverageQuery.qll @@ -1,9 +1,9 @@ private import semmle.code.java.dataflow.FlowSummary -private import utils.modelgenerator.internal.CaptureModels +private import semmle.code.java.dataflow.internal.ModelExclusions private import TopJdkApis /** - * Returns the number of `DataFlowTargetApi`s with Summary MaD models + * Returns the number of `ModelApi`s with Summary MaD models * for a given package and provenance. */ bindingset[package, apiSubset] @@ -13,7 +13,7 @@ private int getNumMadModeledApis(string package, string provenance, string apiSu count(SummarizedCallable sc | callableSubset(sc.asCallable(), apiSubset) and package = sc.asCallable().getCompilationUnit().getPackage().getName() and - sc.asCallable() instanceof DataFlowTargetApi and + sc.asCallable() instanceof ModelApi and ( // "auto-only" not sc.hasManualModel() and @@ -34,12 +34,12 @@ private int getNumMadModeledApis(string package, string provenance, string apiSu ) } -/** Returns the total number of `DataFlowTargetApi`s for a given package. */ +/** Returns the total number of `ModelApi`s for a given package. */ private int getNumApis(string package, string apiSubset) { result = - strictcount(DataFlowTargetApi dataFlowTargApi | - callableSubset(dataFlowTargApi, apiSubset) and - package = dataFlowTargApi.getCompilationUnit().getPackage().getName() + strictcount(ModelApi api | + callableSubset(api, apiSubset) and + package = api.getCompilationUnit().getPackage().getName() ) } @@ -70,7 +70,7 @@ predicate modelCoverageGenVsMan( // calculate the total generated and total manual numbers generated = generatedOnly + both and manual = manualOnly + both and - // count the total number of `DataFlowTargetApi`s for each package + // count the total number of `ModelApi`s for each package all = getNumApis(package, apiSubset) and non = all - (generatedOnly + both + manualOnly) and // Proportion of coverage diff --git a/java/ql/src/Security/CWE/CWE-798/HardcodedCredentialsSourceCall.ql b/java/ql/src/Security/CWE/CWE-798/HardcodedCredentialsSourceCall.ql index 33acad610ff..4237ab088c0 100644 --- a/java/ql/src/Security/CWE/CWE-798/HardcodedCredentialsSourceCall.ql +++ b/java/ql/src/Security/CWE/CWE-798/HardcodedCredentialsSourceCall.ql @@ -12,11 +12,11 @@ import java import semmle.code.java.security.HardcodedCredentialsSourceCallQuery -import DataFlow::PathGraph +import HardcodedCredentialSourceCallFlow::PathGraph from - DataFlow::PathNode source, DataFlow::PathNode sink, - HardcodedCredentialSourceCallConfiguration conf -where conf.hasFlowPath(source, sink) + HardcodedCredentialSourceCallFlow::PathNode source, + HardcodedCredentialSourceCallFlow::PathNode sink +where HardcodedCredentialSourceCallFlow::flowPath(source, sink) select source.getNode(), source, sink, "Hard-coded value flows to $@.", sink.getNode(), "sensitive call" diff --git a/java/ql/src/Security/CWE/CWE-927/SensitiveResultReceiver.ql b/java/ql/src/Security/CWE/CWE-927/SensitiveResultReceiver.ql index efbb0e4c11e..14e8a65c58f 100644 --- a/java/ql/src/Security/CWE/CWE-927/SensitiveResultReceiver.ql +++ b/java/ql/src/Security/CWE/CWE-927/SensitiveResultReceiver.ql @@ -13,9 +13,11 @@ import java import semmle.code.java.security.SensitiveResultReceiverQuery -import DataFlow::PathGraph +import SensitiveResultReceiverFlow::PathGraph -from DataFlow::PathNode src, DataFlow::PathNode sink, DataFlow::Node recSrc -where sensitiveResultReceiver(src, sink, recSrc) +from + SensitiveResultReceiverFlow::PathNode src, SensitiveResultReceiverFlow::PathNode sink, + DataFlow::Node recSrc +where isSensitiveResultReceiver(src, sink, recSrc) select sink, src, sink, "This $@ is sent to a ResultReceiver obtained from $@.", src, "sensitive information", recSrc, "this untrusted source" diff --git a/java/ql/src/Telemetry/ExternalApi.qll b/java/ql/src/Telemetry/ExternalApi.qll index 1675307e2ef..6189d12ba25 100644 --- a/java/ql/src/Telemetry/ExternalApi.qll +++ b/java/ql/src/Telemetry/ExternalApi.qll @@ -8,27 +8,7 @@ private import semmle.code.java.dataflow.FlowSummary private import semmle.code.java.dataflow.internal.DataFlowPrivate private import semmle.code.java.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl private import semmle.code.java.dataflow.TaintTracking - -pragma[nomagic] -private predicate isTestPackage(Package p) { - p.getName() - .matches([ - "org.junit%", "junit.%", "org.mockito%", "org.assertj%", - "com.github.tomakehurst.wiremock%", "org.hamcrest%", "org.springframework.test.%", - "org.springframework.mock.%", "org.springframework.boot.test.%", "reactor.test%", - "org.xmlunit%", "org.testcontainers.%", "org.opentest4j%", "org.mockserver%", - "org.powermock%", "org.skyscreamer.jsonassert%", "org.rnorth.visibleassertions", - "org.openqa.selenium%", "com.gargoylesoftware.htmlunit%", "org.jboss.arquillian.testng%", - "org.testng%" - ]) -} - -/** - * A test library. - */ -private class TestLibrary extends RefType { - TestLibrary() { isTestPackage(this.getPackage()) } -} +private import semmle.code.java.dataflow.internal.ModelExclusions private string containerAsJar(Container container) { if container instanceof JarFile then result = container.getBaseName() else result = "rt.jar" diff --git a/java/ql/src/change-notes/released/0.6.1.md b/java/ql/src/change-notes/released/0.6.1.md new file mode 100644 index 00000000000..6008e49b8e7 --- /dev/null +++ b/java/ql/src/change-notes/released/0.6.1.md @@ -0,0 +1,3 @@ +## 0.6.1 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index a3f820f884d..80fb0899f64 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.0 +lastReleaseVersion: 0.6.1 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 4912587dff9..4cf2d8a9ecb 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 0.6.0 +version: 0.6.1 groups: - java - queries diff --git a/java/ql/src/queries.xml b/java/ql/src/queries.xml deleted file mode 100644 index 0d33187fe86..00000000000 --- a/java/ql/src/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll b/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll index 8823a8977d5..349af01f790 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll @@ -5,6 +5,7 @@ private import java as J private import semmle.code.java.dataflow.internal.DataFlowPrivate private import semmle.code.java.dataflow.internal.ContainerFlow as ContainerFlow +private import semmle.code.java.dataflow.internal.ModelExclusions private import semmle.code.java.dataflow.DataFlow as Df private import semmle.code.java.dataflow.SSA as Ssa private import semmle.code.java.dataflow.TaintTracking as Tt @@ -26,34 +27,6 @@ private J::Method superImpl(J::Method m) { not m instanceof J::ToStringMethod } -private predicate isInTestFile(J::File file) { - file.getAbsolutePath().matches("%src/test/%") or - file.getAbsolutePath().matches("%/guava-tests/%") or - file.getAbsolutePath().matches("%/guava-testlib/%") -} - -private predicate isJdkInternal(J::CompilationUnit cu) { - cu.getPackage().getName().matches("org.graalvm%") or - cu.getPackage().getName().matches("com.sun%") or - cu.getPackage().getName().matches("sun%") or - cu.getPackage().getName().matches("jdk%") or - cu.getPackage().getName().matches("java2d%") or - cu.getPackage().getName().matches("build.tools%") or - cu.getPackage().getName().matches("propertiesparser%") or - cu.getPackage().getName().matches("org.jcp%") or - cu.getPackage().getName().matches("org.w3c%") or - cu.getPackage().getName().matches("org.ietf.jgss%") or - cu.getPackage().getName().matches("org.xml.sax%") or - cu.getPackage().getName().matches("com.oracle%") or - cu.getPackage().getName().matches("org.omg%") or - cu.getPackage().getName().matches("org.relaxng%") or - cu.getPackage().getName() = "compileproperties" or - cu.getPackage().getName() = "transparentruler" or - cu.getPackage().getName() = "genstubs" or - cu.getPackage().getName() = "netscape.javascript" or - cu.getPackage().getName() = "" -} - private predicate isInfrequentlyUsed(J::CompilationUnit cu) { cu.getPackage().getName().matches("javax.swing%") or cu.getPackage().getName().matches("java.awt%") @@ -63,13 +36,8 @@ private predicate isInfrequentlyUsed(J::CompilationUnit cu) { * Holds if it is relevant to generate models for `api`. */ private predicate isRelevantForModels(J::Callable api) { - not isInTestFile(api.getCompilationUnit().getFile()) and - not isJdkInternal(api.getCompilationUnit()) and - not isInfrequentlyUsed(api.getCompilationUnit()) and - not api instanceof J::MainMethod and - not api instanceof J::StaticInitializer and - not exists(J::FunctionalExpr funcExpr | api = funcExpr.asMethod()) and - not api.(J::Constructor).isParameterless() + not isUninterestingForModels(api) and + not isInfrequentlyUsed(api.getCompilationUnit()) } /** diff --git a/java/ql/test/TestUtilities/InlineFlowTest.qll b/java/ql/test/TestUtilities/InlineFlowTest.qll index efc5a6fab2b..0700708fcb7 100644 --- a/java/ql/test/TestUtilities/InlineFlowTest.qll +++ b/java/ql/test/TestUtilities/InlineFlowTest.qll @@ -61,37 +61,11 @@ private module DefaultValueFlow = DataFlow::Global; private module DefaultTaintFlow = TaintTracking::Global; -class DefaultValueFlowConf extends DataFlow::Configuration { - DefaultValueFlowConf() { this = "qltest:defaultValueFlowConf" } - - override predicate isSource(DataFlow::Node n) { defaultSource(n) } - - override predicate isSink(DataFlow::Node n) { - exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) - } - - override int fieldFlowBranchLimit() { result = 1000 } -} - -class DefaultTaintFlowConf extends TaintTracking::Configuration { - DefaultTaintFlowConf() { this = "qltest:defaultTaintFlowConf" } - - override predicate isSource(DataFlow::Node n) { defaultSource(n) } - - override predicate isSink(DataFlow::Node n) { - exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) - } - - override int fieldFlowBranchLimit() { result = 1000 } -} - private string getSourceArgString(DataFlow::Node src) { defaultSource(src) and src.asExpr().(MethodAccess).getAnArgument().(StringLiteral).getValue() = result } -abstract class EnableLegacyConfiguration extends Unit { } - class InlineFlowTest extends InlineExpectationsTest { InlineFlowTest() { this = "HasFlowTest" } @@ -116,18 +90,10 @@ class InlineFlowTest extends InlineExpectationsTest { } predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { - if exists(EnableLegacyConfiguration e) - then getValueFlowConfig().hasFlow(src, sink) - else DefaultValueFlow::flow(src, sink) + DefaultValueFlow::flow(src, sink) } predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - if exists(EnableLegacyConfiguration e) - then getTaintFlowConfig().hasFlow(src, sink) - else DefaultTaintFlow::flow(src, sink) + DefaultTaintFlow::flow(src, sink) } - - DataFlow::Configuration getValueFlowConfig() { result = any(DefaultValueFlowConf config) } - - DataFlow::Configuration getTaintFlowConfig() { result = any(DefaultTaintFlowConf config) } } diff --git a/java/ql/test/experimental/query-tests/security/CWE-020/Log4jInjectionTest.expected b/java/ql/test/experimental/query-tests/security/CWE-020/Log4jInjectionTest.expected index 7a6890d0b51..f3d88d25805 100644 --- a/java/ql/test/experimental/query-tests/security/CWE-020/Log4jInjectionTest.expected +++ b/java/ql/test/experimental/query-tests/security/CWE-020/Log4jInjectionTest.expected @@ -1053,8 +1053,8 @@ edges | Log4jJndiInjectionTest.java:37:59:37:66 | source(...) : String | Log4jJndiInjectionTest.java:37:41:37:66 | (...)... | | Log4jJndiInjectionTest.java:39:50:39:57 | source(...) : String | Log4jJndiInjectionTest.java:39:41:39:57 | (...)... | | Log4jJndiInjectionTest.java:40:50:40:57 | source(...) : String | Log4jJndiInjectionTest.java:40:41:40:57 | (...)... | -| Log4jJndiInjectionTest.java:41:56:41:78 | {...} [[]] : String | Log4jJndiInjectionTest.java:41:56:41:78 | new Object[] | -| Log4jJndiInjectionTest.java:41:70:41:77 | source(...) : String | Log4jJndiInjectionTest.java:41:56:41:78 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:41:56:41:78 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:41:56:41:78 | new Object[] | +| Log4jJndiInjectionTest.java:41:70:41:77 | source(...) : String | Log4jJndiInjectionTest.java:41:56:41:78 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:42:65:42:72 | source(...) : String | Log4jJndiInjectionTest.java:42:56:42:72 | (...)... | | Log4jJndiInjectionTest.java:43:50:43:57 | source(...) : String | Log4jJndiInjectionTest.java:43:41:43:57 | (...)... | | Log4jJndiInjectionTest.java:44:80:44:87 | source(...) : String | Log4jJndiInjectionTest.java:44:71:44:87 | (...)... | @@ -1120,8 +1120,8 @@ edges | Log4jJndiInjectionTest.java:104:36:104:43 | source(...) : String | Log4jJndiInjectionTest.java:104:26:104:43 | (...)... | | Log4jJndiInjectionTest.java:107:35:107:42 | source(...) : String | Log4jJndiInjectionTest.java:107:26:107:42 | (...)... | | Log4jJndiInjectionTest.java:108:35:108:42 | source(...) : String | Log4jJndiInjectionTest.java:108:26:108:42 | (...)... | -| Log4jJndiInjectionTest.java:109:41:109:63 | {...} [[]] : String | Log4jJndiInjectionTest.java:109:41:109:63 | new Object[] | -| Log4jJndiInjectionTest.java:109:55:109:62 | source(...) : String | Log4jJndiInjectionTest.java:109:41:109:63 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:109:41:109:63 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:109:41:109:63 | new Object[] | +| Log4jJndiInjectionTest.java:109:55:109:62 | source(...) : String | Log4jJndiInjectionTest.java:109:41:109:63 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:110:50:110:57 | source(...) : String | Log4jJndiInjectionTest.java:110:41:110:57 | (...)... | | Log4jJndiInjectionTest.java:111:35:111:42 | source(...) : String | Log4jJndiInjectionTest.java:111:26:111:42 | (...)... | | Log4jJndiInjectionTest.java:112:65:112:72 | source(...) : String | Log4jJndiInjectionTest.java:112:56:112:72 | (...)... | @@ -1190,8 +1190,8 @@ edges | Log4jJndiInjectionTest.java:175:59:175:66 | source(...) : String | Log4jJndiInjectionTest.java:175:41:175:66 | (...)... | | Log4jJndiInjectionTest.java:177:50:177:57 | source(...) : String | Log4jJndiInjectionTest.java:177:41:177:57 | (...)... | | Log4jJndiInjectionTest.java:178:50:178:57 | source(...) : String | Log4jJndiInjectionTest.java:178:41:178:57 | (...)... | -| Log4jJndiInjectionTest.java:179:56:179:78 | {...} [[]] : String | Log4jJndiInjectionTest.java:179:56:179:78 | new Object[] | -| Log4jJndiInjectionTest.java:179:70:179:77 | source(...) : String | Log4jJndiInjectionTest.java:179:56:179:78 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:179:56:179:78 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:179:56:179:78 | new Object[] | +| Log4jJndiInjectionTest.java:179:70:179:77 | source(...) : String | Log4jJndiInjectionTest.java:179:56:179:78 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:180:65:180:72 | source(...) : String | Log4jJndiInjectionTest.java:180:56:180:72 | (...)... | | Log4jJndiInjectionTest.java:181:50:181:57 | source(...) : String | Log4jJndiInjectionTest.java:181:41:181:57 | (...)... | | Log4jJndiInjectionTest.java:182:80:182:87 | source(...) : String | Log4jJndiInjectionTest.java:182:71:182:87 | (...)... | @@ -1257,8 +1257,8 @@ edges | Log4jJndiInjectionTest.java:242:36:242:43 | source(...) : String | Log4jJndiInjectionTest.java:242:26:242:43 | (...)... | | Log4jJndiInjectionTest.java:245:35:245:42 | source(...) : String | Log4jJndiInjectionTest.java:245:26:245:42 | (...)... | | Log4jJndiInjectionTest.java:246:35:246:42 | source(...) : String | Log4jJndiInjectionTest.java:246:26:246:42 | (...)... | -| Log4jJndiInjectionTest.java:247:41:247:63 | {...} [[]] : String | Log4jJndiInjectionTest.java:247:41:247:63 | new Object[] | -| Log4jJndiInjectionTest.java:247:55:247:62 | source(...) : String | Log4jJndiInjectionTest.java:247:41:247:63 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:247:41:247:63 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:247:41:247:63 | new Object[] | +| Log4jJndiInjectionTest.java:247:55:247:62 | source(...) : String | Log4jJndiInjectionTest.java:247:41:247:63 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:248:50:248:57 | source(...) : String | Log4jJndiInjectionTest.java:248:41:248:57 | (...)... | | Log4jJndiInjectionTest.java:249:35:249:42 | source(...) : String | Log4jJndiInjectionTest.java:249:26:249:42 | (...)... | | Log4jJndiInjectionTest.java:250:65:250:72 | source(...) : String | Log4jJndiInjectionTest.java:250:56:250:72 | (...)... | @@ -1327,8 +1327,8 @@ edges | Log4jJndiInjectionTest.java:313:59:313:66 | source(...) : String | Log4jJndiInjectionTest.java:313:41:313:66 | (...)... | | Log4jJndiInjectionTest.java:315:50:315:57 | source(...) : String | Log4jJndiInjectionTest.java:315:41:315:57 | (...)... | | Log4jJndiInjectionTest.java:316:50:316:57 | source(...) : String | Log4jJndiInjectionTest.java:316:41:316:57 | (...)... | -| Log4jJndiInjectionTest.java:317:56:317:78 | {...} [[]] : String | Log4jJndiInjectionTest.java:317:56:317:78 | new Object[] | -| Log4jJndiInjectionTest.java:317:70:317:77 | source(...) : String | Log4jJndiInjectionTest.java:317:56:317:78 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:317:56:317:78 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:317:56:317:78 | new Object[] | +| Log4jJndiInjectionTest.java:317:70:317:77 | source(...) : String | Log4jJndiInjectionTest.java:317:56:317:78 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:318:65:318:72 | source(...) : String | Log4jJndiInjectionTest.java:318:56:318:72 | (...)... | | Log4jJndiInjectionTest.java:319:50:319:57 | source(...) : String | Log4jJndiInjectionTest.java:319:41:319:57 | (...)... | | Log4jJndiInjectionTest.java:320:80:320:87 | source(...) : String | Log4jJndiInjectionTest.java:320:71:320:87 | (...)... | @@ -1394,8 +1394,8 @@ edges | Log4jJndiInjectionTest.java:380:36:380:43 | source(...) : String | Log4jJndiInjectionTest.java:380:26:380:43 | (...)... | | Log4jJndiInjectionTest.java:383:35:383:42 | source(...) : String | Log4jJndiInjectionTest.java:383:26:383:42 | (...)... | | Log4jJndiInjectionTest.java:384:35:384:42 | source(...) : String | Log4jJndiInjectionTest.java:384:26:384:42 | (...)... | -| Log4jJndiInjectionTest.java:385:41:385:63 | {...} [[]] : String | Log4jJndiInjectionTest.java:385:41:385:63 | new Object[] | -| Log4jJndiInjectionTest.java:385:55:385:62 | source(...) : String | Log4jJndiInjectionTest.java:385:41:385:63 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:385:41:385:63 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:385:41:385:63 | new Object[] | +| Log4jJndiInjectionTest.java:385:55:385:62 | source(...) : String | Log4jJndiInjectionTest.java:385:41:385:63 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:386:50:386:57 | source(...) : String | Log4jJndiInjectionTest.java:386:41:386:57 | (...)... | | Log4jJndiInjectionTest.java:387:35:387:42 | source(...) : String | Log4jJndiInjectionTest.java:387:26:387:42 | (...)... | | Log4jJndiInjectionTest.java:388:65:388:72 | source(...) : String | Log4jJndiInjectionTest.java:388:56:388:72 | (...)... | @@ -1464,8 +1464,8 @@ edges | Log4jJndiInjectionTest.java:451:58:451:65 | source(...) : String | Log4jJndiInjectionTest.java:451:40:451:65 | (...)... | | Log4jJndiInjectionTest.java:453:49:453:56 | source(...) : String | Log4jJndiInjectionTest.java:453:40:453:56 | (...)... | | Log4jJndiInjectionTest.java:454:49:454:56 | source(...) : String | Log4jJndiInjectionTest.java:454:40:454:56 | (...)... | -| Log4jJndiInjectionTest.java:455:55:455:77 | {...} [[]] : String | Log4jJndiInjectionTest.java:455:55:455:77 | new Object[] | -| Log4jJndiInjectionTest.java:455:69:455:76 | source(...) : String | Log4jJndiInjectionTest.java:455:55:455:77 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:455:55:455:77 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:455:55:455:77 | new Object[] | +| Log4jJndiInjectionTest.java:455:69:455:76 | source(...) : String | Log4jJndiInjectionTest.java:455:55:455:77 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:456:64:456:71 | source(...) : String | Log4jJndiInjectionTest.java:456:55:456:71 | (...)... | | Log4jJndiInjectionTest.java:457:49:457:56 | source(...) : String | Log4jJndiInjectionTest.java:457:40:457:56 | (...)... | | Log4jJndiInjectionTest.java:458:79:458:86 | source(...) : String | Log4jJndiInjectionTest.java:458:70:458:86 | (...)... | @@ -1531,8 +1531,8 @@ edges | Log4jJndiInjectionTest.java:518:35:518:42 | source(...) : String | Log4jJndiInjectionTest.java:518:25:518:42 | (...)... | | Log4jJndiInjectionTest.java:521:34:521:41 | source(...) : String | Log4jJndiInjectionTest.java:521:25:521:41 | (...)... | | Log4jJndiInjectionTest.java:522:34:522:41 | source(...) : String | Log4jJndiInjectionTest.java:522:25:522:41 | (...)... | -| Log4jJndiInjectionTest.java:523:40:523:62 | {...} [[]] : String | Log4jJndiInjectionTest.java:523:40:523:62 | new Object[] | -| Log4jJndiInjectionTest.java:523:54:523:61 | source(...) : String | Log4jJndiInjectionTest.java:523:40:523:62 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:523:40:523:62 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:523:40:523:62 | new Object[] | +| Log4jJndiInjectionTest.java:523:54:523:61 | source(...) : String | Log4jJndiInjectionTest.java:523:40:523:62 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:524:49:524:56 | source(...) : String | Log4jJndiInjectionTest.java:524:40:524:56 | (...)... | | Log4jJndiInjectionTest.java:525:34:525:41 | source(...) : String | Log4jJndiInjectionTest.java:525:25:525:41 | (...)... | | Log4jJndiInjectionTest.java:526:64:526:71 | source(...) : String | Log4jJndiInjectionTest.java:526:55:526:71 | (...)... | @@ -1601,8 +1601,8 @@ edges | Log4jJndiInjectionTest.java:589:71:589:78 | source(...) : String | Log4jJndiInjectionTest.java:589:53:589:78 | (...)... | | Log4jJndiInjectionTest.java:591:62:591:69 | source(...) : String | Log4jJndiInjectionTest.java:591:53:591:69 | (...)... | | Log4jJndiInjectionTest.java:592:62:592:69 | source(...) : String | Log4jJndiInjectionTest.java:592:53:592:69 | (...)... | -| Log4jJndiInjectionTest.java:593:68:593:90 | {...} [[]] : String | Log4jJndiInjectionTest.java:593:68:593:90 | new Object[] | -| Log4jJndiInjectionTest.java:593:82:593:89 | source(...) : String | Log4jJndiInjectionTest.java:593:68:593:90 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:593:68:593:90 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:593:68:593:90 | new Object[] | +| Log4jJndiInjectionTest.java:593:82:593:89 | source(...) : String | Log4jJndiInjectionTest.java:593:68:593:90 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:594:77:594:84 | source(...) : String | Log4jJndiInjectionTest.java:594:68:594:84 | (...)... | | Log4jJndiInjectionTest.java:595:62:595:69 | source(...) : String | Log4jJndiInjectionTest.java:595:53:595:69 | (...)... | | Log4jJndiInjectionTest.java:596:92:596:99 | source(...) : String | Log4jJndiInjectionTest.java:596:83:596:99 | (...)... | @@ -1668,8 +1668,8 @@ edges | Log4jJndiInjectionTest.java:656:48:656:55 | source(...) : String | Log4jJndiInjectionTest.java:656:38:656:55 | (...)... | | Log4jJndiInjectionTest.java:659:47:659:54 | source(...) : String | Log4jJndiInjectionTest.java:659:38:659:54 | (...)... | | Log4jJndiInjectionTest.java:660:47:660:54 | source(...) : String | Log4jJndiInjectionTest.java:660:38:660:54 | (...)... | -| Log4jJndiInjectionTest.java:661:53:661:75 | {...} [[]] : String | Log4jJndiInjectionTest.java:661:53:661:75 | new Object[] | -| Log4jJndiInjectionTest.java:661:67:661:74 | source(...) : String | Log4jJndiInjectionTest.java:661:53:661:75 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:661:53:661:75 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:661:53:661:75 | new Object[] | +| Log4jJndiInjectionTest.java:661:67:661:74 | source(...) : String | Log4jJndiInjectionTest.java:661:53:661:75 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:662:62:662:69 | source(...) : String | Log4jJndiInjectionTest.java:662:53:662:69 | (...)... | | Log4jJndiInjectionTest.java:663:47:663:54 | source(...) : String | Log4jJndiInjectionTest.java:663:38:663:54 | (...)... | | Log4jJndiInjectionTest.java:664:77:664:84 | source(...) : String | Log4jJndiInjectionTest.java:664:68:664:84 | (...)... | @@ -1738,8 +1738,8 @@ edges | Log4jJndiInjectionTest.java:727:59:727:66 | source(...) : String | Log4jJndiInjectionTest.java:727:41:727:66 | (...)... | | Log4jJndiInjectionTest.java:729:50:729:57 | source(...) : String | Log4jJndiInjectionTest.java:729:41:729:57 | (...)... | | Log4jJndiInjectionTest.java:730:50:730:57 | source(...) : String | Log4jJndiInjectionTest.java:730:41:730:57 | (...)... | -| Log4jJndiInjectionTest.java:731:56:731:78 | {...} [[]] : String | Log4jJndiInjectionTest.java:731:56:731:78 | new Object[] | -| Log4jJndiInjectionTest.java:731:70:731:77 | source(...) : String | Log4jJndiInjectionTest.java:731:56:731:78 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:731:56:731:78 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:731:56:731:78 | new Object[] | +| Log4jJndiInjectionTest.java:731:70:731:77 | source(...) : String | Log4jJndiInjectionTest.java:731:56:731:78 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:732:65:732:72 | source(...) : String | Log4jJndiInjectionTest.java:732:56:732:72 | (...)... | | Log4jJndiInjectionTest.java:733:50:733:57 | source(...) : String | Log4jJndiInjectionTest.java:733:41:733:57 | (...)... | | Log4jJndiInjectionTest.java:734:80:734:87 | source(...) : String | Log4jJndiInjectionTest.java:734:71:734:87 | (...)... | @@ -1805,8 +1805,8 @@ edges | Log4jJndiInjectionTest.java:794:36:794:43 | source(...) : String | Log4jJndiInjectionTest.java:794:26:794:43 | (...)... | | Log4jJndiInjectionTest.java:797:35:797:42 | source(...) : String | Log4jJndiInjectionTest.java:797:26:797:42 | (...)... | | Log4jJndiInjectionTest.java:798:35:798:42 | source(...) : String | Log4jJndiInjectionTest.java:798:26:798:42 | (...)... | -| Log4jJndiInjectionTest.java:799:41:799:63 | {...} [[]] : String | Log4jJndiInjectionTest.java:799:41:799:63 | new Object[] | -| Log4jJndiInjectionTest.java:799:55:799:62 | source(...) : String | Log4jJndiInjectionTest.java:799:41:799:63 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:799:41:799:63 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:799:41:799:63 | new Object[] | +| Log4jJndiInjectionTest.java:799:55:799:62 | source(...) : String | Log4jJndiInjectionTest.java:799:41:799:63 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:800:50:800:57 | source(...) : String | Log4jJndiInjectionTest.java:800:41:800:57 | (...)... | | Log4jJndiInjectionTest.java:801:35:801:42 | source(...) : String | Log4jJndiInjectionTest.java:801:26:801:42 | (...)... | | Log4jJndiInjectionTest.java:802:65:802:72 | source(...) : String | Log4jJndiInjectionTest.java:802:56:802:72 | (...)... | @@ -1875,8 +1875,8 @@ edges | Log4jJndiInjectionTest.java:865:58:865:65 | source(...) : String | Log4jJndiInjectionTest.java:865:40:865:65 | (...)... | | Log4jJndiInjectionTest.java:867:49:867:56 | source(...) : String | Log4jJndiInjectionTest.java:867:40:867:56 | (...)... | | Log4jJndiInjectionTest.java:868:49:868:56 | source(...) : String | Log4jJndiInjectionTest.java:868:40:868:56 | (...)... | -| Log4jJndiInjectionTest.java:869:55:869:77 | {...} [[]] : String | Log4jJndiInjectionTest.java:869:55:869:77 | new Object[] | -| Log4jJndiInjectionTest.java:869:69:869:76 | source(...) : String | Log4jJndiInjectionTest.java:869:55:869:77 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:869:55:869:77 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:869:55:869:77 | new Object[] | +| Log4jJndiInjectionTest.java:869:69:869:76 | source(...) : String | Log4jJndiInjectionTest.java:869:55:869:77 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:870:64:870:71 | source(...) : String | Log4jJndiInjectionTest.java:870:55:870:71 | (...)... | | Log4jJndiInjectionTest.java:871:49:871:56 | source(...) : String | Log4jJndiInjectionTest.java:871:40:871:56 | (...)... | | Log4jJndiInjectionTest.java:872:79:872:86 | source(...) : String | Log4jJndiInjectionTest.java:872:70:872:86 | (...)... | @@ -1942,8 +1942,8 @@ edges | Log4jJndiInjectionTest.java:932:35:932:42 | source(...) : String | Log4jJndiInjectionTest.java:932:25:932:42 | (...)... | | Log4jJndiInjectionTest.java:935:34:935:41 | source(...) : String | Log4jJndiInjectionTest.java:935:25:935:41 | (...)... | | Log4jJndiInjectionTest.java:936:34:936:41 | source(...) : String | Log4jJndiInjectionTest.java:936:25:936:41 | (...)... | -| Log4jJndiInjectionTest.java:937:40:937:62 | {...} [[]] : String | Log4jJndiInjectionTest.java:937:40:937:62 | new Object[] | -| Log4jJndiInjectionTest.java:937:54:937:61 | source(...) : String | Log4jJndiInjectionTest.java:937:40:937:62 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:937:40:937:62 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:937:40:937:62 | new Object[] | +| Log4jJndiInjectionTest.java:937:54:937:61 | source(...) : String | Log4jJndiInjectionTest.java:937:40:937:62 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:938:49:938:56 | source(...) : String | Log4jJndiInjectionTest.java:938:40:938:56 | (...)... | | Log4jJndiInjectionTest.java:939:34:939:41 | source(...) : String | Log4jJndiInjectionTest.java:939:25:939:41 | (...)... | | Log4jJndiInjectionTest.java:940:64:940:71 | source(...) : String | Log4jJndiInjectionTest.java:940:55:940:71 | (...)... | @@ -2005,17 +2005,17 @@ edges | Log4jJndiInjectionTest.java:996:39:996:46 | source(...) : String | Log4jJndiInjectionTest.java:996:25:996:46 | (...)... | | Log4jJndiInjectionTest.java:998:65:998:72 | source(...) : String | Log4jJndiInjectionTest.java:998:55:998:72 | (...)... | | Log4jJndiInjectionTest.java:999:48:999:55 | source(...) : String | Log4jJndiInjectionTest.java:999:39:999:55 | (...)... | -| Log4jJndiInjectionTest.java:1000:45:1000:67 | {...} [[]] : String | Log4jJndiInjectionTest.java:1000:45:1000:67 | new Object[] | -| Log4jJndiInjectionTest.java:1000:59:1000:66 | source(...) : String | Log4jJndiInjectionTest.java:1000:45:1000:67 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:1000:45:1000:67 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:1000:45:1000:67 | new Object[] | +| Log4jJndiInjectionTest.java:1000:59:1000:66 | source(...) : String | Log4jJndiInjectionTest.java:1000:45:1000:67 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:1001:42:1001:49 | source(...) : String | Log4jJndiInjectionTest.java:1001:33:1001:49 | (...)... | -| Log4jJndiInjectionTest.java:1002:39:1002:61 | {...} [[]] : String | Log4jJndiInjectionTest.java:1002:39:1002:61 | new Object[] | -| Log4jJndiInjectionTest.java:1002:53:1002:60 | source(...) : String | Log4jJndiInjectionTest.java:1002:39:1002:61 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:1002:39:1002:61 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:1002:39:1002:61 | new Object[] | +| Log4jJndiInjectionTest.java:1002:53:1002:60 | source(...) : String | Log4jJndiInjectionTest.java:1002:39:1002:61 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:1020:40:1020:47 | source(...) : String | Log4jJndiInjectionTest.java:1020:25:1020:47 | (...)... | | Log4jJndiInjectionTest.java:1021:35:1021:42 | source(...) : String | Log4jJndiInjectionTest.java:1021:25:1021:42 | (...)... | | Log4jJndiInjectionTest.java:1023:34:1023:41 | source(...) : String | Log4jJndiInjectionTest.java:1023:25:1023:41 | (...)... | | Log4jJndiInjectionTest.java:1024:34:1024:41 | source(...) : String | Log4jJndiInjectionTest.java:1024:25:1024:41 | (...)... | -| Log4jJndiInjectionTest.java:1025:40:1025:62 | {...} [[]] : String | Log4jJndiInjectionTest.java:1025:40:1025:62 | new Object[] | -| Log4jJndiInjectionTest.java:1025:54:1025:61 | source(...) : String | Log4jJndiInjectionTest.java:1025:40:1025:62 | {...} [[]] : String | +| Log4jJndiInjectionTest.java:1025:40:1025:62 | {...} : Object[] [[]] : String | Log4jJndiInjectionTest.java:1025:40:1025:62 | new Object[] | +| Log4jJndiInjectionTest.java:1025:54:1025:61 | source(...) : String | Log4jJndiInjectionTest.java:1025:40:1025:62 | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:1028:49:1028:56 | source(...) : String | Log4jJndiInjectionTest.java:1028:40:1028:56 | (...)... | | Log4jJndiInjectionTest.java:1029:34:1029:41 | source(...) : String | Log4jJndiInjectionTest.java:1029:25:1029:41 | (...)... | | Log4jJndiInjectionTest.java:1030:64:1030:71 | source(...) : String | Log4jJndiInjectionTest.java:1030:55:1030:71 | (...)... | @@ -2075,8 +2075,8 @@ edges | Log4jJndiInjectionTest.java:1085:39:1085:46 | source(...) : String | Log4jJndiInjectionTest.java:1085:25:1085:46 | (...)... | | Log4jJndiInjectionTest.java:1088:47:1088:54 | source(...) : String | Log4jJndiInjectionTest.java:1088:38:1088:54 | (...)... | | Log4jJndiInjectionTest.java:1089:53:1089:60 | source(...) : String | Log4jJndiInjectionTest.java:1089:44:1089:60 | (...)... | -| Log4jJndiInjectionTest.java:1091:13:1091:15 | map [post update] [] : String | Log4jJndiInjectionTest.java:1092:34:1092:36 | map | -| Log4jJndiInjectionTest.java:1091:28:1091:44 | (...)... : String | Log4jJndiInjectionTest.java:1091:13:1091:15 | map [post update] [] : String | +| Log4jJndiInjectionTest.java:1091:13:1091:15 | map [post update] : Map [] : String | Log4jJndiInjectionTest.java:1092:34:1092:36 | map | +| Log4jJndiInjectionTest.java:1091:28:1091:44 | (...)... : String | Log4jJndiInjectionTest.java:1091:13:1091:15 | map [post update] : Map [] : String | | Log4jJndiInjectionTest.java:1091:37:1091:44 | source(...) : String | Log4jJndiInjectionTest.java:1091:28:1091:44 | (...)... : String | | Log4jJndiInjectionTest.java:1095:31:1095:88 | with(...) : MapMessage | Log4jJndiInjectionTest.java:1096:26:1096:29 | mmsg | | Log4jJndiInjectionTest.java:1095:71:1095:87 | (...)... : String | Log4jJndiInjectionTest.java:1095:31:1095:88 | with(...) : MapMessage | @@ -2087,16 +2087,16 @@ edges | Log4jJndiInjectionTest.java:1105:13:1105:16 | mmsg [post update] : MapMessage | Log4jJndiInjectionTest.java:1106:26:1106:29 | mmsg | | Log4jJndiInjectionTest.java:1105:34:1105:50 | (...)... : String | Log4jJndiInjectionTest.java:1105:13:1105:16 | mmsg [post update] : MapMessage | | Log4jJndiInjectionTest.java:1105:43:1105:50 | source(...) : String | Log4jJndiInjectionTest.java:1105:34:1105:50 | (...)... : String | -| Log4jJndiInjectionTest.java:1111:13:1111:15 | map [post update] [] : String | Log4jJndiInjectionTest.java:1112:25:1112:27 | map [] : String | -| Log4jJndiInjectionTest.java:1111:33:1111:49 | (...)... : String | Log4jJndiInjectionTest.java:1111:13:1111:15 | map [post update] [] : String | +| Log4jJndiInjectionTest.java:1111:13:1111:15 | map [post update] : Map [] : String | Log4jJndiInjectionTest.java:1112:25:1112:27 | map : Map [] : String | +| Log4jJndiInjectionTest.java:1111:33:1111:49 | (...)... : String | Log4jJndiInjectionTest.java:1111:13:1111:15 | map [post update] : Map [] : String | | Log4jJndiInjectionTest.java:1111:42:1111:49 | source(...) : String | Log4jJndiInjectionTest.java:1111:33:1111:49 | (...)... : String | | Log4jJndiInjectionTest.java:1112:13:1112:16 | mmsg [post update] : MapMessage | Log4jJndiInjectionTest.java:1113:26:1113:29 | mmsg | -| Log4jJndiInjectionTest.java:1112:25:1112:27 | map [] : String | Log4jJndiInjectionTest.java:1112:13:1112:16 | mmsg [post update] : MapMessage | +| Log4jJndiInjectionTest.java:1112:25:1112:27 | map : Map [] : String | Log4jJndiInjectionTest.java:1112:13:1112:16 | mmsg [post update] : MapMessage | | Log4jJndiInjectionTest.java:1116:61:1116:68 | source(...) : String | Log4jJndiInjectionTest.java:1116:52:1116:68 | (...)... | | Log4jJndiInjectionTest.java:1117:81:1117:88 | source(...) : String | Log4jJndiInjectionTest.java:1117:72:1117:88 | (...)... | -| Log4jJndiInjectionTest.java:1119:13:1119:15 | map [post update] [] : String | Log4jJndiInjectionTest.java:1120:43:1120:45 | map | -| Log4jJndiInjectionTest.java:1119:13:1119:15 | map [post update] [] : String | Log4jJndiInjectionTest.java:1121:63:1121:65 | map | -| Log4jJndiInjectionTest.java:1119:33:1119:49 | (...)... : String | Log4jJndiInjectionTest.java:1119:13:1119:15 | map [post update] [] : String | +| Log4jJndiInjectionTest.java:1119:13:1119:15 | map [post update] : Map [] : String | Log4jJndiInjectionTest.java:1120:43:1120:45 | map | +| Log4jJndiInjectionTest.java:1119:13:1119:15 | map [post update] : Map [] : String | Log4jJndiInjectionTest.java:1121:63:1121:65 | map | +| Log4jJndiInjectionTest.java:1119:33:1119:49 | (...)... : String | Log4jJndiInjectionTest.java:1119:13:1119:15 | map [post update] : Map [] : String | | Log4jJndiInjectionTest.java:1119:42:1119:49 | source(...) : String | Log4jJndiInjectionTest.java:1119:33:1119:49 | (...)... : String | nodes | Log4jJndiInjectionTest.java:24:16:24:45 | getParameter(...) : String | semmle.label | getParameter(...) : String | @@ -2120,7 +2120,7 @@ nodes | Log4jJndiInjectionTest.java:40:41:40:57 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:40:50:40:57 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:41:56:41:78 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:41:56:41:78 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:41:56:41:78 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:41:70:41:77 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:42:56:42:72 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:42:65:42:72 | source(...) : String | semmle.label | source(...) : String | @@ -2255,7 +2255,7 @@ nodes | Log4jJndiInjectionTest.java:108:26:108:42 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:108:35:108:42 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:109:41:109:63 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:109:41:109:63 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:109:41:109:63 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:109:55:109:62 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:110:41:110:57 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:110:50:110:57 | source(...) : String | semmle.label | source(...) : String | @@ -2395,7 +2395,7 @@ nodes | Log4jJndiInjectionTest.java:178:41:178:57 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:178:50:178:57 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:179:56:179:78 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:179:56:179:78 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:179:56:179:78 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:179:70:179:77 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:180:56:180:72 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:180:65:180:72 | source(...) : String | semmle.label | source(...) : String | @@ -2530,7 +2530,7 @@ nodes | Log4jJndiInjectionTest.java:246:26:246:42 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:246:35:246:42 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:247:41:247:63 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:247:41:247:63 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:247:41:247:63 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:247:55:247:62 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:248:41:248:57 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:248:50:248:57 | source(...) : String | semmle.label | source(...) : String | @@ -2670,7 +2670,7 @@ nodes | Log4jJndiInjectionTest.java:316:41:316:57 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:316:50:316:57 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:317:56:317:78 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:317:56:317:78 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:317:56:317:78 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:317:70:317:77 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:318:56:318:72 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:318:65:318:72 | source(...) : String | semmle.label | source(...) : String | @@ -2805,7 +2805,7 @@ nodes | Log4jJndiInjectionTest.java:384:26:384:42 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:384:35:384:42 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:385:41:385:63 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:385:41:385:63 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:385:41:385:63 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:385:55:385:62 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:386:41:386:57 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:386:50:386:57 | source(...) : String | semmle.label | source(...) : String | @@ -2945,7 +2945,7 @@ nodes | Log4jJndiInjectionTest.java:454:40:454:56 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:454:49:454:56 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:455:55:455:77 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:455:55:455:77 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:455:55:455:77 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:455:69:455:76 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:456:55:456:71 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:456:64:456:71 | source(...) : String | semmle.label | source(...) : String | @@ -3080,7 +3080,7 @@ nodes | Log4jJndiInjectionTest.java:522:25:522:41 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:522:34:522:41 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:523:40:523:62 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:523:40:523:62 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:523:40:523:62 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:523:54:523:61 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:524:40:524:56 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:524:49:524:56 | source(...) : String | semmle.label | source(...) : String | @@ -3220,7 +3220,7 @@ nodes | Log4jJndiInjectionTest.java:592:53:592:69 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:592:62:592:69 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:593:68:593:90 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:593:68:593:90 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:593:68:593:90 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:593:82:593:89 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:594:68:594:84 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:594:77:594:84 | source(...) : String | semmle.label | source(...) : String | @@ -3355,7 +3355,7 @@ nodes | Log4jJndiInjectionTest.java:660:38:660:54 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:660:47:660:54 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:661:53:661:75 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:661:53:661:75 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:661:53:661:75 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:661:67:661:74 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:662:53:662:69 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:662:62:662:69 | source(...) : String | semmle.label | source(...) : String | @@ -3495,7 +3495,7 @@ nodes | Log4jJndiInjectionTest.java:730:41:730:57 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:730:50:730:57 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:731:56:731:78 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:731:56:731:78 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:731:56:731:78 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:731:70:731:77 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:732:56:732:72 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:732:65:732:72 | source(...) : String | semmle.label | source(...) : String | @@ -3630,7 +3630,7 @@ nodes | Log4jJndiInjectionTest.java:798:26:798:42 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:798:35:798:42 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:799:41:799:63 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:799:41:799:63 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:799:41:799:63 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:799:55:799:62 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:800:41:800:57 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:800:50:800:57 | source(...) : String | semmle.label | source(...) : String | @@ -3770,7 +3770,7 @@ nodes | Log4jJndiInjectionTest.java:868:40:868:56 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:868:49:868:56 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:869:55:869:77 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:869:55:869:77 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:869:55:869:77 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:869:69:869:76 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:870:55:870:71 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:870:64:870:71 | source(...) : String | semmle.label | source(...) : String | @@ -3905,7 +3905,7 @@ nodes | Log4jJndiInjectionTest.java:936:25:936:41 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:936:34:936:41 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:937:40:937:62 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:937:40:937:62 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:937:40:937:62 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:937:54:937:61 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:938:40:938:56 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:938:49:938:56 | source(...) : String | semmle.label | source(...) : String | @@ -4030,12 +4030,12 @@ nodes | Log4jJndiInjectionTest.java:999:39:999:55 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:999:48:999:55 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1000:45:1000:67 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:1000:45:1000:67 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:1000:45:1000:67 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:1000:59:1000:66 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1001:33:1001:49 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:1001:42:1001:49 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1002:39:1002:61 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:1002:39:1002:61 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:1002:39:1002:61 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:1002:53:1002:60 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1020:25:1020:47 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:1020:40:1020:47 | source(...) : String | semmle.label | source(...) : String | @@ -4047,7 +4047,7 @@ nodes | Log4jJndiInjectionTest.java:1024:25:1024:41 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:1024:34:1024:41 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1025:40:1025:62 | new Object[] | semmle.label | new Object[] | -| Log4jJndiInjectionTest.java:1025:40:1025:62 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Log4jJndiInjectionTest.java:1025:40:1025:62 | {...} : Object[] [[]] : String | semmle.label | {...} : Object[] [[]] : String | | Log4jJndiInjectionTest.java:1025:54:1025:61 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1026:40:1026:47 | source(...) | semmle.label | source(...) | | Log4jJndiInjectionTest.java:1028:40:1028:56 | (...)... | semmle.label | (...)... | @@ -4168,7 +4168,7 @@ nodes | Log4jJndiInjectionTest.java:1088:47:1088:54 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1089:44:1089:60 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:1089:53:1089:60 | source(...) : String | semmle.label | source(...) : String | -| Log4jJndiInjectionTest.java:1091:13:1091:15 | map [post update] [] : String | semmle.label | map [post update] [] : String | +| Log4jJndiInjectionTest.java:1091:13:1091:15 | map [post update] : Map [] : String | semmle.label | map [post update] : Map [] : String | | Log4jJndiInjectionTest.java:1091:28:1091:44 | (...)... : String | semmle.label | (...)... : String | | Log4jJndiInjectionTest.java:1091:37:1091:44 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1092:34:1092:36 | map | semmle.label | map | @@ -4184,17 +4184,17 @@ nodes | Log4jJndiInjectionTest.java:1105:34:1105:50 | (...)... : String | semmle.label | (...)... : String | | Log4jJndiInjectionTest.java:1105:43:1105:50 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1106:26:1106:29 | mmsg | semmle.label | mmsg | -| Log4jJndiInjectionTest.java:1111:13:1111:15 | map [post update] [] : String | semmle.label | map [post update] [] : String | +| Log4jJndiInjectionTest.java:1111:13:1111:15 | map [post update] : Map [] : String | semmle.label | map [post update] : Map [] : String | | Log4jJndiInjectionTest.java:1111:33:1111:49 | (...)... : String | semmle.label | (...)... : String | | Log4jJndiInjectionTest.java:1111:42:1111:49 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1112:13:1112:16 | mmsg [post update] : MapMessage | semmle.label | mmsg [post update] : MapMessage | -| Log4jJndiInjectionTest.java:1112:25:1112:27 | map [] : String | semmle.label | map [] : String | +| Log4jJndiInjectionTest.java:1112:25:1112:27 | map : Map [] : String | semmle.label | map : Map [] : String | | Log4jJndiInjectionTest.java:1113:26:1113:29 | mmsg | semmle.label | mmsg | | Log4jJndiInjectionTest.java:1116:52:1116:68 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:1116:61:1116:68 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1117:72:1117:88 | (...)... | semmle.label | (...)... | | Log4jJndiInjectionTest.java:1117:81:1117:88 | source(...) : String | semmle.label | source(...) : String | -| Log4jJndiInjectionTest.java:1119:13:1119:15 | map [post update] [] : String | semmle.label | map [post update] [] : String | +| Log4jJndiInjectionTest.java:1119:13:1119:15 | map [post update] : Map [] : String | semmle.label | map [post update] : Map [] : String | | Log4jJndiInjectionTest.java:1119:33:1119:49 | (...)... : String | semmle.label | (...)... : String | | Log4jJndiInjectionTest.java:1119:42:1119:49 | source(...) : String | semmle.label | source(...) : String | | Log4jJndiInjectionTest.java:1120:43:1120:45 | map | semmle.label | map | diff --git a/java/ql/test/experimental/query-tests/security/CWE-089/src/main/MyBatisAnnotationSqlInjection.expected b/java/ql/test/experimental/query-tests/security/CWE-089/src/main/MyBatisAnnotationSqlInjection.expected index dd3f886ccb1..1c5ba31a97f 100644 --- a/java/ql/test/experimental/query-tests/security/CWE-089/src/main/MyBatisAnnotationSqlInjection.expected +++ b/java/ql/test/experimental/query-tests/security/CWE-089/src/main/MyBatisAnnotationSqlInjection.expected @@ -10,8 +10,8 @@ edges | MybatisSqlInjection.java:109:46:109:70 | name : String | MybatisSqlInjection.java:110:40:110:43 | name : String | | MybatisSqlInjection.java:110:40:110:43 | name : String | MybatisSqlInjectionService.java:88:32:88:42 | name : String | | MybatisSqlInjectionService.java:48:19:48:29 | name : String | MybatisSqlInjectionService.java:50:23:50:26 | name : String | -| MybatisSqlInjectionService.java:50:3:50:9 | hashMap [post update] [] : String | MybatisSqlInjectionService.java:51:27:51:33 | hashMap | -| MybatisSqlInjectionService.java:50:23:50:26 | name : String | MybatisSqlInjectionService.java:50:3:50:9 | hashMap [post update] [] : String | +| MybatisSqlInjectionService.java:50:3:50:9 | hashMap [post update] : HashMap [] : String | MybatisSqlInjectionService.java:51:27:51:33 | hashMap | +| MybatisSqlInjectionService.java:50:23:50:26 | name : String | MybatisSqlInjectionService.java:50:3:50:9 | hashMap [post update] : HashMap [] : String | | MybatisSqlInjectionService.java:54:32:54:42 | name : String | MybatisSqlInjectionService.java:55:32:55:35 | name | | MybatisSqlInjectionService.java:80:20:80:30 | name : String | MybatisSqlInjectionService.java:81:28:81:31 | name | | MybatisSqlInjectionService.java:84:20:84:29 | age : String | MybatisSqlInjectionService.java:85:28:85:30 | age | @@ -28,7 +28,7 @@ nodes | MybatisSqlInjection.java:109:46:109:70 | name : String | semmle.label | name : String | | MybatisSqlInjection.java:110:40:110:43 | name : String | semmle.label | name : String | | MybatisSqlInjectionService.java:48:19:48:29 | name : String | semmle.label | name : String | -| MybatisSqlInjectionService.java:50:3:50:9 | hashMap [post update] [] : String | semmle.label | hashMap [post update] [] : String | +| MybatisSqlInjectionService.java:50:3:50:9 | hashMap [post update] : HashMap [] : String | semmle.label | hashMap [post update] : HashMap [] : String | | MybatisSqlInjectionService.java:50:23:50:26 | name : String | semmle.label | name : String | | MybatisSqlInjectionService.java:51:27:51:33 | hashMap | semmle.label | hashMap | | MybatisSqlInjectionService.java:54:32:54:42 | name : String | semmle.label | name : String | diff --git a/java/ql/test/experimental/query-tests/security/CWE-200/SensitiveAndroidFileLeak.expected b/java/ql/test/experimental/query-tests/security/CWE-200/SensitiveAndroidFileLeak.expected index b67c634ad9f..43a64e4226a 100644 --- a/java/ql/test/experimental/query-tests/security/CWE-200/SensitiveAndroidFileLeak.expected +++ b/java/ql/test/experimental/query-tests/security/CWE-200/SensitiveAndroidFileLeak.expected @@ -3,12 +3,12 @@ edges | FileService.java:21:28:21:33 | intent : Intent | FileService.java:21:28:21:64 | getStringExtra(...) : Object | | FileService.java:21:28:21:64 | getStringExtra(...) : Object | FileService.java:25:42:25:50 | localPath : Object | | FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] | FileService.java:40:41:40:55 | params : Object[] | -| FileService.java:25:13:25:51 | makeParamsToExecute(...) [[]] : Object | FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] | -| FileService.java:25:42:25:50 | localPath : Object | FileService.java:25:13:25:51 | makeParamsToExecute(...) [[]] : Object | +| FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] [[]] : Object | FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] | +| FileService.java:25:42:25:50 | localPath : Object | FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] [[]] : Object | | FileService.java:25:42:25:50 | localPath : Object | FileService.java:32:13:32:28 | sourceUri : Object | | FileService.java:32:13:32:28 | sourceUri : Object | FileService.java:35:17:35:25 | sourceUri : Object | -| FileService.java:34:20:36:13 | {...} [[]] : Object | FileService.java:34:20:36:13 | new Object[] [[]] : Object | -| FileService.java:35:17:35:25 | sourceUri : Object | FileService.java:34:20:36:13 | {...} [[]] : Object | +| FileService.java:34:20:36:13 | {...} : Object[] [[]] : Object | FileService.java:34:20:36:13 | new Object[] : Object[] [[]] : Object | +| FileService.java:35:17:35:25 | sourceUri : Object | FileService.java:34:20:36:13 | {...} : Object[] [[]] : Object | | FileService.java:40:41:40:55 | params : Object[] | FileService.java:44:33:44:52 | (...)... : Object | | FileService.java:44:33:44:52 | (...)... : Object | FileService.java:45:53:45:59 | ...[...] | | LeakFileActivity2.java:15:13:15:18 | intent : Intent | LeakFileActivity2.java:16:26:16:31 | intent : Intent | @@ -23,11 +23,11 @@ nodes | FileService.java:21:28:21:33 | intent : Intent | semmle.label | intent : Intent | | FileService.java:21:28:21:64 | getStringExtra(...) : Object | semmle.label | getStringExtra(...) : Object | | FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] | semmle.label | makeParamsToExecute(...) : Object[] | -| FileService.java:25:13:25:51 | makeParamsToExecute(...) [[]] : Object | semmle.label | makeParamsToExecute(...) [[]] : Object | +| FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] [[]] : Object | semmle.label | makeParamsToExecute(...) : Object[] [[]] : Object | | FileService.java:25:42:25:50 | localPath : Object | semmle.label | localPath : Object | | FileService.java:32:13:32:28 | sourceUri : Object | semmle.label | sourceUri : Object | -| FileService.java:34:20:36:13 | new Object[] [[]] : Object | semmle.label | new Object[] [[]] : Object | -| FileService.java:34:20:36:13 | {...} [[]] : Object | semmle.label | {...} [[]] : Object | +| FileService.java:34:20:36:13 | new Object[] : Object[] [[]] : Object | semmle.label | new Object[] : Object[] [[]] : Object | +| FileService.java:34:20:36:13 | {...} : Object[] [[]] : Object | semmle.label | {...} : Object[] [[]] : Object | | FileService.java:35:17:35:25 | sourceUri : Object | semmle.label | sourceUri : Object | | FileService.java:40:41:40:55 | params : Object[] | semmle.label | params : Object[] | | FileService.java:44:33:44:52 | (...)... : Object | semmle.label | (...)... : Object | @@ -41,7 +41,7 @@ nodes | LeakFileActivity.java:21:58:21:72 | streamsToUpload : Object | semmle.label | streamsToUpload : Object | | LeakFileActivity.java:21:58:21:82 | getPath(...) | semmle.label | getPath(...) | subpaths -| FileService.java:25:42:25:50 | localPath : Object | FileService.java:32:13:32:28 | sourceUri : Object | FileService.java:34:20:36:13 | new Object[] [[]] : Object | FileService.java:25:13:25:51 | makeParamsToExecute(...) [[]] : Object | +| FileService.java:25:42:25:50 | localPath : Object | FileService.java:32:13:32:28 | sourceUri : Object | FileService.java:34:20:36:13 | new Object[] : Object[] [[]] : Object | FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] [[]] : Object | #select | FileService.java:45:53:45:59 | ...[...] | LeakFileActivity2.java:15:13:15:18 | intent : Intent | FileService.java:45:53:45:59 | ...[...] | Leaking arbitrary Android file from $@. | LeakFileActivity2.java:15:13:15:18 | intent | this user input | | FileService.java:45:53:45:59 | ...[...] | LeakFileActivity2.java:16:26:16:31 | intent : Intent | FileService.java:45:53:45:59 | ...[...] | Leaking arbitrary Android file from $@. | LeakFileActivity2.java:16:26:16:31 | intent | this user input | diff --git a/java/ql/test/experimental/query-tests/security/CWE-299/DisabledRevocationChecking.expected b/java/ql/test/experimental/query-tests/security/CWE-299/DisabledRevocationChecking.expected index fbb01566a18..ab68d9578b4 100644 --- a/java/ql/test/experimental/query-tests/security/CWE-299/DisabledRevocationChecking.expected +++ b/java/ql/test/experimental/query-tests/security/CWE-299/DisabledRevocationChecking.expected @@ -1,18 +1,18 @@ edges -| DisabledRevocationChecking.java:17:5:17:8 | this <.field> [post update] [flag] : Boolean | DisabledRevocationChecking.java:21:5:21:31 | this <.method> [post update] [flag] : Boolean | -| DisabledRevocationChecking.java:17:12:17:16 | false : Boolean | DisabledRevocationChecking.java:17:5:17:8 | this <.field> [post update] [flag] : Boolean | -| DisabledRevocationChecking.java:21:5:21:31 | this <.method> [post update] [flag] : Boolean | DisabledRevocationChecking.java:22:5:22:31 | this <.method> [flag] : Boolean | -| DisabledRevocationChecking.java:22:5:22:31 | this <.method> [flag] : Boolean | DisabledRevocationChecking.java:25:15:25:22 | parameter this [flag] : Boolean | -| DisabledRevocationChecking.java:25:15:25:22 | parameter this [flag] : Boolean | DisabledRevocationChecking.java:28:33:28:36 | this <.field> [flag] : Boolean | -| DisabledRevocationChecking.java:28:33:28:36 | this <.field> [flag] : Boolean | DisabledRevocationChecking.java:28:33:28:36 | flag | +| DisabledRevocationChecking.java:17:5:17:8 | this <.field> [post update] : DisabledRevocationChecking [flag] : Boolean | DisabledRevocationChecking.java:21:5:21:31 | this <.method> [post update] : DisabledRevocationChecking [flag] : Boolean | +| DisabledRevocationChecking.java:17:12:17:16 | false : Boolean | DisabledRevocationChecking.java:17:5:17:8 | this <.field> [post update] : DisabledRevocationChecking [flag] : Boolean | +| DisabledRevocationChecking.java:21:5:21:31 | this <.method> [post update] : DisabledRevocationChecking [flag] : Boolean | DisabledRevocationChecking.java:22:5:22:31 | this <.method> : DisabledRevocationChecking [flag] : Boolean | +| DisabledRevocationChecking.java:22:5:22:31 | this <.method> : DisabledRevocationChecking [flag] : Boolean | DisabledRevocationChecking.java:25:15:25:22 | parameter this : DisabledRevocationChecking [flag] : Boolean | +| DisabledRevocationChecking.java:25:15:25:22 | parameter this : DisabledRevocationChecking [flag] : Boolean | DisabledRevocationChecking.java:28:33:28:36 | this <.field> : DisabledRevocationChecking [flag] : Boolean | +| DisabledRevocationChecking.java:28:33:28:36 | this <.field> : DisabledRevocationChecking [flag] : Boolean | DisabledRevocationChecking.java:28:33:28:36 | flag | nodes -| DisabledRevocationChecking.java:17:5:17:8 | this <.field> [post update] [flag] : Boolean | semmle.label | this <.field> [post update] [flag] : Boolean | +| DisabledRevocationChecking.java:17:5:17:8 | this <.field> [post update] : DisabledRevocationChecking [flag] : Boolean | semmle.label | this <.field> [post update] : DisabledRevocationChecking [flag] : Boolean | | DisabledRevocationChecking.java:17:12:17:16 | false : Boolean | semmle.label | false : Boolean | -| DisabledRevocationChecking.java:21:5:21:31 | this <.method> [post update] [flag] : Boolean | semmle.label | this <.method> [post update] [flag] : Boolean | -| DisabledRevocationChecking.java:22:5:22:31 | this <.method> [flag] : Boolean | semmle.label | this <.method> [flag] : Boolean | -| DisabledRevocationChecking.java:25:15:25:22 | parameter this [flag] : Boolean | semmle.label | parameter this [flag] : Boolean | +| DisabledRevocationChecking.java:21:5:21:31 | this <.method> [post update] : DisabledRevocationChecking [flag] : Boolean | semmle.label | this <.method> [post update] : DisabledRevocationChecking [flag] : Boolean | +| DisabledRevocationChecking.java:22:5:22:31 | this <.method> : DisabledRevocationChecking [flag] : Boolean | semmle.label | this <.method> : DisabledRevocationChecking [flag] : Boolean | +| DisabledRevocationChecking.java:25:15:25:22 | parameter this : DisabledRevocationChecking [flag] : Boolean | semmle.label | parameter this : DisabledRevocationChecking [flag] : Boolean | | DisabledRevocationChecking.java:28:33:28:36 | flag | semmle.label | flag | -| DisabledRevocationChecking.java:28:33:28:36 | this <.field> [flag] : Boolean | semmle.label | this <.field> [flag] : Boolean | +| DisabledRevocationChecking.java:28:33:28:36 | this <.field> : DisabledRevocationChecking [flag] : Boolean | semmle.label | this <.field> : DisabledRevocationChecking [flag] : Boolean | subpaths #select | DisabledRevocationChecking.java:17:12:17:16 | false | DisabledRevocationChecking.java:17:12:17:16 | false : Boolean | DisabledRevocationChecking.java:28:33:28:36 | flag | This disables revocation checking. | diff --git a/java/ql/test/experimental/query-tests/security/CWE-327/UnsafeTlsVersion.expected b/java/ql/test/experimental/query-tests/security/CWE-327/UnsafeTlsVersion.expected index b6fc5960e2b..53315833c14 100644 --- a/java/ql/test/experimental/query-tests/security/CWE-327/UnsafeTlsVersion.expected +++ b/java/ql/test/experimental/query-tests/security/CWE-327/UnsafeTlsVersion.expected @@ -1,59 +1,59 @@ edges -| UnsafeTlsVersion.java:31:5:31:46 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:43:74:43:92 | protocols [[]] : String | -| UnsafeTlsVersion.java:31:39:31:45 | "SSLv3" : String | UnsafeTlsVersion.java:31:5:31:46 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:32:5:32:44 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:43:74:43:92 | protocols [[]] : String | -| UnsafeTlsVersion.java:32:39:32:43 | "TLS" : String | UnsafeTlsVersion.java:32:5:32:44 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:33:5:33:46 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:43:74:43:92 | protocols [[]] : String | -| UnsafeTlsVersion.java:33:39:33:45 | "TLSv1" : String | UnsafeTlsVersion.java:33:5:33:46 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:34:5:34:48 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:43:74:43:92 | protocols [[]] : String | -| UnsafeTlsVersion.java:34:39:34:47 | "TLSv1.1" : String | UnsafeTlsVersion.java:34:5:34:48 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:35:5:35:68 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:43:74:43:92 | protocols [[]] : String | -| UnsafeTlsVersion.java:35:39:35:45 | "TLSv1" : String | UnsafeTlsVersion.java:35:5:35:68 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:35:48:35:56 | "TLSv1.1" : String | UnsafeTlsVersion.java:35:5:35:68 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:43:74:43:92 | protocols [[]] : String | UnsafeTlsVersion.java:44:44:44:52 | protocols | -| UnsafeTlsVersion.java:50:38:50:61 | {...} [[]] : String | UnsafeTlsVersion.java:50:38:50:61 | new String[] | -| UnsafeTlsVersion.java:50:53:50:59 | "SSLv3" : String | UnsafeTlsVersion.java:50:38:50:61 | {...} [[]] : String | -| UnsafeTlsVersion.java:51:38:51:59 | {...} [[]] : String | UnsafeTlsVersion.java:51:38:51:59 | new String[] | -| UnsafeTlsVersion.java:51:53:51:57 | "TLS" : String | UnsafeTlsVersion.java:51:38:51:59 | {...} [[]] : String | -| UnsafeTlsVersion.java:52:38:52:61 | {...} [[]] : String | UnsafeTlsVersion.java:52:38:52:61 | new String[] | -| UnsafeTlsVersion.java:52:53:52:59 | "TLSv1" : String | UnsafeTlsVersion.java:52:38:52:61 | {...} [[]] : String | -| UnsafeTlsVersion.java:53:38:53:63 | {...} [[]] : String | UnsafeTlsVersion.java:53:38:53:63 | new String[] | -| UnsafeTlsVersion.java:53:53:53:61 | "TLSv1.1" : String | UnsafeTlsVersion.java:53:38:53:63 | {...} [[]] : String | -| UnsafeTlsVersion.java:56:29:56:65 | {...} [[]] : String | UnsafeTlsVersion.java:56:29:56:65 | new String[] | -| UnsafeTlsVersion.java:56:44:56:52 | "TLSv1.1" : String | UnsafeTlsVersion.java:56:29:56:65 | {...} [[]] : String | -| UnsafeTlsVersion.java:68:5:68:28 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:79:43:79:61 | protocols [[]] : String | -| UnsafeTlsVersion.java:68:21:68:27 | "SSLv3" : String | UnsafeTlsVersion.java:68:5:68:28 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:69:5:69:26 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:79:43:79:61 | protocols [[]] : String | -| UnsafeTlsVersion.java:69:21:69:25 | "TLS" : String | UnsafeTlsVersion.java:69:5:69:26 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:70:5:70:28 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:79:43:79:61 | protocols [[]] : String | -| UnsafeTlsVersion.java:70:21:70:27 | "TLSv1" : String | UnsafeTlsVersion.java:70:5:70:28 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:71:5:71:30 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:79:43:79:61 | protocols [[]] : String | -| UnsafeTlsVersion.java:71:21:71:29 | "TLSv1.1" : String | UnsafeTlsVersion.java:71:5:71:30 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:72:5:72:41 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:79:43:79:61 | protocols [[]] : String | -| UnsafeTlsVersion.java:72:21:72:29 | "TLSv1.1" : String | UnsafeTlsVersion.java:72:5:72:41 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:79:43:79:61 | protocols [[]] : String | UnsafeTlsVersion.java:81:32:81:40 | protocols | -| UnsafeTlsVersion.java:88:5:88:34 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:99:55:99:73 | protocols [[]] : String | -| UnsafeTlsVersion.java:88:27:88:33 | "SSLv3" : String | UnsafeTlsVersion.java:88:5:88:34 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:89:5:89:32 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:99:55:99:73 | protocols [[]] : String | -| UnsafeTlsVersion.java:89:27:89:31 | "TLS" : String | UnsafeTlsVersion.java:89:5:89:32 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:90:5:90:34 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:99:55:99:73 | protocols [[]] : String | -| UnsafeTlsVersion.java:90:27:90:33 | "TLSv1" : String | UnsafeTlsVersion.java:90:5:90:34 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:91:5:91:36 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:99:55:99:73 | protocols [[]] : String | -| UnsafeTlsVersion.java:91:27:91:35 | "TLSv1.1" : String | UnsafeTlsVersion.java:91:5:91:36 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:92:5:92:47 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:99:55:99:73 | protocols [[]] : String | -| UnsafeTlsVersion.java:92:27:92:35 | "TLSv1.1" : String | UnsafeTlsVersion.java:92:5:92:47 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:99:55:99:73 | protocols [[]] : String | UnsafeTlsVersion.java:101:32:101:40 | protocols | -| UnsafeTlsVersion.java:108:5:108:28 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:119:43:119:61 | protocols [[]] : String | -| UnsafeTlsVersion.java:108:21:108:27 | "SSLv3" : String | UnsafeTlsVersion.java:108:5:108:28 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:109:5:109:26 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:119:43:119:61 | protocols [[]] : String | -| UnsafeTlsVersion.java:109:21:109:25 | "TLS" : String | UnsafeTlsVersion.java:109:5:109:26 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:110:5:110:28 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:119:43:119:61 | protocols [[]] : String | -| UnsafeTlsVersion.java:110:21:110:27 | "TLSv1" : String | UnsafeTlsVersion.java:110:5:110:28 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:111:5:111:30 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:119:43:119:61 | protocols [[]] : String | -| UnsafeTlsVersion.java:111:21:111:29 | "TLSv1.1" : String | UnsafeTlsVersion.java:111:5:111:30 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:112:5:112:41 | new ..[] { .. } [[]] : String | UnsafeTlsVersion.java:119:43:119:61 | protocols [[]] : String | -| UnsafeTlsVersion.java:112:21:112:29 | "TLSv1.1" : String | UnsafeTlsVersion.java:112:5:112:41 | new ..[] { .. } [[]] : String | -| UnsafeTlsVersion.java:119:43:119:61 | protocols [[]] : String | UnsafeTlsVersion.java:121:32:121:40 | protocols | +| UnsafeTlsVersion.java:31:5:31:46 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:43:74:43:92 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:31:39:31:45 | "SSLv3" : String | UnsafeTlsVersion.java:31:5:31:46 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:32:5:32:44 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:43:74:43:92 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:32:39:32:43 | "TLS" : String | UnsafeTlsVersion.java:32:5:32:44 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:33:5:33:46 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:43:74:43:92 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:33:39:33:45 | "TLSv1" : String | UnsafeTlsVersion.java:33:5:33:46 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:34:5:34:48 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:43:74:43:92 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:34:39:34:47 | "TLSv1.1" : String | UnsafeTlsVersion.java:34:5:34:48 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:35:5:35:68 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:43:74:43:92 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:35:39:35:45 | "TLSv1" : String | UnsafeTlsVersion.java:35:5:35:68 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:35:48:35:56 | "TLSv1.1" : String | UnsafeTlsVersion.java:35:5:35:68 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:43:74:43:92 | protocols : String[] [[]] : String | UnsafeTlsVersion.java:44:44:44:52 | protocols | +| UnsafeTlsVersion.java:50:38:50:61 | {...} : String[] [[]] : String | UnsafeTlsVersion.java:50:38:50:61 | new String[] | +| UnsafeTlsVersion.java:50:53:50:59 | "SSLv3" : String | UnsafeTlsVersion.java:50:38:50:61 | {...} : String[] [[]] : String | +| UnsafeTlsVersion.java:51:38:51:59 | {...} : String[] [[]] : String | UnsafeTlsVersion.java:51:38:51:59 | new String[] | +| UnsafeTlsVersion.java:51:53:51:57 | "TLS" : String | UnsafeTlsVersion.java:51:38:51:59 | {...} : String[] [[]] : String | +| UnsafeTlsVersion.java:52:38:52:61 | {...} : String[] [[]] : String | UnsafeTlsVersion.java:52:38:52:61 | new String[] | +| UnsafeTlsVersion.java:52:53:52:59 | "TLSv1" : String | UnsafeTlsVersion.java:52:38:52:61 | {...} : String[] [[]] : String | +| UnsafeTlsVersion.java:53:38:53:63 | {...} : String[] [[]] : String | UnsafeTlsVersion.java:53:38:53:63 | new String[] | +| UnsafeTlsVersion.java:53:53:53:61 | "TLSv1.1" : String | UnsafeTlsVersion.java:53:38:53:63 | {...} : String[] [[]] : String | +| UnsafeTlsVersion.java:56:29:56:65 | {...} : String[] [[]] : String | UnsafeTlsVersion.java:56:29:56:65 | new String[] | +| UnsafeTlsVersion.java:56:44:56:52 | "TLSv1.1" : String | UnsafeTlsVersion.java:56:29:56:65 | {...} : String[] [[]] : String | +| UnsafeTlsVersion.java:68:5:68:28 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:79:43:79:61 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:68:21:68:27 | "SSLv3" : String | UnsafeTlsVersion.java:68:5:68:28 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:69:5:69:26 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:79:43:79:61 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:69:21:69:25 | "TLS" : String | UnsafeTlsVersion.java:69:5:69:26 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:70:5:70:28 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:79:43:79:61 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:70:21:70:27 | "TLSv1" : String | UnsafeTlsVersion.java:70:5:70:28 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:71:5:71:30 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:79:43:79:61 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:71:21:71:29 | "TLSv1.1" : String | UnsafeTlsVersion.java:71:5:71:30 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:72:5:72:41 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:79:43:79:61 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:72:21:72:29 | "TLSv1.1" : String | UnsafeTlsVersion.java:72:5:72:41 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:79:43:79:61 | protocols : String[] [[]] : String | UnsafeTlsVersion.java:81:32:81:40 | protocols | +| UnsafeTlsVersion.java:88:5:88:34 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:99:55:99:73 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:88:27:88:33 | "SSLv3" : String | UnsafeTlsVersion.java:88:5:88:34 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:89:5:89:32 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:99:55:99:73 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:89:27:89:31 | "TLS" : String | UnsafeTlsVersion.java:89:5:89:32 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:90:5:90:34 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:99:55:99:73 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:90:27:90:33 | "TLSv1" : String | UnsafeTlsVersion.java:90:5:90:34 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:91:5:91:36 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:99:55:99:73 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:91:27:91:35 | "TLSv1.1" : String | UnsafeTlsVersion.java:91:5:91:36 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:92:5:92:47 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:99:55:99:73 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:92:27:92:35 | "TLSv1.1" : String | UnsafeTlsVersion.java:92:5:92:47 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:99:55:99:73 | protocols : String[] [[]] : String | UnsafeTlsVersion.java:101:32:101:40 | protocols | +| UnsafeTlsVersion.java:108:5:108:28 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:119:43:119:61 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:108:21:108:27 | "SSLv3" : String | UnsafeTlsVersion.java:108:5:108:28 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:109:5:109:26 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:119:43:119:61 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:109:21:109:25 | "TLS" : String | UnsafeTlsVersion.java:109:5:109:26 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:110:5:110:28 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:119:43:119:61 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:110:21:110:27 | "TLSv1" : String | UnsafeTlsVersion.java:110:5:110:28 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:111:5:111:30 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:119:43:119:61 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:111:21:111:29 | "TLSv1.1" : String | UnsafeTlsVersion.java:111:5:111:30 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:112:5:112:41 | new ..[] { .. } : String[] [[]] : String | UnsafeTlsVersion.java:119:43:119:61 | protocols : String[] [[]] : String | +| UnsafeTlsVersion.java:112:21:112:29 | "TLSv1.1" : String | UnsafeTlsVersion.java:112:5:112:41 | new ..[] { .. } : String[] [[]] : String | +| UnsafeTlsVersion.java:119:43:119:61 | protocols : String[] [[]] : String | UnsafeTlsVersion.java:121:32:121:40 | protocols | nodes | UnsafeTlsVersion.java:16:28:16:32 | "SSL" | semmle.label | "SSL" | | UnsafeTlsVersion.java:17:28:17:34 | "SSLv2" | semmle.label | "SSLv2" | @@ -61,69 +61,69 @@ nodes | UnsafeTlsVersion.java:19:28:19:32 | "TLS" | semmle.label | "TLS" | | UnsafeTlsVersion.java:20:28:20:34 | "TLSv1" | semmle.label | "TLSv1" | | UnsafeTlsVersion.java:21:28:21:36 | "TLSv1.1" | semmle.label | "TLSv1.1" | -| UnsafeTlsVersion.java:31:5:31:46 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:31:5:31:46 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:31:39:31:45 | "SSLv3" : String | semmle.label | "SSLv3" : String | -| UnsafeTlsVersion.java:32:5:32:44 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:32:5:32:44 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:32:39:32:43 | "TLS" : String | semmle.label | "TLS" : String | -| UnsafeTlsVersion.java:33:5:33:46 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:33:5:33:46 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:33:39:33:45 | "TLSv1" : String | semmle.label | "TLSv1" : String | -| UnsafeTlsVersion.java:34:5:34:48 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:34:5:34:48 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:34:39:34:47 | "TLSv1.1" : String | semmle.label | "TLSv1.1" : String | -| UnsafeTlsVersion.java:35:5:35:68 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:35:5:35:68 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:35:39:35:45 | "TLSv1" : String | semmle.label | "TLSv1" : String | | UnsafeTlsVersion.java:35:48:35:56 | "TLSv1.1" : String | semmle.label | "TLSv1.1" : String | -| UnsafeTlsVersion.java:43:74:43:92 | protocols [[]] : String | semmle.label | protocols [[]] : String | +| UnsafeTlsVersion.java:43:74:43:92 | protocols : String[] [[]] : String | semmle.label | protocols : String[] [[]] : String | | UnsafeTlsVersion.java:44:44:44:52 | protocols | semmle.label | protocols | | UnsafeTlsVersion.java:50:38:50:61 | new String[] | semmle.label | new String[] | -| UnsafeTlsVersion.java:50:38:50:61 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| UnsafeTlsVersion.java:50:38:50:61 | {...} : String[] [[]] : String | semmle.label | {...} : String[] [[]] : String | | UnsafeTlsVersion.java:50:53:50:59 | "SSLv3" : String | semmle.label | "SSLv3" : String | | UnsafeTlsVersion.java:51:38:51:59 | new String[] | semmle.label | new String[] | -| UnsafeTlsVersion.java:51:38:51:59 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| UnsafeTlsVersion.java:51:38:51:59 | {...} : String[] [[]] : String | semmle.label | {...} : String[] [[]] : String | | UnsafeTlsVersion.java:51:53:51:57 | "TLS" : String | semmle.label | "TLS" : String | | UnsafeTlsVersion.java:52:38:52:61 | new String[] | semmle.label | new String[] | -| UnsafeTlsVersion.java:52:38:52:61 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| UnsafeTlsVersion.java:52:38:52:61 | {...} : String[] [[]] : String | semmle.label | {...} : String[] [[]] : String | | UnsafeTlsVersion.java:52:53:52:59 | "TLSv1" : String | semmle.label | "TLSv1" : String | | UnsafeTlsVersion.java:53:38:53:63 | new String[] | semmle.label | new String[] | -| UnsafeTlsVersion.java:53:38:53:63 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| UnsafeTlsVersion.java:53:38:53:63 | {...} : String[] [[]] : String | semmle.label | {...} : String[] [[]] : String | | UnsafeTlsVersion.java:53:53:53:61 | "TLSv1.1" : String | semmle.label | "TLSv1.1" : String | | UnsafeTlsVersion.java:56:29:56:65 | new String[] | semmle.label | new String[] | -| UnsafeTlsVersion.java:56:29:56:65 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| UnsafeTlsVersion.java:56:29:56:65 | {...} : String[] [[]] : String | semmle.label | {...} : String[] [[]] : String | | UnsafeTlsVersion.java:56:44:56:52 | "TLSv1.1" : String | semmle.label | "TLSv1.1" : String | -| UnsafeTlsVersion.java:68:5:68:28 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:68:5:68:28 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:68:21:68:27 | "SSLv3" : String | semmle.label | "SSLv3" : String | -| UnsafeTlsVersion.java:69:5:69:26 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:69:5:69:26 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:69:21:69:25 | "TLS" : String | semmle.label | "TLS" : String | -| UnsafeTlsVersion.java:70:5:70:28 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:70:5:70:28 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:70:21:70:27 | "TLSv1" : String | semmle.label | "TLSv1" : String | -| UnsafeTlsVersion.java:71:5:71:30 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:71:5:71:30 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:71:21:71:29 | "TLSv1.1" : String | semmle.label | "TLSv1.1" : String | -| UnsafeTlsVersion.java:72:5:72:41 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:72:5:72:41 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:72:21:72:29 | "TLSv1.1" : String | semmle.label | "TLSv1.1" : String | -| UnsafeTlsVersion.java:79:43:79:61 | protocols [[]] : String | semmle.label | protocols [[]] : String | +| UnsafeTlsVersion.java:79:43:79:61 | protocols : String[] [[]] : String | semmle.label | protocols : String[] [[]] : String | | UnsafeTlsVersion.java:81:32:81:40 | protocols | semmle.label | protocols | -| UnsafeTlsVersion.java:88:5:88:34 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:88:5:88:34 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:88:27:88:33 | "SSLv3" : String | semmle.label | "SSLv3" : String | -| UnsafeTlsVersion.java:89:5:89:32 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:89:5:89:32 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:89:27:89:31 | "TLS" : String | semmle.label | "TLS" : String | -| UnsafeTlsVersion.java:90:5:90:34 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:90:5:90:34 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:90:27:90:33 | "TLSv1" : String | semmle.label | "TLSv1" : String | -| UnsafeTlsVersion.java:91:5:91:36 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:91:5:91:36 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:91:27:91:35 | "TLSv1.1" : String | semmle.label | "TLSv1.1" : String | -| UnsafeTlsVersion.java:92:5:92:47 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:92:5:92:47 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:92:27:92:35 | "TLSv1.1" : String | semmle.label | "TLSv1.1" : String | -| UnsafeTlsVersion.java:99:55:99:73 | protocols [[]] : String | semmle.label | protocols [[]] : String | +| UnsafeTlsVersion.java:99:55:99:73 | protocols : String[] [[]] : String | semmle.label | protocols : String[] [[]] : String | | UnsafeTlsVersion.java:101:32:101:40 | protocols | semmle.label | protocols | -| UnsafeTlsVersion.java:108:5:108:28 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:108:5:108:28 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:108:21:108:27 | "SSLv3" : String | semmle.label | "SSLv3" : String | -| UnsafeTlsVersion.java:109:5:109:26 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:109:5:109:26 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:109:21:109:25 | "TLS" : String | semmle.label | "TLS" : String | -| UnsafeTlsVersion.java:110:5:110:28 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:110:5:110:28 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:110:21:110:27 | "TLSv1" : String | semmle.label | "TLSv1" : String | -| UnsafeTlsVersion.java:111:5:111:30 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:111:5:111:30 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:111:21:111:29 | "TLSv1.1" : String | semmle.label | "TLSv1.1" : String | -| UnsafeTlsVersion.java:112:5:112:41 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| UnsafeTlsVersion.java:112:5:112:41 | new ..[] { .. } : String[] [[]] : String | semmle.label | new ..[] { .. } : String[] [[]] : String | | UnsafeTlsVersion.java:112:21:112:29 | "TLSv1.1" : String | semmle.label | "TLSv1.1" : String | -| UnsafeTlsVersion.java:119:43:119:61 | protocols [[]] : String | semmle.label | protocols [[]] : String | +| UnsafeTlsVersion.java:119:43:119:61 | protocols : String[] [[]] : String | semmle.label | protocols : String[] [[]] : String | | UnsafeTlsVersion.java:121:32:121:40 | protocols | semmle.label | protocols | subpaths #select diff --git a/java/ql/test/experimental/query-tests/security/CWE-400/LocalThreadResourceAbuse.expected b/java/ql/test/experimental/query-tests/security/CWE-400/LocalThreadResourceAbuse.expected index 7dcaf2fc0c4..1f74227841b 100644 --- a/java/ql/test/experimental/query-tests/security/CWE-400/LocalThreadResourceAbuse.expected +++ b/java/ql/test/experimental/query-tests/security/CWE-400/LocalThreadResourceAbuse.expected @@ -1,23 +1,23 @@ edges | ThreadResourceAbuse.java:37:25:37:73 | getInitParameter(...) : String | ThreadResourceAbuse.java:40:28:40:36 | delayTime : Number | -| ThreadResourceAbuse.java:40:4:40:37 | new UncheckedSyncAction(...) [waitTime] : Number | ThreadResourceAbuse.java:71:15:71:17 | parameter this [waitTime] : Number | -| ThreadResourceAbuse.java:40:28:40:36 | delayTime : Number | ThreadResourceAbuse.java:40:4:40:37 | new UncheckedSyncAction(...) [waitTime] : Number | +| ThreadResourceAbuse.java:40:4:40:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | ThreadResourceAbuse.java:71:15:71:17 | parameter this : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:40:28:40:36 | delayTime : Number | ThreadResourceAbuse.java:40:4:40:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | | ThreadResourceAbuse.java:40:28:40:36 | delayTime : Number | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | ThreadResourceAbuse.java:67:20:67:27 | waitTime : Number | -| ThreadResourceAbuse.java:67:20:67:27 | waitTime : Number | ThreadResourceAbuse.java:67:4:67:7 | this [post update] [waitTime] : Number | -| ThreadResourceAbuse.java:71:15:71:17 | parameter this [waitTime] : Number | ThreadResourceAbuse.java:74:18:74:25 | this <.field> [waitTime] : Number | -| ThreadResourceAbuse.java:74:18:74:25 | this <.field> [waitTime] : Number | ThreadResourceAbuse.java:74:18:74:25 | waitTime | +| ThreadResourceAbuse.java:67:20:67:27 | waitTime : Number | ThreadResourceAbuse.java:67:4:67:7 | this [post update] : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:71:15:71:17 | parameter this : UncheckedSyncAction [waitTime] : Number | ThreadResourceAbuse.java:74:18:74:25 | this <.field> : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:74:18:74:25 | this <.field> : UncheckedSyncAction [waitTime] : Number | ThreadResourceAbuse.java:74:18:74:25 | waitTime | nodes | ThreadResourceAbuse.java:37:25:37:73 | getInitParameter(...) : String | semmle.label | getInitParameter(...) : String | -| ThreadResourceAbuse.java:40:4:40:37 | new UncheckedSyncAction(...) [waitTime] : Number | semmle.label | new UncheckedSyncAction(...) [waitTime] : Number | +| ThreadResourceAbuse.java:40:4:40:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | semmle.label | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | | ThreadResourceAbuse.java:40:28:40:36 | delayTime : Number | semmle.label | delayTime : Number | | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | semmle.label | waitTime : Number | -| ThreadResourceAbuse.java:67:4:67:7 | this [post update] [waitTime] : Number | semmle.label | this [post update] [waitTime] : Number | +| ThreadResourceAbuse.java:67:4:67:7 | this [post update] : UncheckedSyncAction [waitTime] : Number | semmle.label | this [post update] : UncheckedSyncAction [waitTime] : Number | | ThreadResourceAbuse.java:67:20:67:27 | waitTime : Number | semmle.label | waitTime : Number | -| ThreadResourceAbuse.java:71:15:71:17 | parameter this [waitTime] : Number | semmle.label | parameter this [waitTime] : Number | -| ThreadResourceAbuse.java:74:18:74:25 | this <.field> [waitTime] : Number | semmle.label | this <.field> [waitTime] : Number | +| ThreadResourceAbuse.java:71:15:71:17 | parameter this : UncheckedSyncAction [waitTime] : Number | semmle.label | parameter this : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:74:18:74:25 | this <.field> : UncheckedSyncAction [waitTime] : Number | semmle.label | this <.field> : UncheckedSyncAction [waitTime] : Number | | ThreadResourceAbuse.java:74:18:74:25 | waitTime | semmle.label | waitTime | subpaths -| ThreadResourceAbuse.java:40:28:40:36 | delayTime : Number | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | ThreadResourceAbuse.java:67:4:67:7 | this [post update] [waitTime] : Number | ThreadResourceAbuse.java:40:4:40:37 | new UncheckedSyncAction(...) [waitTime] : Number | +| ThreadResourceAbuse.java:40:28:40:36 | delayTime : Number | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | ThreadResourceAbuse.java:67:4:67:7 | this [post update] : UncheckedSyncAction [waitTime] : Number | ThreadResourceAbuse.java:40:4:40:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | #select | ThreadResourceAbuse.java:74:18:74:25 | waitTime | ThreadResourceAbuse.java:37:25:37:73 | getInitParameter(...) : String | ThreadResourceAbuse.java:74:18:74:25 | waitTime | Possible uncontrolled resource consumption due to $@. | ThreadResourceAbuse.java:37:25:37:73 | getInitParameter(...) | local user-provided value | diff --git a/java/ql/test/experimental/query-tests/security/CWE-400/ThreadResourceAbuse.expected b/java/ql/test/experimental/query-tests/security/CWE-400/ThreadResourceAbuse.expected index a510070daf9..12419be1064 100644 --- a/java/ql/test/experimental/query-tests/security/CWE-400/ThreadResourceAbuse.expected +++ b/java/ql/test/experimental/query-tests/security/CWE-400/ThreadResourceAbuse.expected @@ -1,65 +1,65 @@ edges | ThreadResourceAbuse.java:18:25:18:57 | getParameter(...) : String | ThreadResourceAbuse.java:21:28:21:36 | delayTime : Number | -| ThreadResourceAbuse.java:21:4:21:37 | new UncheckedSyncAction(...) [waitTime] : Number | ThreadResourceAbuse.java:71:15:71:17 | parameter this [waitTime] : Number | -| ThreadResourceAbuse.java:21:28:21:36 | delayTime : Number | ThreadResourceAbuse.java:21:4:21:37 | new UncheckedSyncAction(...) [waitTime] : Number | +| ThreadResourceAbuse.java:21:4:21:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | ThreadResourceAbuse.java:71:15:71:17 | parameter this : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:21:28:21:36 | delayTime : Number | ThreadResourceAbuse.java:21:4:21:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | | ThreadResourceAbuse.java:21:28:21:36 | delayTime : Number | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | | ThreadResourceAbuse.java:29:82:29:114 | getParameter(...) : String | ThreadResourceAbuse.java:30:28:30:36 | delayTime : Number | -| ThreadResourceAbuse.java:30:4:30:37 | new UncheckedSyncAction(...) [waitTime] : Number | ThreadResourceAbuse.java:71:15:71:17 | parameter this [waitTime] : Number | -| ThreadResourceAbuse.java:30:28:30:36 | delayTime : Number | ThreadResourceAbuse.java:30:4:30:37 | new UncheckedSyncAction(...) [waitTime] : Number | +| ThreadResourceAbuse.java:30:4:30:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | ThreadResourceAbuse.java:71:15:71:17 | parameter this : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:30:28:30:36 | delayTime : Number | ThreadResourceAbuse.java:30:4:30:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | | ThreadResourceAbuse.java:30:28:30:36 | delayTime : Number | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | ThreadResourceAbuse.java:67:20:67:27 | waitTime : Number | -| ThreadResourceAbuse.java:67:20:67:27 | waitTime : Number | ThreadResourceAbuse.java:67:4:67:7 | this [post update] [waitTime] : Number | -| ThreadResourceAbuse.java:71:15:71:17 | parameter this [waitTime] : Number | ThreadResourceAbuse.java:74:18:74:25 | this <.field> [waitTime] : Number | -| ThreadResourceAbuse.java:74:18:74:25 | this <.field> [waitTime] : Number | ThreadResourceAbuse.java:74:18:74:25 | waitTime | +| ThreadResourceAbuse.java:67:20:67:27 | waitTime : Number | ThreadResourceAbuse.java:67:4:67:7 | this [post update] : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:71:15:71:17 | parameter this : UncheckedSyncAction [waitTime] : Number | ThreadResourceAbuse.java:74:18:74:25 | this <.field> : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:74:18:74:25 | this <.field> : UncheckedSyncAction [waitTime] : Number | ThreadResourceAbuse.java:74:18:74:25 | waitTime | | ThreadResourceAbuse.java:141:27:141:43 | getValue(...) : String | ThreadResourceAbuse.java:144:34:144:42 | delayTime | | ThreadResourceAbuse.java:172:19:172:50 | getHeader(...) : String | ThreadResourceAbuse.java:176:17:176:26 | retryAfter | | ThreadResourceAbuse.java:206:28:206:56 | getParameter(...) : String | ThreadResourceAbuse.java:209:49:209:59 | uploadDelay : Number | -| ThreadResourceAbuse.java:209:30:209:87 | new UploadListener(...) [slowUploads] : Number | UploadListener.java:28:14:28:19 | parameter this [slowUploads] : Number | -| ThreadResourceAbuse.java:209:49:209:59 | uploadDelay : Number | ThreadResourceAbuse.java:209:30:209:87 | new UploadListener(...) [slowUploads] : Number | +| ThreadResourceAbuse.java:209:30:209:87 | new UploadListener(...) : UploadListener [slowUploads] : Number | UploadListener.java:28:14:28:19 | parameter this : UploadListener [slowUploads] : Number | +| ThreadResourceAbuse.java:209:49:209:59 | uploadDelay : Number | ThreadResourceAbuse.java:209:30:209:87 | new UploadListener(...) : UploadListener [slowUploads] : Number | | ThreadResourceAbuse.java:209:49:209:59 | uploadDelay : Number | UploadListener.java:15:24:15:44 | sleepMilliseconds : Number | | UploadListener.java:15:24:15:44 | sleepMilliseconds : Number | UploadListener.java:16:17:16:33 | sleepMilliseconds : Number | -| UploadListener.java:16:17:16:33 | sleepMilliseconds : Number | UploadListener.java:16:3:16:13 | this <.field> [post update] [slowUploads] : Number | -| UploadListener.java:28:14:28:19 | parameter this [slowUploads] : Number | UploadListener.java:29:3:29:11 | this <.field> [slowUploads] : Number | -| UploadListener.java:29:3:29:11 | this <.field> [slowUploads] : Number | UploadListener.java:30:3:30:15 | this <.field> [slowUploads] : Number | -| UploadListener.java:30:3:30:15 | this <.field> [slowUploads] : Number | UploadListener.java:33:7:33:17 | this <.field> [slowUploads] : Number | -| UploadListener.java:30:3:30:15 | this <.field> [slowUploads] : Number | UploadListener.java:35:18:35:28 | this <.field> [slowUploads] : Number | +| UploadListener.java:16:17:16:33 | sleepMilliseconds : Number | UploadListener.java:16:3:16:13 | this <.field> [post update] : UploadListener [slowUploads] : Number | +| UploadListener.java:28:14:28:19 | parameter this : UploadListener [slowUploads] : Number | UploadListener.java:29:3:29:11 | this <.field> : UploadListener [slowUploads] : Number | +| UploadListener.java:29:3:29:11 | this <.field> : UploadListener [slowUploads] : Number | UploadListener.java:30:3:30:15 | this <.field> : UploadListener [slowUploads] : Number | +| UploadListener.java:30:3:30:15 | this <.field> : UploadListener [slowUploads] : Number | UploadListener.java:33:7:33:17 | this <.field> : UploadListener [slowUploads] : Number | +| UploadListener.java:30:3:30:15 | this <.field> : UploadListener [slowUploads] : Number | UploadListener.java:35:18:35:28 | this <.field> : UploadListener [slowUploads] : Number | | UploadListener.java:33:7:33:17 | slowUploads : Number | UploadListener.java:35:18:35:28 | slowUploads | -| UploadListener.java:33:7:33:17 | this <.field> [slowUploads] : Number | UploadListener.java:33:7:33:17 | slowUploads : Number | -| UploadListener.java:35:18:35:28 | this <.field> [slowUploads] : Number | UploadListener.java:35:18:35:28 | slowUploads | +| UploadListener.java:33:7:33:17 | this <.field> : UploadListener [slowUploads] : Number | UploadListener.java:33:7:33:17 | slowUploads : Number | +| UploadListener.java:35:18:35:28 | this <.field> : UploadListener [slowUploads] : Number | UploadListener.java:35:18:35:28 | slowUploads | nodes | ThreadResourceAbuse.java:18:25:18:57 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| ThreadResourceAbuse.java:21:4:21:37 | new UncheckedSyncAction(...) [waitTime] : Number | semmle.label | new UncheckedSyncAction(...) [waitTime] : Number | +| ThreadResourceAbuse.java:21:4:21:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | semmle.label | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | | ThreadResourceAbuse.java:21:28:21:36 | delayTime : Number | semmle.label | delayTime : Number | | ThreadResourceAbuse.java:29:82:29:114 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| ThreadResourceAbuse.java:30:4:30:37 | new UncheckedSyncAction(...) [waitTime] : Number | semmle.label | new UncheckedSyncAction(...) [waitTime] : Number | +| ThreadResourceAbuse.java:30:4:30:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | semmle.label | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | | ThreadResourceAbuse.java:30:28:30:36 | delayTime : Number | semmle.label | delayTime : Number | | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | semmle.label | waitTime : Number | -| ThreadResourceAbuse.java:67:4:67:7 | this [post update] [waitTime] : Number | semmle.label | this [post update] [waitTime] : Number | +| ThreadResourceAbuse.java:67:4:67:7 | this [post update] : UncheckedSyncAction [waitTime] : Number | semmle.label | this [post update] : UncheckedSyncAction [waitTime] : Number | | ThreadResourceAbuse.java:67:20:67:27 | waitTime : Number | semmle.label | waitTime : Number | -| ThreadResourceAbuse.java:71:15:71:17 | parameter this [waitTime] : Number | semmle.label | parameter this [waitTime] : Number | -| ThreadResourceAbuse.java:74:18:74:25 | this <.field> [waitTime] : Number | semmle.label | this <.field> [waitTime] : Number | +| ThreadResourceAbuse.java:71:15:71:17 | parameter this : UncheckedSyncAction [waitTime] : Number | semmle.label | parameter this : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:74:18:74:25 | this <.field> : UncheckedSyncAction [waitTime] : Number | semmle.label | this <.field> : UncheckedSyncAction [waitTime] : Number | | ThreadResourceAbuse.java:74:18:74:25 | waitTime | semmle.label | waitTime | | ThreadResourceAbuse.java:141:27:141:43 | getValue(...) : String | semmle.label | getValue(...) : String | | ThreadResourceAbuse.java:144:34:144:42 | delayTime | semmle.label | delayTime | | ThreadResourceAbuse.java:172:19:172:50 | getHeader(...) : String | semmle.label | getHeader(...) : String | | ThreadResourceAbuse.java:176:17:176:26 | retryAfter | semmle.label | retryAfter | | ThreadResourceAbuse.java:206:28:206:56 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| ThreadResourceAbuse.java:209:30:209:87 | new UploadListener(...) [slowUploads] : Number | semmle.label | new UploadListener(...) [slowUploads] : Number | +| ThreadResourceAbuse.java:209:30:209:87 | new UploadListener(...) : UploadListener [slowUploads] : Number | semmle.label | new UploadListener(...) : UploadListener [slowUploads] : Number | | ThreadResourceAbuse.java:209:49:209:59 | uploadDelay : Number | semmle.label | uploadDelay : Number | | UploadListener.java:15:24:15:44 | sleepMilliseconds : Number | semmle.label | sleepMilliseconds : Number | -| UploadListener.java:16:3:16:13 | this <.field> [post update] [slowUploads] : Number | semmle.label | this <.field> [post update] [slowUploads] : Number | +| UploadListener.java:16:3:16:13 | this <.field> [post update] : UploadListener [slowUploads] : Number | semmle.label | this <.field> [post update] : UploadListener [slowUploads] : Number | | UploadListener.java:16:17:16:33 | sleepMilliseconds : Number | semmle.label | sleepMilliseconds : Number | -| UploadListener.java:28:14:28:19 | parameter this [slowUploads] : Number | semmle.label | parameter this [slowUploads] : Number | -| UploadListener.java:29:3:29:11 | this <.field> [slowUploads] : Number | semmle.label | this <.field> [slowUploads] : Number | -| UploadListener.java:30:3:30:15 | this <.field> [slowUploads] : Number | semmle.label | this <.field> [slowUploads] : Number | +| UploadListener.java:28:14:28:19 | parameter this : UploadListener [slowUploads] : Number | semmle.label | parameter this : UploadListener [slowUploads] : Number | +| UploadListener.java:29:3:29:11 | this <.field> : UploadListener [slowUploads] : Number | semmle.label | this <.field> : UploadListener [slowUploads] : Number | +| UploadListener.java:30:3:30:15 | this <.field> : UploadListener [slowUploads] : Number | semmle.label | this <.field> : UploadListener [slowUploads] : Number | | UploadListener.java:33:7:33:17 | slowUploads : Number | semmle.label | slowUploads : Number | -| UploadListener.java:33:7:33:17 | this <.field> [slowUploads] : Number | semmle.label | this <.field> [slowUploads] : Number | +| UploadListener.java:33:7:33:17 | this <.field> : UploadListener [slowUploads] : Number | semmle.label | this <.field> : UploadListener [slowUploads] : Number | | UploadListener.java:35:18:35:28 | slowUploads | semmle.label | slowUploads | -| UploadListener.java:35:18:35:28 | this <.field> [slowUploads] : Number | semmle.label | this <.field> [slowUploads] : Number | +| UploadListener.java:35:18:35:28 | this <.field> : UploadListener [slowUploads] : Number | semmle.label | this <.field> : UploadListener [slowUploads] : Number | subpaths -| ThreadResourceAbuse.java:21:28:21:36 | delayTime : Number | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | ThreadResourceAbuse.java:67:4:67:7 | this [post update] [waitTime] : Number | ThreadResourceAbuse.java:21:4:21:37 | new UncheckedSyncAction(...) [waitTime] : Number | -| ThreadResourceAbuse.java:30:28:30:36 | delayTime : Number | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | ThreadResourceAbuse.java:67:4:67:7 | this [post update] [waitTime] : Number | ThreadResourceAbuse.java:30:4:30:37 | new UncheckedSyncAction(...) [waitTime] : Number | -| ThreadResourceAbuse.java:209:49:209:59 | uploadDelay : Number | UploadListener.java:15:24:15:44 | sleepMilliseconds : Number | UploadListener.java:16:3:16:13 | this <.field> [post update] [slowUploads] : Number | ThreadResourceAbuse.java:209:30:209:87 | new UploadListener(...) [slowUploads] : Number | +| ThreadResourceAbuse.java:21:28:21:36 | delayTime : Number | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | ThreadResourceAbuse.java:67:4:67:7 | this [post update] : UncheckedSyncAction [waitTime] : Number | ThreadResourceAbuse.java:21:4:21:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:30:28:30:36 | delayTime : Number | ThreadResourceAbuse.java:66:30:66:41 | waitTime : Number | ThreadResourceAbuse.java:67:4:67:7 | this [post update] : UncheckedSyncAction [waitTime] : Number | ThreadResourceAbuse.java:30:4:30:37 | new UncheckedSyncAction(...) : UncheckedSyncAction [waitTime] : Number | +| ThreadResourceAbuse.java:209:49:209:59 | uploadDelay : Number | UploadListener.java:15:24:15:44 | sleepMilliseconds : Number | UploadListener.java:16:3:16:13 | this <.field> [post update] : UploadListener [slowUploads] : Number | ThreadResourceAbuse.java:209:30:209:87 | new UploadListener(...) : UploadListener [slowUploads] : Number | #select | ThreadResourceAbuse.java:74:18:74:25 | waitTime | ThreadResourceAbuse.java:18:25:18:57 | getParameter(...) : String | ThreadResourceAbuse.java:74:18:74:25 | waitTime | Vulnerability of uncontrolled resource consumption due to $@. | ThreadResourceAbuse.java:18:25:18:57 | getParameter(...) | user-provided value | | ThreadResourceAbuse.java:74:18:74:25 | waitTime | ThreadResourceAbuse.java:29:82:29:114 | getParameter(...) : String | ThreadResourceAbuse.java:74:18:74:25 | waitTime | Vulnerability of uncontrolled resource consumption due to $@. | ThreadResourceAbuse.java:29:82:29:114 | getParameter(...) | user-provided value | diff --git a/java/ql/test/experimental/query-tests/security/CWE-601/SpringUrlRedirect.expected b/java/ql/test/experimental/query-tests/security/CWE-601/SpringUrlRedirect.expected index 74d74aaf77f..66c4093f011 100644 --- a/java/ql/test/experimental/query-tests/security/CWE-601/SpringUrlRedirect.expected +++ b/java/ql/test/experimental/query-tests/security/CWE-601/SpringUrlRedirect.expected @@ -6,8 +6,8 @@ edges | SpringUrlRedirect.java:41:24:41:41 | redirectUrl : String | SpringUrlRedirect.java:44:29:44:39 | redirectUrl | | SpringUrlRedirect.java:49:24:49:41 | redirectUrl : String | SpringUrlRedirect.java:52:30:52:40 | redirectUrl | | SpringUrlRedirect.java:57:24:57:41 | redirectUrl : String | SpringUrlRedirect.java:58:55:58:65 | redirectUrl : String | -| SpringUrlRedirect.java:58:30:58:66 | new ..[] { .. } [[]] : String | SpringUrlRedirect.java:58:30:58:66 | format(...) | -| SpringUrlRedirect.java:58:55:58:65 | redirectUrl : String | SpringUrlRedirect.java:58:30:58:66 | new ..[] { .. } [[]] : String | +| SpringUrlRedirect.java:58:30:58:66 | new ..[] { .. } : Object[] [[]] : String | SpringUrlRedirect.java:58:30:58:66 | format(...) | +| SpringUrlRedirect.java:58:55:58:65 | redirectUrl : String | SpringUrlRedirect.java:58:30:58:66 | new ..[] { .. } : Object[] [[]] : String | | SpringUrlRedirect.java:62:24:62:41 | redirectUrl : String | SpringUrlRedirect.java:63:44:63:68 | ... + ... : String | | SpringUrlRedirect.java:63:44:63:68 | ... + ... : String | SpringUrlRedirect.java:63:30:63:76 | format(...) | | SpringUrlRedirect.java:89:38:89:55 | redirectUrl : String | SpringUrlRedirect.java:91:38:91:48 | redirectUrl : String | @@ -17,19 +17,19 @@ edges | SpringUrlRedirect.java:98:44:98:54 | redirectUrl : String | SpringUrlRedirect.java:98:33:98:55 | create(...) : URI | | SpringUrlRedirect.java:104:39:104:56 | redirectUrl : String | SpringUrlRedirect.java:106:37:106:47 | redirectUrl : String | | SpringUrlRedirect.java:106:9:106:19 | httpHeaders [post update] : HttpHeaders | SpringUrlRedirect.java:108:68:108:78 | httpHeaders | -| SpringUrlRedirect.java:106:9:106:19 | httpHeaders [post update] [, ] : String | SpringUrlRedirect.java:108:68:108:78 | httpHeaders | +| SpringUrlRedirect.java:106:9:106:19 | httpHeaders [post update] : HttpHeaders [, ] : String | SpringUrlRedirect.java:108:68:108:78 | httpHeaders | | SpringUrlRedirect.java:106:37:106:47 | redirectUrl : String | SpringUrlRedirect.java:106:9:106:19 | httpHeaders [post update] : HttpHeaders | -| SpringUrlRedirect.java:106:37:106:47 | redirectUrl : String | SpringUrlRedirect.java:106:9:106:19 | httpHeaders [post update] [, ] : String | +| SpringUrlRedirect.java:106:37:106:47 | redirectUrl : String | SpringUrlRedirect.java:106:9:106:19 | httpHeaders [post update] : HttpHeaders [, ] : String | | SpringUrlRedirect.java:112:39:112:56 | redirectUrl : String | SpringUrlRedirect.java:114:37:114:47 | redirectUrl : String | | SpringUrlRedirect.java:114:9:114:19 | httpHeaders [post update] : HttpHeaders | SpringUrlRedirect.java:116:37:116:47 | httpHeaders | -| SpringUrlRedirect.java:114:9:114:19 | httpHeaders [post update] [, ] : String | SpringUrlRedirect.java:116:37:116:47 | httpHeaders | +| SpringUrlRedirect.java:114:9:114:19 | httpHeaders [post update] : HttpHeaders [, ] : String | SpringUrlRedirect.java:116:37:116:47 | httpHeaders | | SpringUrlRedirect.java:114:37:114:47 | redirectUrl : String | SpringUrlRedirect.java:114:9:114:19 | httpHeaders [post update] : HttpHeaders | -| SpringUrlRedirect.java:114:37:114:47 | redirectUrl : String | SpringUrlRedirect.java:114:9:114:19 | httpHeaders [post update] [, ] : String | +| SpringUrlRedirect.java:114:37:114:47 | redirectUrl : String | SpringUrlRedirect.java:114:9:114:19 | httpHeaders [post update] : HttpHeaders [, ] : String | | SpringUrlRedirect.java:120:33:120:50 | redirectUrl : String | SpringUrlRedirect.java:122:37:122:47 | redirectUrl : String | | SpringUrlRedirect.java:122:9:122:19 | httpHeaders [post update] : HttpHeaders | SpringUrlRedirect.java:124:49:124:59 | httpHeaders | -| SpringUrlRedirect.java:122:9:122:19 | httpHeaders [post update] [, ] : String | SpringUrlRedirect.java:124:49:124:59 | httpHeaders | +| SpringUrlRedirect.java:122:9:122:19 | httpHeaders [post update] : HttpHeaders [, ] : String | SpringUrlRedirect.java:124:49:124:59 | httpHeaders | | SpringUrlRedirect.java:122:37:122:47 | redirectUrl : String | SpringUrlRedirect.java:122:9:122:19 | httpHeaders [post update] : HttpHeaders | -| SpringUrlRedirect.java:122:37:122:47 | redirectUrl : String | SpringUrlRedirect.java:122:9:122:19 | httpHeaders [post update] [, ] : String | +| SpringUrlRedirect.java:122:37:122:47 | redirectUrl : String | SpringUrlRedirect.java:122:9:122:19 | httpHeaders [post update] : HttpHeaders [, ] : String | | SpringUrlRedirect.java:128:33:128:50 | redirectUrl : String | SpringUrlRedirect.java:130:44:130:54 | redirectUrl : String | | SpringUrlRedirect.java:130:33:130:55 | create(...) : URI | SpringUrlRedirect.java:132:49:132:59 | httpHeaders | | SpringUrlRedirect.java:130:44:130:54 | redirectUrl : String | SpringUrlRedirect.java:130:33:130:55 | create(...) : URI | @@ -48,7 +48,7 @@ nodes | SpringUrlRedirect.java:52:30:52:40 | redirectUrl | semmle.label | redirectUrl | | SpringUrlRedirect.java:57:24:57:41 | redirectUrl : String | semmle.label | redirectUrl : String | | SpringUrlRedirect.java:58:30:58:66 | format(...) | semmle.label | format(...) | -| SpringUrlRedirect.java:58:30:58:66 | new ..[] { .. } [[]] : String | semmle.label | new ..[] { .. } [[]] : String | +| SpringUrlRedirect.java:58:30:58:66 | new ..[] { .. } : Object[] [[]] : String | semmle.label | new ..[] { .. } : Object[] [[]] : String | | SpringUrlRedirect.java:58:55:58:65 | redirectUrl : String | semmle.label | redirectUrl : String | | SpringUrlRedirect.java:62:24:62:41 | redirectUrl : String | semmle.label | redirectUrl : String | | SpringUrlRedirect.java:63:30:63:76 | format(...) | semmle.label | format(...) | @@ -62,17 +62,17 @@ nodes | SpringUrlRedirect.java:100:37:100:47 | httpHeaders | semmle.label | httpHeaders | | SpringUrlRedirect.java:104:39:104:56 | redirectUrl : String | semmle.label | redirectUrl : String | | SpringUrlRedirect.java:106:9:106:19 | httpHeaders [post update] : HttpHeaders | semmle.label | httpHeaders [post update] : HttpHeaders | -| SpringUrlRedirect.java:106:9:106:19 | httpHeaders [post update] [, ] : String | semmle.label | httpHeaders [post update] [, ] : String | +| SpringUrlRedirect.java:106:9:106:19 | httpHeaders [post update] : HttpHeaders [, ] : String | semmle.label | httpHeaders [post update] : HttpHeaders [, ] : String | | SpringUrlRedirect.java:106:37:106:47 | redirectUrl : String | semmle.label | redirectUrl : String | | SpringUrlRedirect.java:108:68:108:78 | httpHeaders | semmle.label | httpHeaders | | SpringUrlRedirect.java:112:39:112:56 | redirectUrl : String | semmle.label | redirectUrl : String | | SpringUrlRedirect.java:114:9:114:19 | httpHeaders [post update] : HttpHeaders | semmle.label | httpHeaders [post update] : HttpHeaders | -| SpringUrlRedirect.java:114:9:114:19 | httpHeaders [post update] [, ] : String | semmle.label | httpHeaders [post update] [, ] : String | +| SpringUrlRedirect.java:114:9:114:19 | httpHeaders [post update] : HttpHeaders [, ] : String | semmle.label | httpHeaders [post update] : HttpHeaders [, ] : String | | SpringUrlRedirect.java:114:37:114:47 | redirectUrl : String | semmle.label | redirectUrl : String | | SpringUrlRedirect.java:116:37:116:47 | httpHeaders | semmle.label | httpHeaders | | SpringUrlRedirect.java:120:33:120:50 | redirectUrl : String | semmle.label | redirectUrl : String | | SpringUrlRedirect.java:122:9:122:19 | httpHeaders [post update] : HttpHeaders | semmle.label | httpHeaders [post update] : HttpHeaders | -| SpringUrlRedirect.java:122:9:122:19 | httpHeaders [post update] [, ] : String | semmle.label | httpHeaders [post update] [, ] : String | +| SpringUrlRedirect.java:122:9:122:19 | httpHeaders [post update] : HttpHeaders [, ] : String | semmle.label | httpHeaders [post update] : HttpHeaders [, ] : String | | SpringUrlRedirect.java:122:37:122:47 | redirectUrl : String | semmle.label | redirectUrl : String | | SpringUrlRedirect.java:124:49:124:59 | httpHeaders | semmle.label | httpHeaders | | SpringUrlRedirect.java:128:33:128:50 | redirectUrl : String | semmle.label | redirectUrl : String | diff --git a/java/ql/test/ext/TestModels/Test.java b/java/ql/test/ext/TestModels/Test.java index 021047bb5e2..83efd12e967 100644 --- a/java/ql/test/ext/TestModels/Test.java +++ b/java/ql/test/ext/TestModels/Test.java @@ -93,7 +93,7 @@ public class Test { sink(sj1.add((CharSequence)source())); // $hasTaintFlow StringJoiner sj2 = (StringJoiner)source(); - sink(sj2.add("test")); // $hasTaintFlow + sink(sj2.add("test")); // $hasValueFlow } // top 300-500 JDK APIs tests diff --git a/java/ql/test/kotlin/library-tests/dataflow/extensionMethod/test.ql b/java/ql/test/kotlin/library-tests/dataflow/extensionMethod/test.ql index f30061c4f59..269d55bd3e7 100644 --- a/java/ql/test/kotlin/library-tests/dataflow/extensionMethod/test.ql +++ b/java/ql/test/kotlin/library-tests/dataflow/extensionMethod/test.ql @@ -1,18 +1,16 @@ import java import semmle.code.java.dataflow.TaintTracking -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:extension-method" } - - override predicate isSource(DataFlow::Node n) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("taint") } - override predicate isSink(DataFlow::Node n) { - n.asExpr().(Argument).getCall().getCallee().hasName("sink") - } + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } } -from DataFlow::Node src, DataFlow::Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/kotlin/library-tests/dataflow/foreach/test.ql b/java/ql/test/kotlin/library-tests/dataflow/foreach/test.ql index 1b0dc06d7b7..269d55bd3e7 100644 --- a/java/ql/test/kotlin/library-tests/dataflow/foreach/test.ql +++ b/java/ql/test/kotlin/library-tests/dataflow/foreach/test.ql @@ -1,18 +1,16 @@ import java import semmle.code.java.dataflow.TaintTracking -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:foreach-array-iterator" } - - override predicate isSource(DataFlow::Node n) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("taint") } - override predicate isSink(DataFlow::Node n) { - n.asExpr().(Argument).getCall().getCallee().hasName("sink") - } + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } } -from DataFlow::Node src, DataFlow::Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/kotlin/library-tests/dataflow/func/test.ql b/java/ql/test/kotlin/library-tests/dataflow/func/test.ql index d9753998114..671c27dd684 100644 --- a/java/ql/test/kotlin/library-tests/dataflow/func/test.ql +++ b/java/ql/test/kotlin/library-tests/dataflow/func/test.ql @@ -1,18 +1,14 @@ import java import semmle.code.java.dataflow.TaintTracking -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:lambdaFlow" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") } - override predicate isSource(DataFlow::Node n) { - n.asExpr().(MethodAccess).getMethod().hasName("taint") - } - - override predicate isSink(DataFlow::Node n) { - n.asExpr().(Argument).getCall().getCallee().hasName("sink") - } + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } } -from DataFlow::Node src, DataFlow::Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/kotlin/library-tests/dataflow/notnullexpr/test.ql b/java/ql/test/kotlin/library-tests/dataflow/notnullexpr/test.ql index 36fae98724c..671c27dd684 100644 --- a/java/ql/test/kotlin/library-tests/dataflow/notnullexpr/test.ql +++ b/java/ql/test/kotlin/library-tests/dataflow/notnullexpr/test.ql @@ -1,18 +1,14 @@ import java import semmle.code.java.dataflow.TaintTracking -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:notNullExprFlow" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") } - override predicate isSource(DataFlow::Node n) { - n.asExpr().(MethodAccess).getMethod().hasName("taint") - } - - override predicate isSink(DataFlow::Node n) { - n.asExpr().(Argument).getCall().getCallee().hasName("sink") - } + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } } -from DataFlow::Node src, DataFlow::Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/kotlin/library-tests/dataflow/stmtexpr/test.ql b/java/ql/test/kotlin/library-tests/dataflow/stmtexpr/test.ql index dbda8992f34..c0420a73fd6 100644 --- a/java/ql/test/kotlin/library-tests/dataflow/stmtexpr/test.ql +++ b/java/ql/test/kotlin/library-tests/dataflow/stmtexpr/test.ql @@ -1,18 +1,16 @@ import java import semmle.code.java.dataflow.DataFlow -class Conf extends DataFlow::Configuration { - Conf() { this = "qltest:exprStmtFlow" } - - override predicate isSource(DataFlow::Node n) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(ClassInstanceExpr).getType().(RefType).getASupertype*().hasName("Source") } - override predicate isSink(DataFlow::Node n) { - n.asExpr().(Argument).getCall().getCallee().hasName("sink") - } + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } } -from DataFlow::Node src, DataFlow::Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/kotlin/library-tests/dataflow/taint/test.ql b/java/ql/test/kotlin/library-tests/dataflow/taint/test.ql index ec65598757f..671c27dd684 100644 --- a/java/ql/test/kotlin/library-tests/dataflow/taint/test.ql +++ b/java/ql/test/kotlin/library-tests/dataflow/taint/test.ql @@ -1,18 +1,14 @@ import java import semmle.code.java.dataflow.TaintTracking -class Conf extends TaintTracking::Configuration { - Conf() { this = "kttaintconf" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") } - override predicate isSource(DataFlow::Node n) { - n.asExpr().(MethodAccess).getMethod().hasName("taint") - } - - override predicate isSink(DataFlow::Node n) { - n.asExpr().(Argument).getCall().getCallee().hasName("sink") - } + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } } -from DataFlow::Node src, DataFlow::Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/kotlin/library-tests/dataflow/whenexpr/test.ql b/java/ql/test/kotlin/library-tests/dataflow/whenexpr/test.ql index 36fae98724c..671c27dd684 100644 --- a/java/ql/test/kotlin/library-tests/dataflow/whenexpr/test.ql +++ b/java/ql/test/kotlin/library-tests/dataflow/whenexpr/test.ql @@ -1,18 +1,14 @@ import java import semmle.code.java.dataflow.TaintTracking -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:notNullExprFlow" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") } - override predicate isSource(DataFlow::Node n) { - n.asExpr().(MethodAccess).getMethod().hasName("taint") - } - - override predicate isSink(DataFlow::Node n) { - n.asExpr().(Argument).getCall().getCallee().hasName("sink") - } + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } } -from DataFlow::Node src, DataFlow::Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/kotlin/library-tests/field-initializer-flow/test.ql b/java/ql/test/kotlin/library-tests/field-initializer-flow/test.ql index aeb2c5d5bbc..7d42aebe7fb 100644 --- a/java/ql/test/kotlin/library-tests/field-initializer-flow/test.ql +++ b/java/ql/test/kotlin/library-tests/field-initializer-flow/test.ql @@ -1,20 +1,20 @@ import java import semmle.code.java.dataflow.DataFlow -class Config extends DataFlow::Configuration { - Config() { this = "Config" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(StringLiteral).getValue() = "Source" } - override predicate isSource(DataFlow::Node n) { n.asExpr().(StringLiteral).getValue() = "Source" } - - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().getName() = "sink" } } +module Flow = DataFlow::Global; + query predicate isFinalField(Field f) { exists(FieldDeclaration f2 | f = f2.getAField()) and f.isFinal() } from DataFlow::Node source, DataFlow::Node sink -where any(Config c).hasFlow(source, sink) +where Flow::flow(source, sink) select source, sink diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads_flow/test.ql b/java/ql/test/kotlin/library-tests/jvmoverloads_flow/test.ql index 05bdca7b7c9..34ab6146dc1 100644 --- a/java/ql/test/kotlin/library-tests/jvmoverloads_flow/test.ql +++ b/java/ql/test/kotlin/library-tests/jvmoverloads_flow/test.ql @@ -1,18 +1,18 @@ import java import semmle.code.java.dataflow.DataFlow -class Config extends DataFlow::Configuration { - Config() { this = "config" } - - override predicate isSource(DataFlow::Node n) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getCallee().getName() = "source" } - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().getName() = "sink" } } -from Config c, DataFlow::Node source, DataFlow::Node sink -where c.hasFlow(source, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node source, DataFlow::Node sink +where Flow::flow(source, sink) select source, sink, source.getEnclosingCallable() diff --git a/java/ql/test/kotlin/library-tests/parameter-defaults/flowTest.ql b/java/ql/test/kotlin/library-tests/parameter-defaults/flowTest.ql index 28151ecdc85..da0fc33464b 100644 --- a/java/ql/test/kotlin/library-tests/parameter-defaults/flowTest.ql +++ b/java/ql/test/kotlin/library-tests/parameter-defaults/flowTest.ql @@ -12,21 +12,21 @@ class ShouldBeSunk extends StringLiteral { } } -class Config extends DataFlow::Configuration { - Config() { this = "Config" } - - override predicate isSource(DataFlow::Node n) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr() instanceof ShouldBeSunk or n.asExpr() instanceof ShouldNotBeSunk } - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().getName() = "sink" } } +module Flow = DataFlow::Global; + predicate isSunk(StringLiteral sl) { - exists(Config c, DataFlow::Node source | c.hasFlow(source, _) and sl = source.asExpr()) + exists(DataFlow::Node source | Flow::flow(source, _) and sl = source.asExpr()) } query predicate shouldBeSunkButIsnt(ShouldBeSunk src) { not isSunk(src) } diff --git a/java/ql/test/kotlin/library-tests/super-method-calls/test.ql b/java/ql/test/kotlin/library-tests/super-method-calls/test.ql index 9a628624c91..c1903d21996 100644 --- a/java/ql/test/kotlin/library-tests/super-method-calls/test.ql +++ b/java/ql/test/kotlin/library-tests/super-method-calls/test.ql @@ -1,18 +1,18 @@ import java import semmle.code.java.dataflow.DataFlow -class Config extends DataFlow::Configuration { - Config() { this = "abc" } - - override predicate isSource(DataFlow::Node n) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().getName() = "source" } - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().getName() = "sink" } } -from Config c, DataFlow::Node n1, DataFlow::Node n2 -where c.hasFlow(n1, n2) +module Flow = DataFlow::Global; + +from DataFlow::Node n1, DataFlow::Node n2 +where Flow::flow(n1, n2) select n1, n2 diff --git a/java/ql/test/kotlin/library-tests/vararg/dataflow.ql b/java/ql/test/kotlin/library-tests/vararg/dataflow.ql index c4e60e6115d..b898bfb3aff 100644 --- a/java/ql/test/kotlin/library-tests/vararg/dataflow.ql +++ b/java/ql/test/kotlin/library-tests/vararg/dataflow.ql @@ -1,18 +1,18 @@ import java import semmle.code.java.dataflow.DataFlow -class Config extends DataFlow::Configuration { - Config() { this = "varargs-dataflow-test" } - - override predicate isSource(DataFlow::Node n) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(CompileTimeConstantExpr).getEnclosingCallable().fromSource() } - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { n.asExpr() = any(MethodAccess ma | ma.getMethod().getName() = "sink").getAnArgument() } } -from DataFlow::Node source, DataFlow::Node sink, Config c -where c.hasFlow(source, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node source, DataFlow::Node sink +where Flow::flow(source, sink) select source, sink diff --git a/java/ql/test/library-tests/dataflow/call-sensitivity/flow.ql b/java/ql/test/library-tests/dataflow/call-sensitivity/flow.ql index b4e9d3cb353..155280c415a 100644 --- a/java/ql/test/library-tests/dataflow/call-sensitivity/flow.ql +++ b/java/ql/test/library-tests/dataflow/call-sensitivity/flow.ql @@ -4,14 +4,12 @@ import java import semmle.code.java.dataflow.DataFlow -import DataFlow::PathGraph +import Flow::PathGraph -class Conf extends DataFlow::Configuration { - Conf() { this = "CallSensitiveFlowConf" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ClassInstanceExpr } - override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ClassInstanceExpr } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodAccess ma | ma.getMethod().hasName("sink") and ma.getAnArgument() = sink.asExpr() @@ -19,6 +17,8 @@ class Conf extends DataFlow::Configuration { } } -from DataFlow::PathNode source, DataFlow::PathNode sink, Conf conf -where conf.hasFlowPath(source, sink) +module Flow = DataFlow::Global; + +from Flow::PathNode source, Flow::PathNode sink +where Flow::flowPath(source, sink) select source, source, sink, "$@", sink, sink.toString() diff --git a/java/ql/test/library-tests/dataflow/callback-dispatch/test.ql b/java/ql/test/library-tests/dataflow/callback-dispatch/test.ql index cadd07c6f41..131d0a5706d 100644 --- a/java/ql/test/library-tests/dataflow/callback-dispatch/test.ql +++ b/java/ql/test/library-tests/dataflow/callback-dispatch/test.ql @@ -2,18 +2,16 @@ import java import semmle.code.java.dataflow.DataFlow import TestUtilities.InlineExpectationsTest -class Conf extends DataFlow::Configuration { - Conf() { this = "qltest:callback-dispatch" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("source") } - override predicate isSource(DataFlow::Node n) { - n.asExpr().(MethodAccess).getMethod().hasName("source") - } - - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) } } +module Flow = DataFlow::Global; + class HasFlowTest extends InlineExpectationsTest { HasFlowTest() { this = "HasFlowTest" } @@ -21,7 +19,7 @@ class HasFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "flow" and - exists(DataFlow::Node src, DataFlow::Node sink, Conf conf | conf.hasFlow(src, sink) | + exists(DataFlow::Node src, DataFlow::Node sink | Flow::flow(src, sink) | sink.getLocation() = location and element = sink.toString() and value = src.asExpr().(MethodAccess).getAnArgument().toString() diff --git a/java/ql/test/library-tests/dataflow/capture/test.ql b/java/ql/test/library-tests/dataflow/capture/test.ql index 989094c520d..448bb030583 100644 --- a/java/ql/test/library-tests/dataflow/capture/test.ql +++ b/java/ql/test/library-tests/dataflow/capture/test.ql @@ -1,17 +1,16 @@ import java import semmle.code.java.dataflow.DataFlow -import DataFlow StringLiteral src() { result.getCompilationUnit().fromSource() } -class Conf extends Configuration { - Conf() { this = "qq capture" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr() = src() } - override predicate isSource(Node n) { n.asExpr() = src() } - - override predicate isSink(Node n) { any() } + predicate isSink(DataFlow::Node n) { any() } } -from Node src, Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/library-tests/dataflow/collections/flow.ql b/java/ql/test/library-tests/dataflow/collections/flow.ql index e485725250d..a1dbcd7b38b 100644 --- a/java/ql/test/library-tests/dataflow/collections/flow.ql +++ b/java/ql/test/library-tests/dataflow/collections/flow.ql @@ -1,10 +1,8 @@ import java import semmle.code.java.dataflow.TaintTracking -class Conf extends TaintTracking::Configuration { - Conf() { this = "conf" } - - override predicate isSource(DataFlow::Node src) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { ( src.asExpr().(VarAccess).getVariable().hasName("tainted") or @@ -14,7 +12,7 @@ class Conf extends TaintTracking::Configuration { ) } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodAccess ma | sink.asExpr() = ma.getAnArgument() and ma.getMethod().hasName("sink") @@ -25,6 +23,8 @@ class Conf extends TaintTracking::Configuration { } } -from Conf c, DataFlow::Node src, DataFlow::Node sink -where c.hasFlow(src, sink) +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/library-tests/dataflow/entrypoint-types/EntryPointTypesTest.ql b/java/ql/test/library-tests/dataflow/entrypoint-types/EntryPointTypesTest.ql index 7f3afb75a2e..5a0ca1865c1 100644 --- a/java/ql/test/library-tests/dataflow/entrypoint-types/EntryPointTypesTest.ql +++ b/java/ql/test/library-tests/dataflow/entrypoint-types/EntryPointTypesTest.ql @@ -8,16 +8,16 @@ class TestRemoteFlowSource extends RemoteFlowSource { override string getSourceType() { result = "test" } } -class TaintFlowConf extends TaintTracking::Configuration { - TaintFlowConf() { this = "qltest:dataflow:entrypoint-types-taint" } +module TaintFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node n) { n instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) } } +module TaintFlow = TaintTracking::Global; + class HasFlowTest extends InlineExpectationsTest { HasFlowTest() { this = "HasFlowTest" } @@ -25,7 +25,7 @@ class HasFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "hasTaintFlow" and - exists(DataFlow::Node sink, TaintFlowConf conf | conf.hasFlowTo(sink) | + exists(DataFlow::Node sink | TaintFlow::flowTo(sink) | sink.getLocation() = location and element = sink.toString() and value = "" diff --git a/java/ql/test/library-tests/dataflow/fields/flow.ql b/java/ql/test/library-tests/dataflow/fields/flow.ql index 02a3f7e3adb..39c5c0273ee 100644 --- a/java/ql/test/library-tests/dataflow/fields/flow.ql +++ b/java/ql/test/library-tests/dataflow/fields/flow.ql @@ -1,12 +1,10 @@ import java import semmle.code.java.dataflow.DataFlow -class Conf extends DataFlow::Configuration { - Conf() { this = "FieldFlowConf" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ClassInstanceExpr } - override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ClassInstanceExpr } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodAccess ma | ma.getMethod().hasName("sink") and ma.getAnArgument() = sink.asExpr() @@ -14,6 +12,8 @@ class Conf extends DataFlow::Configuration { } } -from DataFlow::Node src, DataFlow::Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/library-tests/dataflow/lambda/flow.ql b/java/ql/test/library-tests/dataflow/lambda/flow.ql index dc8d1c7d4b0..ea4ad906086 100644 --- a/java/ql/test/library-tests/dataflow/lambda/flow.ql +++ b/java/ql/test/library-tests/dataflow/lambda/flow.ql @@ -1,16 +1,14 @@ import java import semmle.code.java.dataflow.TaintTracking -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest lambda" } - - override predicate isSource(DataFlow::Node src) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src.asExpr().(VarAccess).getVariable().hasName("args") or src.asExpr().(MethodAccess).getMethod().hasName("source") } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { sink.asExpr().(Argument).getCall() = any(MethodAccess ma | ma.getMethod().hasName("exec") and @@ -19,6 +17,8 @@ class Conf extends TaintTracking::Configuration { } } -from DataFlow::Node src, DataFlow::Node sink, Conf c -where c.hasFlow(src, sink) +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/library-tests/dataflow/local-flow/flow.ql b/java/ql/test/library-tests/dataflow/local-flow/flow.ql index b568a1be73d..adb3e8d2dc4 100644 --- a/java/ql/test/library-tests/dataflow/local-flow/flow.ql +++ b/java/ql/test/library-tests/dataflow/local-flow/flow.ql @@ -1,14 +1,12 @@ import java import semmle.code.java.dataflow.DataFlow -class Conf extends DataFlow::Configuration { - Conf() { this = "conf" } - - override predicate isSource(DataFlow::Node src) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src.asExpr().(MethodAccess).getMethod().hasName("source") } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodAccess ma | sink.asExpr() = ma.getAnArgument() and ma.getMethod().hasName("sink") @@ -16,6 +14,8 @@ class Conf extends DataFlow::Configuration { } } -from Conf c, DataFlow::Node src, DataFlow::Node sink -where c.hasFlow(src, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/library-tests/dataflow/null/testnullflow.ql b/java/ql/test/library-tests/dataflow/null/testnullflow.ql index d0937e9c0f4..1b6ab960d31 100644 --- a/java/ql/test/library-tests/dataflow/null/testnullflow.ql +++ b/java/ql/test/library-tests/dataflow/null/testnullflow.ql @@ -1,14 +1,14 @@ import java import semmle.code.java.dataflow.DataFlow -class Conf extends DataFlow::Configuration { - Conf() { this = "qqconf" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr() instanceof NullLiteral } - override predicate isSource(DataFlow::Node n) { n.asExpr() instanceof NullLiteral } - - override predicate isSink(DataFlow::Node n) { any() } + predicate isSink(DataFlow::Node n) { any() } } -from Conf conf, DataFlow::Node src, DataFlow::Node sink -where conf.hasFlow(src, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/library-tests/dataflow/partial/test.expected b/java/ql/test/library-tests/dataflow/partial/test.expected index c3376cfa5ef..0b3cebcb18b 100644 --- a/java/ql/test/library-tests/dataflow/partial/test.expected +++ b/java/ql/test/library-tests/dataflow/partial/test.expected @@ -1,11 +1,11 @@ edges | A.java:4:16:4:18 | this [post update] [elem] | A.java:22:17:22:25 | new Box(...) [elem] | -| A.java:12:5:12:5 | b [post update] [elem] | A.java:13:12:13:12 | b [elem] | -| A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:5 | b [post update] [elem] | +| A.java:12:5:12:5 | b [post update] : Box [elem] | A.java:13:12:13:12 | b : Box [elem] | +| A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:5 | b [post update] : Box [elem] | | A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:18 | ...=... : Object | -| A.java:13:12:13:12 | b [elem] | A.java:17:13:17:16 | f1(...) [elem] | -| A.java:17:13:17:16 | f1(...) [elem] | A.java:18:8:18:8 | b [elem] | -| A.java:18:8:18:8 | b [elem] | A.java:21:11:21:15 | b [elem] | +| A.java:13:12:13:12 | b : Box [elem] | A.java:17:13:17:16 | f1(...) : Box [elem] | +| A.java:17:13:17:16 | f1(...) : Box [elem] | A.java:18:8:18:8 | b : Box [elem] | +| A.java:18:8:18:8 | b : Box [elem] | A.java:21:11:21:15 | b : Box [elem] | | A.java:22:17:22:25 | new Box(...) [elem] | A.java:23:13:23:17 | other [elem] | | A.java:23:13:23:17 | other [elem] | A.java:24:10:24:14 | other [elem] | | A.java:23:13:23:17 | other [post update] [elem] | A.java:24:10:24:14 | other [elem] | @@ -13,9 +13,9 @@ edges | A.java:28:5:28:5 | b [post update] [elem] | A.java:23:13:23:17 | other [post update] [elem] | | A.java:28:14:28:25 | new Object(...) | A.java:28:5:28:5 | b [post update] [elem] | #select -| 0 | A.java:12:5:12:5 | b [post update] [elem] | +| 0 | A.java:12:5:12:5 | b [post update] : Box [elem] | | 0 | A.java:12:5:12:18 | ...=... : Object | -| 0 | A.java:13:12:13:12 | b [elem] | -| 1 | A.java:17:13:17:16 | f1(...) [elem] | -| 1 | A.java:18:8:18:8 | b [elem] | -| 2 | A.java:21:11:21:15 | b [elem] | +| 0 | A.java:13:12:13:12 | b : Box [elem] | +| 1 | A.java:17:13:17:16 | f1(...) : Box [elem] | +| 1 | A.java:18:8:18:8 | b : Box [elem] | +| 2 | A.java:21:11:21:15 | b : Box [elem] | diff --git a/java/ql/test/library-tests/dataflow/partial/testRev.expected b/java/ql/test/library-tests/dataflow/partial/testRev.expected index 4c43e79cc81..bd44f641276 100644 --- a/java/ql/test/library-tests/dataflow/partial/testRev.expected +++ b/java/ql/test/library-tests/dataflow/partial/testRev.expected @@ -1,11 +1,11 @@ edges | A.java:4:16:4:18 | this [post update] [elem] | A.java:22:17:22:25 | new Box(...) [elem] | -| A.java:12:5:12:5 | b [post update] [elem] | A.java:13:12:13:12 | b [elem] | -| A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:5 | b [post update] [elem] | +| A.java:12:5:12:5 | b [post update] : Box [elem] | A.java:13:12:13:12 | b : Box [elem] | +| A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:5 | b [post update] : Box [elem] | | A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:18 | ...=... : Object | -| A.java:13:12:13:12 | b [elem] | A.java:17:13:17:16 | f1(...) [elem] | -| A.java:17:13:17:16 | f1(...) [elem] | A.java:18:8:18:8 | b [elem] | -| A.java:18:8:18:8 | b [elem] | A.java:21:11:21:15 | b [elem] | +| A.java:13:12:13:12 | b : Box [elem] | A.java:17:13:17:16 | f1(...) : Box [elem] | +| A.java:17:13:17:16 | f1(...) : Box [elem] | A.java:18:8:18:8 | b : Box [elem] | +| A.java:18:8:18:8 | b : Box [elem] | A.java:21:11:21:15 | b : Box [elem] | | A.java:22:17:22:25 | new Box(...) [elem] | A.java:23:13:23:17 | other [elem] | | A.java:23:13:23:17 | other [elem] | A.java:24:10:24:14 | other [elem] | | A.java:23:13:23:17 | other [post update] [elem] | A.java:24:10:24:14 | other [elem] | diff --git a/java/ql/test/library-tests/dataflow/records/test.ql b/java/ql/test/library-tests/dataflow/records/test.ql index 3ce69be095e..7d1e315efea 100644 --- a/java/ql/test/library-tests/dataflow/records/test.ql +++ b/java/ql/test/library-tests/dataflow/records/test.ql @@ -1,15 +1,14 @@ import java import semmle.code.java.dataflow.DataFlow -import DataFlow -class Conf extends Configuration { - Conf() { this = "qqconf" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("source") } - override predicate isSource(Node n) { n.asExpr().(MethodAccess).getMethod().hasName("source") } - - override predicate isSink(Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } } -from Conf conf, Node src, Node sink -where conf.hasFlow(src, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/library-tests/dataflow/switchexpr/switchexprflow.ql b/java/ql/test/library-tests/dataflow/switchexpr/switchexprflow.ql index 2a6f2cc12b8..c9cb216feea 100644 --- a/java/ql/test/library-tests/dataflow/switchexpr/switchexprflow.ql +++ b/java/ql/test/library-tests/dataflow/switchexpr/switchexprflow.ql @@ -1,15 +1,14 @@ import java import semmle.code.java.dataflow.DataFlow -import DataFlow -class Conf extends Configuration { - Conf() { this = "qqconf" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("source") } - override predicate isSource(Node n) { n.asExpr().(MethodAccess).getMethod().hasName("source") } - - override predicate isSink(Node n) { any() } + predicate isSink(DataFlow::Node n) { any() } } -from Conf c, Node sink -where c.hasFlow(_, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node sink +where Flow::flowTo(sink) select sink diff --git a/java/ql/test/library-tests/dataflow/taint-ioutils/dataFlow.ql b/java/ql/test/library-tests/dataflow/taint-ioutils/dataFlow.ql index 7ecf221b9fd..d4ce44f38ab 100644 --- a/java/ql/test/library-tests/dataflow/taint-ioutils/dataFlow.ql +++ b/java/ql/test/library-tests/dataflow/taint-ioutils/dataFlow.ql @@ -2,14 +2,14 @@ import semmle.code.java.dataflow.DataFlow import semmle.code.java.dataflow.TaintTracking import semmle.code.java.dataflow.FlowSources -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:dataflow:ioutils" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof UserInput } - override predicate isSource(DataFlow::Node source) { source instanceof UserInput } - - override predicate isSink(DataFlow::Node sink) { any() } + predicate isSink(DataFlow::Node sink) { any() } } -from UserInput u, DataFlow::Node e, Conf config -where config.hasFlow(u, e) and e.getEnclosingCallable().hasName("ioutils") +module Flow = TaintTracking::Global; + +from UserInput u, DataFlow::Node e +where Flow::flow(u, e) and e.getEnclosingCallable().hasName("ioutils") select e diff --git a/java/ql/test/library-tests/dataflow/taint/StringJoinerTests.java b/java/ql/test/library-tests/dataflow/taint/StringJoinerTests.java new file mode 100644 index 00000000000..a44fe56ca2e --- /dev/null +++ b/java/ql/test/library-tests/dataflow/taint/StringJoinerTests.java @@ -0,0 +1,92 @@ +import java.util.StringJoiner; + +public class StringJoinerTests { + + Object taint() { + return null; + } + + void sink(Object o) {} + + public void test() throws Exception { + { + // "java.util;StringJoiner;false;StringJoiner;(CharSequence);;Argument[0];Argument[-1];taint;manual" + StringJoiner out = null; + CharSequence in = (CharSequence) taint(); + out = new StringJoiner(in); + sink(out); + } + { + // "java.util;StringJoiner;false;StringJoiner;(CharSequence,CharSequence,CharSequence);;Argument[0];Argument[-1];taint;manual" + StringJoiner out = null; + CharSequence in = (CharSequence) taint(); + out = new StringJoiner(in, null, null); + sink(out); + } + { + // "java.util;StringJoiner;false;StringJoiner;(CharSequence,CharSequence,CharSequence);;Argument[1];Argument[-1];taint;manual" + StringJoiner out = null; + CharSequence in = (CharSequence) taint(); + out = new StringJoiner(null, in, null); + sink(out); + } + { + // "java.util;StringJoiner;false;StringJoiner;(CharSequence,CharSequence,CharSequence);;Argument[2];Argument[-1];taint;manual" + StringJoiner out = null; + CharSequence in = (CharSequence) taint(); + out = new StringJoiner(null, null, in); + sink(out); + } + { + // "java.util;StringJoiner;false;add;;;Argument[-1];ReturnValue;value;manual" + StringJoiner out = null; + StringJoiner in = (StringJoiner) taint(); + out = in.add(null); + sink(out); + } + { + // "java.util;StringJoiner;false;add;;;Argument[0];Argument[-1];taint;manual" + StringJoiner out = null; + CharSequence in = (CharSequence) taint(); + out.add(in); + sink(out); + } + { + // "java.util;StringJoiner;false;merge;;;Argument[-1];ReturnValue;value;manual" + StringJoiner out = null; + StringJoiner in = (StringJoiner) taint(); + out = in.merge(null); + sink(out); + } + { + // "java.util;StringJoiner;false;merge;;;Argument[0];Argument[-1];taint;manual" + StringJoiner out = null; + StringJoiner in = (StringJoiner) taint(); + out.merge(in); + sink(out); + } + { + // "java.util;StringJoiner;false;setEmptyValue;;;Argument[-1];ReturnValue;taint;manual" + StringJoiner out = null; + StringJoiner in = (StringJoiner) taint(); + out = in.setEmptyValue(null); + sink(out); + } + { + // "java.util;StringJoiner;false;setEmptyValue;;;Argument[0];Argument[-1];taint;manual" + StringJoiner out = null; + CharSequence in = (CharSequence) taint(); + out.setEmptyValue(in); + sink(out); + } + { + // "java.util;StringJoiner;false;toString;;;Argument[-1];ReturnValue;taint;manual" + String out = null; + StringJoiner in = (StringJoiner) taint(); + out = in.toString(); + sink(out); + } + + } + +} diff --git a/java/ql/test/library-tests/dataflow/taint/test.expected b/java/ql/test/library-tests/dataflow/taint/test.expected index aee1744af9b..1c00372e3dd 100644 --- a/java/ql/test/library-tests/dataflow/taint/test.expected +++ b/java/ql/test/library-tests/dataflow/taint/test.expected @@ -71,6 +71,17 @@ | StringBuilderTests.java:70:15:70:21 | taint(...) | StringBuilderTests.java:73:10:73:26 | new String(...) | | StringBuilderTests.java:79:15:79:21 | taint(...) | StringBuilderTests.java:80:10:80:40 | toString(...) | | StringBuilderTests.java:86:15:86:21 | taint(...) | StringBuilderTests.java:87:10:87:27 | substring(...) | +| StringJoinerTests.java:15:37:15:43 | taint(...) | StringJoinerTests.java:17:9:17:11 | out | +| StringJoinerTests.java:22:37:22:43 | taint(...) | StringJoinerTests.java:24:9:24:11 | out | +| StringJoinerTests.java:29:37:29:43 | taint(...) | StringJoinerTests.java:31:9:31:11 | out | +| StringJoinerTests.java:36:37:36:43 | taint(...) | StringJoinerTests.java:38:9:38:11 | out | +| StringJoinerTests.java:43:37:43:43 | taint(...) | StringJoinerTests.java:45:9:45:11 | out | +| StringJoinerTests.java:50:37:50:43 | taint(...) | StringJoinerTests.java:52:9:52:11 | out | +| StringJoinerTests.java:57:37:57:43 | taint(...) | StringJoinerTests.java:59:9:59:11 | out | +| StringJoinerTests.java:64:37:64:43 | taint(...) | StringJoinerTests.java:66:9:66:11 | out | +| StringJoinerTests.java:71:37:71:43 | taint(...) | StringJoinerTests.java:73:9:73:11 | out | +| StringJoinerTests.java:78:37:78:43 | taint(...) | StringJoinerTests.java:80:9:80:11 | out | +| StringJoinerTests.java:85:37:85:43 | taint(...) | StringJoinerTests.java:87:9:87:11 | out | | Varargs.java:7:8:7:14 | taint(...) | Varargs.java:14:10:14:10 | s | | Varargs.java:8:8:8:14 | taint(...) | Varargs.java:19:10:19:10 | s | | Varargs.java:8:17:8:23 | taint(...) | Varargs.java:19:10:19:10 | s | diff --git a/java/ql/test/library-tests/dataflow/taint/test.ql b/java/ql/test/library-tests/dataflow/taint/test.ql index 65b15fbaa4e..671c27dd684 100644 --- a/java/ql/test/library-tests/dataflow/taint/test.ql +++ b/java/ql/test/library-tests/dataflow/taint/test.ql @@ -1,18 +1,14 @@ import java import semmle.code.java.dataflow.TaintTracking -class Conf extends TaintTracking::Configuration { - Conf() { this = "qqconf" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") } - override predicate isSource(DataFlow::Node n) { - n.asExpr().(MethodAccess).getMethod().hasName("taint") - } - - override predicate isSink(DataFlow::Node n) { - n.asExpr().(Argument).getCall().getCallee().hasName("sink") - } + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } } -from DataFlow::Node src, DataFlow::Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/library-tests/dataflow/taintgettersetter/taintgettersetter.ql b/java/ql/test/library-tests/dataflow/taintgettersetter/taintgettersetter.ql index 86e176345d6..6da67a65cc3 100644 --- a/java/ql/test/library-tests/dataflow/taintgettersetter/taintgettersetter.ql +++ b/java/ql/test/library-tests/dataflow/taintgettersetter/taintgettersetter.ql @@ -1,25 +1,24 @@ import java import semmle.code.java.dataflow.DataFlow -import DataFlow -class Conf extends Configuration { - Conf() { this = "taintgettersetter" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") } - override predicate isSource(Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") } - - override predicate isSink(Node n) { + predicate isSink(DataFlow::Node n) { exists(MethodAccess sink | sink.getAnArgument() = n.asExpr() and sink.getMethod().hasName("sink") ) } - override predicate isAdditionalFlowStep(Node n1, Node n2) { + predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { exists(AddExpr add | add.getType() instanceof TypeString and add.getAnOperand() = n1.asExpr() and n2.asExpr() = add ) } } -from Node src, Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = DataFlow::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/library-tests/dataflow/taintreturn/taintreturn.ql b/java/ql/test/library-tests/dataflow/taintreturn/taintreturn.ql index 4d264ac6f28..46400b5ab45 100644 --- a/java/ql/test/library-tests/dataflow/taintreturn/taintreturn.ql +++ b/java/ql/test/library-tests/dataflow/taintreturn/taintreturn.ql @@ -1,6 +1,5 @@ import java import semmle.code.java.dataflow.TaintTracking -import DataFlow predicate step(Expr e1, Expr e2) { exists(MethodAccess ma | @@ -17,28 +16,35 @@ predicate isSink0(Expr sink) { ) } -class Conf1 extends Configuration { - Conf1() { this = "testconf1" } +module FirstConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("src") } - override predicate isSource(Node n) { n.asExpr().(MethodAccess).getMethod().hasName("src") } + predicate isSink(DataFlow::Node n) { any() } - override predicate isSink(Node n) { any() } - - override predicate isAdditionalFlowStep(Node n1, Node n2) { step(n1.asExpr(), n2.asExpr()) } + predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { + step(n1.asExpr(), n2.asExpr()) + } } -class Conf2 extends Configuration { - Conf2() { this = "testconf2" } +module FirstFlow = DataFlow::Global; - override predicate isSource(Node n) { n.asExpr().(MethodAccess).getMethod().hasName("src") } +module SecondConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("src") } - override predicate isSink(Node n) { isSink0(n.asExpr()) } + predicate isSink(DataFlow::Node n) { isSink0(n.asExpr()) } - override predicate isAdditionalFlowStep(Node n1, Node n2) { step(n1.asExpr(), n2.asExpr()) } + predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { + step(n1.asExpr(), n2.asExpr()) + } } +module SecondFlow = DataFlow::Global; + from int i1, int i2 where - i1 = count(Node src, Node sink, Conf1 c | c.hasFlow(src, sink) and isSink0(sink.asExpr())) and - i2 = count(Node src, Node sink, Conf2 c | c.hasFlow(src, sink)) + i1 = + count(DataFlow::Node src, DataFlow::Node sink | + FirstFlow::flow(src, sink) and isSink0(sink.asExpr()) + ) and + i2 = count(DataFlow::Node src, DataFlow::Node sink | SecondFlow::flow(src, sink)) select i1, i2 diff --git a/java/ql/test/library-tests/dataflow/taintsources/local.ql b/java/ql/test/library-tests/dataflow/taintsources/local.ql index 37dc93f03ad..a174629ca6e 100644 --- a/java/ql/test/library-tests/dataflow/taintsources/local.ql +++ b/java/ql/test/library-tests/dataflow/taintsources/local.ql @@ -10,22 +10,22 @@ predicate isTestSink(DataFlow::Node n) { exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) } -class LocalValueConf extends DataFlow::Configuration { - LocalValueConf() { this = "LocalValueConf" } +module LocalValueConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n instanceof LocalSource } - override predicate isSource(DataFlow::Node n) { n instanceof LocalSource } - - override predicate isSink(DataFlow::Node n) { isTestSink(n) } + predicate isSink(DataFlow::Node n) { isTestSink(n) } } -class LocalTaintConf extends TaintTracking::Configuration { - LocalTaintConf() { this = "LocalTaintConf" } +module LocalValueFlow = DataFlow::Global; - override predicate isSource(DataFlow::Node n) { n instanceof LocalSource } +module LocalTaintConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n instanceof LocalSource } - override predicate isSink(DataFlow::Node n) { isTestSink(n) } + predicate isSink(DataFlow::Node n) { isTestSink(n) } } +module LocalTaintFlow = TaintTracking::Global; + class LocalFlowTest extends InlineExpectationsTest { LocalFlowTest() { this = "LocalFlowTest" } @@ -33,7 +33,7 @@ class LocalFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "hasLocalValueFlow" and - exists(DataFlow::Node sink | any(LocalValueConf c).hasFlowTo(sink) | + exists(DataFlow::Node sink | LocalValueFlow::flowTo(sink) | sink.getLocation() = location and element = sink.toString() and value = "" @@ -41,7 +41,7 @@ class LocalFlowTest extends InlineExpectationsTest { or tag = "hasLocalTaintFlow" and exists(DataFlow::Node src, DataFlow::Node sink | - any(LocalTaintConf c).hasFlow(src, sink) and not any(LocalValueConf c).hasFlow(src, sink) + LocalTaintFlow::flow(src, sink) and not LocalValueFlow::flow(src, sink) | sink.getLocation() = location and element = sink.toString() and diff --git a/java/ql/test/library-tests/dataflow/taintsources/remote.ql b/java/ql/test/library-tests/dataflow/taintsources/remote.ql index d8a3be41537..fa1f206ca74 100644 --- a/java/ql/test/library-tests/dataflow/taintsources/remote.ql +++ b/java/ql/test/library-tests/dataflow/taintsources/remote.ql @@ -6,22 +6,22 @@ predicate isTestSink(DataFlow::Node n) { exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) } -class RemoteValueConf extends DataFlow::Configuration { - RemoteValueConf() { this = "RemoteValueConf" } +module RemoteValueConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node n) { n instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node n) { isTestSink(n) } + predicate isSink(DataFlow::Node n) { isTestSink(n) } } -class RemoteTaintConf extends TaintTracking::Configuration { - RemoteTaintConf() { this = "RemoteTaintConf" } +module RemoteValueFlow = DataFlow::Global; - override predicate isSource(DataFlow::Node n) { n instanceof RemoteFlowSource } +module RemoteTaintConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n instanceof RemoteFlowSource } - override predicate isSink(DataFlow::Node n) { isTestSink(n) } + predicate isSink(DataFlow::Node n) { isTestSink(n) } } +module RemoteTaintFlow = TaintTracking::Global; + class RemoteFlowTest extends InlineExpectationsTest { RemoteFlowTest() { this = "RemoteFlowTest" } @@ -29,7 +29,7 @@ class RemoteFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "hasRemoteValueFlow" and - exists(DataFlow::Node sink | any(RemoteValueConf c).hasFlowTo(sink) | + exists(DataFlow::Node sink | RemoteValueFlow::flowTo(sink) | sink.getLocation() = location and element = sink.toString() and value = "" @@ -37,7 +37,7 @@ class RemoteFlowTest extends InlineExpectationsTest { or tag = "hasRemoteTaintFlow" and exists(DataFlow::Node src, DataFlow::Node sink | - any(RemoteTaintConf c).hasFlow(src, sink) and not any(RemoteValueConf c).hasFlow(src, sink) + RemoteTaintFlow::flow(src, sink) and not RemoteValueFlow::flow(src, sink) | sink.getLocation() = location and element = sink.toString() and diff --git a/java/ql/test/library-tests/dataflow/this-flow/this-flow.ql b/java/ql/test/library-tests/dataflow/this-flow/this-flow.ql index 481cb2108d9..aa7811d07eb 100644 --- a/java/ql/test/library-tests/dataflow/this-flow/this-flow.ql +++ b/java/ql/test/library-tests/dataflow/this-flow/this-flow.ql @@ -1,19 +1,18 @@ import java import semmle.code.java.dataflow.DataFlow -import DataFlow -class ThisFlowConfig extends Configuration { - ThisFlowConfig() { this = "ThisFlowConfig" } - - override predicate isSource(Node src) { - exists(PostUpdateNode cie | cie.asExpr() instanceof ClassInstanceExpr | +module ThisFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { + exists(DataFlow::PostUpdateNode cie | cie.asExpr() instanceof ClassInstanceExpr | cie.getPreUpdateNode() = src or cie = src ) } - override predicate isSink(Node sink) { any() } + predicate isSink(DataFlow::Node sink) { any() } } -from Node n, ThisFlowConfig conf -where conf.hasFlow(_, n) +module ThisFlow = DataFlow::Global; + +from DataFlow::Node n +where ThisFlow::flowTo(n) select n diff --git a/java/ql/test/library-tests/dataflow/typepruning/test.ql b/java/ql/test/library-tests/dataflow/typepruning/test.ql index c86476afeed..018a4f428fe 100644 --- a/java/ql/test/library-tests/dataflow/typepruning/test.ql +++ b/java/ql/test/library-tests/dataflow/typepruning/test.ql @@ -2,18 +2,16 @@ import java import semmle.code.java.dataflow.DataFlow import DataFlow -class Conf extends Configuration { - Conf() { this = "test types" } +module Config implements DataFlow::ConfigSig { + predicate isSource(Node n) { n.asExpr().(MethodAccess).getMethod().hasName("source") } - override predicate isSource(Node n) { n.asExpr().(MethodAccess).getMethod().hasName("source") } - - override predicate isSink(Node n) { + predicate isSink(Node n) { exists(MethodAccess sink | sink.getAnArgument() = n.asExpr() and sink.getMethod().hasName("sink") ) } - override predicate isAdditionalFlowStep(Node n1, Node n2) { + predicate isAdditionalFlowStep(Node n1, Node n2) { exists(MethodAccess ma | ma.getMethod().hasName("customStep") and ma.getAnArgument() = n1.asExpr() and @@ -22,6 +20,8 @@ class Conf extends Configuration { } } -from Node src, Node sink, Conf conf -where conf.hasFlow(src, sink) +module Flow = DataFlow::Global; + +from Node src, Node sink +where Flow::flow(src, sink) select src, sink, sink.getEnclosingCallable() diff --git a/java/ql/test/library-tests/frameworks/JaxWs/JaxRsFlow.ql b/java/ql/test/library-tests/frameworks/JaxWs/JaxRsFlow.ql index dcfe48d08bb..d0ab4274b12 100644 --- a/java/ql/test/library-tests/frameworks/JaxWs/JaxRsFlow.ql +++ b/java/ql/test/library-tests/frameworks/JaxWs/JaxRsFlow.ql @@ -3,22 +3,26 @@ import semmle.code.java.dataflow.TaintTracking import semmle.code.java.dataflow.FlowSources import TestUtilities.InlineFlowTest -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { + DefaultFlowConfig::isSource(node) + or + node instanceof RemoteFlowSource + } + + predicate isSink = DefaultFlowConfig::isSink/1; } -class TaintFlowConf extends DefaultTaintFlowConf { - override predicate isSource(DataFlow::Node n) { - super.isSource(n) - or - n instanceof RemoteFlowSource - } -} +module TaintFlow = TaintTracking::Global; -class ValueFlowConf extends DefaultValueFlowConf { - override predicate isSource(DataFlow::Node n) { - super.isSource(n) - or - n instanceof RemoteFlowSource +module ValueFlow = DataFlow::Global; + +class Test extends InlineFlowTest { + override predicate hasTaintFlow(DataFlow::Node source, DataFlow::Node sink) { + TaintFlow::flow(source, sink) + } + + override predicate hasValueFlow(DataFlow::Node source, DataFlow::Node sink) { + ValueFlow::flow(source, sink) } } diff --git a/java/ql/test/library-tests/frameworks/android/content-provider/test.ql b/java/ql/test/library-tests/frameworks/android/content-provider/test.ql index a88702a206f..f068b30b0d5 100644 --- a/java/ql/test/library-tests/frameworks/android/content-provider/test.ql +++ b/java/ql/test/library-tests/frameworks/android/content-provider/test.ql @@ -2,14 +2,20 @@ import java import semmle.code.java.dataflow.FlowSources import TestUtilities.InlineFlowTest -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } +module ProviderTaintFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n instanceof RemoteFlowSource } + + predicate isSink(DataFlow::Node n) { DefaultFlowConfig::isSink(n) } + + int fieldFlowBranchLimit() { result = DefaultFlowConfig::fieldFlowBranchLimit() } } -class ProviderTaintFlowConf extends DefaultTaintFlowConf { - override predicate isSource(DataFlow::Node n) { n instanceof RemoteFlowSource } -} +module ProviderTaintFlow = TaintTracking::Global; class ProviderInlineFlowTest extends InlineFlowTest { - override DataFlow::Configuration getValueFlowConfig() { none() } + override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } + + override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { + ProviderTaintFlow::flow(src, sink) + } } diff --git a/java/ql/test/library-tests/frameworks/android/external-storage/test.ql b/java/ql/test/library-tests/frameworks/android/external-storage/test.ql index e7d5ae7e44b..c73c0a5c6c9 100644 --- a/java/ql/test/library-tests/frameworks/android/external-storage/test.ql +++ b/java/ql/test/library-tests/frameworks/android/external-storage/test.ql @@ -3,22 +3,18 @@ import semmle.code.java.dataflow.DataFlow import semmle.code.java.dataflow.FlowSources import TestUtilities.InlineFlowTest -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } -} +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource } -class Conf extends TaintTracking::Configuration { - Conf() { this = "test:AndroidExternalFlowConf" } - - override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { sink.asExpr().(Argument).getCall().getCallee().hasName("sink") } } -class ExternalStorageTest extends InlineFlowTest { - override DataFlow::Configuration getValueFlowConfig() { none() } +module Flow = TaintTracking::Global; - override DataFlow::Configuration getTaintFlowConfig() { result instanceof Conf } +class ExternalStorageTest extends InlineFlowTest { + override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } + + override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { Flow::flow(src, sink) } } diff --git a/java/ql/test/library-tests/frameworks/android/slice/test.ql b/java/ql/test/library-tests/frameworks/android/slice/test.ql index 5274c08ccdd..b3c5fe78094 100644 --- a/java/ql/test/library-tests/frameworks/android/slice/test.ql +++ b/java/ql/test/library-tests/frameworks/android/slice/test.ql @@ -1,22 +1,37 @@ import java +import semmle.code.java.dataflow.TaintTracking import TestUtilities.InlineFlowTest import semmle.code.java.dataflow.FlowSources -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } -} - -class SliceValueFlowConf extends DefaultValueFlowConf { - override predicate isSource(DataFlow::Node source) { - super.isSource(source) or source instanceof RemoteFlowSource +module SliceValueFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + DefaultFlowConfig::isSource(source) or source instanceof RemoteFlowSource } + + predicate isSink = DefaultFlowConfig::isSink/1; } -class SliceTaintFlowConf extends DefaultTaintFlowConf { - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - super.allowImplicitRead(node, c) - or - isSink(node) and +module SliceValueFlow = DataFlow::Global; + +module SliceTaintFlowConfig implements DataFlow::ConfigSig { + predicate isSource = DefaultFlowConfig::isSource/1; + + predicate isSink = DefaultFlowConfig::isSink/1; + + predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { + DefaultFlowConfig::isSink(node) and c.(DataFlow::SyntheticFieldContent).getField() = "androidx.slice.Slice.action" } } + +module SliceTaintFlow = TaintTracking::Global; + +class SliceFlowTest extends InlineFlowTest { + override predicate hasValueFlow(DataFlow::Node source, DataFlow::Node sink) { + SliceValueFlow::flow(source, sink) + } + + override predicate hasTaintFlow(DataFlow::Node source, DataFlow::Node sink) { + SliceTaintFlow::flow(source, sink) + } +} diff --git a/java/ql/test/library-tests/frameworks/android/sources/OnActivityResultSourceTest.ql b/java/ql/test/library-tests/frameworks/android/sources/OnActivityResultSourceTest.ql index 682442b3dfc..64c0f48ffa6 100644 --- a/java/ql/test/library-tests/frameworks/android/sources/OnActivityResultSourceTest.ql +++ b/java/ql/test/library-tests/frameworks/android/sources/OnActivityResultSourceTest.ql @@ -2,14 +2,20 @@ import java import semmle.code.java.dataflow.FlowSources import TestUtilities.InlineFlowTest -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } +module SourceValueFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource } + + predicate isSink(DataFlow::Node sink) { DefaultFlowConfig::isSink(sink) } + + int fieldFlowBranchLimit() { result = DefaultFlowConfig::fieldFlowBranchLimit() } } -class SourceValueFlowConf extends DefaultValueFlowConf { - override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource } -} +module SourceValueFlow = DataFlow::Global; class SourceInlineFlowTest extends InlineFlowTest { - override DataFlow::Configuration getTaintFlowConfig() { none() } + override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { + SourceValueFlow::flow(src, sink) + } + + override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { none() } } diff --git a/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.ql b/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.ql index f94074649ec..5bbe2cab89c 100644 --- a/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.ql +++ b/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.ql @@ -4,16 +4,16 @@ import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.QueryInjection import TestUtilities.InlineExpectationsTest -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:dataflow:android::flow" } - - override predicate isSource(DataFlow::Node source) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source.asExpr().(MethodAccess).getMethod().hasName("taint") } - override predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(ReturnStmt r).getResult() } + predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(ReturnStmt r).getResult() } } +module Flow = TaintTracking::Global; + class FlowStepTest extends InlineExpectationsTest { FlowStepTest() { this = "FlowStepTest" } @@ -22,8 +22,7 @@ class FlowStepTest extends InlineExpectationsTest { override predicate hasActualResult(Location l, string element, string tag, string value) { tag = "taintReachesReturn" and value = "" and - exists(Conf conf, DataFlow::Node source | - conf.hasFlow(source, _) and + exists(DataFlow::Node source | Flow::flow(source, _) | l = source.getLocation() and element = source.toString() ) diff --git a/java/ql/test/library-tests/frameworks/android/taint-database/sinks.ql b/java/ql/test/library-tests/frameworks/android/taint-database/sinks.ql index fd1dbad3b02..234b7ca74b0 100644 --- a/java/ql/test/library-tests/frameworks/android/taint-database/sinks.ql +++ b/java/ql/test/library-tests/frameworks/android/taint-database/sinks.ql @@ -4,16 +4,16 @@ import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.QueryInjection import TestUtilities.InlineExpectationsTest -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:dataflow:android::flow" } - - override predicate isSource(DataFlow::Node source) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source.asExpr().(MethodAccess).getMethod().hasName("taint") } - override predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } + predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } } +module Flow = TaintTracking::Global; + class SinkTest extends InlineExpectationsTest { SinkTest() { this = "SinkTest" } @@ -22,8 +22,7 @@ class SinkTest extends InlineExpectationsTest { override predicate hasActualResult(Location l, string element, string tag, string value) { tag = "taintReachesSink" and value = "" and - exists(Conf conf, DataFlow::Node source | - conf.hasFlow(source, _) and + exists(DataFlow::Node source | Flow::flow(source, _) | l = source.getLocation() and element = source.toString() ) diff --git a/java/ql/test/library-tests/frameworks/apache-http/flow.ql b/java/ql/test/library-tests/frameworks/apache-http/flow.ql index ac350ec6eb9..20069103a4a 100644 --- a/java/ql/test/library-tests/frameworks/apache-http/flow.ql +++ b/java/ql/test/library-tests/frameworks/apache-http/flow.ql @@ -5,20 +5,14 @@ import semmle.code.java.security.XSS import semmle.code.java.security.UrlRedirect import TestUtilities.InlineFlowTest -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } -} - -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:frameworks:apache-http" } - - override predicate isSource(DataFlow::Node n) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") or n instanceof RemoteFlowSource } - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) or n instanceof XssSink @@ -27,8 +21,10 @@ class Conf extends TaintTracking::Configuration { } } -class HasFlowTest extends InlineFlowTest { - override DataFlow::Configuration getValueFlowConfig() { none() } +module Flow = TaintTracking::Global; - override DataFlow::Configuration getTaintFlowConfig() { result = any(Conf c) } +class HasFlowTest extends InlineFlowTest { + override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } + + override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { Flow::flow(src, sink) } } diff --git a/java/ql/test/library-tests/frameworks/guava/handwritten/flow.ql b/java/ql/test/library-tests/frameworks/guava/handwritten/flow.ql index 956de3612db..fbfc56486f8 100644 --- a/java/ql/test/library-tests/frameworks/guava/handwritten/flow.ql +++ b/java/ql/test/library-tests/frameworks/guava/handwritten/flow.ql @@ -2,32 +2,28 @@ import java import semmle.code.java.dataflow.TaintTracking import TestUtilities.InlineExpectationsTest -class TaintFlowConf extends TaintTracking::Configuration { - TaintFlowConf() { this = "qltest:frameworks:guava-taint" } +module TaintFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") } - override predicate isSource(DataFlow::Node n) { - n.asExpr().(MethodAccess).getMethod().hasName("taint") - } - - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) } } -class ValueFlowConf extends DataFlow::Configuration { - ValueFlowConf() { this = "qltest:frameworks:guava-value" } +module TaintFlow = TaintTracking::Global; - override predicate isSource(DataFlow::Node n) { - n.asExpr().(MethodAccess).getMethod().hasName("taint") - } +module ValueFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") } - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) } - override int fieldFlowBranchLimit() { result = 100 } + int fieldFlowBranchLimit() { result = 100 } } +module ValueFlow = DataFlow::Global; + class HasFlowTest extends InlineExpectationsTest { HasFlowTest() { this = "HasFlowTest" } @@ -35,22 +31,20 @@ class HasFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "numTaintFlow" and - exists(DataFlow::Node src, DataFlow::Node sink, TaintFlowConf tconf, int num | - tconf.hasFlow(src, sink) - | - not any(ValueFlowConf vconf).hasFlow(src, sink) and + exists(DataFlow::Node src, DataFlow::Node sink, int num | TaintFlow::flow(src, sink) | + not ValueFlow::flow(src, sink) and value = num.toString() and sink.getLocation() = location and element = sink.toString() and - num = strictcount(DataFlow::Node src2 | tconf.hasFlow(src2, sink)) + num = strictcount(DataFlow::Node src2 | TaintFlow::flow(src2, sink)) ) or tag = "numValueFlow" and - exists(DataFlow::Node sink, ValueFlowConf vconf, int num | vconf.hasFlowTo(sink) | + exists(DataFlow::Node sink, int num | ValueFlow::flowTo(sink) | value = num.toString() and sink.getLocation() = location and element = sink.toString() and - num = strictcount(DataFlow::Node src2 | vconf.hasFlow(src2, sink)) + num = strictcount(DataFlow::Node src2 | ValueFlow::flow(src2, sink)) ) } } diff --git a/java/ql/test/library-tests/frameworks/guice/flow.ql b/java/ql/test/library-tests/frameworks/guice/flow.ql index eb41b078132..e8e58e6cbb8 100644 --- a/java/ql/test/library-tests/frameworks/guice/flow.ql +++ b/java/ql/test/library-tests/frameworks/guice/flow.ql @@ -2,12 +2,10 @@ import java import semmle.code.java.dataflow.FlowSources import semmle.code.java.dataflow.TaintTracking -class Conf extends TaintTracking::Configuration { - Conf() { this = "conf" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodAccess ma | sink.asExpr() = ma.getAnArgument() and ma.getMethod().hasName("sink") @@ -16,6 +14,8 @@ class Conf extends TaintTracking::Configuration { } } -from Conf c, DataFlow::Node src, DataFlow::Node sink -where c.hasFlow(src, sink) +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) select src, sink diff --git a/java/ql/test/library-tests/frameworks/jms/FlowTest.ql b/java/ql/test/library-tests/frameworks/jms/FlowTest.ql index 386d22e4951..3644b87e6d3 100644 --- a/java/ql/test/library-tests/frameworks/jms/FlowTest.ql +++ b/java/ql/test/library-tests/frameworks/jms/FlowTest.ql @@ -2,18 +2,18 @@ import java import semmle.code.java.dataflow.FlowSources import TestUtilities.InlineExpectationsTest -class TestConfig extends TaintTracking::Configuration { - TestConfig() { this = "TestConfig" } +module TestConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(MethodAccess call | call.getMethod().hasName("sink") and call.getArgument(0) = sink.asExpr() ) } } +module TestFlow = TaintTracking::Global; + class JmsFlowTest extends InlineExpectationsTest { JmsFlowTest() { this = "JmsFlowTest" } @@ -21,7 +21,7 @@ class JmsFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "tainted" and - exists(DataFlow::PathNode sink, TestConfig conf | conf.hasFlowPath(_, sink) | + exists(TestFlow::PathNode sink | TestFlow::flowPath(_, sink) | location = sink.getNode().getLocation() and element = sink.getNode().toString() and value = "" ) } diff --git a/java/ql/test/library-tests/frameworks/netty/generated/Test.java b/java/ql/test/library-tests/frameworks/netty/generated/Test.java index ab38ecbe53c..8f8a3e6994c 100644 --- a/java/ql/test/library-tests/frameworks/netty/generated/Test.java +++ b/java/ql/test/library-tests/frameworks/netty/generated/Test.java @@ -6106,20 +6106,6 @@ public class Test { out = in.getUri(); sink(out); // $ hasTaintFlow } - { - // "io.netty.handler.codec.http;HttpRequest;true;setUri;;;Argument[0];Argument[-1];taint;manual" - FullHttpRequest out = null; - String in = (String)source(); - out.setUri(in); - sink(out); // $ hasTaintFlow - } - { - // "io.netty.handler.codec.http;HttpRequest;true;setUri;;;Argument[0];Argument[-1];taint;manual" - HttpRequest out = null; - String in = (String)source(); - out.setUri(in); - sink(out); // $ hasTaintFlow - } { // "io.netty.handler.codec.http;HttpRequest;true;uri;;;Argument[-1];ReturnValue;taint;manual" String out = null; @@ -7892,4 +7878,4 @@ public class Test { } -} \ No newline at end of file +} diff --git a/java/ql/test/library-tests/frameworks/netty/manual/test.ql b/java/ql/test/library-tests/frameworks/netty/manual/test.ql index 1f707c18e10..111db20f792 100644 --- a/java/ql/test/library-tests/frameworks/netty/manual/test.ql +++ b/java/ql/test/library-tests/frameworks/netty/manual/test.ql @@ -1,15 +1,22 @@ import java +import semmle.code.java.dataflow.DataFlow import semmle.code.java.dataflow.FlowSources import TestUtilities.InlineFlowTest -class Conf extends DefaultTaintFlowConf { - override predicate isSource(DataFlow::Node node) { - super.isSource(node) +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { + DefaultFlowConfig::isSource(node) or node instanceof RemoteFlowSource } + + predicate isSink = DefaultFlowConfig::isSink/1; } -class LegacyConfig extends EnableLegacyConfiguration { - LegacyConfig() { this instanceof Unit } +module Flow = TaintTracking::Global; + +class Test extends InlineFlowTest { + override predicate hasTaintFlow(DataFlow::Node source, DataFlow::Node sink) { + Flow::flow(source, sink) + } } diff --git a/java/ql/test/library-tests/frameworks/okhttp/test.ql b/java/ql/test/library-tests/frameworks/okhttp/test.ql index 063f6dc4fe8..2992a519e64 100644 --- a/java/ql/test/library-tests/frameworks/okhttp/test.ql +++ b/java/ql/test/library-tests/frameworks/okhttp/test.ql @@ -1,10 +1,17 @@ import java +import semmle.code.java.dataflow.DataFlow import TestUtilities.InlineFlowTest -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } +module OkHttpFlowConfig implements DataFlow::ConfigSig { + predicate isSource = DefaultFlowConfig::isSource/1; + + predicate isSink(DataFlow::Node n) { DefaultFlowConfig::isSink(n) or sinkNode(n, "open-url") } } -class FlowConf extends DefaultValueFlowConf { - override predicate isSink(DataFlow::Node n) { super.isSink(n) or sinkNode(n, "open-url") } +module OkHttpFlow = DataFlow::Global; + +class OkHttpTest extends InlineFlowTest { + override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { + OkHttpFlow::flow(src, sink) + } } diff --git a/java/ql/test/library-tests/frameworks/rabbitmq/FlowTest.ql b/java/ql/test/library-tests/frameworks/rabbitmq/FlowTest.ql index 6e200ffa201..47cc6b07ad2 100644 --- a/java/ql/test/library-tests/frameworks/rabbitmq/FlowTest.ql +++ b/java/ql/test/library-tests/frameworks/rabbitmq/FlowTest.ql @@ -3,22 +3,18 @@ import semmle.code.java.dataflow.TaintTracking import semmle.code.java.dataflow.FlowSources import TestUtilities.InlineFlowTest -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } -} +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { node instanceof RemoteFlowSource } -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:frameworks:rabbitmq" } - - override predicate isSource(DataFlow::Node node) { node instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node node) { + predicate isSink(DataFlow::Node node) { exists(MethodAccess ma | ma.getMethod().hasName("sink") | node.asExpr() = ma.getAnArgument()) } } -class HasFlowTest extends InlineFlowTest { - override DataFlow::Configuration getValueFlowConfig() { none() } +module Flow = TaintTracking::Global; - override DataFlow::Configuration getTaintFlowConfig() { result = any(Conf c) } +class HasFlowTest extends InlineFlowTest { + override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } + + override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { Flow::flow(src, sink) } } diff --git a/java/ql/test/library-tests/frameworks/ratpack/flow.ql b/java/ql/test/library-tests/frameworks/ratpack/flow.ql index d499d727d98..dae21e78f7c 100644 --- a/java/ql/test/library-tests/frameworks/ratpack/flow.ql +++ b/java/ql/test/library-tests/frameworks/ratpack/flow.ql @@ -1,33 +1,26 @@ import java import semmle.code.java.dataflow.TaintTracking import semmle.code.java.dataflow.FlowSources -import TestUtilities.InlineExpectationsTest +import TestUtilities.InlineFlowTest -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:frameworks:ratpack" } - - override predicate isSource(DataFlow::Node n) { +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodAccess).getMethod().hasName("taint") or n instanceof RemoteFlowSource } - override predicate isSink(DataFlow::Node n) { + predicate isSink(DataFlow::Node n) { exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) } } -class HasFlowTest extends InlineExpectationsTest { +module Flow = TaintTracking::Global; + +class HasFlowTest extends InlineFlowTest { HasFlowTest() { this = "HasFlowTest" } - override string getARelevantTag() { result = "hasTaintFlow" } + override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } - override predicate hasActualResult(Location location, string element, string tag, string value) { - tag = "hasTaintFlow" and - exists(DataFlow::Node sink, Conf conf | conf.hasFlowTo(sink) | - sink.getLocation() = location and - element = sink.toString() and - value = "" - ) - } + override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { Flow::flow(src, sink) } } diff --git a/java/ql/test/library-tests/frameworks/retrofit/test.ql b/java/ql/test/library-tests/frameworks/retrofit/test.ql index 063f6dc4fe8..5db5201aad0 100644 --- a/java/ql/test/library-tests/frameworks/retrofit/test.ql +++ b/java/ql/test/library-tests/frameworks/retrofit/test.ql @@ -1,10 +1,15 @@ import java +import semmle.code.java.dataflow.DataFlow import TestUtilities.InlineFlowTest -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } +module FlowConfig implements DataFlow::ConfigSig { + predicate isSource = DefaultFlowConfig::isSource/1; + + predicate isSink(DataFlow::Node n) { DefaultFlowConfig::isSink(n) or sinkNode(n, "open-url") } } -class FlowConf extends DefaultValueFlowConf { - override predicate isSink(DataFlow::Node n) { super.isSink(n) or sinkNode(n, "open-url") } +module Flow = DataFlow::Global; + +class RetrofitFlowTest extends InlineFlowTest { + override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { Flow::flow(src, sink) } } diff --git a/java/ql/test/library-tests/frameworks/spring/controller/test.ql b/java/ql/test/library-tests/frameworks/spring/controller/test.ql index bfd5384454b..b6beb8e1e75 100644 --- a/java/ql/test/library-tests/frameworks/spring/controller/test.ql +++ b/java/ql/test/library-tests/frameworks/spring/controller/test.ql @@ -2,20 +2,18 @@ import java import semmle.code.java.dataflow.FlowSources import TestUtilities.InlineFlowTest -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } -} +module ValueFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } -class ValueFlowConf extends DataFlow::Configuration { - ValueFlowConf() { this = "ValueFlowConf" } - - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { sink.asExpr().(Argument).getCall().getCallee().hasName("sink") } } +module ValueFlow = DataFlow::Global; + class Test extends InlineFlowTest { - override DataFlow::Configuration getValueFlowConfig() { result = any(ValueFlowConf config) } + override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { + ValueFlow::flow(src, sink) + } } diff --git a/java/ql/test/library-tests/frameworks/spring/util/Test.java b/java/ql/test/library-tests/frameworks/spring/util/Test.java index 913d96ebe3e..ac59cd33f3e 100644 --- a/java/ql/test/library-tests/frameworks/spring/util/Test.java +++ b/java/ql/test/library-tests/frameworks/spring/util/Test.java @@ -380,20 +380,6 @@ public class Test { FileCopyUtils.copy(in, out); sink(out); // $hasTaintFlow } - { - // "org.springframework.util;FileCopyUtils;false;copy;;;Argument[0];Argument[1];taint;manual" - File out = null; - byte[] in = (byte[])source(); - FileCopyUtils.copy(in, out); - sink(out); // $hasTaintFlow - } - { - // "org.springframework.util;FileCopyUtils;false;copy;;;Argument[0];Argument[1];taint;manual" - File out = null; - File in = (File)source(); - FileCopyUtils.copy(in, out); - sink(out); // $hasTaintFlow - } { // "org.springframework.util;FileCopyUtils;false;copyToByteArray;;;Argument[0];ReturnValue;taint;manual" byte[] out = null; diff --git a/java/ql/test/library-tests/pathsanitizer/test.ql b/java/ql/test/library-tests/pathsanitizer/test.ql index bea3af839a1..cefce3276e6 100644 --- a/java/ql/test/library-tests/pathsanitizer/test.ql +++ b/java/ql/test/library-tests/pathsanitizer/test.ql @@ -2,18 +2,20 @@ import java import semmle.code.java.security.PathSanitizer import TestUtilities.InlineFlowTest -class EnableLegacy extends EnableLegacyConfiguration { - EnableLegacy() { exists(this) } +module PathSanitizerConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { DefaultFlowConfig::isSource(source) } + + predicate isSink(DataFlow::Node sink) { DefaultFlowConfig::isSink(sink) } + + predicate isBarrier(DataFlow::Node sanitizer) { sanitizer instanceof PathInjectionSanitizer } } -class PathSanitizerConf extends DefaultTaintFlowConf { - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof PathInjectionSanitizer - } -} +module PathSanitizerFlow = TaintTracking::Global; class Test extends InlineFlowTest { - override DataFlow::Configuration getValueFlowConfig() { none() } + override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } - override DataFlow::Configuration getTaintFlowConfig() { result = any(PathSanitizerConf config) } + override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { + PathSanitizerFlow::flow(src, sink) + } } diff --git a/java/ql/test/queries.xml b/java/ql/test/queries.xml deleted file mode 100644 index 0d33187fe86..00000000000 --- a/java/ql/test/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/AbstractStringBuilder.java b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/AbstractStringBuilder.java index 8f17bde04db..06cdc2c35e9 100644 --- a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/AbstractStringBuilder.java +++ b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/AbstractStringBuilder.java @@ -7,8 +7,8 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence { public char charAt(int p0){ return '0'; } // manual summary public int length(){ return 0; } // manual neutral - public void setCharAt(int p0, char p1){} // manual neutral, Note: not currently counted by query due to exclusions in `TargetApiSpecific` - public void setLength(int p0){} // manual neutral, Note: not currently counted by query due to exclusions in `TargetApiSpecific` + public void setCharAt(int p0, char p1){} // manual neutral + public void setLength(int p0){} // manual neutral public AbstractStringBuilder append(CharSequence p0){ return null; } diff --git a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/Enum.java b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/Enum.java index 147e5ad9dbc..acb3d7a1894 100644 --- a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/Enum.java +++ b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/Enum.java @@ -7,7 +7,7 @@ import java.io.Serializable; abstract public class Enum> implements Comparable, Serializable { protected Enum() {} - protected Enum(String p0, int p1){} // manual neutral, Note: this will not be counted in query results since `protected` not `public` + protected Enum(String p0, int p1){} // manual neutral public String toString(){ return null; } // manual neutral public final String name(){ return null; } // manual neutral public final boolean equals(Object p0){ return false; } // manual neutral diff --git a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/StringBuffer.java b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/StringBuffer.java index 74016e209c1..5d90fabbf28 100644 --- a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/StringBuffer.java +++ b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/StringBuffer.java @@ -12,7 +12,4 @@ public class StringBuffer extends AbstractStringBuilder implements Serializable public StringBuffer append(char p0){ return null; } // manual summary public StringBuffer append(CharSequence s, int start, int end) { return null; } - - public void setCharAt(int p0, char p1){} - public void setLength(int p0){} } diff --git a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/StringBuilder.java b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/StringBuilder.java index 57f5b250220..48edda221fd 100644 --- a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/StringBuilder.java +++ b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/StringBuilder.java @@ -19,7 +19,4 @@ public class StringBuilder extends AbstractStringBuilder implements Serializable public StringBuilder(int p0){} // manual summary public StringBuilder append(CharSequence s, int start, int end) { return null; } - - public void setCharAt(int p0, char p1){} - public void setLength(int p0){} } diff --git a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected index d32407f4ddf..b362ef171f5 100644 --- a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected +++ b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected @@ -1,21 +1,23 @@ -| java.io | 0 | 0 | 22 | 9 | 31 | 0.7096774193548387 | 0.0 | 0.7096774193548387 | 0.0 | NaN | 0.2903225806451613 | -| java.lang | 0 | 0 | 60 | 89 | 149 | 0.40268456375838924 | 0.0 | 0.40268456375838924 | 0.0 | NaN | 0.5973154362416108 | +| java.awt | 0 | 0 | 2 | 1 | 3 | 0.6666666666666666 | 0.0 | 0.6666666666666666 | 0.0 | NaN | 0.3333333333333333 | +| java.io | 0 | 0 | 22 | 15 | 37 | 0.5945945945945946 | 0.0 | 0.5945945945945946 | 0.0 | NaN | 0.40540540540540543 | +| java.lang | 0 | 0 | 62 | 94 | 156 | 0.3974358974358974 | 0.0 | 0.3974358974358974 | 0.0 | NaN | 0.6025641025641025 | | java.lang.invoke | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.lang.reflect | 0 | 0 | 0 | 4 | 4 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.math | 0 | 0 | 0 | 16 | 16 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.net | 0 | 0 | 5 | 0 | 5 | 1.0 | 0.0 | 1.0 | 0.0 | NaN | 0.0 | | java.nio | 0 | 0 | 2 | 3 | 5 | 0.4 | 0.0 | 0.4 | 0.0 | NaN | 0.6 | | java.nio.charset | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.nio.file | 0 | 0 | 1 | 1 | 2 | 0.5 | 0.0 | 0.5 | 0.0 | NaN | 0.5 | -| java.sql | 0 | 0 | 0 | 2 | 2 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | +| java.nio.file | 0 | 0 | 7 | 1 | 8 | 0.875 | 0.0 | 0.875 | 0.0 | NaN | 0.125 | +| java.sql | 0 | 0 | 2 | 14 | 16 | 0.125 | 0.0 | 0.125 | 0.0 | NaN | 0.875 | | java.text | 0 | 0 | 0 | 5 | 5 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.time | 0 | 0 | 0 | 17 | 17 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.time.chrono | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.time.format | 0 | 0 | 0 | 2 | 2 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.util | 0 | 0 | 56 | 45 | 101 | 0.5544554455445545 | 0.0 | 0.5544554455445545 | 0.0 | NaN | 0.44554455445544555 | -| java.util.concurrent | 0 | 0 | 6 | 7 | 13 | 0.46153846153846156 | 0.0 | 0.46153846153846156 | 0.0 | NaN | 0.5384615384615384 | +| java.util | 0 | 0 | 84 | 68 | 152 | 0.5526315789473685 | 0.0 | 0.5526315789473685 | 0.0 | NaN | 0.4473684210526316 | +| java.util.concurrent | 0 | 0 | 9 | 9 | 18 | 0.5 | 0.0 | 0.5 | 0.0 | NaN | 0.5 | | java.util.concurrent.atomic | 0 | 0 | 2 | 11 | 13 | 0.15384615384615385 | 0.0 | 0.15384615384615385 | 0.0 | NaN | 0.8461538461538461 | -| java.util.function | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | +| java.util.concurrent.locks | 0 | 0 | 0 | 2 | 2 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | +| java.util.function | 0 | 0 | 0 | 6 | 6 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.util.logging | 0 | 0 | 1 | 1 | 2 | 0.5 | 0.0 | 0.5 | 0.0 | NaN | 0.5 | | java.util.regex | 0 | 0 | 3 | 1 | 4 | 0.75 | 0.0 | 0.75 | 0.0 | NaN | 0.25 | -| java.util.stream | 0 | 0 | 4 | 5 | 9 | 0.4444444444444444 | 0.0 | 0.4444444444444444 | 0.0 | NaN | 0.5555555555555556 | +| java.util.stream | 0 | 0 | 18 | 8 | 26 | 0.6923076923076923 | 0.0 | 0.6923076923076923 | 0.0 | NaN | 0.3076923076923077 | diff --git a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected index 456ec85f6cb..95a492fcd12 100644 --- a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected @@ -14,108 +14,114 @@ edges | Test.java:95:14:95:34 | getHostName(...) : String | Test.java:99:12:99:33 | new URI(...) | | Test.java:95:14:95:34 | getHostName(...) : String | Test.java:100:12:100:45 | new URI(...) | | Test.java:95:14:95:34 | getHostName(...) : String | Test.java:101:12:101:54 | new URI(...) | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:33:61:33:68 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:35:41:35:48 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:37:56:37:63 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:39:46:39:53 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:41:38:41:45 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:43:36:43:43 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:45:31:45:38 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:47:33:47:40 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:49:27:49:34 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:50:27:50:34 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:51:34:51:41 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:53:40:53:47 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:54:48:54:55 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:55:47:55:54 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:57:40:57:47 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:59:38:59:45 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:61:33:61:40 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:63:33:63:40 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:65:41:65:48 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:67:42:67:49 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:69:37:69:44 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:71:29:71:36 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:73:37:73:44 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:75:28:75:35 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:77:33:77:40 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:79:40:79:47 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:81:40:81:47 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:82:40:82:47 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:84:38:84:45 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:86:28:86:35 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:87:28:87:35 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:88:28:88:35 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:90:34:90:41 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:91:34:91:41 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:93:33:93:40 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:95:42:95:49 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:97:50:97:57 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:99:54:99:61 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:104:37:104:44 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:106:74:106:81 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:108:68:108:75 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:110:68:110:75 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:112:30:112:37 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:117:30:117:37 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:122:33:122:40 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:124:27:124:34 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:126:28:126:35 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:128:29:128:36 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:133:27:133:34 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:135:26:135:33 | source(...) : String | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:140:29:140:36 | source(...) : String | -| mad/Test.java:33:61:33:68 | source(...) : String | mad/Test.java:33:52:33:68 | (...)... | -| mad/Test.java:35:41:35:48 | source(...) : String | mad/Test.java:35:32:35:48 | (...)... | -| mad/Test.java:37:56:37:63 | source(...) : String | mad/Test.java:37:47:37:63 | (...)... | -| mad/Test.java:39:46:39:53 | source(...) : String | mad/Test.java:39:39:39:53 | (...)... | -| mad/Test.java:41:38:41:45 | source(...) : String | mad/Test.java:41:31:41:45 | (...)... | -| mad/Test.java:43:36:43:43 | source(...) : String | mad/Test.java:43:29:43:43 | (...)... | -| mad/Test.java:45:31:45:38 | source(...) : String | mad/Test.java:45:24:45:38 | (...)... | -| mad/Test.java:47:33:47:40 | source(...) : String | mad/Test.java:47:24:47:40 | (...)... | -| mad/Test.java:49:27:49:34 | source(...) : String | mad/Test.java:49:20:49:34 | (...)... | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:34:61:34:68 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:36:41:36:48 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:38:56:38:63 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:40:46:40:53 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:42:38:42:45 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:44:36:44:43 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:46:31:46:38 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:48:33:48:40 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:50:27:50:34 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:51:27:51:34 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:52:34:52:41 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:54:40:54:47 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:55:48:55:55 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:56:47:56:54 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:58:40:58:47 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:60:38:60:45 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:62:33:62:40 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:64:33:64:40 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:66:41:66:48 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:68:42:68:49 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:70:37:70:44 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:72:29:72:36 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:74:37:74:44 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:76:28:76:35 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:78:33:78:40 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:80:40:80:47 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:82:40:82:47 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:83:40:83:47 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:85:38:85:45 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:87:28:87:35 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:88:28:88:35 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:89:28:89:35 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:91:34:91:41 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:92:34:92:41 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:94:33:94:40 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:96:42:96:49 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:98:50:98:57 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:100:54:100:61 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:102:50:102:57 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:104:35:104:42 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:106:48:106:55 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:111:37:111:44 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:113:74:113:81 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:115:68:115:75 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:117:68:117:75 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:119:30:119:37 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:124:30:124:37 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:129:33:129:40 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:131:27:131:34 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:133:28:133:35 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:135:29:135:36 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:140:27:140:34 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:142:26:142:33 | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:147:29:147:36 | source(...) : String | +| mad/Test.java:34:61:34:68 | source(...) : String | mad/Test.java:34:52:34:68 | (...)... | +| mad/Test.java:36:41:36:48 | source(...) : String | mad/Test.java:36:32:36:48 | (...)... | +| mad/Test.java:38:56:38:63 | source(...) : String | mad/Test.java:38:47:38:63 | (...)... | +| mad/Test.java:40:46:40:53 | source(...) : String | mad/Test.java:40:39:40:53 | (...)... | +| mad/Test.java:42:38:42:45 | source(...) : String | mad/Test.java:42:31:42:45 | (...)... | +| mad/Test.java:44:36:44:43 | source(...) : String | mad/Test.java:44:29:44:43 | (...)... | +| mad/Test.java:46:31:46:38 | source(...) : String | mad/Test.java:46:24:46:38 | (...)... | +| mad/Test.java:48:33:48:40 | source(...) : String | mad/Test.java:48:24:48:40 | (...)... | | mad/Test.java:50:27:50:34 | source(...) : String | mad/Test.java:50:20:50:34 | (...)... | -| mad/Test.java:51:34:51:41 | source(...) : String | mad/Test.java:51:20:51:41 | (...)... | -| mad/Test.java:53:40:53:47 | source(...) : String | mad/Test.java:53:33:53:47 | (...)... | -| mad/Test.java:54:48:54:55 | source(...) : String | mad/Test.java:54:33:54:55 | (...)... | -| mad/Test.java:55:47:55:54 | source(...) : String | mad/Test.java:55:40:55:54 | (...)... | -| mad/Test.java:57:40:57:47 | source(...) : String | mad/Test.java:57:33:57:47 | (...)... | -| mad/Test.java:59:38:59:45 | source(...) : String | mad/Test.java:59:31:59:45 | (...)... | -| mad/Test.java:61:33:61:40 | source(...) : String | mad/Test.java:61:26:61:40 | (...)... | -| mad/Test.java:63:33:63:40 | source(...) : String | mad/Test.java:63:26:63:40 | (...)... | -| mad/Test.java:65:41:65:48 | source(...) : String | mad/Test.java:65:34:65:48 | (...)... | -| mad/Test.java:67:42:67:49 | source(...) : String | mad/Test.java:67:35:67:49 | (...)... | -| mad/Test.java:69:37:69:44 | source(...) : String | mad/Test.java:69:30:69:44 | (...)... | -| mad/Test.java:71:29:71:36 | source(...) : String | mad/Test.java:71:22:71:36 | (...)... | -| mad/Test.java:73:37:73:44 | source(...) : String | mad/Test.java:73:30:73:44 | (...)... | -| mad/Test.java:75:28:75:35 | source(...) : String | mad/Test.java:75:21:75:35 | (...)... | -| mad/Test.java:77:33:77:40 | source(...) : String | mad/Test.java:77:26:77:40 | (...)... | -| mad/Test.java:79:40:79:47 | source(...) : String | mad/Test.java:79:33:79:47 | (...)... | -| mad/Test.java:81:40:81:47 | source(...) : String | mad/Test.java:81:33:81:47 | (...)... | +| mad/Test.java:51:27:51:34 | source(...) : String | mad/Test.java:51:20:51:34 | (...)... | +| mad/Test.java:52:34:52:41 | source(...) : String | mad/Test.java:52:20:52:41 | (...)... | +| mad/Test.java:54:40:54:47 | source(...) : String | mad/Test.java:54:33:54:47 | (...)... | +| mad/Test.java:55:48:55:55 | source(...) : String | mad/Test.java:55:33:55:55 | (...)... | +| mad/Test.java:56:47:56:54 | source(...) : String | mad/Test.java:56:40:56:54 | (...)... | +| mad/Test.java:58:40:58:47 | source(...) : String | mad/Test.java:58:33:58:47 | (...)... | +| mad/Test.java:60:38:60:45 | source(...) : String | mad/Test.java:60:31:60:45 | (...)... | +| mad/Test.java:62:33:62:40 | source(...) : String | mad/Test.java:62:26:62:40 | (...)... | +| mad/Test.java:64:33:64:40 | source(...) : String | mad/Test.java:64:26:64:40 | (...)... | +| mad/Test.java:66:41:66:48 | source(...) : String | mad/Test.java:66:34:66:48 | (...)... | +| mad/Test.java:68:42:68:49 | source(...) : String | mad/Test.java:68:35:68:49 | (...)... | +| mad/Test.java:70:37:70:44 | source(...) : String | mad/Test.java:70:30:70:44 | (...)... | +| mad/Test.java:72:29:72:36 | source(...) : String | mad/Test.java:72:22:72:36 | (...)... | +| mad/Test.java:74:37:74:44 | source(...) : String | mad/Test.java:74:30:74:44 | (...)... | +| mad/Test.java:76:28:76:35 | source(...) : String | mad/Test.java:76:21:76:35 | (...)... | +| mad/Test.java:78:33:78:40 | source(...) : String | mad/Test.java:78:26:78:40 | (...)... | +| mad/Test.java:80:40:80:47 | source(...) : String | mad/Test.java:80:33:80:47 | (...)... | | mad/Test.java:82:40:82:47 | source(...) : String | mad/Test.java:82:33:82:47 | (...)... | -| mad/Test.java:84:38:84:45 | source(...) : String | mad/Test.java:84:31:84:45 | (...)... | -| mad/Test.java:86:28:86:35 | source(...) : String | mad/Test.java:86:21:86:35 | (...)... | +| mad/Test.java:83:40:83:47 | source(...) : String | mad/Test.java:83:33:83:47 | (...)... | +| mad/Test.java:85:38:85:45 | source(...) : String | mad/Test.java:85:31:85:45 | (...)... | | mad/Test.java:87:28:87:35 | source(...) : String | mad/Test.java:87:21:87:35 | (...)... | | mad/Test.java:88:28:88:35 | source(...) : String | mad/Test.java:88:21:88:35 | (...)... | -| mad/Test.java:90:34:90:41 | source(...) : String | mad/Test.java:90:27:90:41 | (...)... | +| mad/Test.java:89:28:89:35 | source(...) : String | mad/Test.java:89:21:89:35 | (...)... | | mad/Test.java:91:34:91:41 | source(...) : String | mad/Test.java:91:27:91:41 | (...)... | -| mad/Test.java:93:33:93:40 | source(...) : String | mad/Test.java:93:26:93:40 | (...)... | -| mad/Test.java:95:42:95:49 | source(...) : String | mad/Test.java:95:35:95:49 | (...)... | -| mad/Test.java:97:50:97:57 | source(...) : String | mad/Test.java:97:41:97:57 | (...)... | -| mad/Test.java:99:54:99:61 | source(...) : String | mad/Test.java:99:45:99:61 | (...)... | -| mad/Test.java:104:37:104:44 | source(...) : String | mad/Test.java:104:30:104:44 | (...)... | -| mad/Test.java:106:74:106:81 | source(...) : String | mad/Test.java:106:40:106:81 | (...)... | -| mad/Test.java:108:68:108:75 | source(...) : String | mad/Test.java:108:34:108:75 | (...)... | -| mad/Test.java:110:68:110:75 | source(...) : String | mad/Test.java:110:34:110:75 | (...)... | -| mad/Test.java:112:30:112:37 | source(...) : String | mad/Test.java:112:23:112:37 | (...)... | -| mad/Test.java:117:30:117:37 | source(...) : String | mad/Test.java:117:23:117:37 | (...)... | -| mad/Test.java:122:33:122:40 | source(...) : String | mad/Test.java:122:23:122:40 | (...)... | -| mad/Test.java:124:27:124:34 | source(...) : String | mad/Test.java:124:20:124:34 | (...)... | -| mad/Test.java:126:28:126:35 | source(...) : String | mad/Test.java:126:21:126:35 | (...)... | -| mad/Test.java:128:29:128:36 | source(...) : String | mad/Test.java:128:22:128:36 | (...)... | -| mad/Test.java:133:27:133:34 | source(...) : String | mad/Test.java:133:20:133:34 | (...)... | -| mad/Test.java:135:26:135:33 | source(...) : String | mad/Test.java:135:19:135:33 | (...)... | -| mad/Test.java:140:29:140:36 | source(...) : String | mad/Test.java:140:20:140:36 | (...)... | +| mad/Test.java:92:34:92:41 | source(...) : String | mad/Test.java:92:27:92:41 | (...)... | +| mad/Test.java:94:33:94:40 | source(...) : String | mad/Test.java:94:26:94:40 | (...)... | +| mad/Test.java:96:42:96:49 | source(...) : String | mad/Test.java:96:35:96:49 | (...)... | +| mad/Test.java:98:50:98:57 | source(...) : String | mad/Test.java:98:41:98:57 | (...)... | +| mad/Test.java:100:54:100:61 | source(...) : String | mad/Test.java:100:45:100:61 | (...)... | +| mad/Test.java:102:50:102:57 | source(...) : String | mad/Test.java:102:43:102:57 | (...)... | +| mad/Test.java:104:35:104:42 | source(...) : String | mad/Test.java:104:28:104:42 | (...)... | +| mad/Test.java:106:48:106:55 | source(...) : String | mad/Test.java:106:41:106:55 | (...)... | +| mad/Test.java:111:37:111:44 | source(...) : String | mad/Test.java:111:30:111:44 | (...)... | +| mad/Test.java:113:74:113:81 | source(...) : String | mad/Test.java:113:40:113:81 | (...)... | +| mad/Test.java:115:68:115:75 | source(...) : String | mad/Test.java:115:34:115:75 | (...)... | +| mad/Test.java:117:68:117:75 | source(...) : String | mad/Test.java:117:34:117:75 | (...)... | +| mad/Test.java:119:30:119:37 | source(...) : String | mad/Test.java:119:23:119:37 | (...)... | +| mad/Test.java:124:30:124:37 | source(...) : String | mad/Test.java:124:23:124:37 | (...)... | +| mad/Test.java:129:33:129:40 | source(...) : String | mad/Test.java:129:23:129:40 | (...)... | +| mad/Test.java:131:27:131:34 | source(...) : String | mad/Test.java:131:20:131:34 | (...)... | +| mad/Test.java:133:28:133:35 | source(...) : String | mad/Test.java:133:21:133:35 | (...)... | +| mad/Test.java:135:29:135:36 | source(...) : String | mad/Test.java:135:22:135:36 | (...)... | +| mad/Test.java:140:27:140:34 | source(...) : String | mad/Test.java:140:20:140:34 | (...)... | +| mad/Test.java:142:26:142:33 | source(...) : String | mad/Test.java:142:19:142:33 | (...)... | +| mad/Test.java:147:29:147:36 | source(...) : String | mad/Test.java:147:20:147:36 | (...)... | nodes | Test.java:19:18:19:38 | getHostName(...) : String | semmle.label | getHostName(...) : String | | Test.java:24:20:24:23 | temp | semmle.label | temp | @@ -136,109 +142,115 @@ nodes | Test.java:99:12:99:33 | new URI(...) | semmle.label | new URI(...) | | Test.java:100:12:100:45 | new URI(...) | semmle.label | new URI(...) | | Test.java:101:12:101:54 | new URI(...) | semmle.label | new URI(...) | -| mad/Test.java:28:16:28:36 | getHostName(...) : String | semmle.label | getHostName(...) : String | -| mad/Test.java:33:52:33:68 | (...)... | semmle.label | (...)... | -| mad/Test.java:33:61:33:68 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:35:32:35:48 | (...)... | semmle.label | (...)... | -| mad/Test.java:35:41:35:48 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:37:47:37:63 | (...)... | semmle.label | (...)... | -| mad/Test.java:37:56:37:63 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:39:39:39:53 | (...)... | semmle.label | (...)... | -| mad/Test.java:39:46:39:53 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:41:31:41:45 | (...)... | semmle.label | (...)... | -| mad/Test.java:41:38:41:45 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:43:29:43:43 | (...)... | semmle.label | (...)... | -| mad/Test.java:43:36:43:43 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:45:24:45:38 | (...)... | semmle.label | (...)... | -| mad/Test.java:45:31:45:38 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:47:24:47:40 | (...)... | semmle.label | (...)... | -| mad/Test.java:47:33:47:40 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:49:20:49:34 | (...)... | semmle.label | (...)... | -| mad/Test.java:49:27:49:34 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:29:16:29:36 | getHostName(...) : String | semmle.label | getHostName(...) : String | +| mad/Test.java:34:52:34:68 | (...)... | semmle.label | (...)... | +| mad/Test.java:34:61:34:68 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:36:32:36:48 | (...)... | semmle.label | (...)... | +| mad/Test.java:36:41:36:48 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:38:47:38:63 | (...)... | semmle.label | (...)... | +| mad/Test.java:38:56:38:63 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:40:39:40:53 | (...)... | semmle.label | (...)... | +| mad/Test.java:40:46:40:53 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:42:31:42:45 | (...)... | semmle.label | (...)... | +| mad/Test.java:42:38:42:45 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:44:29:44:43 | (...)... | semmle.label | (...)... | +| mad/Test.java:44:36:44:43 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:46:24:46:38 | (...)... | semmle.label | (...)... | +| mad/Test.java:46:31:46:38 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:48:24:48:40 | (...)... | semmle.label | (...)... | +| mad/Test.java:48:33:48:40 | source(...) : String | semmle.label | source(...) : String | | mad/Test.java:50:20:50:34 | (...)... | semmle.label | (...)... | | mad/Test.java:50:27:50:34 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:51:20:51:41 | (...)... | semmle.label | (...)... | -| mad/Test.java:51:34:51:41 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:53:33:53:47 | (...)... | semmle.label | (...)... | -| mad/Test.java:53:40:53:47 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:54:33:54:55 | (...)... | semmle.label | (...)... | -| mad/Test.java:54:48:54:55 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:55:40:55:54 | (...)... | semmle.label | (...)... | -| mad/Test.java:55:47:55:54 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:57:33:57:47 | (...)... | semmle.label | (...)... | -| mad/Test.java:57:40:57:47 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:59:31:59:45 | (...)... | semmle.label | (...)... | -| mad/Test.java:59:38:59:45 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:61:26:61:40 | (...)... | semmle.label | (...)... | -| mad/Test.java:61:33:61:40 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:63:26:63:40 | (...)... | semmle.label | (...)... | -| mad/Test.java:63:33:63:40 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:65:34:65:48 | (...)... | semmle.label | (...)... | -| mad/Test.java:65:41:65:48 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:67:35:67:49 | (...)... | semmle.label | (...)... | -| mad/Test.java:67:42:67:49 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:69:30:69:44 | (...)... | semmle.label | (...)... | -| mad/Test.java:69:37:69:44 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:71:22:71:36 | (...)... | semmle.label | (...)... | -| mad/Test.java:71:29:71:36 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:73:30:73:44 | (...)... | semmle.label | (...)... | -| mad/Test.java:73:37:73:44 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:75:21:75:35 | (...)... | semmle.label | (...)... | -| mad/Test.java:75:28:75:35 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:77:26:77:40 | (...)... | semmle.label | (...)... | -| mad/Test.java:77:33:77:40 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:79:33:79:47 | (...)... | semmle.label | (...)... | -| mad/Test.java:79:40:79:47 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:81:33:81:47 | (...)... | semmle.label | (...)... | -| mad/Test.java:81:40:81:47 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:51:20:51:34 | (...)... | semmle.label | (...)... | +| mad/Test.java:51:27:51:34 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:52:20:52:41 | (...)... | semmle.label | (...)... | +| mad/Test.java:52:34:52:41 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:54:33:54:47 | (...)... | semmle.label | (...)... | +| mad/Test.java:54:40:54:47 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:55:33:55:55 | (...)... | semmle.label | (...)... | +| mad/Test.java:55:48:55:55 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:56:40:56:54 | (...)... | semmle.label | (...)... | +| mad/Test.java:56:47:56:54 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:58:33:58:47 | (...)... | semmle.label | (...)... | +| mad/Test.java:58:40:58:47 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:60:31:60:45 | (...)... | semmle.label | (...)... | +| mad/Test.java:60:38:60:45 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:62:26:62:40 | (...)... | semmle.label | (...)... | +| mad/Test.java:62:33:62:40 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:64:26:64:40 | (...)... | semmle.label | (...)... | +| mad/Test.java:64:33:64:40 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:66:34:66:48 | (...)... | semmle.label | (...)... | +| mad/Test.java:66:41:66:48 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:68:35:68:49 | (...)... | semmle.label | (...)... | +| mad/Test.java:68:42:68:49 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:70:30:70:44 | (...)... | semmle.label | (...)... | +| mad/Test.java:70:37:70:44 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:72:22:72:36 | (...)... | semmle.label | (...)... | +| mad/Test.java:72:29:72:36 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:74:30:74:44 | (...)... | semmle.label | (...)... | +| mad/Test.java:74:37:74:44 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:76:21:76:35 | (...)... | semmle.label | (...)... | +| mad/Test.java:76:28:76:35 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:78:26:78:40 | (...)... | semmle.label | (...)... | +| mad/Test.java:78:33:78:40 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:80:33:80:47 | (...)... | semmle.label | (...)... | +| mad/Test.java:80:40:80:47 | source(...) : String | semmle.label | source(...) : String | | mad/Test.java:82:33:82:47 | (...)... | semmle.label | (...)... | | mad/Test.java:82:40:82:47 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:84:31:84:45 | (...)... | semmle.label | (...)... | -| mad/Test.java:84:38:84:45 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:86:21:86:35 | (...)... | semmle.label | (...)... | -| mad/Test.java:86:28:86:35 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:83:33:83:47 | (...)... | semmle.label | (...)... | +| mad/Test.java:83:40:83:47 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:85:31:85:45 | (...)... | semmle.label | (...)... | +| mad/Test.java:85:38:85:45 | source(...) : String | semmle.label | source(...) : String | | mad/Test.java:87:21:87:35 | (...)... | semmle.label | (...)... | | mad/Test.java:87:28:87:35 | source(...) : String | semmle.label | source(...) : String | | mad/Test.java:88:21:88:35 | (...)... | semmle.label | (...)... | | mad/Test.java:88:28:88:35 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:90:27:90:41 | (...)... | semmle.label | (...)... | -| mad/Test.java:90:34:90:41 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:89:21:89:35 | (...)... | semmle.label | (...)... | +| mad/Test.java:89:28:89:35 | source(...) : String | semmle.label | source(...) : String | | mad/Test.java:91:27:91:41 | (...)... | semmle.label | (...)... | | mad/Test.java:91:34:91:41 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:93:26:93:40 | (...)... | semmle.label | (...)... | -| mad/Test.java:93:33:93:40 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:95:35:95:49 | (...)... | semmle.label | (...)... | -| mad/Test.java:95:42:95:49 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:97:41:97:57 | (...)... | semmle.label | (...)... | -| mad/Test.java:97:50:97:57 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:99:45:99:61 | (...)... | semmle.label | (...)... | -| mad/Test.java:99:54:99:61 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:104:30:104:44 | (...)... | semmle.label | (...)... | -| mad/Test.java:104:37:104:44 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:106:40:106:81 | (...)... | semmle.label | (...)... | -| mad/Test.java:106:74:106:81 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:108:34:108:75 | (...)... | semmle.label | (...)... | -| mad/Test.java:108:68:108:75 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:110:34:110:75 | (...)... | semmle.label | (...)... | -| mad/Test.java:110:68:110:75 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:112:23:112:37 | (...)... | semmle.label | (...)... | -| mad/Test.java:112:30:112:37 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:117:23:117:37 | (...)... | semmle.label | (...)... | -| mad/Test.java:117:30:117:37 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:122:23:122:40 | (...)... | semmle.label | (...)... | -| mad/Test.java:122:33:122:40 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:124:20:124:34 | (...)... | semmle.label | (...)... | -| mad/Test.java:124:27:124:34 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:126:21:126:35 | (...)... | semmle.label | (...)... | -| mad/Test.java:126:28:126:35 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:128:22:128:36 | (...)... | semmle.label | (...)... | -| mad/Test.java:128:29:128:36 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:133:20:133:34 | (...)... | semmle.label | (...)... | -| mad/Test.java:133:27:133:34 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:135:19:135:33 | (...)... | semmle.label | (...)... | -| mad/Test.java:135:26:135:33 | source(...) : String | semmle.label | source(...) : String | -| mad/Test.java:140:20:140:36 | (...)... | semmle.label | (...)... | -| mad/Test.java:140:29:140:36 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:92:27:92:41 | (...)... | semmle.label | (...)... | +| mad/Test.java:92:34:92:41 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:94:26:94:40 | (...)... | semmle.label | (...)... | +| mad/Test.java:94:33:94:40 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:96:35:96:49 | (...)... | semmle.label | (...)... | +| mad/Test.java:96:42:96:49 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:98:41:98:57 | (...)... | semmle.label | (...)... | +| mad/Test.java:98:50:98:57 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:100:45:100:61 | (...)... | semmle.label | (...)... | +| mad/Test.java:100:54:100:61 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:102:43:102:57 | (...)... | semmle.label | (...)... | +| mad/Test.java:102:50:102:57 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:104:28:104:42 | (...)... | semmle.label | (...)... | +| mad/Test.java:104:35:104:42 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:106:41:106:55 | (...)... | semmle.label | (...)... | +| mad/Test.java:106:48:106:55 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:111:30:111:44 | (...)... | semmle.label | (...)... | +| mad/Test.java:111:37:111:44 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:113:40:113:81 | (...)... | semmle.label | (...)... | +| mad/Test.java:113:74:113:81 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:115:34:115:75 | (...)... | semmle.label | (...)... | +| mad/Test.java:115:68:115:75 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:117:34:117:75 | (...)... | semmle.label | (...)... | +| mad/Test.java:117:68:117:75 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:119:23:119:37 | (...)... | semmle.label | (...)... | +| mad/Test.java:119:30:119:37 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:124:23:124:37 | (...)... | semmle.label | (...)... | +| mad/Test.java:124:30:124:37 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:129:23:129:40 | (...)... | semmle.label | (...)... | +| mad/Test.java:129:33:129:40 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:131:20:131:34 | (...)... | semmle.label | (...)... | +| mad/Test.java:131:27:131:34 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:133:21:133:35 | (...)... | semmle.label | (...)... | +| mad/Test.java:133:28:133:35 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:135:22:135:36 | (...)... | semmle.label | (...)... | +| mad/Test.java:135:29:135:36 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:140:20:140:34 | (...)... | semmle.label | (...)... | +| mad/Test.java:140:27:140:34 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:142:19:142:33 | (...)... | semmle.label | (...)... | +| mad/Test.java:142:26:142:33 | source(...) : String | semmle.label | source(...) : String | +| mad/Test.java:147:20:147:36 | (...)... | semmle.label | (...)... | +| mad/Test.java:147:29:147:36 | source(...) : String | semmle.label | source(...) : String | subpaths #select | Test.java:24:11:24:24 | new File(...) | Test.java:19:18:19:38 | getHostName(...) : String | Test.java:24:20:24:23 | temp | This path depends on a $@. | Test.java:19:18:19:38 | getHostName(...) | user-provided value | @@ -252,54 +264,57 @@ subpaths | Test.java:99:3:99:34 | new File(...) | Test.java:95:14:95:34 | getHostName(...) : String | Test.java:99:12:99:33 | new URI(...) | This path depends on a $@. | Test.java:95:14:95:34 | getHostName(...) | user-provided value | | Test.java:100:3:100:46 | new File(...) | Test.java:95:14:95:34 | getHostName(...) : String | Test.java:100:12:100:45 | new URI(...) | This path depends on a $@. | Test.java:95:14:95:34 | getHostName(...) | user-provided value | | Test.java:101:3:101:55 | new File(...) | Test.java:95:14:95:34 | getHostName(...) : String | Test.java:101:12:101:54 | new URI(...) | This path depends on a $@. | Test.java:95:14:95:34 | getHostName(...) | user-provided value | -| mad/Test.java:33:52:33:68 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:33:52:33:68 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:35:32:35:48 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:35:32:35:48 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:37:47:37:63 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:37:47:37:63 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:39:39:39:53 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:39:39:39:53 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:41:31:41:45 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:41:31:41:45 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:43:29:43:43 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:43:29:43:43 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:45:24:45:38 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:45:24:45:38 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:47:9:47:41 | new FileReader(...) | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:47:24:47:40 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:49:20:49:34 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:49:20:49:34 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:50:20:50:34 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:50:20:50:34 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:51:20:51:41 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:51:20:51:41 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:53:33:53:47 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:53:33:53:47 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:54:33:54:55 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:54:33:54:55 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:55:40:55:54 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:55:40:55:54 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:57:33:57:47 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:57:33:57:47 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:59:31:59:45 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:59:31:59:45 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:61:26:61:40 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:61:26:61:40 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:63:26:63:40 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:63:26:63:40 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:65:34:65:48 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:65:34:65:48 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:67:35:67:49 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:67:35:67:49 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:69:30:69:44 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:69:30:69:44 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:71:22:71:36 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:71:22:71:36 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:73:30:73:44 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:73:30:73:44 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:75:21:75:35 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:75:21:75:35 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:77:26:77:40 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:77:26:77:40 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:79:33:79:47 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:79:33:79:47 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:81:33:81:47 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:81:33:81:47 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:82:33:82:47 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:82:33:82:47 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:84:31:84:45 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:84:31:84:45 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:86:21:86:35 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:86:21:86:35 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:87:21:87:35 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:87:21:87:35 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:88:21:88:35 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:88:21:88:35 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:90:27:90:41 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:90:27:90:41 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:91:27:91:41 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:91:27:91:41 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:93:26:93:40 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:93:26:93:40 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:95:35:95:49 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:95:35:95:49 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:97:41:97:57 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:97:41:97:57 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:99:45:99:61 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:99:45:99:61 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:104:30:104:44 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:104:30:104:44 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:106:40:106:81 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:106:40:106:81 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:108:34:108:75 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:108:34:108:75 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:110:34:110:75 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:110:34:110:75 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:112:23:112:37 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:112:23:112:37 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:117:23:117:37 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:117:23:117:37 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:122:23:122:40 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:122:23:122:40 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:124:20:124:34 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:124:20:124:34 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:126:21:126:35 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:126:21:126:35 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:128:22:128:36 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:128:22:128:36 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:133:20:133:34 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:133:20:133:34 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:135:19:135:33 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:135:19:135:33 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | -| mad/Test.java:140:20:140:36 | (...)... | mad/Test.java:28:16:28:36 | getHostName(...) : String | mad/Test.java:140:20:140:36 | (...)... | This path depends on a $@. | mad/Test.java:28:16:28:36 | getHostName(...) | user-provided value | +| mad/Test.java:34:52:34:68 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:34:52:34:68 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:36:32:36:48 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:36:32:36:48 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:38:47:38:63 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:38:47:38:63 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:40:39:40:53 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:40:39:40:53 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:42:31:42:45 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:42:31:42:45 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:44:29:44:43 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:44:29:44:43 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:46:24:46:38 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:46:24:46:38 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:48:9:48:41 | new FileReader(...) | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:48:24:48:40 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:50:20:50:34 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:50:20:50:34 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:51:20:51:34 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:51:20:51:34 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:52:20:52:41 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:52:20:52:41 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:54:33:54:47 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:54:33:54:47 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:55:33:55:55 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:55:33:55:55 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:56:40:56:54 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:56:40:56:54 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:58:33:58:47 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:58:33:58:47 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:60:31:60:45 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:60:31:60:45 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:62:26:62:40 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:62:26:62:40 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:64:26:64:40 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:64:26:64:40 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:66:34:66:48 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:66:34:66:48 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:68:35:68:49 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:68:35:68:49 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:70:30:70:44 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:70:30:70:44 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:72:22:72:36 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:72:22:72:36 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:74:30:74:44 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:74:30:74:44 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:76:21:76:35 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:76:21:76:35 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:78:26:78:40 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:78:26:78:40 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:80:33:80:47 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:80:33:80:47 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:82:33:82:47 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:82:33:82:47 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:83:33:83:47 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:83:33:83:47 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:85:31:85:45 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:85:31:85:45 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:87:21:87:35 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:87:21:87:35 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:88:21:88:35 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:88:21:88:35 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:89:21:89:35 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:89:21:89:35 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:91:27:91:41 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:91:27:91:41 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:92:27:92:41 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:92:27:92:41 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:94:26:94:40 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:94:26:94:40 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:96:35:96:49 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:96:35:96:49 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:98:41:98:57 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:98:41:98:57 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:100:45:100:61 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:100:45:100:61 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:102:43:102:57 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:102:43:102:57 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:104:28:104:42 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:104:28:104:42 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:106:41:106:55 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:106:41:106:55 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:111:30:111:44 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:111:30:111:44 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:113:40:113:81 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:113:40:113:81 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:115:34:115:75 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:115:34:115:75 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:117:34:117:75 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:117:34:117:75 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:119:23:119:37 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:119:23:119:37 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:124:23:124:37 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:124:23:124:37 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:129:23:129:40 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:129:23:129:40 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:131:20:131:34 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:131:20:131:34 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:133:21:133:35 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:133:21:133:35 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:135:22:135:36 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:135:22:135:36 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:140:20:140:34 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:140:20:140:34 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:142:19:142:33 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:142:19:142:33 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | +| mad/Test.java:147:20:147:36 | (...)... | mad/Test.java:29:16:29:36 | getHostName(...) : String | mad/Test.java:147:20:147:36 | (...)... | This path depends on a $@. | mad/Test.java:29:16:29:36 | getHostName(...) | user-provided value | diff --git a/java/ql/test/query-tests/security/CWE-022/semmle/tests/mad/Test.java b/java/ql/test/query-tests/security/CWE-022/semmle/tests/mad/Test.java index 43e5168b449..daa82c43a04 100644 --- a/java/ql/test/query-tests/security/CWE-022/semmle/tests/mad/Test.java +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/mad/Test.java @@ -19,6 +19,7 @@ import org.apache.tools.ant.types.FileSet; import org.codehaus.cargo.container.installer.ZipURLInstaller; import org.kohsuke.stapler.framework.io.LargeText; import org.openjdk.jmh.runner.options.ChainedOptionsBuilder; +import org.springframework.util.FileCopyUtils; public class Test { @@ -97,6 +98,12 @@ public class Test { new ZipURLInstaller((URL) null, (String) source(), ""); // "org.codehaus.cargo.container.installer;ZipURLInstaller;true;ZipURLInstaller;(URL,String,String);;Argument[2];create-file;ai-generated" new ZipURLInstaller((URL) null, "", (String) source()); + // "org.springframework.util;FileCopyUtils;false;copy;(byte[],File);;Argument[1];create-file;manual" + FileCopyUtils.copy((byte[]) null, (File) source()); + // "org.springframework.util;FileCopyUtils;false;copy;(File,File);;Argument[0];create-file;manual" + FileCopyUtils.copy((File) source(), null); + // "org.springframework.util;FileCopyUtils;false;copy;(File,File);;Argument[1];create-file;manual" + FileCopyUtils.copy((File) null, (File) source()); } void test(AntClassLoader acl) { diff --git a/java/ql/test/query-tests/security/CWE-022/semmle/tests/options b/java/ql/test/query-tests/security/CWE-022/semmle/tests/options index 592aaf631f2..b176cfdecf0 100644 --- a/java/ql/test/query-tests/security/CWE-022/semmle/tests/options +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/options @@ -1 +1 @@ -// semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/servlet-api-2.4:${testdir}/../../../../../stubs/apache-commons-io-2.6:${testdir}/../../../../../stubs/cargo:${testdir}/../../../../../stubs/apache-ant-1.10.13:${testdir}/../../../../../stubs/stapler-1.263:${testdir}/../../../../../stubs/javax-servlet-2.5:${testdir}/../../../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../../../stubs/saxon-xqj-9.x:${testdir}/../../../../../stubs/apache-commons-beanutils:${testdir}/../../../../../stubs/dom4j-2.1.1:${testdir}/../../../../../stubs/apache-commons-lang:${testdir}/../../../../../stubs/jaxen-1.2.0:${testdir}/../../../../../stubs/jmh-1.3.6 \ No newline at end of file +// semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/servlet-api-2.4:${testdir}/../../../../../stubs/apache-commons-io-2.6:${testdir}/../../../../../stubs/cargo:${testdir}/../../../../../stubs/apache-ant-1.10.13:${testdir}/../../../../../stubs/stapler-1.263:${testdir}/../../../../../stubs/javax-servlet-2.5:${testdir}/../../../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../../../stubs/saxon-xqj-9.x:${testdir}/../../../../../stubs/apache-commons-beanutils:${testdir}/../../../../../stubs/dom4j-2.1.1:${testdir}/../../../../../stubs/apache-commons-lang:${testdir}/../../../../../stubs/jaxen-1.2.0:${testdir}/../../../../../stubs/jmh-1.3.6:${testdir}/../../../../../stubs/springframework-5.3.8 \ No newline at end of file diff --git a/java/ql/test/query-tests/security/CWE-078/ExecTaintedLocal.expected b/java/ql/test/query-tests/security/CWE-078/ExecTaintedLocal.expected index e4ab7eaef4a..2ae893b5d1d 100644 --- a/java/ql/test/query-tests/security/CWE-078/ExecTaintedLocal.expected +++ b/java/ql/test/query-tests/security/CWE-078/ExecTaintedLocal.expected @@ -3,12 +3,12 @@ edges | Test.java:6:35:6:44 | arg : String | Test.java:10:61:10:73 | ... + ... : String | | Test.java:6:35:6:44 | arg : String | Test.java:16:13:16:25 | ... + ... : String | | Test.java:6:35:6:44 | arg : String | Test.java:22:15:22:27 | ... + ... : String | -| Test.java:10:29:10:74 | {...} [[]] : String | Test.java:10:29:10:74 | new String[] | -| Test.java:10:61:10:73 | ... + ... : String | Test.java:10:29:10:74 | {...} [[]] : String | -| Test.java:16:5:16:7 | cmd [post update] [] : String | Test.java:18:29:18:31 | cmd | -| Test.java:16:13:16:25 | ... + ... : String | Test.java:16:5:16:7 | cmd [post update] [] : String | -| Test.java:22:5:22:8 | cmd1 [post update] [[]] : String | Test.java:24:29:24:32 | cmd1 | -| Test.java:22:15:22:27 | ... + ... : String | Test.java:22:5:22:8 | cmd1 [post update] [[]] : String | +| Test.java:10:29:10:74 | {...} : String[] [[]] : String | Test.java:10:29:10:74 | new String[] | +| Test.java:10:61:10:73 | ... + ... : String | Test.java:10:29:10:74 | {...} : String[] [[]] : String | +| Test.java:16:5:16:7 | cmd [post update] : List [] : String | Test.java:18:29:18:31 | cmd | +| Test.java:16:13:16:25 | ... + ... : String | Test.java:16:5:16:7 | cmd [post update] : List [] : String | +| Test.java:22:5:22:8 | cmd1 [post update] : String[] [[]] : String | Test.java:24:29:24:32 | cmd1 | +| Test.java:22:15:22:27 | ... + ... : String | Test.java:22:5:22:8 | cmd1 [post update] : String[] [[]] : String | | Test.java:28:38:28:47 | arg : String | Test.java:29:44:29:64 | ... + ... | | Test.java:57:27:57:39 | args : String[] | Test.java:60:20:60:22 | arg : String | | Test.java:57:27:57:39 | args : String[] | Test.java:61:23:61:25 | arg : String | @@ -18,12 +18,12 @@ nodes | Test.java:6:35:6:44 | arg : String | semmle.label | arg : String | | Test.java:7:44:7:69 | ... + ... | semmle.label | ... + ... | | Test.java:10:29:10:74 | new String[] | semmle.label | new String[] | -| Test.java:10:29:10:74 | {...} [[]] : String | semmle.label | {...} [[]] : String | +| Test.java:10:29:10:74 | {...} : String[] [[]] : String | semmle.label | {...} : String[] [[]] : String | | Test.java:10:61:10:73 | ... + ... : String | semmle.label | ... + ... : String | -| Test.java:16:5:16:7 | cmd [post update] [] : String | semmle.label | cmd [post update] [] : String | +| Test.java:16:5:16:7 | cmd [post update] : List [] : String | semmle.label | cmd [post update] : List [] : String | | Test.java:16:13:16:25 | ... + ... : String | semmle.label | ... + ... : String | | Test.java:18:29:18:31 | cmd | semmle.label | cmd | -| Test.java:22:5:22:8 | cmd1 [post update] [[]] : String | semmle.label | cmd1 [post update] [[]] : String | +| Test.java:22:5:22:8 | cmd1 [post update] : String[] [[]] : String | semmle.label | cmd1 [post update] : String[] [[]] : String | | Test.java:22:15:22:27 | ... + ... : String | semmle.label | ... + ... : String | | Test.java:24:29:24:32 | cmd1 | semmle.label | cmd1 | | Test.java:28:38:28:47 | arg : String | semmle.label | arg : String | diff --git a/java/ql/test/query-tests/security/CWE-079/semmle/tests/XSS.ql b/java/ql/test/query-tests/security/CWE-079/semmle/tests/XSS.ql index aecf0807e58..454f42112ea 100644 --- a/java/ql/test/query-tests/security/CWE-079/semmle/tests/XSS.ql +++ b/java/ql/test/query-tests/security/CWE-079/semmle/tests/XSS.ql @@ -1,22 +1,7 @@ import java -import semmle.code.java.dataflow.FlowSources -import semmle.code.java.security.XSS +import semmle.code.java.security.XssQuery import TestUtilities.InlineExpectationsTest -class XssConfig extends TaintTracking::Configuration { - XssConfig() { this = "XSSConfig" } - - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof XssSink } - - override predicate isSanitizer(DataFlow::Node node) { node instanceof XssSanitizer } - - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { - any(XssAdditionalTaintStep s).step(node1, node2) - } -} - class XssTest extends InlineExpectationsTest { XssTest() { this = "XssTest" } @@ -24,7 +9,7 @@ class XssTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "xss" and - exists(DataFlow::Node sink, XssConfig conf | conf.hasFlowTo(sink) | + exists(DataFlow::Node sink | XssFlow::flowTo(sink) | sink.getLocation() = location and element = sink.toString() and value = "" diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/springjdbc.ql b/java/ql/test/query-tests/security/CWE-089/semmle/examples/springjdbc.ql index 62e9895fbe9..bee1fa84ebc 100644 --- a/java/ql/test/query-tests/security/CWE-089/semmle/examples/springjdbc.ql +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/springjdbc.ql @@ -1,26 +1,12 @@ import java -import semmle.code.java.dataflow.TaintTracking -import semmle.code.java.security.QueryInjection +import semmle.code.java.dataflow.FlowSources +import semmle.code.java.security.SqlInjectionQuery import TestUtilities.InlineExpectationsTest -private class QueryInjectionFlowConfig extends TaintTracking::Configuration { - QueryInjectionFlowConfig() { this = "SqlInjectionLib::QueryInjectionFlowConfig" } +private class SourceMethodSource extends RemoteFlowSource { + SourceMethodSource() { this.asExpr().(MethodAccess).getMethod().hasName("source") } - override predicate isSource(DataFlow::Node src) { - src.asExpr() = any(MethodAccess ma | ma.getMethod().hasName("source")) - } - - override predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } - - override predicate isSanitizer(DataFlow::Node node) { - node.getType() instanceof PrimitiveType or - node.getType() instanceof BoxedType or - node.getType() instanceof NumberType - } - - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { - any(AdditionalQueryInjectionTaintStep s).step(node1, node2) - } + override string getSourceType() { result = "source" } } class HasFlowTest extends InlineExpectationsTest { @@ -30,7 +16,7 @@ class HasFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "sqlInjection" and - exists(DataFlow::Node sink, QueryInjectionFlowConfig conf | conf.hasFlowTo(sink) | + exists(DataFlow::Node sink | QueryInjectionFlow::flowTo(sink) | sink.getLocation() = location and element = sink.toString() and value = "" diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/taintedString.ql b/java/ql/test/query-tests/security/CWE-089/semmle/examples/taintedString.ql index 145fd8f2028..d2cafc8e67d 100644 --- a/java/ql/test/query-tests/security/CWE-089/semmle/examples/taintedString.ql +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/taintedString.ql @@ -1,16 +1,16 @@ import semmle.code.java.dataflow.FlowSources -class Conf extends TaintTracking::Configuration { - Conf() { this = "qltest:cwe-089:taintedString" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof UserInput } - override predicate isSource(DataFlow::Node source) { source instanceof UserInput } - - override predicate isSink(DataFlow::Node sink) { any() } + predicate isSink(DataFlow::Node sink) { any() } } -from Conf conf, Expr tainted, Method method +module Flow = TaintTracking::Global; + +from Expr tainted, Method method where - conf.hasFlowToExpr(tainted) and + Flow::flowToExpr(tainted) and tainted.getEnclosingCallable() = method and tainted.getFile().getStem() = ["Test", "Validation"] select method, tainted.getLocation().getStartLine() - method.getLocation().getStartLine(), tainted diff --git a/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.java b/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.java index 13d4901fc67..4bcdb197e15 100644 --- a/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.java +++ b/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.java @@ -1,5 +1,6 @@ import java.util.ResourceBundle; import java.util.logging.LogRecord; +import java.util.regex.Pattern; import com.google.common.flogger.LoggingApi; import org.apache.commons.logging.Log; import org.apache.log4j.Category; @@ -19,6 +20,172 @@ public class LogInjectionTest { return null; } + public void testSanitizers() { + String source = (String) source(); + Logger logger = null; + logger.debug(source.replace("\n", "")); // Safe + logger.debug(source.replace("\n", "\n")); // $ hasTaintFlow + logger.debug(source.replace("\n", "\r")); // $ hasTaintFlow + logger.debug(source.replace("\r", "")); // Safe + logger.debug(source.replace("\r", "\n")); // $ hasTaintFlow + logger.debug(source.replace("\r", "\r")); // $ hasTaintFlow + logger.debug(source.replace("something_else", "")); // $ hasTaintFlow + logger.debug(source.replace('\n', '_')); // Safe + logger.debug(source.replace('\n', '\n')); // $ hasTaintFlow + logger.debug(source.replace('\n', '\r')); // $ hasTaintFlow + logger.debug(source.replace('\r', '_')); // Safe + logger.debug(source.replace('\r', '\n')); // $ hasTaintFlow + logger.debug(source.replace('\r', '\r')); // $ hasTaintFlow + logger.debug(source.replace('-', '_')); // $ hasTaintFlow + logger.debug(source.replaceAll("\n", "")); // Safe + logger.debug(source.replaceAll("\n", "\n")); // $ hasTaintFlow + logger.debug(source.replaceAll("\n", "\r")); // $ hasTaintFlow + logger.debug(source.replaceAll("\r", "")); // Safe + logger.debug(source.replaceAll("\r", "\n")); // $ hasTaintFlow + logger.debug(source.replaceAll("\r", "\r")); // $ hasTaintFlow + logger.debug(source.replaceAll("\\n", "")); // Safe + logger.debug(source.replaceAll("\\n", "\n")); // $ hasTaintFlow + logger.debug(source.replaceAll("\\n", "\r")); // $ hasTaintFlow + logger.debug(source.replaceAll("\\r", "")); // Safe + logger.debug(source.replaceAll("\\r", "\n")); // $ hasTaintFlow + logger.debug(source.replaceAll("\\r", "\r")); // $ hasTaintFlow + logger.debug(source.replaceAll("\\R", "")); // Safe + logger.debug(source.replaceAll("\\R", "\n")); // $ hasTaintFlow + logger.debug(source.replaceAll("\\R", "\r")); // $ hasTaintFlow + logger.debug(source.replaceAll("[^a-zA-Z]", "")); // Safe + logger.debug(source.replaceAll("[^a-zA-Z]", "\n")); // $ hasTaintFlow + logger.debug(source.replaceAll("[^a-zA-Z]", "\r")); // $ hasTaintFlow + logger.debug(source.replaceAll("[^a-zA-Z\n]", "")); // $ hasTaintFlow + logger.debug(source.replaceAll("[^a-zA-Z\r]", "")); // $ hasTaintFlow + logger.debug(source.replaceAll("[^a-zA-Z\\R]", "")); // $ hasTaintFlow + } + + public void testGuards() { + String source = (String) source(); + Logger logger = null; + + if (source.matches(".*\n.*")) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // Safe + } + + if (Pattern.matches(".*\n.*", source)) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // Safe + } + + if (source.matches(".*\\n.*")) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // Safe + } + + if (Pattern.matches(".*\\n.*", source)) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // Safe + } + + if (source.matches(".*\r.*")) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // Safe + } + + if (Pattern.matches(".*\r.*", source)) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // Safe + } + + if (source.matches(".*\\r.*")) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // Safe + } + + if (Pattern.matches(".*\\r.*", source)) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // Safe + } + + if (source.matches(".*\\R.*")) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // Safe + } + + if (Pattern.matches(".*\\R.*", source)) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // Safe + } + + if (source.matches(".*")) { + logger.debug(source); // Safe (assuming not DOTALL) + } else { + logger.debug(source); // $ hasTaintFlow + } + + if (Pattern.matches(".*", source)) { + logger.debug(source); // Safe (assuming not DOTALL) + } else { + logger.debug(source); // $ hasTaintFlow + } + + if (source.matches("[^\n\r]*")) { + logger.debug(source); // Safe + } else { + logger.debug(source); // $ hasTaintFlow + } + + if (Pattern.matches("[^\n\r]*", source)) { + logger.debug(source); // Safe + } else { + logger.debug(source); // $ hasTaintFlow + } + + if (source.matches("[^\\R]*")) { + logger.debug(source); // Safe + } else { + logger.debug(source); // $ hasTaintFlow + } + + if (Pattern.matches("[^\\R]*", source)) { + logger.debug(source); // Safe + } else { + logger.debug(source); // $ hasTaintFlow + } + + if (source.matches("[^a-zA-Z]*")) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // $ hasTaintFlow + } + + if (Pattern.matches("[^a-zA-Z]*", source)) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // $ hasTaintFlow + } + + if (source.matches("[\n]*")) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // $ MISSING: $ hasTaintFlow + } + + if (Pattern.matches("[\n]*", source)) { + logger.debug(source); // $ hasTaintFlow + } else { + logger.debug(source); // $ MISSING: $ hasTaintFlow + } + + } + public void test() { { Category category = null; diff --git a/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTaintedLocal.expected b/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTaintedLocal.expected index 4d37fd48f49..1864576369c 100644 --- a/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTaintedLocal.expected +++ b/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTaintedLocal.expected @@ -22,11 +22,11 @@ edges | ArithmeticTainted.java:21:29:21:47 | trim(...) : String | ArithmeticTainted.java:119:10:119:13 | data : Number | | ArithmeticTainted.java:21:29:21:47 | trim(...) : String | ArithmeticTainted.java:120:10:120:13 | data : Number | | ArithmeticTainted.java:21:29:21:47 | trim(...) : String | ArithmeticTainted.java:121:10:121:13 | data : Number | -| ArithmeticTainted.java:64:4:64:10 | tainted [post update] [dat] : Number | ArithmeticTainted.java:66:18:66:24 | tainted [dat] : Number | -| ArithmeticTainted.java:64:20:64:23 | data : Number | ArithmeticTainted.java:64:4:64:10 | tainted [post update] [dat] : Number | +| ArithmeticTainted.java:64:4:64:10 | tainted [post update] : Holder [dat] : Number | ArithmeticTainted.java:66:18:66:24 | tainted : Holder [dat] : Number | +| ArithmeticTainted.java:64:20:64:23 | data : Number | ArithmeticTainted.java:64:4:64:10 | tainted [post update] : Holder [dat] : Number | | ArithmeticTainted.java:64:20:64:23 | data : Number | Holder.java:12:22:12:26 | d : Number | -| ArithmeticTainted.java:66:18:66:24 | tainted [dat] : Number | ArithmeticTainted.java:66:18:66:34 | getData(...) : Number | -| ArithmeticTainted.java:66:18:66:24 | tainted [dat] : Number | Holder.java:16:13:16:19 | parameter this [dat] : Number | +| ArithmeticTainted.java:66:18:66:24 | tainted : Holder [dat] : Number | ArithmeticTainted.java:66:18:66:34 | getData(...) : Number | +| ArithmeticTainted.java:66:18:66:24 | tainted : Holder [dat] : Number | Holder.java:16:13:16:19 | parameter this : Holder [dat] : Number | | ArithmeticTainted.java:66:18:66:34 | getData(...) : Number | ArithmeticTainted.java:71:17:71:23 | herring | | ArithmeticTainted.java:118:9:118:12 | data : Number | ArithmeticTainted.java:125:26:125:33 | data : Number | | ArithmeticTainted.java:119:10:119:13 | data : Number | ArithmeticTainted.java:129:27:129:34 | data : Number | @@ -37,9 +37,9 @@ edges | ArithmeticTainted.java:133:27:133:34 | data : Number | ArithmeticTainted.java:135:3:135:6 | data | | ArithmeticTainted.java:137:27:137:34 | data : Number | ArithmeticTainted.java:139:5:139:8 | data | | Holder.java:12:22:12:26 | d : Number | Holder.java:13:9:13:9 | d : Number | -| Holder.java:13:9:13:9 | d : Number | Holder.java:13:3:13:5 | this <.field> [post update] [dat] : Number | -| Holder.java:16:13:16:19 | parameter this [dat] : Number | Holder.java:17:10:17:12 | this <.field> [dat] : Number | -| Holder.java:17:10:17:12 | this <.field> [dat] : Number | Holder.java:17:10:17:12 | dat : Number | +| Holder.java:13:9:13:9 | d : Number | Holder.java:13:3:13:5 | this <.field> [post update] : Holder [dat] : Number | +| Holder.java:16:13:16:19 | parameter this : Holder [dat] : Number | Holder.java:17:10:17:12 | this <.field> : Holder [dat] : Number | +| Holder.java:17:10:17:12 | this <.field> : Holder [dat] : Number | Holder.java:17:10:17:12 | dat : Number | nodes | ArithmeticTainted.java:17:24:17:64 | new InputStreamReader(...) : InputStreamReader | semmle.label | new InputStreamReader(...) : InputStreamReader | | ArithmeticTainted.java:17:24:17:64 | new InputStreamReader(...) : InputStreamReader | semmle.label | new InputStreamReader(...) : InputStreamReader | @@ -60,9 +60,9 @@ nodes | ArithmeticTainted.java:32:17:32:20 | data | semmle.label | data | | ArithmeticTainted.java:40:17:40:20 | data | semmle.label | data | | ArithmeticTainted.java:50:17:50:20 | data | semmle.label | data | -| ArithmeticTainted.java:64:4:64:10 | tainted [post update] [dat] : Number | semmle.label | tainted [post update] [dat] : Number | +| ArithmeticTainted.java:64:4:64:10 | tainted [post update] : Holder [dat] : Number | semmle.label | tainted [post update] : Holder [dat] : Number | | ArithmeticTainted.java:64:20:64:23 | data : Number | semmle.label | data : Number | -| ArithmeticTainted.java:66:18:66:24 | tainted [dat] : Number | semmle.label | tainted [dat] : Number | +| ArithmeticTainted.java:66:18:66:24 | tainted : Holder [dat] : Number | semmle.label | tainted : Holder [dat] : Number | | ArithmeticTainted.java:66:18:66:34 | getData(...) : Number | semmle.label | getData(...) : Number | | ArithmeticTainted.java:71:17:71:23 | herring | semmle.label | herring | | ArithmeticTainted.java:95:37:95:40 | data | semmle.label | data | @@ -79,14 +79,14 @@ nodes | ArithmeticTainted.java:137:27:137:34 | data : Number | semmle.label | data : Number | | ArithmeticTainted.java:139:5:139:8 | data | semmle.label | data | | Holder.java:12:22:12:26 | d : Number | semmle.label | d : Number | -| Holder.java:13:3:13:5 | this <.field> [post update] [dat] : Number | semmle.label | this <.field> [post update] [dat] : Number | +| Holder.java:13:3:13:5 | this <.field> [post update] : Holder [dat] : Number | semmle.label | this <.field> [post update] : Holder [dat] : Number | | Holder.java:13:9:13:9 | d : Number | semmle.label | d : Number | -| Holder.java:16:13:16:19 | parameter this [dat] : Number | semmle.label | parameter this [dat] : Number | +| Holder.java:16:13:16:19 | parameter this : Holder [dat] : Number | semmle.label | parameter this : Holder [dat] : Number | | Holder.java:17:10:17:12 | dat : Number | semmle.label | dat : Number | -| Holder.java:17:10:17:12 | this <.field> [dat] : Number | semmle.label | this <.field> [dat] : Number | +| Holder.java:17:10:17:12 | this <.field> : Holder [dat] : Number | semmle.label | this <.field> : Holder [dat] : Number | subpaths -| ArithmeticTainted.java:64:20:64:23 | data : Number | Holder.java:12:22:12:26 | d : Number | Holder.java:13:3:13:5 | this <.field> [post update] [dat] : Number | ArithmeticTainted.java:64:4:64:10 | tainted [post update] [dat] : Number | -| ArithmeticTainted.java:66:18:66:24 | tainted [dat] : Number | Holder.java:16:13:16:19 | parameter this [dat] : Number | Holder.java:17:10:17:12 | dat : Number | ArithmeticTainted.java:66:18:66:34 | getData(...) : Number | +| ArithmeticTainted.java:64:20:64:23 | data : Number | Holder.java:12:22:12:26 | d : Number | Holder.java:13:3:13:5 | this <.field> [post update] : Holder [dat] : Number | ArithmeticTainted.java:64:4:64:10 | tainted [post update] : Holder [dat] : Number | +| ArithmeticTainted.java:66:18:66:24 | tainted : Holder [dat] : Number | Holder.java:16:13:16:19 | parameter this : Holder [dat] : Number | Holder.java:17:10:17:12 | dat : Number | ArithmeticTainted.java:66:18:66:34 | getData(...) : Number | #select | ArithmeticTainted.java:32:17:32:25 | ... + ... | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:32:17:32:20 | data | This arithmetic expression depends on a $@, potentially causing an overflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | | ArithmeticTainted.java:40:17:40:25 | ... - ... | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:40:17:40:20 | data | This arithmetic expression depends on a $@, potentially causing an underflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | diff --git a/java/ql/test/query-tests/security/CWE-643/XPathInjectionTest.ql b/java/ql/test/query-tests/security/CWE-643/XPathInjectionTest.ql index c52221999d1..6d6ea719da9 100644 --- a/java/ql/test/query-tests/security/CWE-643/XPathInjectionTest.ql +++ b/java/ql/test/query-tests/security/CWE-643/XPathInjectionTest.ql @@ -4,14 +4,14 @@ import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.XPath import TestUtilities.InlineExpectationsTest -class Conf extends TaintTracking::Configuration { - Conf() { this = "test:xml:xpathinjection" } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof XPathInjectionSink } + predicate isSink(DataFlow::Node sink) { sink instanceof XPathInjectionSink } } +module Flow = TaintTracking::Global; + class HasXPathInjectionTest extends InlineExpectationsTest { HasXPathInjectionTest() { this = "HasXPathInjectionTest" } @@ -19,7 +19,7 @@ class HasXPathInjectionTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "hasXPathInjection" and - exists(DataFlow::Node sink, Conf conf | conf.hasFlowTo(sink) | + exists(DataFlow::Node sink | Flow::flowTo(sink) | sink.getLocation() = location and element = sink.toString() and value = "" diff --git a/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsSourceCall.ql b/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsSourceCall.ql index 3570dbe49e9..0fcf2f128ad 100644 --- a/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsSourceCall.ql +++ b/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsSourceCall.ql @@ -9,9 +9,7 @@ class HardcodedCredentialsSourceCallTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "HardcodedCredentialsSourceCall" and - exists(DataFlow::Node sink, HardcodedCredentialSourceCallConfiguration conf | - conf.hasFlow(_, sink) - | + exists(DataFlow::Node sink | HardcodedCredentialSourceCallFlow::flowTo(sink) | sink.getLocation() = location and element = sink.toString() and value = "" diff --git a/java/ql/test/query-tests/security/CWE-918/ApacheHttpSSRFVersion5.java b/java/ql/test/query-tests/security/CWE-918/ApacheHttpSSRFVersion5.java new file mode 100644 index 00000000000..de22dd02fac --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-918/ApacheHttpSSRFVersion5.java @@ -0,0 +1,401 @@ +import java.io.IOException; +import java.net.URI; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.Method; +import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncRequester; +import org.apache.hc.core5.http.impl.io.DefaultClassicHttpRequestFactory; +import org.apache.hc.core5.http.impl.nio.DefaultHttpRequestFactory; +import org.apache.hc.core5.http.io.support.ClassicRequestBuilder; +import org.apache.hc.core5.http.message.BasicClassicHttpRequest; +import org.apache.hc.core5.http.message.BasicHttpRequest; +import org.apache.hc.core5.http.message.HttpRequestWrapper; +import org.apache.hc.client5.http.async.methods.BasicHttpRequests; +import org.apache.hc.client5.http.async.methods.ConfigurableHttpRequest; +import org.apache.hc.client5.http.async.methods.SimpleHttpRequest; +import org.apache.hc.client5.http.async.methods.SimpleHttpRequests; +import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder; +import org.apache.hc.client5.http.classic.methods.ClassicHttpRequests; +import org.apache.hc.client5.http.classic.methods.HttpDelete; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.classic.methods.HttpHead; +import org.apache.hc.client5.http.classic.methods.HttpOptions; +import org.apache.hc.client5.http.classic.methods.HttpPatch; +import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.classic.methods.HttpPut; +import org.apache.hc.client5.http.classic.methods.HttpTrace; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; +import org.apache.hc.client5.http.fluent.Request; + +public class ApacheHttpSSRFVersion5 extends HttpServlet { + + // org.apache.hc.client5.http.async.methods + protected void doGet1(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + + String uriSink = request.getParameter("uri"); + URI uri = new URI(uriSink); + + String hostSink = request.getParameter("host"); + HttpHost host = new HttpHost(hostSink); + + // org.apache.hc.client5.http.async.methods.BasicHttpRequests + BasicHttpRequests.create(Method.CONNECT, host, "path"); // $ SSRF + BasicHttpRequests.create(Method.CONNECT, uri.toString()); // $ SSRF + BasicHttpRequests.create(Method.CONNECT, uri); // $ SSRF + BasicHttpRequests.create("method", uri.toString()); // $ SSRF + BasicHttpRequests.create("method", uri); // $ SSRF + + BasicHttpRequests.delete(host, "path"); // $ SSRF + BasicHttpRequests.delete(uri.toString()); // $ SSRF + BasicHttpRequests.delete(uri); // $ SSRF + + BasicHttpRequests.get(host, "path"); // $ SSRF + BasicHttpRequests.get(uri.toString()); // $ SSRF + BasicHttpRequests.get(uri); // $ SSRF + + BasicHttpRequests.head(host, "path"); // $ SSRF + BasicHttpRequests.head(uri.toString()); // $ SSRF + BasicHttpRequests.head(uri); // $ SSRF + + BasicHttpRequests.options(host, "path"); // $ SSRF + BasicHttpRequests.options(uri.toString()); // $ SSRF + BasicHttpRequests.options(uri); // $ SSRF + + BasicHttpRequests.patch(host, "path"); // $ SSRF + BasicHttpRequests.patch(uri.toString()); // $ SSRF + BasicHttpRequests.patch(uri); // $ SSRF + + BasicHttpRequests.post(host, "path"); // $ SSRF + BasicHttpRequests.post(uri.toString()); // $ SSRF + BasicHttpRequests.post(uri); // $ SSRF + + BasicHttpRequests.put(host, "path"); // $ SSRF + BasicHttpRequests.put(uri.toString()); // $ SSRF + BasicHttpRequests.put(uri); // $ SSRF + + BasicHttpRequests.trace(host, "path"); // $ SSRF + BasicHttpRequests.trace(uri.toString()); // $ SSRF + BasicHttpRequests.trace(uri); // $ SSRF + + // org.apache.hc.client5.http.async.methods.ConfigurableHttpRequest + new ConfigurableHttpRequest("method", host, "path"); // $ SSRF + new ConfigurableHttpRequest("method", uri); // $ SSRF + + // org.apache.hc.client5.http.async.methods.SimpleHttpRequest + new SimpleHttpRequest(Method.CONNECT, host, "path"); // $ SSRF + new SimpleHttpRequest(Method.CONNECT, uri); // $ SSRF + new SimpleHttpRequest("method", host, "path"); // $ SSRF + new SimpleHttpRequest("method", uri); // $ SSRF + + SimpleHttpRequest.create(Method.CONNECT, host, "path"); // $ SSRF + SimpleHttpRequest.create(Method.CONNECT, uri); // $ SSRF + SimpleHttpRequest.create("method", uri.toString()); // $ SSRF + SimpleHttpRequest.create("method", uri); // $ SSRF + + // org.apache.hc.client5.http.async.methods.SimpleHttpRequests + SimpleHttpRequests.create(Method.CONNECT, host, "path"); // $ SSRF + SimpleHttpRequests.create(Method.CONNECT, uri.toString()); // $ SSRF + SimpleHttpRequests.create(Method.CONNECT, uri); // $ SSRF + SimpleHttpRequests.create("method", uri.toString()); // $ SSRF + SimpleHttpRequests.create("method", uri); // $ SSRF + + SimpleHttpRequests.delete(host, "path"); // $ SSRF + SimpleHttpRequests.delete(uri.toString()); // $ SSRF + SimpleHttpRequests.delete(uri); // $ SSRF + + SimpleHttpRequests.get(host, "path"); // $ SSRF + SimpleHttpRequests.get(uri.toString()); // $ SSRF + SimpleHttpRequests.get(uri); // $ SSRF + + SimpleHttpRequests.head(host, "path"); // $ SSRF + SimpleHttpRequests.head(uri.toString()); // $ SSRF + SimpleHttpRequests.head(uri); // $ SSRF + + SimpleHttpRequests.options(host, "path"); // $ SSRF + SimpleHttpRequests.options(uri.toString()); // $ SSRF + SimpleHttpRequests.options(uri); // $ SSRF + + SimpleHttpRequests.patch(host, "path"); // $ SSRF + SimpleHttpRequests.patch(uri.toString()); // $ SSRF + SimpleHttpRequests.patch(uri); // $ SSRF + + SimpleHttpRequests.post(host, "path"); // $ SSRF + SimpleHttpRequests.post(uri.toString()); // $ SSRF + SimpleHttpRequests.post(uri); // $ SSRF + + SimpleHttpRequests.put(host, "path"); // $ SSRF + SimpleHttpRequests.put(uri.toString()); // $ SSRF + SimpleHttpRequests.put(uri); // $ SSRF + + SimpleHttpRequests.trace(host, "path"); // $ SSRF + SimpleHttpRequests.trace(uri.toString()); // $ SSRF + SimpleHttpRequests.trace(uri); // $ SSRF + + // org.apache.hc.client5.http.async.methods.SimpleRequestBuilder + SimpleRequestBuilder.delete(uri.toString()); // $ SSRF + SimpleRequestBuilder.delete(uri); // $ SSRF + + SimpleRequestBuilder.get(uri.toString()); // $ SSRF + SimpleRequestBuilder.get(uri); // $ SSRF + + SimpleRequestBuilder.head(uri.toString()); // $ SSRF + SimpleRequestBuilder.head(uri); // $ SSRF + + SimpleRequestBuilder.options(uri.toString()); // $ SSRF + SimpleRequestBuilder.options(uri); // $ SSRF + + SimpleRequestBuilder.patch(uri.toString()); // $ SSRF + SimpleRequestBuilder.patch(uri); // $ SSRF + + SimpleRequestBuilder.post(uri.toString()); // $ SSRF + SimpleRequestBuilder.post(uri); // $ SSRF + + SimpleRequestBuilder.put(uri.toString()); // $ SSRF + SimpleRequestBuilder.put(uri); // $ SSRF + + SimpleRequestBuilder.get().setHttpHost(host); // $ SSRF + + SimpleRequestBuilder.get().setUri(uri.toString()); // $ SSRF + SimpleRequestBuilder.get().setUri(uri); // $ SSRF + + SimpleRequestBuilder.trace(uri.toString()); // $ SSRF + SimpleRequestBuilder.trace(uri); // $ SSRF + + } catch (Exception e) { + // TODO: handle exception + } + } + + // org.apache.hc.client5.http.classic.methods + protected void doGet2(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + + String uriSink = request.getParameter("uri"); + URI uri = new URI(uriSink); + + // org.apache.hc.client5.http.classic.methods.ClassicHttpRequests + ClassicHttpRequests.create(Method.CONNECT, uri.toString()); // $ SSRF + ClassicHttpRequests.create(Method.CONNECT, uri); // $ SSRF + ClassicHttpRequests.create("method", uri.toString()); // $ SSRF + ClassicHttpRequests.create("method", uri); // $ SSRF + + ClassicHttpRequests.delete(uri.toString()); // $ SSRF + ClassicHttpRequests.delete(uri); // $ SSRF + + ClassicHttpRequests.get(uri.toString()); // $ SSRF + ClassicHttpRequests.get(uri); // $ SSRF + + ClassicHttpRequests.head(uri.toString()); // $ SSRF + ClassicHttpRequests.head(uri); // $ SSRF + + ClassicHttpRequests.options(uri.toString()); // $ SSRF + ClassicHttpRequests.options(uri); // $ SSRF + + ClassicHttpRequests.patch(uri.toString()); // $ SSRF + ClassicHttpRequests.patch(uri); // $ SSRF + + ClassicHttpRequests.post(uri.toString()); // $ SSRF + ClassicHttpRequests.post(uri); // $ SSRF + + ClassicHttpRequests.put(uri.toString()); // $ SSRF + ClassicHttpRequests.put(uri); // $ SSRF + + ClassicHttpRequests.trace(uri.toString()); // $ SSRF + ClassicHttpRequests.trace(uri); // $ SSRF + + // org.apache.hc.client5.http.classic.methods.HttpDelete through HttpTrace + new HttpDelete(uri.toString()); // $ SSRF + new HttpDelete(uri); // $ SSRF + + new HttpGet(uri.toString()); // $ SSRF + new HttpGet(uri); // $ SSRF + + new HttpHead(uri.toString()); // $ SSRF + new HttpHead(uri); // $ SSRF + + new HttpOptions(uri.toString()); // $ SSRF + new HttpOptions(uri); // $ SSRF + + new HttpPatch(uri.toString()); // $ SSRF + new HttpPatch(uri); // $ SSRF + + new HttpPost(uri.toString()); // $ SSRF + new HttpPost(uri); // $ SSRF + + new HttpPut(uri.toString()); // $ SSRF + new HttpPut(uri); // $ SSRF + + new HttpTrace(uri.toString()); // $ SSRF + new HttpTrace(uri); // $ SSRF + + // org.apache.hc.client5.http.classic.methods.HttpUriRequestBase + new HttpUriRequestBase("method", uri); // $ SSRF + + } catch (Exception e) { + // TODO: handle exception + } + } + + // org.apache.hc.client5.http.fluent + protected void doGet3(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + + String uriSink = request.getParameter("uri"); + URI uri = new URI(uriSink); + + // org.apache.hc.client5.http.fluent.Request + Request.create(Method.CONNECT, uri); // $ SSRF + Request.create("method", uri.toString()); // $ SSRF + Request.create("method", uri); // $ SSRF + + Request.delete(uri.toString()); // $ SSRF + Request.delete(uri); // $ SSRF + + Request.get(uri.toString()); // $ SSRF + Request.get(uri); // $ SSRF + + Request.head(uri.toString()); // $ SSRF + Request.head(uri); // $ SSRF + + Request.options(uri.toString()); // $ SSRF + Request.options(uri); // $ SSRF + + Request.patch(uri.toString()); // $ SSRF + Request.patch(uri); // $ SSRF + + Request.post(uri.toString()); // $ SSRF + Request.post(uri); // $ SSRF + + Request.put(uri.toString()); // $ SSRF + Request.put(uri); // $ SSRF + + Request.trace(uri.toString()); // $ SSRF + Request.trace(uri); // $ SSRF + + } catch (Exception e) { + // TODO: handle exception + } + } + + // org.apache.hc.core5.http.impl.bootstrap + // org.apache.hc.core5.http.impl.io + // org.apache.hc.core5.http.impl.nio + protected void doGet4(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + + String uriSink = request.getParameter("uri"); + URI uri = new URI(uriSink); + + String hostSink = request.getParameter("host"); + HttpHost host = new HttpHost(hostSink); + + // org.apache.hc.core5.http.impl.bootstrap + HttpAsyncRequester httpAsyncReq = new HttpAsyncRequester(null, null, null, null, null, null); + httpAsyncReq.connect(host, null); // $ SSRF + httpAsyncReq.connect(host, null, null, null); // $ SSRF + + // org.apache.hc.core5.http.impl.io + DefaultClassicHttpRequestFactory defClassicHttpReqFact = new DefaultClassicHttpRequestFactory(); + defClassicHttpReqFact.newHttpRequest("method", uri.toString()); // $ SSRF + defClassicHttpReqFact.newHttpRequest("method", uri); // $ SSRF + + // org.apache.hc.core5.http.impl.nio + DefaultHttpRequestFactory defHttpReqFact = new DefaultHttpRequestFactory(); + defHttpReqFact.newHttpRequest("method", uri.toString()); // $ SSRF + defHttpReqFact.newHttpRequest("method", uri); // $ SSRF + + } catch (Exception e) { + // TODO: handle exception + } + } + + // org.apache.hc.core5.http.io.support + protected void doGet5(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + + String uriSink = request.getParameter("uri"); + URI uri = new URI(uriSink); + + String hostSink = request.getParameter("host"); + HttpHost host = new HttpHost(hostSink); + + // org.apache.hc.core5.http.io.support.ClassicRequestBuilder + ClassicRequestBuilder.delete(uri.toString()); // $ SSRF + ClassicRequestBuilder.delete(uri); // $ SSRF + + ClassicRequestBuilder.get(uri.toString()); // $ SSRF + ClassicRequestBuilder.get(uri); // $ SSRF + + ClassicRequestBuilder.head(uri.toString()); // $ SSRF + ClassicRequestBuilder.head(uri); // $ SSRF + + ClassicRequestBuilder.options(uri.toString()); // $ SSRF + ClassicRequestBuilder.options(uri); // $ SSRF + + ClassicRequestBuilder.patch(uri.toString()); // $ SSRF + ClassicRequestBuilder.patch(uri); // $ SSRF + + ClassicRequestBuilder.post(uri.toString()); // $ SSRF + ClassicRequestBuilder.post(uri); // $ SSRF + + ClassicRequestBuilder.put(uri.toString()); // $ SSRF + ClassicRequestBuilder.put(uri); // $ SSRF + + ClassicRequestBuilder.get().setHttpHost(host); // $ SSRF + + ClassicRequestBuilder.get().setUri(uri.toString()); // $ SSRF + ClassicRequestBuilder.get().setUri(uri); // $ SSRF + + ClassicRequestBuilder.trace(uri.toString()); // $ SSRF + ClassicRequestBuilder.trace(uri); // $ SSRF + + } catch (Exception e) { + // TODO: handle exception + } + } + + // org.apache.hc.core5.http.message + protected void doGet6(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + + String uriSink = request.getParameter("uri"); + URI uri = new URI(uriSink); + + String hostSink = request.getParameter("host"); + HttpHost host = new HttpHost(hostSink); + + // BasicClassicHttpRequest + new BasicClassicHttpRequest(Method.CONNECT, host, "path"); // $ SSRF + new BasicClassicHttpRequest(Method.CONNECT, uri); // $ SSRF + new BasicClassicHttpRequest("method", host, "path"); // $ SSRF + new BasicClassicHttpRequest("method", uri); // $ SSRF + + // BasicHttpRequest + new BasicHttpRequest(Method.CONNECT, host, "path"); // $ SSRF + new BasicHttpRequest(Method.CONNECT, uri); // $ SSRF + new BasicHttpRequest("method", host, "path"); // $ SSRF + new BasicHttpRequest("method", uri); // $ SSRF + BasicHttpRequest bhr = new BasicHttpRequest("method", "path"); + bhr.setUri(uri); // $ SSRF + + // HttpRequestWrapper + HttpRequestWrapper hrw = new HttpRequestWrapper(null); + hrw.setUri(uri); // $ SSRF + + } catch (Exception e) { + // TODO: handle exception + } + } + +} diff --git a/java/ql/test/query-tests/security/CWE-918/options b/java/ql/test/query-tests/security/CWE-918/options index 7a4e3251ca1..c8147ece2a9 100644 --- a/java/ql/test/query-tests/security/CWE-918/options +++ b/java/ql/test/query-tests/security/CWE-918/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/javax-ws-rs-api-3.0.0:${testdir}/../../../stubs/apache-http-4.4.13/:${testdir}/../../../stubs/projectreactor-3.4.3/:${testdir}/../../../stubs/postgresql-42.3.3/:${testdir}/../../../stubs/HikariCP-3.4.5/:${testdir}/../../../stubs/spring-jdbc-5.3.8/:${testdir}/../../../stubs/jdbi3-core-3.27.2/:${testdir}/../../../stubs/cargo:${testdir}/../../../stubs/javafx-web:${testdir}/../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/stapler-1.263:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../stubs/saxon-xqj-9.x:${testdir}/../../../stubs/apache-commons-beanutils:${testdir}/../../../stubs/apache-commons-lang +//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/javax-ws-rs-api-3.0.0:${testdir}/../../../stubs/apache-http-4.4.13/:${testdir}/../../../stubs/projectreactor-3.4.3/:${testdir}/../../../stubs/postgresql-42.3.3/:${testdir}/../../../stubs/HikariCP-3.4.5/:${testdir}/../../../stubs/spring-jdbc-5.3.8/:${testdir}/../../../stubs/jdbi3-core-3.27.2/:${testdir}/../../../stubs/cargo:${testdir}/../../../stubs/javafx-web:${testdir}/../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/stapler-1.263:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../stubs/saxon-xqj-9.x:${testdir}/../../../stubs/apache-commons-beanutils:${testdir}/../../../stubs/apache-commons-lang:${testdir}/../../../stubs/apache-http-5 diff --git a/java/ql/test/query-tests/security/CWE-927/SensitiveResultReceiver.ql b/java/ql/test/query-tests/security/CWE-927/SensitiveResultReceiver.ql index e8f2b4eef75..fb7b1dfee43 100644 --- a/java/ql/test/query-tests/security/CWE-927/SensitiveResultReceiver.ql +++ b/java/ql/test/query-tests/security/CWE-927/SensitiveResultReceiver.ql @@ -14,8 +14,8 @@ class ResultReceiverTest extends InlineExpectationsTest { override string getARelevantTag() { result = "hasSensitiveResultReceiver" } override predicate hasActualResult(Location loc, string element, string tag, string value) { - exists(DataFlow::PathNode sink | - sensitiveResultReceiver(_, sink, _) and + exists(SensitiveResultReceiverFlow::PathNode sink | + isSensitiveResultReceiver(_, sink, _) and element = sink.toString() and loc = sink.getNode().getLocation() and tag = "hasSensitiveResultReceiver" and diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/BasicHttpRequests.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/BasicHttpRequests.java new file mode 100644 index 00000000000..89bdcc0344b --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/BasicHttpRequests.java @@ -0,0 +1,42 @@ +// Generated automatically from org.apache.hc.client5.http.async.methods.BasicHttpRequests for testing purposes + +package org.apache.hc.client5.http.async.methods; + +import java.net.URI; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.Method; +import org.apache.hc.core5.http.message.BasicHttpRequest; + +public class BasicHttpRequests +{ + public BasicHttpRequests(){} + public static BasicHttpRequest create(Method p0, HttpHost p1, String p2){ return null; } + public static BasicHttpRequest create(Method p0, String p1){ return null; } + public static BasicHttpRequest create(Method p0, URI p1){ return null; } + public static BasicHttpRequest create(String p0, String p1){ return null; } + public static BasicHttpRequest create(String p0, URI p1){ return null; } + public static BasicHttpRequest delete(HttpHost p0, String p1){ return null; } + public static BasicHttpRequest delete(String p0){ return null; } + public static BasicHttpRequest delete(URI p0){ return null; } + public static BasicHttpRequest get(HttpHost p0, String p1){ return null; } + public static BasicHttpRequest get(String p0){ return null; } + public static BasicHttpRequest get(URI p0){ return null; } + public static BasicHttpRequest head(HttpHost p0, String p1){ return null; } + public static BasicHttpRequest head(String p0){ return null; } + public static BasicHttpRequest head(URI p0){ return null; } + public static BasicHttpRequest options(HttpHost p0, String p1){ return null; } + public static BasicHttpRequest options(String p0){ return null; } + public static BasicHttpRequest options(URI p0){ return null; } + public static BasicHttpRequest patch(HttpHost p0, String p1){ return null; } + public static BasicHttpRequest patch(String p0){ return null; } + public static BasicHttpRequest patch(URI p0){ return null; } + public static BasicHttpRequest post(HttpHost p0, String p1){ return null; } + public static BasicHttpRequest post(String p0){ return null; } + public static BasicHttpRequest post(URI p0){ return null; } + public static BasicHttpRequest put(HttpHost p0, String p1){ return null; } + public static BasicHttpRequest put(String p0){ return null; } + public static BasicHttpRequest put(URI p0){ return null; } + public static BasicHttpRequest trace(HttpHost p0, String p1){ return null; } + public static BasicHttpRequest trace(String p0){ return null; } + public static BasicHttpRequest trace(URI p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/ConfigurableHttpRequest.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/ConfigurableHttpRequest.java new file mode 100644 index 00000000000..eea418de061 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/ConfigurableHttpRequest.java @@ -0,0 +1,21 @@ +// Generated automatically from org.apache.hc.client5.http.async.methods.ConfigurableHttpRequest for testing purposes + +package org.apache.hc.client5.http.async.methods; + +import java.net.URI; +import org.apache.hc.client5.http.config.Configurable; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.message.BasicHttpRequest; +import org.apache.hc.core5.net.URIAuthority; + +public class ConfigurableHttpRequest extends BasicHttpRequest implements Configurable +{ + protected ConfigurableHttpRequest() {} + public ConfigurableHttpRequest(String p0, HttpHost p1, String p2){} + public ConfigurableHttpRequest(String p0, String p1){} + public ConfigurableHttpRequest(String p0, String p1, URIAuthority p2, String p3){} + public ConfigurableHttpRequest(String p0, URI p1){} + public RequestConfig getConfig(){ return null; } + public void setConfig(RequestConfig p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleBody.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleBody.java new file mode 100644 index 00000000000..6ad677d12cf --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleBody.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.client5.http.async.methods.SimpleBody for testing purposes + +package org.apache.hc.client5.http.async.methods; + +import org.apache.hc.core5.http.ContentType; + +public class SimpleBody +{ + protected SimpleBody() {} + public ContentType getContentType(){ return null; } + public String getBodyText(){ return null; } + public String toString(){ return null; } + public boolean isBytes(){ return false; } + public boolean isText(){ return false; } + public byte[] getBodyBytes(){ return null; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleHttpRequest.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleHttpRequest.java new file mode 100644 index 00000000000..49822a83d14 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleHttpRequest.java @@ -0,0 +1,36 @@ +// Generated automatically from org.apache.hc.client5.http.async.methods.SimpleHttpRequest for testing purposes + +package org.apache.hc.client5.http.async.methods; + +import java.net.URI; +import org.apache.hc.client5.http.async.methods.ConfigurableHttpRequest; +import org.apache.hc.client5.http.async.methods.SimpleBody; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.Method; +import org.apache.hc.core5.net.URIAuthority; + +public class SimpleHttpRequest extends ConfigurableHttpRequest +{ + protected SimpleHttpRequest() {} + public ContentType getContentType(){ return null; } + public SimpleBody getBody(){ return null; } + public SimpleHttpRequest(Method p0, HttpHost p1, String p2){} + public SimpleHttpRequest(Method p0, URI p1){} + public SimpleHttpRequest(String p0, HttpHost p1, String p2){} + public SimpleHttpRequest(String p0, String p1){} + public SimpleHttpRequest(String p0, String p1, URIAuthority p2, String p3){} + public SimpleHttpRequest(String p0, URI p1){} + public String getBodyText(){ return null; } + public byte[] getBodyBytes(){ return null; } + public static SimpleHttpRequest copy(HttpRequest p0){ return null; } + public static SimpleHttpRequest create(Method p0, HttpHost p1, String p2){ return null; } + public static SimpleHttpRequest create(Method p0, URI p1){ return null; } + public static SimpleHttpRequest create(String p0, String p1){ return null; } + public static SimpleHttpRequest create(String p0, String p1, URIAuthority p2, String p3){ return null; } + public static SimpleHttpRequest create(String p0, URI p1){ return null; } + public void setBody(SimpleBody p0){} + public void setBody(String p0, ContentType p1){} + public void setBody(byte[] p0, ContentType p1){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleHttpRequests.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleHttpRequests.java new file mode 100644 index 00000000000..8f5ea3907f3 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleHttpRequests.java @@ -0,0 +1,42 @@ +// Generated automatically from org.apache.hc.client5.http.async.methods.SimpleHttpRequests for testing purposes + +package org.apache.hc.client5.http.async.methods; + +import java.net.URI; +import org.apache.hc.client5.http.async.methods.SimpleHttpRequest; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.Method; + +public class SimpleHttpRequests +{ + public SimpleHttpRequests(){} + public static SimpleHttpRequest create(Method p0, HttpHost p1, String p2){ return null; } + public static SimpleHttpRequest create(Method p0, String p1){ return null; } + public static SimpleHttpRequest create(Method p0, URI p1){ return null; } + public static SimpleHttpRequest create(String p0, String p1){ return null; } + public static SimpleHttpRequest create(String p0, URI p1){ return null; } + public static SimpleHttpRequest delete(HttpHost p0, String p1){ return null; } + public static SimpleHttpRequest delete(String p0){ return null; } + public static SimpleHttpRequest delete(URI p0){ return null; } + public static SimpleHttpRequest get(HttpHost p0, String p1){ return null; } + public static SimpleHttpRequest get(String p0){ return null; } + public static SimpleHttpRequest get(URI p0){ return null; } + public static SimpleHttpRequest head(HttpHost p0, String p1){ return null; } + public static SimpleHttpRequest head(String p0){ return null; } + public static SimpleHttpRequest head(URI p0){ return null; } + public static SimpleHttpRequest options(HttpHost p0, String p1){ return null; } + public static SimpleHttpRequest options(String p0){ return null; } + public static SimpleHttpRequest options(URI p0){ return null; } + public static SimpleHttpRequest patch(HttpHost p0, String p1){ return null; } + public static SimpleHttpRequest patch(String p0){ return null; } + public static SimpleHttpRequest patch(URI p0){ return null; } + public static SimpleHttpRequest post(HttpHost p0, String p1){ return null; } + public static SimpleHttpRequest post(String p0){ return null; } + public static SimpleHttpRequest post(URI p0){ return null; } + public static SimpleHttpRequest put(HttpHost p0, String p1){ return null; } + public static SimpleHttpRequest put(String p0){ return null; } + public static SimpleHttpRequest put(URI p0){ return null; } + public static SimpleHttpRequest trace(HttpHost p0, String p1){ return null; } + public static SimpleHttpRequest trace(String p0){ return null; } + public static SimpleHttpRequest trace(URI p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleRequestBuilder.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleRequestBuilder.java new file mode 100644 index 00000000000..de6ea977cdd --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/async/methods/SimpleRequestBuilder.java @@ -0,0 +1,80 @@ +// Generated automatically from org.apache.hc.client5.http.async.methods.SimpleRequestBuilder for testing purposes + +package org.apache.hc.client5.http.async.methods; + +import java.net.URI; +import java.nio.charset.Charset; +import org.apache.hc.client5.http.async.methods.SimpleBody; +import org.apache.hc.client5.http.async.methods.SimpleHttpRequest; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.Method; +import org.apache.hc.core5.http.NameValuePair; +import org.apache.hc.core5.http.ProtocolVersion; +import org.apache.hc.core5.http.support.AbstractRequestBuilder; +import org.apache.hc.core5.net.URIAuthority; + +public class SimpleRequestBuilder extends AbstractRequestBuilder +{ + protected SimpleRequestBuilder() {} + protected void digest(HttpRequest p0){} + protected void digest(SimpleHttpRequest p0){} + public RequestConfig getRequestConfig(){ return null; } + public SimpleBody getBody(){ return null; } + public SimpleHttpRequest build(){ return null; } + public SimpleRequestBuilder addHeader(Header p0){ return null; } + public SimpleRequestBuilder addHeader(String p0, String p1){ return null; } + public SimpleRequestBuilder addParameter(NameValuePair p0){ return null; } + public SimpleRequestBuilder addParameter(String p0, String p1){ return null; } + public SimpleRequestBuilder addParameters(NameValuePair... p0){ return null; } + public SimpleRequestBuilder removeHeader(Header p0){ return null; } + public SimpleRequestBuilder removeHeaders(String p0){ return null; } + public SimpleRequestBuilder setAbsoluteRequestUri(boolean p0){ return null; } + public SimpleRequestBuilder setAuthority(URIAuthority p0){ return null; } + public SimpleRequestBuilder setBody(SimpleBody p0){ return null; } + public SimpleRequestBuilder setBody(String p0, ContentType p1){ return null; } + public SimpleRequestBuilder setBody(byte[] p0, ContentType p1){ return null; } + public SimpleRequestBuilder setCharset(Charset p0){ return null; } + public SimpleRequestBuilder setHeader(Header p0){ return null; } + public SimpleRequestBuilder setHeader(String p0, String p1){ return null; } + public SimpleRequestBuilder setHeaders(Header... p0){ return null; } + public SimpleRequestBuilder setHttpHost(HttpHost p0){ return null; } + public SimpleRequestBuilder setPath(String p0){ return null; } + public SimpleRequestBuilder setRequestConfig(RequestConfig p0){ return null; } + public SimpleRequestBuilder setScheme(String p0){ return null; } + public SimpleRequestBuilder setUri(String p0){ return null; } + public SimpleRequestBuilder setUri(URI p0){ return null; } + public SimpleRequestBuilder setVersion(ProtocolVersion p0){ return null; } + public String toString(){ return null; } + public static SimpleRequestBuilder copy(HttpRequest p0){ return null; } + public static SimpleRequestBuilder copy(SimpleHttpRequest p0){ return null; } + public static SimpleRequestBuilder create(Method p0){ return null; } + public static SimpleRequestBuilder create(String p0){ return null; } + public static SimpleRequestBuilder delete(){ return null; } + public static SimpleRequestBuilder delete(String p0){ return null; } + public static SimpleRequestBuilder delete(URI p0){ return null; } + public static SimpleRequestBuilder get(){ return null; } + public static SimpleRequestBuilder get(String p0){ return null; } + public static SimpleRequestBuilder get(URI p0){ return null; } + public static SimpleRequestBuilder head(){ return null; } + public static SimpleRequestBuilder head(String p0){ return null; } + public static SimpleRequestBuilder head(URI p0){ return null; } + public static SimpleRequestBuilder options(){ return null; } + public static SimpleRequestBuilder options(String p0){ return null; } + public static SimpleRequestBuilder options(URI p0){ return null; } + public static SimpleRequestBuilder patch(){ return null; } + public static SimpleRequestBuilder patch(String p0){ return null; } + public static SimpleRequestBuilder patch(URI p0){ return null; } + public static SimpleRequestBuilder post(){ return null; } + public static SimpleRequestBuilder post(String p0){ return null; } + public static SimpleRequestBuilder post(URI p0){ return null; } + public static SimpleRequestBuilder put(){ return null; } + public static SimpleRequestBuilder put(String p0){ return null; } + public static SimpleRequestBuilder put(URI p0){ return null; } + public static SimpleRequestBuilder trace(){ return null; } + public static SimpleRequestBuilder trace(String p0){ return null; } + public static SimpleRequestBuilder trace(URI p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/HttpClient.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/HttpClient.java new file mode 100644 index 00000000000..7cfe982a4f0 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/HttpClient.java @@ -0,0 +1,22 @@ +// Generated automatically from org.apache.hc.client5.http.classic.HttpClient for testing purposes + +package org.apache.hc.client5.http.classic; + +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.io.HttpClientResponseHandler; +import org.apache.hc.core5.http.protocol.HttpContext; + +public interface HttpClient +{ + T execute(ClassicHttpRequest p0, HttpContext p1, org.apache.hc.core5.http.io.HttpClientResponseHandler p2); + T execute(ClassicHttpRequest p0, org.apache.hc.core5.http.io.HttpClientResponseHandler p1); + T execute(HttpHost p0, ClassicHttpRequest p1, HttpContext p2, org.apache.hc.core5.http.io.HttpClientResponseHandler p3); + T execute(HttpHost p0, ClassicHttpRequest p1, org.apache.hc.core5.http.io.HttpClientResponseHandler p2); + ClassicHttpResponse execute(HttpHost p0, ClassicHttpRequest p1); + HttpResponse execute(ClassicHttpRequest p0); + HttpResponse execute(ClassicHttpRequest p0, HttpContext p1); + HttpResponse execute(HttpHost p0, ClassicHttpRequest p1, HttpContext p2); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/ClassicHttpRequests.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/ClassicHttpRequests.java new file mode 100644 index 00000000000..15030b64e74 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/ClassicHttpRequests.java @@ -0,0 +1,32 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.ClassicHttpRequests for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import java.net.URI; +import org.apache.hc.client5.http.classic.methods.HttpUriRequest; +import org.apache.hc.core5.http.Method; + +public class ClassicHttpRequests +{ + public ClassicHttpRequests(){} + public static HttpUriRequest create(Method p0, String p1){ return null; } + public static HttpUriRequest create(Method p0, URI p1){ return null; } + public static HttpUriRequest create(String p0, String p1){ return null; } + public static HttpUriRequest create(String p0, URI p1){ return null; } + public static HttpUriRequest delete(String p0){ return null; } + public static HttpUriRequest delete(URI p0){ return null; } + public static HttpUriRequest get(String p0){ return null; } + public static HttpUriRequest get(URI p0){ return null; } + public static HttpUriRequest head(String p0){ return null; } + public static HttpUriRequest head(URI p0){ return null; } + public static HttpUriRequest options(String p0){ return null; } + public static HttpUriRequest options(URI p0){ return null; } + public static HttpUriRequest patch(String p0){ return null; } + public static HttpUriRequest patch(URI p0){ return null; } + public static HttpUriRequest post(String p0){ return null; } + public static HttpUriRequest post(URI p0){ return null; } + public static HttpUriRequest put(String p0){ return null; } + public static HttpUriRequest put(URI p0){ return null; } + public static HttpUriRequest trace(String p0){ return null; } + public static HttpUriRequest trace(URI p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpDelete.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpDelete.java new file mode 100644 index 00000000000..2d7250d4bc5 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpDelete.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.HttpDelete for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import java.net.URI; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; + +public class HttpDelete extends HttpUriRequestBase +{ + protected HttpDelete() {} + public HttpDelete(String p0){} + public HttpDelete(URI p0){} + public static String METHOD_NAME = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpGet.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpGet.java new file mode 100644 index 00000000000..2e1189c8a5b --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpGet.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.HttpGet for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import java.net.URI; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; + +public class HttpGet extends HttpUriRequestBase +{ + protected HttpGet() {} + public HttpGet(String p0){} + public HttpGet(URI p0){} + public static String METHOD_NAME = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpHead.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpHead.java new file mode 100644 index 00000000000..628d960f773 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpHead.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.HttpHead for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import java.net.URI; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; + +public class HttpHead extends HttpUriRequestBase +{ + protected HttpHead() {} + public HttpHead(String p0){} + public HttpHead(URI p0){} + public static String METHOD_NAME = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpOptions.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpOptions.java new file mode 100644 index 00000000000..6eca25c9640 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpOptions.java @@ -0,0 +1,18 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.HttpOptions for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import java.net.URI; +import java.util.Set; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; +import org.apache.hc.core5.http.HttpResponse; + +public class HttpOptions extends HttpUriRequestBase +{ + protected HttpOptions() {} + public HttpOptions(String p0){} + public HttpOptions(URI p0){} + public Set getAllowedMethods(HttpResponse p0){ return null; } + public String getMethod(){ return null; } + public static String METHOD_NAME = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpPatch.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpPatch.java new file mode 100644 index 00000000000..7d8406a597a --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpPatch.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.HttpPatch for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import java.net.URI; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; + +public class HttpPatch extends HttpUriRequestBase +{ + protected HttpPatch() {} + public HttpPatch(String p0){} + public HttpPatch(URI p0){} + public static String METHOD_NAME = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpPost.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpPost.java new file mode 100644 index 00000000000..6dfca855ad5 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpPost.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.HttpPost for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import java.net.URI; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; + +public class HttpPost extends HttpUriRequestBase +{ + protected HttpPost() {} + public HttpPost(String p0){} + public HttpPost(URI p0){} + public static String METHOD_NAME = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpPut.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpPut.java new file mode 100644 index 00000000000..b52fcef2065 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpPut.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.HttpPut for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import java.net.URI; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; + +public class HttpPut extends HttpUriRequestBase +{ + protected HttpPut() {} + public HttpPut(String p0){} + public HttpPut(URI p0){} + public static String METHOD_NAME = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpTrace.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpTrace.java new file mode 100644 index 00000000000..df582e904b4 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpTrace.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.HttpTrace for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import java.net.URI; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; +import org.apache.hc.core5.http.HttpEntity; + +public class HttpTrace extends HttpUriRequestBase +{ + protected HttpTrace() {} + public HttpTrace(String p0){} + public HttpTrace(URI p0){} + public static String METHOD_NAME = null; + public void setEntity(HttpEntity p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpUriRequest.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpUriRequest.java new file mode 100644 index 00000000000..689c61a6d9a --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpUriRequest.java @@ -0,0 +1,12 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.HttpUriRequest for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import org.apache.hc.client5.http.config.Configurable; +import org.apache.hc.core5.http.ClassicHttpRequest; + +public interface HttpUriRequest extends ClassicHttpRequest, Configurable +{ + boolean isAborted(); + void abort(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpUriRequestBase.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpUriRequestBase.java new file mode 100644 index 00000000000..27e8f7627a8 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/classic/methods/HttpUriRequestBase.java @@ -0,0 +1,25 @@ +// Generated automatically from org.apache.hc.client5.http.classic.methods.HttpUriRequestBase for testing purposes + +package org.apache.hc.client5.http.classic.methods; + +import java.net.URI; +import org.apache.hc.client5.http.classic.methods.HttpUriRequest; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.core5.concurrent.Cancellable; +import org.apache.hc.core5.concurrent.CancellableDependency; +import org.apache.hc.core5.http.message.BasicClassicHttpRequest; + +public class HttpUriRequestBase extends BasicClassicHttpRequest implements CancellableDependency, HttpUriRequest +{ + protected HttpUriRequestBase() {} + public HttpUriRequestBase(String p0, URI p1){} + public RequestConfig getConfig(){ return null; } + public String toString(){ return null; } + public boolean cancel(){ return false; } + public boolean isAborted(){ return false; } + public boolean isCancelled(){ return false; } + public void abort(){} + public void reset(){} + public void setConfig(RequestConfig p0){} + public void setDependency(Cancellable p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/config/Configurable.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/config/Configurable.java new file mode 100644 index 00000000000..325e1618af6 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/config/Configurable.java @@ -0,0 +1,10 @@ +// Generated automatically from org.apache.hc.client5.http.config.Configurable for testing purposes + +package org.apache.hc.client5.http.config; + +import org.apache.hc.client5.http.config.RequestConfig; + +public interface Configurable +{ + RequestConfig getConfig(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/config/RequestConfig.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/config/RequestConfig.java new file mode 100644 index 00000000000..cdc6605437b --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/config/RequestConfig.java @@ -0,0 +1,57 @@ +// Generated automatically from org.apache.hc.client5.http.config.RequestConfig for testing purposes + +package org.apache.hc.client5.http.config; + +import java.util.Collection; +import java.util.concurrent.TimeUnit; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.util.TimeValue; +import org.apache.hc.core5.util.Timeout; + +public class RequestConfig implements Cloneable +{ + protected RequestConfig clone(){ return null; } + protected RequestConfig(){} + public Collection getProxyPreferredAuthSchemes(){ return null; } + public Collection getTargetPreferredAuthSchemes(){ return null; } + public HttpHost getProxy(){ return null; } + public String getCookieSpec(){ return null; } + public String toString(){ return null; } + public TimeValue getConnectionKeepAlive(){ return null; } + public Timeout getConnectTimeout(){ return null; } + public Timeout getConnectionRequestTimeout(){ return null; } + public Timeout getResponseTimeout(){ return null; } + public boolean isAuthenticationEnabled(){ return false; } + public boolean isCircularRedirectsAllowed(){ return false; } + public boolean isContentCompressionEnabled(){ return false; } + public boolean isExpectContinueEnabled(){ return false; } + public boolean isHardCancellationEnabled(){ return false; } + public boolean isRedirectsEnabled(){ return false; } + public int getMaxRedirects(){ return 0; } + public static RequestConfig DEFAULT = null; + public static RequestConfig.Builder copy(RequestConfig p0){ return null; } + public static RequestConfig.Builder custom(){ return null; } + static public class Builder + { + public RequestConfig build(){ return null; } + public RequestConfig.Builder setAuthenticationEnabled(boolean p0){ return null; } + public RequestConfig.Builder setCircularRedirectsAllowed(boolean p0){ return null; } + public RequestConfig.Builder setConnectTimeout(Timeout p0){ return null; } + public RequestConfig.Builder setConnectTimeout(long p0, TimeUnit p1){ return null; } + public RequestConfig.Builder setConnectionKeepAlive(TimeValue p0){ return null; } + public RequestConfig.Builder setConnectionRequestTimeout(Timeout p0){ return null; } + public RequestConfig.Builder setConnectionRequestTimeout(long p0, TimeUnit p1){ return null; } + public RequestConfig.Builder setContentCompressionEnabled(boolean p0){ return null; } + public RequestConfig.Builder setCookieSpec(String p0){ return null; } + public RequestConfig.Builder setDefaultKeepAlive(long p0, TimeUnit p1){ return null; } + public RequestConfig.Builder setExpectContinueEnabled(boolean p0){ return null; } + public RequestConfig.Builder setHardCancellationEnabled(boolean p0){ return null; } + public RequestConfig.Builder setMaxRedirects(int p0){ return null; } + public RequestConfig.Builder setProxy(HttpHost p0){ return null; } + public RequestConfig.Builder setProxyPreferredAuthSchemes(Collection p0){ return null; } + public RequestConfig.Builder setRedirectsEnabled(boolean p0){ return null; } + public RequestConfig.Builder setResponseTimeout(Timeout p0){ return null; } + public RequestConfig.Builder setResponseTimeout(long p0, TimeUnit p1){ return null; } + public RequestConfig.Builder setTargetPreferredAuthSchemes(Collection p0){ return null; } + } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/fluent/Content.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/fluent/Content.java new file mode 100644 index 00000000000..22435b79c19 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/fluent/Content.java @@ -0,0 +1,20 @@ +// Generated automatically from org.apache.hc.client5.http.fluent.Content for testing purposes + +package org.apache.hc.client5.http.fluent; + +import java.io.InputStream; +import java.nio.charset.Charset; +import org.apache.hc.core5.http.ContentType; + +public class Content +{ + protected Content() {} + public Content(byte[] p0, ContentType p1){} + public ContentType getType(){ return null; } + public InputStream asStream(){ return null; } + public String asString(){ return null; } + public String asString(Charset p0){ return null; } + public String toString(){ return null; } + public byte[] asBytes(){ return null; } + public static Content NO_CONTENT = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/fluent/Request.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/fluent/Request.java new file mode 100644 index 00000000000..ccbb5e755e4 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/fluent/Request.java @@ -0,0 +1,81 @@ +// Generated automatically from org.apache.hc.client5.http.fluent.Request for testing purposes + +package org.apache.hc.client5.http.fluent; + +import java.io.File; +import java.io.InputStream; +import java.net.URI; +import java.nio.charset.Charset; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; +import org.apache.hc.client5.http.fluent.Response; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpVersion; +import org.apache.hc.core5.http.Method; +import org.apache.hc.core5.http.NameValuePair; +import org.apache.hc.core5.util.Timeout; + +public class Request +{ + protected Request() {} + public Request addHeader(Header p0){ return null; } + public Request addHeader(String p0, String p1){ return null; } + public Request body(HttpEntity p0){ return null; } + public Request bodyByteArray(byte[] p0){ return null; } + public Request bodyByteArray(byte[] p0, ContentType p1){ return null; } + public Request bodyByteArray(byte[] p0, int p1, int p2){ return null; } + public Request bodyByteArray(byte[] p0, int p1, int p2, ContentType p3){ return null; } + public Request bodyFile(File p0, ContentType p1){ return null; } + public Request bodyForm(Iterable p0){ return null; } + public Request bodyForm(Iterable p0, Charset p1){ return null; } + public Request bodyForm(NameValuePair... p0){ return null; } + public Request bodyStream(InputStream p0){ return null; } + public Request bodyStream(InputStream p0, ContentType p1){ return null; } + public Request bodyString(String p0, ContentType p1){ return null; } + public Request connectTimeout(Timeout p0){ return null; } + public Request removeHeader(Header p0){ return null; } + public Request removeHeaders(String p0){ return null; } + public Request responseTimeout(Timeout p0){ return null; } + public Request setCacheControl(String p0){ return null; } + public Request setDate(Date p0){ return null; } + public Request setHeader(Header p0){ return null; } + public Request setHeader(String p0, String p1){ return null; } + public Request setHeaders(Header... p0){ return null; } + public Request setIfModifiedSince(Date p0){ return null; } + public Request setIfUnmodifiedSince(Date p0){ return null; } + public Request useExpectContinue(){ return null; } + public Request userAgent(String p0){ return null; } + public Request version(HttpVersion p0){ return null; } + public Request viaProxy(HttpHost p0){ return null; } + public Request viaProxy(String p0){ return null; } + public Response execute(){ return null; } + public Response execute(CloseableHttpClient p0){ return null; } + public String toString(){ return null; } + public static Locale DATE_LOCALE = null; + public static Request create(Method p0, URI p1){ return null; } + public static Request create(String p0, String p1){ return null; } + public static Request create(String p0, URI p1){ return null; } + public static Request delete(String p0){ return null; } + public static Request delete(URI p0){ return null; } + public static Request get(String p0){ return null; } + public static Request get(URI p0){ return null; } + public static Request head(String p0){ return null; } + public static Request head(URI p0){ return null; } + public static Request options(String p0){ return null; } + public static Request options(URI p0){ return null; } + public static Request patch(String p0){ return null; } + public static Request patch(URI p0){ return null; } + public static Request post(String p0){ return null; } + public static Request post(URI p0){ return null; } + public static Request put(String p0){ return null; } + public static Request put(URI p0){ return null; } + public static Request trace(String p0){ return null; } + public static Request trace(URI p0){ return null; } + public static String DATE_FORMAT = null; + public static TimeZone TIME_ZONE = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/fluent/Response.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/fluent/Response.java new file mode 100644 index 00000000000..658dd41a74b --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/fluent/Response.java @@ -0,0 +1,18 @@ +// Generated automatically from org.apache.hc.client5.http.fluent.Response for testing purposes + +package org.apache.hc.client5.http.fluent; + +import java.io.File; +import org.apache.hc.client5.http.fluent.Content; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.io.HttpClientResponseHandler; + +public class Response +{ + protected Response() {} + public T handleResponse(HttpClientResponseHandler p0){ return null; } + public Content returnContent(){ return null; } + public HttpResponse returnResponse(){ return null; } + public void discardContent(){} + public void saveContent(File p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/impl/classic/CloseableHttpClient.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/impl/classic/CloseableHttpClient.java new file mode 100644 index 00000000000..748fbdb8649 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/impl/classic/CloseableHttpClient.java @@ -0,0 +1,25 @@ +// Generated automatically from org.apache.hc.client5.http.impl.classic.CloseableHttpClient for testing purposes + +package org.apache.hc.client5.http.impl.classic; + +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.io.HttpClientResponseHandler; +import org.apache.hc.core5.http.protocol.HttpContext; +import org.apache.hc.core5.io.ModalCloseable; + +abstract public class CloseableHttpClient implements HttpClient, ModalCloseable +{ + protected abstract CloseableHttpResponse doExecute(HttpHost p0, ClassicHttpRequest p1, HttpContext p2); + public T execute(ClassicHttpRequest p0, HttpContext p1, org.apache.hc.core5.http.io.HttpClientResponseHandler p2){ return null; } + public T execute(ClassicHttpRequest p0, org.apache.hc.core5.http.io.HttpClientResponseHandler p1){ return null; } + public T execute(HttpHost p0, ClassicHttpRequest p1, HttpContext p2, org.apache.hc.core5.http.io.HttpClientResponseHandler p3){ return null; } + public T execute(HttpHost p0, ClassicHttpRequest p1, org.apache.hc.core5.http.io.HttpClientResponseHandler p2){ return null; } + public CloseableHttpClient(){} + public CloseableHttpResponse execute(ClassicHttpRequest p0){ return null; } + public CloseableHttpResponse execute(ClassicHttpRequest p0, HttpContext p1){ return null; } + public CloseableHttpResponse execute(HttpHost p0, ClassicHttpRequest p1){ return null; } + public CloseableHttpResponse execute(HttpHost p0, ClassicHttpRequest p1, HttpContext p2){ return null; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/impl/classic/CloseableHttpResponse.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/impl/classic/CloseableHttpResponse.java new file mode 100644 index 00000000000..a26907a91cd --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/client5/http/impl/classic/CloseableHttpResponse.java @@ -0,0 +1,43 @@ +// Generated automatically from org.apache.hc.client5.http.impl.classic.CloseableHttpResponse for testing purposes + +package org.apache.hc.client5.http.impl.classic; + +import java.util.Iterator; +import java.util.Locale; +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.ProtocolVersion; + +public class CloseableHttpResponse implements ClassicHttpResponse +{ + protected CloseableHttpResponse() {} + public Header getFirstHeader(String p0){ return null; } + public Header getHeader(String p0){ return null; } + public Header getLastHeader(String p0){ return null; } + public Header[] getHeaders(){ return null; } + public Header[] getHeaders(String p0){ return null; } + public HttpEntity getEntity(){ return null; } + public Iterator
    headerIterator(){ return null; } + public Iterator
    headerIterator(String p0){ return null; } + public Locale getLocale(){ return null; } + public ProtocolVersion getVersion(){ return null; } + public String getReasonPhrase(){ return null; } + public String toString(){ return null; } + public boolean containsHeader(String p0){ return false; } + public boolean removeHeader(Header p0){ return false; } + public boolean removeHeaders(String p0){ return false; } + public int countHeaders(String p0){ return 0; } + public int getCode(){ return 0; } + public void addHeader(Header p0){} + public void addHeader(String p0, Object p1){} + public void close(){} + public void setCode(int p0){} + public void setEntity(HttpEntity p0){} + public void setHeader(Header p0){} + public void setHeader(String p0, Object p1){} + public void setHeaders(Header... p0){} + public void setLocale(Locale p0){} + public void setReasonPhrase(String p0){} + public void setVersion(ProtocolVersion p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/concurrent/Cancellable.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/concurrent/Cancellable.java new file mode 100644 index 00000000000..90c9701146f --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/concurrent/Cancellable.java @@ -0,0 +1,9 @@ +// Generated automatically from org.apache.hc.core5.concurrent.Cancellable for testing purposes + +package org.apache.hc.core5.concurrent; + + +public interface Cancellable +{ + boolean cancel(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/concurrent/CancellableDependency.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/concurrent/CancellableDependency.java new file mode 100644 index 00000000000..ae96fdf62bf --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/concurrent/CancellableDependency.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.concurrent.CancellableDependency for testing purposes + +package org.apache.hc.core5.concurrent; + +import org.apache.hc.core5.concurrent.Cancellable; + +public interface CancellableDependency extends Cancellable +{ + boolean isCancelled(); + void setDependency(Cancellable p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/concurrent/FutureCallback.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/concurrent/FutureCallback.java new file mode 100644 index 00000000000..01fcf800303 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/concurrent/FutureCallback.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.concurrent.FutureCallback for testing purposes + +package org.apache.hc.core5.concurrent; + + +public interface FutureCallback +{ + void cancelled(); + void completed(T p0); + void failed(Exception p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Callback.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Callback.java new file mode 100644 index 00000000000..f834d9e3118 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Callback.java @@ -0,0 +1,9 @@ +// Generated automatically from org.apache.hc.core5.function.Callback for testing purposes + +package org.apache.hc.core5.function; + + +public interface Callback +{ + void execute(T p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Decorator.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Decorator.java new file mode 100644 index 00000000000..5a91c7ead8b --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Decorator.java @@ -0,0 +1,9 @@ +// Generated automatically from org.apache.hc.core5.function.Decorator for testing purposes + +package org.apache.hc.core5.function; + + +public interface Decorator +{ + T decorate(T p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Resolver.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Resolver.java new file mode 100644 index 00000000000..a4f60c02bad --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Resolver.java @@ -0,0 +1,9 @@ +// Generated automatically from org.apache.hc.core5.function.Resolver for testing purposes + +package org.apache.hc.core5.function; + + +public interface Resolver +{ + O resolve(I p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Supplier.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Supplier.java index c847728f32f..0e109333a4e 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Supplier.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/function/Supplier.java @@ -1,33 +1,9 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.function.Supplier for testing purposes package org.apache.hc.core5.function; -public interface Supplier { - T get(); +public interface Supplier +{ + T get(); } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ClassicHttpRequest.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ClassicHttpRequest.java index 9997a4f0cb1..1ee328346b8 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ClassicHttpRequest.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ClassicHttpRequest.java @@ -1,36 +1,10 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.ClassicHttpRequest for testing purposes package org.apache.hc.core5.http; -/** - * 'Classic' {@link HttpRequest} message that can enclose {@link HttpEntity}. - * - * @since 5.0 - */ -public interface ClassicHttpRequest extends HttpRequest, HttpEntityContainer { +import org.apache.hc.core5.http.HttpEntityContainer; +import org.apache.hc.core5.http.HttpRequest; + +public interface ClassicHttpRequest extends HttpEntityContainer, HttpRequest +{ } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ClassicHttpResponse.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ClassicHttpResponse.java index 571f1b0c420..a3fb7c84e34 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ClassicHttpResponse.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ClassicHttpResponse.java @@ -1,33 +1,11 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.ClassicHttpResponse for testing purposes package org.apache.hc.core5.http; import java.io.Closeable; +import org.apache.hc.core5.http.HttpEntityContainer; +import org.apache.hc.core5.http.HttpResponse; -public interface ClassicHttpResponse extends HttpResponse, HttpEntityContainer, Closeable { +public interface ClassicHttpResponse extends Closeable, HttpEntityContainer, HttpResponse +{ } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ContentType.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ContentType.java index f7d3ffc21a3..96e14094e2b 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ContentType.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ContentType.java @@ -1,159 +1,60 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.ContentType for testing purposes package org.apache.hc.core5.http; + import java.io.Serializable; import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.charset.UnsupportedCharsetException; - -public final class ContentType implements Serializable { - public static final ContentType APPLICATION_ATOM_XML = null; - - public static final ContentType APPLICATION_FORM_URLENCODED = null; - - public static final ContentType APPLICATION_JSON = null; - - public static final ContentType APPLICATION_NDJSON = null; - - public static final ContentType APPLICATION_OCTET_STREAM = null; - - public static final ContentType APPLICATION_PDF = null; - - public static final ContentType APPLICATION_SOAP_XML = null; - - public static final ContentType APPLICATION_SVG_XML = null; - - public static final ContentType APPLICATION_XHTML_XML = null; - - public static final ContentType APPLICATION_XML = null; - - public static final ContentType APPLICATION_PROBLEM_JSON = null; - - public static final ContentType APPLICATION_PROBLEM_XML = null; - - public static final ContentType APPLICATION_RSS_XML = null; - - public static final ContentType IMAGE_BMP = null; - - public static final ContentType IMAGE_GIF = null; - - public static final ContentType IMAGE_JPEG = null; - - public static final ContentType IMAGE_PNG = null; - - public static final ContentType IMAGE_SVG = null; - - public static final ContentType IMAGE_TIFF = null; - - public static final ContentType IMAGE_WEBP = null; - - public static final ContentType MULTIPART_FORM_DATA = null; - - public static final ContentType MULTIPART_MIXED = null; - - public static final ContentType MULTIPART_RELATED = null; - - public static final ContentType TEXT_HTML = null; - - public static final ContentType TEXT_MARKDOWN = null; - - public static final ContentType TEXT_PLAIN = null; - - public static final ContentType TEXT_XML = null; - - public static final ContentType TEXT_EVENT_STREAM = null; - - public static final ContentType WILDCARD = null; - - private static final NameValuePair[] EMPTY_NAME_VALUE_PAIR_ARRAY = new NameValuePair[0]; - - public String getMimeType() { - return null; - } - - public Charset getCharset() { - return null; - } - - public String getParameter(final String name) { - return null; - } - - @Override - public String toString() { - return null; - } - - public static ContentType create(final String mimeType, final Charset charset) { - return null; - } - - public static ContentType create(final String mimeType) { - return null; - } - - public static ContentType create( - final String mimeType, final String charset) throws UnsupportedCharsetException { - return null; - } - - public static ContentType create( - final String mimeType, final NameValuePair... params) throws UnsupportedCharsetException { - return null; - } - - public static ContentType parse(final CharSequence s) throws UnsupportedCharsetException { - return null; - } - - public static ContentType parseLenient(final CharSequence s) throws UnsupportedCharsetException { - return null; - } - - public static ContentType getByMimeType(final String mimeType) { - return null; - } - - public ContentType withCharset(final Charset charset) { - return null; - } - - public ContentType withCharset(final String charset) { - return null; - } - - public ContentType withParameters( - final NameValuePair... params) throws UnsupportedCharsetException { - return null; - } - - public boolean isSameMimeType(final ContentType contentType) { - return false; - } +import org.apache.hc.core5.http.NameValuePair; +public class ContentType implements Serializable +{ + protected ContentType() {} + public Charset getCharset(){ return null; } + public Charset getCharset(Charset p0){ return null; } + public ContentType withCharset(Charset p0){ return null; } + public ContentType withCharset(String p0){ return null; } + public ContentType withParameters(NameValuePair... p0){ return null; } + public String getMimeType(){ return null; } + public String getParameter(String p0){ return null; } + public String toString(){ return null; } + public boolean isSameMimeType(ContentType p0){ return false; } + public static Charset getCharset(ContentType p0, Charset p1){ return null; } + public static ContentType APPLICATION_ATOM_XML = null; + public static ContentType APPLICATION_FORM_URLENCODED = null; + public static ContentType APPLICATION_JSON = null; + public static ContentType APPLICATION_NDJSON = null; + public static ContentType APPLICATION_OCTET_STREAM = null; + public static ContentType APPLICATION_PDF = null; + public static ContentType APPLICATION_PROBLEM_JSON = null; + public static ContentType APPLICATION_PROBLEM_XML = null; + public static ContentType APPLICATION_RSS_XML = null; + public static ContentType APPLICATION_SOAP_XML = null; + public static ContentType APPLICATION_SVG_XML = null; + public static ContentType APPLICATION_XHTML_XML = null; + public static ContentType APPLICATION_XML = null; + public static ContentType DEFAULT_BINARY = null; + public static ContentType DEFAULT_TEXT = null; + public static ContentType IMAGE_BMP = null; + public static ContentType IMAGE_GIF = null; + public static ContentType IMAGE_JPEG = null; + public static ContentType IMAGE_PNG = null; + public static ContentType IMAGE_SVG = null; + public static ContentType IMAGE_TIFF = null; + public static ContentType IMAGE_WEBP = null; + public static ContentType MULTIPART_FORM_DATA = null; + public static ContentType MULTIPART_MIXED = null; + public static ContentType MULTIPART_RELATED = null; + public static ContentType TEXT_EVENT_STREAM = null; + public static ContentType TEXT_HTML = null; + public static ContentType TEXT_MARKDOWN = null; + public static ContentType TEXT_PLAIN = null; + public static ContentType TEXT_XML = null; + public static ContentType WILDCARD = null; + public static ContentType create(String p0){ return null; } + public static ContentType create(String p0, Charset p1){ return null; } + public static ContentType create(String p0, NameValuePair... p1){ return null; } + public static ContentType create(String p0, String p1){ return null; } + public static ContentType getByMimeType(String p0){ return null; } + public static ContentType parse(CharSequence p0){ return null; } + public static ContentType parseLenient(CharSequence p0){ return null; } } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/EntityDetails.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/EntityDetails.java index bed26e033f7..744e2df8775 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/EntityDetails.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/EntityDetails.java @@ -1,43 +1,14 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.EntityDetails for testing purposes package org.apache.hc.core5.http; import java.util.Set; -public interface EntityDetails { - long getContentLength(); - - String getContentType(); - - String getContentEncoding(); - - boolean isChunked(); - +public interface EntityDetails +{ Set getTrailerNames(); - + String getContentEncoding(); + String getContentType(); + boolean isChunked(); + long getContentLength(); } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/Header.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/Header.java index 888e80e1748..7a46f5c8b1a 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/Header.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/Header.java @@ -1,39 +1,10 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.Header for testing purposes package org.apache.hc.core5.http; -/** - * Represents an HTTP header field consisting of a field name and a field - * value. - * - * @since 4.0 - */ -public interface Header extends NameValuePair { - boolean isSensitive(); +import org.apache.hc.core5.http.NameValuePair; +public interface Header extends NameValuePair +{ + boolean isSensitive(); } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpEntity.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpEntity.java index 02f47cd4e41..c9388af385c 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpEntity.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpEntity.java @@ -1,29 +1,4 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.HttpEntity for testing purposes package org.apache.hc.core5.http; @@ -32,17 +7,15 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; - import org.apache.hc.core5.function.Supplier; +import org.apache.hc.core5.http.EntityDetails; +import org.apache.hc.core5.http.Header; -public interface HttpEntity extends EntityDetails, Closeable { - boolean isRepeatable(); - +public interface HttpEntity extends Closeable, EntityDetails +{ InputStream getContent() throws IOException, UnsupportedOperationException; - - void writeTo(OutputStream outStream) throws IOException; - - boolean isStreaming(); Supplier> getTrailers(); - + boolean isRepeatable(); + boolean isStreaming(); + void writeTo(OutputStream p0) throws IOException; } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpEntityContainer.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpEntityContainer.java index dbde2e9966c..9eafd490377 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpEntityContainer.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpEntityContainer.java @@ -1,40 +1,11 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.HttpEntityContainer for testing purposes package org.apache.hc.core5.http; -/** - * Contains an {@link HttpEntity}. - * - * @since 5.0 - */ -public interface HttpEntityContainer { +import org.apache.hc.core5.http.HttpEntity; + +public interface HttpEntityContainer +{ HttpEntity getEntity(); - - void setEntity(HttpEntity entity); - + void setEntity(HttpEntity p0); } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpHost.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpHost.java new file mode 100644 index 00000000000..a84b0e611fd --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpHost.java @@ -0,0 +1,37 @@ +// Generated automatically from org.apache.hc.core5.http.HttpHost for testing purposes + +package org.apache.hc.core5.http; + +import java.io.Serializable; +import java.net.InetAddress; +import java.net.URI; +import org.apache.hc.core5.http.URIScheme; +import org.apache.hc.core5.net.NamedEndpoint; +import org.apache.hc.core5.net.URIAuthority; + +public class HttpHost implements NamedEndpoint, Serializable +{ + protected HttpHost() {} + public HttpHost(InetAddress p0){} + public HttpHost(InetAddress p0, int p1){} + public HttpHost(String p0){} + public HttpHost(String p0, InetAddress p1, String p2, int p3){} + public HttpHost(String p0, InetAddress p1, int p2){} + public HttpHost(String p0, NamedEndpoint p1){} + public HttpHost(String p0, String p1){} + public HttpHost(String p0, String p1, int p2){} + public HttpHost(String p0, int p1){} + public HttpHost(URIAuthority p0){} + public InetAddress getAddress(){ return null; } + public String getHostName(){ return null; } + public String getSchemeName(){ return null; } + public String toHostString(){ return null; } + public String toString(){ return null; } + public String toURI(){ return null; } + public boolean equals(Object p0){ return false; } + public int getPort(){ return 0; } + public int hashCode(){ return 0; } + public static HttpHost create(String p0){ return null; } + public static HttpHost create(URI p0){ return null; } + public static URIScheme DEFAULT_SCHEME = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpMessage.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpMessage.java index 425e3a2719c..9ddeef03cef 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpMessage.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpMessage.java @@ -1,55 +1,20 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.HttpMessage for testing purposes package org.apache.hc.core5.http; -/** - * HTTP messages consist of requests from client to server and responses - * from server to client. - * - * @since 4.0 - */ -public interface HttpMessage extends MessageHeaders { - void setVersion(ProtocolVersion version); +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.MessageHeaders; +import org.apache.hc.core5.http.ProtocolVersion; +public interface HttpMessage extends MessageHeaders +{ ProtocolVersion getVersion(); - - void addHeader(Header header); - - void addHeader(String name, Object value); - - void setHeader(Header header); - - void setHeader(String name, Object value); - - void setHeaders(Header... headers); - - boolean removeHeader(Header header); - - boolean removeHeaders(String name); - + boolean removeHeader(Header p0); + boolean removeHeaders(String p0); + void addHeader(Header p0); + void addHeader(String p0, Object p1); + void setHeader(Header p0); + void setHeader(String p0, Object p1); + void setHeaders(Header... p0); + void setVersion(ProtocolVersion p0); } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpRequest.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpRequest.java index e16c157b030..a0d587525d9 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpRequest.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpRequest.java @@ -1,56 +1,21 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.HttpRequest for testing purposes package org.apache.hc.core5.http; import java.net.URI; -import java.net.URISyntaxException; - +import org.apache.hc.core5.http.HttpMessage; import org.apache.hc.core5.net.URIAuthority; -public interface HttpRequest extends HttpMessage { +public interface HttpRequest extends HttpMessage +{ String getMethod(); - String getPath(); - - void setPath(String path); - - String getScheme(); - - void setScheme(String scheme); - - URIAuthority getAuthority(); - - void setAuthority(URIAuthority authority); - String getRequestUri(); - - URI getUri() throws URISyntaxException; - - void setUri(final URI requestUri); - + String getScheme(); + URI getUri(); + URIAuthority getAuthority(); + void setAuthority(URIAuthority p0); + void setPath(String p0); + void setScheme(String p0); + void setUri(URI p0); } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpRequestFactory.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpRequestFactory.java new file mode 100644 index 00000000000..d421c21c8f3 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpRequestFactory.java @@ -0,0 +1,12 @@ +// Generated automatically from org.apache.hc.core5.http.HttpRequestFactory for testing purposes + +package org.apache.hc.core5.http; + +import java.net.URI; +import org.apache.hc.core5.http.HttpRequest; + +public interface HttpRequestFactory +{ + T newHttpRequest(String p0, String p1); + T newHttpRequest(String p0, URI p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpResponse.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpResponse.java index 4a962d484ff..cd6cae950d2 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpResponse.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpResponse.java @@ -1,45 +1,16 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.HttpResponse for testing purposes package org.apache.hc.core5.http; import java.util.Locale; +import org.apache.hc.core5.http.HttpMessage; -public interface HttpResponse extends HttpMessage { - int getCode(); - - void setCode(int code); - - String getReasonPhrase(); - - void setReasonPhrase(String reason); - +public interface HttpResponse extends HttpMessage +{ Locale getLocale(); - - void setLocale(Locale loc); - + String getReasonPhrase(); + int getCode(); + void setCode(int p0); + void setLocale(Locale p0); + void setReasonPhrase(String p0); } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpVersion.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpVersion.java new file mode 100644 index 00000000000..76b3adfe585 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/HttpVersion.java @@ -0,0 +1,20 @@ +// Generated automatically from org.apache.hc.core5.http.HttpVersion for testing purposes + +package org.apache.hc.core5.http; + +import org.apache.hc.core5.http.ProtocolVersion; + +public class HttpVersion extends ProtocolVersion +{ + protected HttpVersion() {} + public HttpVersion(int p0, int p1){} + public static HttpVersion DEFAULT = null; + public static HttpVersion HTTP_0_9 = null; + public static HttpVersion HTTP_1_0 = null; + public static HttpVersion HTTP_1_1 = null; + public static HttpVersion HTTP_2 = null; + public static HttpVersion HTTP_2_0 = null; + public static HttpVersion get(int p0, int p1){ return null; } + public static HttpVersion[] ALL = null; + public static String HTTP = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/MessageHeaders.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/MessageHeaders.java index 374910f5f2b..1a426cb1b21 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/MessageHeaders.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/MessageHeaders.java @@ -1,51 +1,19 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.MessageHeaders for testing purposes package org.apache.hc.core5.http; import java.util.Iterator; +import org.apache.hc.core5.http.Header; -public interface MessageHeaders { - boolean containsHeader(String name); - - int countHeaders(String name); - - Header getFirstHeader(String name); - - Header getHeader(String name) throws ProtocolException; - +public interface MessageHeaders +{ + Header getFirstHeader(String p0); + Header getHeader(String p0); + Header getLastHeader(String p0); Header[] getHeaders(); - - Header[] getHeaders(String name); - - Header getLastHeader(String name); - + Header[] getHeaders(String p0); Iterator
    headerIterator(); - - Iterator
    headerIterator(String name); - + Iterator
    headerIterator(String p0); + boolean containsHeader(String p0); + int countHeaders(String p0); } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/Method.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/Method.java new file mode 100644 index 00000000000..54684fbf6d3 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/Method.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.http.Method for testing purposes + +package org.apache.hc.core5.http; + + +public enum Method +{ + CONNECT, DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT, TRACE; + private Method() {} + public boolean isIdempotent(){ return false; } + public boolean isSafe(){ return false; } + public boolean isSame(String p0){ return false; } + public static Method normalizedValueOf(String p0){ return null; } + public static boolean isIdempotent(String p0){ return false; } + public static boolean isSafe(String p0){ return false; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/NameValuePair.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/NameValuePair.java index b7e793994db..50fdab985a7 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/NameValuePair.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/NameValuePair.java @@ -1,40 +1,10 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.NameValuePair for testing purposes package org.apache.hc.core5.http; -/** - * A name-value pair parameter used as an element of HTTP messages. - * - * @since 4.0 - */ -public interface NameValuePair { + +public interface NameValuePair +{ String getName(); - String getValue(); - } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ProtocolVersion.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ProtocolVersion.java index 37f17cf8b8d..dbdc93c9233 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ProtocolVersion.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/ProtocolVersion.java @@ -1,87 +1,23 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.ProtocolVersion for testing purposes package org.apache.hc.core5.http; import java.io.Serializable; -public class ProtocolVersion implements Serializable { - public ProtocolVersion(final String protocol, final int major, final int minor) { - } - - public final String getProtocol() { - return null; - } - - public final int getMajor() { - return 0; - } - - public final int getMinor() { - return 0; - } - - @Override - public final int hashCode() { - return 0; - } - - public final boolean equals(final int major, final int minor) { - return false; - } - - @Override - public final boolean equals(final Object obj) { - return false; - } - - public String format() { - return null; - } - - public boolean isComparable(final ProtocolVersion that) { - return false; - } - - public int compareToVersion(final ProtocolVersion that) { - return 0; - } - - public final boolean greaterEquals(final ProtocolVersion version) { - return false; - } - - public final boolean lessEquals(final ProtocolVersion version) { - return false; - } - - @Override - public String toString() { - return null; - } - +public class ProtocolVersion implements Serializable +{ + protected ProtocolVersion() {} + public ProtocolVersion(String p0, int p1, int p2){} + public String format(){ return null; } + public String toString(){ return null; } + public boolean isComparable(ProtocolVersion p0){ return false; } + public final String getProtocol(){ return null; } + public final boolean equals(Object p0){ return false; } + public final boolean equals(int p0, int p1){ return false; } + public final boolean greaterEquals(ProtocolVersion p0){ return false; } + public final boolean lessEquals(ProtocolVersion p0){ return false; } + public final int getMajor(){ return 0; } + public final int getMinor(){ return 0; } + public final int hashCode(){ return 0; } + public int compareToVersion(ProtocolVersion p0){ return 0; } } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/SocketModalCloseable.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/SocketModalCloseable.java new file mode 100644 index 00000000000..1c16e962e08 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/SocketModalCloseable.java @@ -0,0 +1,12 @@ +// Generated automatically from org.apache.hc.core5.http.SocketModalCloseable for testing purposes + +package org.apache.hc.core5.http; + +import org.apache.hc.core5.io.ModalCloseable; +import org.apache.hc.core5.util.Timeout; + +public interface SocketModalCloseable extends ModalCloseable +{ + Timeout getSocketTimeout(); + void setSocketTimeout(Timeout p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/URIScheme.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/URIScheme.java new file mode 100644 index 00000000000..5145c917bec --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/URIScheme.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.hc.core5.http.URIScheme for testing purposes + +package org.apache.hc.core5.http; + + +public enum URIScheme +{ + HTTP, HTTPS; + private URIScheme() {} + public String getId(){ return null; } + public String toString(){ return null; } + public boolean same(String p0){ return false; } + public final String id = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/bootstrap/AbstractConnectionInitiatorBase.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/bootstrap/AbstractConnectionInitiatorBase.java new file mode 100644 index 00000000000..e3577b76387 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/bootstrap/AbstractConnectionInitiatorBase.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.http.impl.bootstrap.AbstractConnectionInitiatorBase for testing purposes + +package org.apache.hc.core5.http.impl.bootstrap; + +import java.net.SocketAddress; +import java.util.concurrent.Future; +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.net.NamedEndpoint; +import org.apache.hc.core5.reactor.ConnectionInitiator; +import org.apache.hc.core5.reactor.IOSession; +import org.apache.hc.core5.util.Timeout; + +abstract class AbstractConnectionInitiatorBase implements ConnectionInitiator +{ + public final Future connect(NamedEndpoint p0, SocketAddress p1, SocketAddress p2, Timeout p3, Object p4, FutureCallback p5){ return null; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/bootstrap/AsyncRequester.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/bootstrap/AsyncRequester.java new file mode 100644 index 00000000000..ff10df989d0 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/bootstrap/AsyncRequester.java @@ -0,0 +1,34 @@ +// Generated automatically from org.apache.hc.core5.http.impl.bootstrap.AsyncRequester for testing purposes + +package org.apache.hc.core5.http.impl.bootstrap; + +import java.net.InetSocketAddress; +import java.util.concurrent.Future; +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.function.Callback; +import org.apache.hc.core5.function.Decorator; +import org.apache.hc.core5.function.Resolver; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.impl.bootstrap.AbstractConnectionInitiatorBase; +import org.apache.hc.core5.io.CloseMode; +import org.apache.hc.core5.reactor.IOEventHandlerFactory; +import org.apache.hc.core5.reactor.IOReactorConfig; +import org.apache.hc.core5.reactor.IOReactorService; +import org.apache.hc.core5.reactor.IOReactorStatus; +import org.apache.hc.core5.reactor.IOSession; +import org.apache.hc.core5.reactor.IOSessionListener; +import org.apache.hc.core5.util.TimeValue; +import org.apache.hc.core5.util.Timeout; + +public class AsyncRequester extends AbstractConnectionInitiatorBase implements IOReactorService +{ + protected AsyncRequester() {} + public AsyncRequester(IOEventHandlerFactory p0, IOReactorConfig p1, Decorator p2, Callback p3, IOSessionListener p4, Callback p5, Resolver p6){} + public Future requestSession(HttpHost p0, Timeout p1, Object p2, FutureCallback p3){ return null; } + public IOReactorStatus getStatus(){ return null; } + public void awaitShutdown(TimeValue p0){} + public void close(){} + public void close(CloseMode p0){} + public void initiateShutdown(){} + public void start(){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java new file mode 100644 index 00000000000..75632e1ed6f --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java @@ -0,0 +1,59 @@ +// Generated automatically from org.apache.hc.core5.http.impl.bootstrap.HttpAsyncRequester for testing purposes + +package org.apache.hc.core5.http.impl.bootstrap; + +import java.util.Set; +import java.util.concurrent.Future; +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.function.Callback; +import org.apache.hc.core5.function.Decorator; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.impl.bootstrap.AsyncRequester; +import org.apache.hc.core5.http.nio.AsyncClientEndpoint; +import org.apache.hc.core5.http.nio.AsyncClientExchangeHandler; +import org.apache.hc.core5.http.nio.AsyncPushConsumer; +import org.apache.hc.core5.http.nio.AsyncRequestProducer; +import org.apache.hc.core5.http.nio.AsyncResponseConsumer; +import org.apache.hc.core5.http.nio.HandlerFactory; +import org.apache.hc.core5.http.nio.ResourceHolder; +import org.apache.hc.core5.http.nio.ssl.TlsStrategy; +import org.apache.hc.core5.http.protocol.HttpContext; +import org.apache.hc.core5.io.ModalCloseable; +import org.apache.hc.core5.net.NamedEndpoint; +import org.apache.hc.core5.pool.ConnPoolControl; +import org.apache.hc.core5.pool.ManagedConnPool; +import org.apache.hc.core5.pool.PoolStats; +import org.apache.hc.core5.reactor.IOEventHandlerFactory; +import org.apache.hc.core5.reactor.IOReactorConfig; +import org.apache.hc.core5.reactor.IOSession; +import org.apache.hc.core5.reactor.IOSessionListener; +import org.apache.hc.core5.reactor.ProtocolIOSession; +import org.apache.hc.core5.util.TimeValue; +import org.apache.hc.core5.util.Timeout; + +public class HttpAsyncRequester extends AsyncRequester implements ConnPoolControl +{ + protected HttpAsyncRequester() {} + protected Future doConnect(HttpHost p0, Timeout p1, Object p2, FutureCallback p3){ return null; } + protected void doTlsUpgrade(ProtocolIOSession p0, NamedEndpoint p1, FutureCallback p2){} + public Future connect(HttpHost p0, Timeout p1){ return null; } + public Future connect(HttpHost p0, Timeout p1, Object p2, FutureCallback p3){ return null; } + public HttpAsyncRequester(IOReactorConfig p0, IOEventHandlerFactory p1, Decorator p2, Callback p3, IOSessionListener p4, ManagedConnPool p5){} + public HttpAsyncRequester(IOReactorConfig p0, IOEventHandlerFactory p1, Decorator p2, Callback p3, IOSessionListener p4, ManagedConnPool p5, TlsStrategy p6, Timeout p7){} + public PoolStats getStats(HttpHost p0){ return null; } + public PoolStats getTotalStats(){ return null; } + public Set getRoutes(){ return null; } + public final java.util.concurrent.Future execute(AsyncRequestProducer p0, org.apache.hc.core5.http.nio.AsyncResponseConsumer p1, HandlerFactory p2, Timeout p3, HttpContext p4, org.apache.hc.core5.concurrent.FutureCallback p5){ return null; } + public final java.util.concurrent.Future execute(AsyncRequestProducer p0, org.apache.hc.core5.http.nio.AsyncResponseConsumer p1, Timeout p2, HttpContext p3, org.apache.hc.core5.concurrent.FutureCallback p4){ return null; } + public final java.util.concurrent.Future execute(AsyncRequestProducer p0, org.apache.hc.core5.http.nio.AsyncResponseConsumer p1, Timeout p2, org.apache.hc.core5.concurrent.FutureCallback p3){ return null; } + public int getDefaultMaxPerRoute(){ return 0; } + public int getMaxPerRoute(HttpHost p0){ return 0; } + public int getMaxTotal(){ return 0; } + public void closeExpired(){} + public void closeIdle(TimeValue p0){} + public void execute(AsyncClientExchangeHandler p0, HandlerFactory p1, Timeout p2, HttpContext p3){} + public void execute(AsyncClientExchangeHandler p0, Timeout p1, HttpContext p2){} + public void setDefaultMaxPerRoute(int p0){} + public void setMaxPerRoute(HttpHost p0, int p1){} + public void setMaxTotal(int p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/io/DefaultClassicHttpRequestFactory.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/io/DefaultClassicHttpRequestFactory.java new file mode 100644 index 00000000000..8d807c9ad35 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/io/DefaultClassicHttpRequestFactory.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.http.impl.io.DefaultClassicHttpRequestFactory for testing purposes + +package org.apache.hc.core5.http.impl.io; + +import java.net.URI; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.HttpRequestFactory; + +public class DefaultClassicHttpRequestFactory implements HttpRequestFactory +{ + public ClassicHttpRequest newHttpRequest(String p0, String p1){ return null; } + public ClassicHttpRequest newHttpRequest(String p0, URI p1){ return null; } + public DefaultClassicHttpRequestFactory(){} + public static DefaultClassicHttpRequestFactory INSTANCE = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/nio/DefaultHttpRequestFactory.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/nio/DefaultHttpRequestFactory.java new file mode 100644 index 00000000000..ae3274e8e86 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/impl/nio/DefaultHttpRequestFactory.java @@ -0,0 +1,15 @@ +// Generated automatically from org.apache.hc.core5.http.impl.nio.DefaultHttpRequestFactory for testing purposes + +package org.apache.hc.core5.http.impl.nio; + +import java.net.URI; +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.HttpRequestFactory; + +public class DefaultHttpRequestFactory implements HttpRequestFactory +{ + public DefaultHttpRequestFactory(){} + public HttpRequest newHttpRequest(String p0, String p1){ return null; } + public HttpRequest newHttpRequest(String p0, URI p1){ return null; } + public static DefaultHttpRequestFactory INSTANCE = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/io/HttpClientResponseHandler.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/io/HttpClientResponseHandler.java new file mode 100644 index 00000000000..839e90c97ab --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/io/HttpClientResponseHandler.java @@ -0,0 +1,10 @@ +// Generated automatically from org.apache.hc.core5.http.io.HttpClientResponseHandler for testing purposes + +package org.apache.hc.core5.http.io; + +import org.apache.hc.core5.http.ClassicHttpResponse; + +public interface HttpClientResponseHandler +{ + T handleResponse(ClassicHttpResponse p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/io/support/ClassicRequestBuilder.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/io/support/ClassicRequestBuilder.java new file mode 100644 index 00000000000..8479f00cad8 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/io/support/ClassicRequestBuilder.java @@ -0,0 +1,73 @@ +// Generated automatically from org.apache.hc.core5.http.io.support.ClassicRequestBuilder for testing purposes + +package org.apache.hc.core5.http.io.support; + +import java.net.URI; +import java.nio.charset.Charset; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.NameValuePair; +import org.apache.hc.core5.http.ProtocolVersion; +import org.apache.hc.core5.http.support.AbstractRequestBuilder; +import org.apache.hc.core5.net.URIAuthority; + +public class ClassicRequestBuilder extends AbstractRequestBuilder +{ + protected ClassicRequestBuilder() {} + protected void digest(ClassicHttpRequest p0){} + public ClassicHttpRequest build(){ return null; } + public ClassicRequestBuilder addHeader(Header p0){ return null; } + public ClassicRequestBuilder addHeader(String p0, String p1){ return null; } + public ClassicRequestBuilder addParameter(NameValuePair p0){ return null; } + public ClassicRequestBuilder addParameter(String p0, String p1){ return null; } + public ClassicRequestBuilder addParameters(NameValuePair... p0){ return null; } + public ClassicRequestBuilder removeHeader(Header p0){ return null; } + public ClassicRequestBuilder removeHeaders(String p0){ return null; } + public ClassicRequestBuilder setAbsoluteRequestUri(boolean p0){ return null; } + public ClassicRequestBuilder setAuthority(URIAuthority p0){ return null; } + public ClassicRequestBuilder setCharset(Charset p0){ return null; } + public ClassicRequestBuilder setEntity(HttpEntity p0){ return null; } + public ClassicRequestBuilder setEntity(String p0){ return null; } + public ClassicRequestBuilder setEntity(String p0, ContentType p1){ return null; } + public ClassicRequestBuilder setEntity(byte[] p0, ContentType p1){ return null; } + public ClassicRequestBuilder setHeader(Header p0){ return null; } + public ClassicRequestBuilder setHeader(String p0, String p1){ return null; } + public ClassicRequestBuilder setHeaders(Header... p0){ return null; } + public ClassicRequestBuilder setHttpHost(HttpHost p0){ return null; } + public ClassicRequestBuilder setPath(String p0){ return null; } + public ClassicRequestBuilder setScheme(String p0){ return null; } + public ClassicRequestBuilder setUri(String p0){ return null; } + public ClassicRequestBuilder setUri(URI p0){ return null; } + public ClassicRequestBuilder setVersion(ProtocolVersion p0){ return null; } + public HttpEntity getEntity(){ return null; } + public String toString(){ return null; } + public static ClassicRequestBuilder copy(ClassicHttpRequest p0){ return null; } + public static ClassicRequestBuilder create(String p0){ return null; } + public static ClassicRequestBuilder delete(){ return null; } + public static ClassicRequestBuilder delete(String p0){ return null; } + public static ClassicRequestBuilder delete(URI p0){ return null; } + public static ClassicRequestBuilder get(){ return null; } + public static ClassicRequestBuilder get(String p0){ return null; } + public static ClassicRequestBuilder get(URI p0){ return null; } + public static ClassicRequestBuilder head(){ return null; } + public static ClassicRequestBuilder head(String p0){ return null; } + public static ClassicRequestBuilder head(URI p0){ return null; } + public static ClassicRequestBuilder options(){ return null; } + public static ClassicRequestBuilder options(String p0){ return null; } + public static ClassicRequestBuilder options(URI p0){ return null; } + public static ClassicRequestBuilder patch(){ return null; } + public static ClassicRequestBuilder patch(String p0){ return null; } + public static ClassicRequestBuilder patch(URI p0){ return null; } + public static ClassicRequestBuilder post(){ return null; } + public static ClassicRequestBuilder post(String p0){ return null; } + public static ClassicRequestBuilder post(URI p0){ return null; } + public static ClassicRequestBuilder put(){ return null; } + public static ClassicRequestBuilder put(String p0){ return null; } + public static ClassicRequestBuilder put(URI p0){ return null; } + public static ClassicRequestBuilder trace(){ return null; } + public static ClassicRequestBuilder trace(String p0){ return null; } + public static ClassicRequestBuilder trace(URI p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/AbstractMessageWrapper.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/AbstractMessageWrapper.java new file mode 100644 index 00000000000..4b967f7f737 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/AbstractMessageWrapper.java @@ -0,0 +1,33 @@ +// Generated automatically from org.apache.hc.core5.http.message.AbstractMessageWrapper for testing purposes + +package org.apache.hc.core5.http.message; + +import java.util.Iterator; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpMessage; +import org.apache.hc.core5.http.ProtocolVersion; + +abstract public class AbstractMessageWrapper implements HttpMessage +{ + protected AbstractMessageWrapper() {} + public AbstractMessageWrapper(HttpMessage p0){} + public Header getFirstHeader(String p0){ return null; } + public Header getHeader(String p0){ return null; } + public Header getLastHeader(String p0){ return null; } + public Header[] getHeaders(){ return null; } + public Header[] getHeaders(String p0){ return null; } + public Iterator
    headerIterator(){ return null; } + public Iterator
    headerIterator(String p0){ return null; } + public ProtocolVersion getVersion(){ return null; } + public String toString(){ return null; } + public boolean containsHeader(String p0){ return false; } + public boolean removeHeader(Header p0){ return false; } + public boolean removeHeaders(String p0){ return false; } + public int countHeaders(String p0){ return 0; } + public void addHeader(Header p0){} + public void addHeader(String p0, Object p1){} + public void setHeader(Header p0){} + public void setHeader(String p0, Object p1){} + public void setHeaders(Header... p0){} + public void setVersion(ProtocolVersion p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/BasicClassicHttpRequest.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/BasicClassicHttpRequest.java new file mode 100644 index 00000000000..3330aa30812 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/BasicClassicHttpRequest.java @@ -0,0 +1,25 @@ +// Generated automatically from org.apache.hc.core5.http.message.BasicClassicHttpRequest for testing purposes + +package org.apache.hc.core5.http.message; + +import java.net.URI; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.Method; +import org.apache.hc.core5.http.message.BasicHttpRequest; +import org.apache.hc.core5.net.URIAuthority; + +public class BasicClassicHttpRequest extends BasicHttpRequest implements ClassicHttpRequest +{ + protected BasicClassicHttpRequest() {} + public BasicClassicHttpRequest(Method p0, HttpHost p1, String p2){} + public BasicClassicHttpRequest(Method p0, String p1){} + public BasicClassicHttpRequest(Method p0, URI p1){} + public BasicClassicHttpRequest(String p0, HttpHost p1, String p2){} + public BasicClassicHttpRequest(String p0, String p1){} + public BasicClassicHttpRequest(String p0, String p1, URIAuthority p2, String p3){} + public BasicClassicHttpRequest(String p0, URI p1){} + public HttpEntity getEntity(){ return null; } + public void setEntity(HttpEntity p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/BasicHttpRequest.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/BasicHttpRequest.java new file mode 100644 index 00000000000..da824745160 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/BasicHttpRequest.java @@ -0,0 +1,39 @@ +// Generated automatically from org.apache.hc.core5.http.message.BasicHttpRequest for testing purposes + +package org.apache.hc.core5.http.message; + +import java.net.URI; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.Method; +import org.apache.hc.core5.http.ProtocolVersion; +import org.apache.hc.core5.http.message.HeaderGroup; +import org.apache.hc.core5.net.URIAuthority; + +public class BasicHttpRequest extends HeaderGroup implements HttpRequest +{ + protected BasicHttpRequest() {} + public BasicHttpRequest(Method p0, HttpHost p1, String p2){} + public BasicHttpRequest(Method p0, String p1){} + public BasicHttpRequest(Method p0, URI p1){} + public BasicHttpRequest(String p0, HttpHost p1, String p2){} + public BasicHttpRequest(String p0, String p1){} + public BasicHttpRequest(String p0, String p1, URIAuthority p2, String p3){} + public BasicHttpRequest(String p0, URI p1){} + public ProtocolVersion getVersion(){ return null; } + public String getMethod(){ return null; } + public String getPath(){ return null; } + public String getRequestUri(){ return null; } + public String getScheme(){ return null; } + public String toString(){ return null; } + public URI getUri(){ return null; } + public URIAuthority getAuthority(){ return null; } + public void addHeader(String p0, Object p1){} + public void setAbsoluteRequestUri(boolean p0){} + public void setAuthority(URIAuthority p0){} + public void setHeader(String p0, Object p1){} + public void setPath(String p0){} + public void setScheme(String p0){} + public void setUri(URI p0){} + public void setVersion(ProtocolVersion p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/HeaderGroup.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/HeaderGroup.java new file mode 100644 index 00000000000..10b7e1cb87e --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/HeaderGroup.java @@ -0,0 +1,31 @@ +// Generated automatically from org.apache.hc.core5.http.message.HeaderGroup for testing purposes + +package org.apache.hc.core5.http.message; + +import java.io.Serializable; +import java.util.Iterator; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.MessageHeaders; + +public class HeaderGroup implements MessageHeaders, Serializable +{ + public Header getCondensedHeader(String p0){ return null; } + public Header getFirstHeader(String p0){ return null; } + public Header getHeader(String p0){ return null; } + public Header getLastHeader(String p0){ return null; } + public HeaderGroup(){} + public Header[] getHeaders(){ return null; } + public Header[] getHeaders(String p0){ return null; } + public Iterator
    headerIterator(){ return null; } + public Iterator
    headerIterator(String p0){ return null; } + public String toString(){ return null; } + public boolean containsHeader(String p0){ return false; } + public boolean removeHeader(Header p0){ return false; } + public boolean removeHeaders(Header p0){ return false; } + public boolean removeHeaders(String p0){ return false; } + public int countHeaders(String p0){ return 0; } + public void addHeader(Header p0){} + public void clear(){} + public void setHeader(Header p0){} + public void setHeaders(Header... p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/HttpRequestWrapper.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/HttpRequestWrapper.java new file mode 100644 index 00000000000..b738ad4a0f4 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/message/HttpRequestWrapper.java @@ -0,0 +1,24 @@ +// Generated automatically from org.apache.hc.core5.http.message.HttpRequestWrapper for testing purposes + +package org.apache.hc.core5.http.message; + +import java.net.URI; +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.message.AbstractMessageWrapper; +import org.apache.hc.core5.net.URIAuthority; + +public class HttpRequestWrapper extends AbstractMessageWrapper implements HttpRequest +{ + protected HttpRequestWrapper() {} + public HttpRequestWrapper(HttpRequest p0){} + public String getMethod(){ return null; } + public String getPath(){ return null; } + public String getRequestUri(){ return null; } + public String getScheme(){ return null; } + public URI getUri(){ return null; } + public URIAuthority getAuthority(){ return null; } + public void setAuthority(URIAuthority p0){} + public void setPath(String p0){} + public void setScheme(String p0){} + public void setUri(URI p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncClientEndpoint.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncClientEndpoint.java new file mode 100644 index 00000000000..a861f02d0fb --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncClientEndpoint.java @@ -0,0 +1,26 @@ +// Generated automatically from org.apache.hc.core5.http.nio.AsyncClientEndpoint for testing purposes + +package org.apache.hc.core5.http.nio; + +import java.util.concurrent.Future; +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.http.nio.AsyncClientExchangeHandler; +import org.apache.hc.core5.http.nio.AsyncPushConsumer; +import org.apache.hc.core5.http.nio.AsyncRequestProducer; +import org.apache.hc.core5.http.nio.AsyncResponseConsumer; +import org.apache.hc.core5.http.nio.HandlerFactory; +import org.apache.hc.core5.http.nio.ResourceHolder; +import org.apache.hc.core5.http.protocol.HttpContext; + +abstract public class AsyncClientEndpoint +{ + public AsyncClientEndpoint(){} + public abstract boolean isConnected(); + public abstract void execute(AsyncClientExchangeHandler p0, HandlerFactory p1, HttpContext p2); + public abstract void releaseAndDiscard(); + public abstract void releaseAndReuse(); + public final java.util.concurrent.Future execute(AsyncRequestProducer p0, org.apache.hc.core5.http.nio.AsyncResponseConsumer p1, HandlerFactory p2, HttpContext p3, org.apache.hc.core5.concurrent.FutureCallback p4){ return null; } + public final java.util.concurrent.Future execute(AsyncRequestProducer p0, org.apache.hc.core5.http.nio.AsyncResponseConsumer p1, HttpContext p2, org.apache.hc.core5.concurrent.FutureCallback p3){ return null; } + public final java.util.concurrent.Future execute(AsyncRequestProducer p0, org.apache.hc.core5.http.nio.AsyncResponseConsumer p1, org.apache.hc.core5.concurrent.FutureCallback p2){ return null; } + public void execute(AsyncClientExchangeHandler p0, HttpContext p1){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncClientExchangeHandler.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncClientExchangeHandler.java new file mode 100644 index 00000000000..cb6ed3dd475 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncClientExchangeHandler.java @@ -0,0 +1,17 @@ +// Generated automatically from org.apache.hc.core5.http.nio.AsyncClientExchangeHandler for testing purposes + +package org.apache.hc.core5.http.nio; + +import org.apache.hc.core5.http.EntityDetails; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.nio.AsyncDataExchangeHandler; +import org.apache.hc.core5.http.nio.RequestChannel; +import org.apache.hc.core5.http.protocol.HttpContext; + +public interface AsyncClientExchangeHandler extends AsyncDataExchangeHandler +{ + void cancel(); + void consumeInformation(HttpResponse p0, HttpContext p1); + void consumeResponse(HttpResponse p0, EntityDetails p1, HttpContext p2); + void produceRequest(RequestChannel p0, HttpContext p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncDataConsumer.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncDataConsumer.java new file mode 100644 index 00000000000..a9fc2120157 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncDataConsumer.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.http.nio.AsyncDataConsumer for testing purposes + +package org.apache.hc.core5.http.nio; + +import java.nio.ByteBuffer; +import java.util.List; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.nio.CapacityChannel; +import org.apache.hc.core5.http.nio.ResourceHolder; + +public interface AsyncDataConsumer extends ResourceHolder +{ + void consume(ByteBuffer p0); + void streamEnd(List p0); + void updateCapacity(CapacityChannel p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncDataExchangeHandler.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncDataExchangeHandler.java new file mode 100644 index 00000000000..8b3b964ded0 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncDataExchangeHandler.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.http.nio.AsyncDataExchangeHandler for testing purposes + +package org.apache.hc.core5.http.nio; + +import org.apache.hc.core5.http.nio.AsyncDataConsumer; +import org.apache.hc.core5.http.nio.AsyncDataProducer; + +public interface AsyncDataExchangeHandler extends AsyncDataConsumer, AsyncDataProducer +{ + void failed(Exception p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncDataProducer.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncDataProducer.java new file mode 100644 index 00000000000..d6231bcd905 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncDataProducer.java @@ -0,0 +1,12 @@ +// Generated automatically from org.apache.hc.core5.http.nio.AsyncDataProducer for testing purposes + +package org.apache.hc.core5.http.nio; + +import org.apache.hc.core5.http.nio.DataStreamChannel; +import org.apache.hc.core5.http.nio.ResourceHolder; + +public interface AsyncDataProducer extends ResourceHolder +{ + int available(); + void produce(DataStreamChannel p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncPushConsumer.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncPushConsumer.java new file mode 100644 index 00000000000..ce375bbca6e --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncPushConsumer.java @@ -0,0 +1,15 @@ +// Generated automatically from org.apache.hc.core5.http.nio.AsyncPushConsumer for testing purposes + +package org.apache.hc.core5.http.nio; + +import org.apache.hc.core5.http.EntityDetails; +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.nio.AsyncDataConsumer; +import org.apache.hc.core5.http.protocol.HttpContext; + +public interface AsyncPushConsumer extends AsyncDataConsumer +{ + void consumePromise(HttpRequest p0, HttpResponse p1, EntityDetails p2, HttpContext p3); + void failed(Exception p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncRequestProducer.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncRequestProducer.java new file mode 100644 index 00000000000..6b2e8148b52 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncRequestProducer.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.hc.core5.http.nio.AsyncRequestProducer for testing purposes + +package org.apache.hc.core5.http.nio; + +import org.apache.hc.core5.http.nio.AsyncDataProducer; +import org.apache.hc.core5.http.nio.RequestChannel; +import org.apache.hc.core5.http.protocol.HttpContext; + +public interface AsyncRequestProducer extends AsyncDataProducer +{ + boolean isRepeatable(); + void failed(Exception p0); + void sendRequest(RequestChannel p0, HttpContext p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncResponseConsumer.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncResponseConsumer.java new file mode 100644 index 00000000000..8f508b9e52e --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/AsyncResponseConsumer.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.http.nio.AsyncResponseConsumer for testing purposes + +package org.apache.hc.core5.http.nio; + +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.http.EntityDetails; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.nio.AsyncDataConsumer; +import org.apache.hc.core5.http.protocol.HttpContext; + +public interface AsyncResponseConsumer extends AsyncDataConsumer +{ + void consumeResponse(HttpResponse p0, EntityDetails p1, HttpContext p2, org.apache.hc.core5.concurrent.FutureCallback p3); + void failed(Exception p0); + void informationResponse(HttpResponse p0, HttpContext p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/CapacityChannel.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/CapacityChannel.java new file mode 100644 index 00000000000..63230980da5 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/CapacityChannel.java @@ -0,0 +1,9 @@ +// Generated automatically from org.apache.hc.core5.http.nio.CapacityChannel for testing purposes + +package org.apache.hc.core5.http.nio; + + +public interface CapacityChannel +{ + void update(int p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/DataStreamChannel.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/DataStreamChannel.java new file mode 100644 index 00000000000..12eaa1729f6 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/DataStreamChannel.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.http.nio.DataStreamChannel for testing purposes + +package org.apache.hc.core5.http.nio; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.util.List; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.nio.StreamChannel; + +public interface DataStreamChannel extends StreamChannel +{ + int write(ByteBuffer p0); + void endStream(List p0); + void requestOutput(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/HandlerFactory.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/HandlerFactory.java new file mode 100644 index 00000000000..f09e9db5b71 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/HandlerFactory.java @@ -0,0 +1,12 @@ +// Generated automatically from org.apache.hc.core5.http.nio.HandlerFactory for testing purposes + +package org.apache.hc.core5.http.nio; + +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.nio.ResourceHolder; +import org.apache.hc.core5.http.protocol.HttpContext; + +public interface HandlerFactory +{ + T create(HttpRequest p0, HttpContext p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/RequestChannel.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/RequestChannel.java new file mode 100644 index 00000000000..e261b2c6a04 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/RequestChannel.java @@ -0,0 +1,12 @@ +// Generated automatically from org.apache.hc.core5.http.nio.RequestChannel for testing purposes + +package org.apache.hc.core5.http.nio; + +import org.apache.hc.core5.http.EntityDetails; +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.protocol.HttpContext; + +public interface RequestChannel +{ + void sendRequest(HttpRequest p0, EntityDetails p1, HttpContext p2); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/ResourceHolder.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/ResourceHolder.java new file mode 100644 index 00000000000..ccf87c798dd --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/ResourceHolder.java @@ -0,0 +1,9 @@ +// Generated automatically from org.apache.hc.core5.http.nio.ResourceHolder for testing purposes + +package org.apache.hc.core5.http.nio; + + +public interface ResourceHolder +{ + void releaseResources(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/StreamChannel.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/StreamChannel.java new file mode 100644 index 00000000000..20e7d39ba7a --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/StreamChannel.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.http.nio.StreamChannel for testing purposes + +package org.apache.hc.core5.http.nio; + +import java.nio.Buffer; + +public interface StreamChannel +{ + int write(T p0); + void endStream(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/ssl/TlsStrategy.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/ssl/TlsStrategy.java new file mode 100644 index 00000000000..24dbb2cb4d6 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/nio/ssl/TlsStrategy.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.http.nio.ssl.TlsStrategy for testing purposes + +package org.apache.hc.core5.http.nio.ssl; + +import java.net.SocketAddress; +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.net.NamedEndpoint; +import org.apache.hc.core5.reactor.ssl.TransportSecurityLayer; +import org.apache.hc.core5.util.Timeout; + +public interface TlsStrategy +{ + boolean upgrade(TransportSecurityLayer p0, HttpHost p1, SocketAddress p2, SocketAddress p3, Object p4, Timeout p5); + default void upgrade(TransportSecurityLayer p0, NamedEndpoint p1, Object p2, Timeout p3, FutureCallback p4){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/protocol/HttpContext.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/protocol/HttpContext.java index 1506409dc25..71145309551 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/protocol/HttpContext.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/protocol/HttpContext.java @@ -1,42 +1,15 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.http.protocol.HttpContext for testing purposes package org.apache.hc.core5.http.protocol; + import org.apache.hc.core5.http.ProtocolVersion; -public interface HttpContext { +public interface HttpContext +{ + Object getAttribute(String p0); + Object removeAttribute(String p0); + Object setAttribute(String p0, Object p1); ProtocolVersion getProtocolVersion(); - - void setProtocolVersion(ProtocolVersion version); - - Object getAttribute(String id); - - Object setAttribute(String id, Object obj); - - Object removeAttribute(String id); - + static String RESERVED_PREFIX = null; + void setProtocolVersion(ProtocolVersion p0); } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/support/AbstractMessageBuilder.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/support/AbstractMessageBuilder.java new file mode 100644 index 00000000000..84b4a49d501 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/support/AbstractMessageBuilder.java @@ -0,0 +1,30 @@ +// Generated automatically from org.apache.hc.core5.http.support.AbstractMessageBuilder for testing purposes + +package org.apache.hc.core5.http.support; + +import java.util.Iterator; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpMessage; +import org.apache.hc.core5.http.ProtocolVersion; + +abstract public class AbstractMessageBuilder +{ + protected AbstractMessageBuilder(){} + protected abstract T build(); + protected void digest(HttpMessage p0){} + public AbstractMessageBuilder addHeader(Header p0){ return null; } + public AbstractMessageBuilder addHeader(String p0, String p1){ return null; } + public AbstractMessageBuilder removeHeader(Header p0){ return null; } + public AbstractMessageBuilder removeHeaders(String p0){ return null; } + public AbstractMessageBuilder setHeader(Header p0){ return null; } + public AbstractMessageBuilder setHeader(String p0, String p1){ return null; } + public AbstractMessageBuilder setHeaders(Header... p0){ return null; } + public AbstractMessageBuilder setHeaders(Iterator
    p0){ return null; } + public AbstractMessageBuilder setVersion(ProtocolVersion p0){ return null; } + public Header getFirstHeader(String p0){ return null; } + public Header getLastHeader(String p0){ return null; } + public Header[] getFirstHeaders(){ return null; } + public Header[] getHeaders(){ return null; } + public Header[] getHeaders(String p0){ return null; } + public ProtocolVersion getVersion(){ return null; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/support/AbstractRequestBuilder.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/support/AbstractRequestBuilder.java new file mode 100644 index 00000000000..c95ec1c7157 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/http/support/AbstractRequestBuilder.java @@ -0,0 +1,54 @@ +// Generated automatically from org.apache.hc.core5.http.support.AbstractRequestBuilder for testing purposes + +package org.apache.hc.core5.http.support; + +import java.net.URI; +import java.nio.charset.Charset; +import java.util.List; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.Method; +import org.apache.hc.core5.http.NameValuePair; +import org.apache.hc.core5.http.ProtocolVersion; +import org.apache.hc.core5.http.support.AbstractMessageBuilder; +import org.apache.hc.core5.net.URIAuthority; + +abstract public class AbstractRequestBuilder extends AbstractMessageBuilder +{ + protected AbstractRequestBuilder() {} + protected AbstractRequestBuilder(Method p0){} + protected AbstractRequestBuilder(Method p0, String p1){} + protected AbstractRequestBuilder(Method p0, URI p1){} + protected AbstractRequestBuilder(String p0){} + protected AbstractRequestBuilder(String p0, String p1){} + protected AbstractRequestBuilder(String p0, URI p1){} + protected void digest(HttpRequest p0){} + public AbstractRequestBuilder addHeader(Header p0){ return null; } + public AbstractRequestBuilder addHeader(String p0, String p1){ return null; } + public AbstractRequestBuilder addParameter(NameValuePair p0){ return null; } + public AbstractRequestBuilder addParameter(String p0, String p1){ return null; } + public AbstractRequestBuilder addParameters(NameValuePair... p0){ return null; } + public AbstractRequestBuilder removeHeader(Header p0){ return null; } + public AbstractRequestBuilder removeHeaders(String p0){ return null; } + public AbstractRequestBuilder setAbsoluteRequestUri(boolean p0){ return null; } + public AbstractRequestBuilder setAuthority(URIAuthority p0){ return null; } + public AbstractRequestBuilder setCharset(Charset p0){ return null; } + public AbstractRequestBuilder setHeader(Header p0){ return null; } + public AbstractRequestBuilder setHeader(String p0, String p1){ return null; } + public AbstractRequestBuilder setHeaders(Header... p0){ return null; } + public AbstractRequestBuilder setHttpHost(HttpHost p0){ return null; } + public AbstractRequestBuilder setPath(String p0){ return null; } + public AbstractRequestBuilder setScheme(String p0){ return null; } + public AbstractRequestBuilder setUri(String p0){ return null; } + public AbstractRequestBuilder setUri(URI p0){ return null; } + public AbstractRequestBuilder setVersion(ProtocolVersion p0){ return null; } + public Charset getCharset(){ return null; } + public List getParameters(){ return null; } + public String getMethod(){ return null; } + public String getPath(){ return null; } + public String getScheme(){ return null; } + public URI getUri(){ return null; } + public URIAuthority getAuthority(){ return null; } + public boolean isAbsoluteRequestUri(){ return false; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/io/CloseMode.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/io/CloseMode.java new file mode 100644 index 00000000000..3616bb2e5b3 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/io/CloseMode.java @@ -0,0 +1,10 @@ +// Generated automatically from org.apache.hc.core5.io.CloseMode for testing purposes + +package org.apache.hc.core5.io; + + +public enum CloseMode +{ + GRACEFUL, IMMEDIATE; + private CloseMode() {} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/io/ModalCloseable.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/io/ModalCloseable.java new file mode 100644 index 00000000000..70b60eefdfe --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/io/ModalCloseable.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.io.ModalCloseable for testing purposes + +package org.apache.hc.core5.io; + +import java.io.Closeable; +import org.apache.hc.core5.io.CloseMode; + +public interface ModalCloseable extends Closeable +{ + void close(CloseMode p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/net/Host.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/net/Host.java new file mode 100644 index 00000000000..52c726c0e63 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/net/Host.java @@ -0,0 +1,18 @@ +// Generated automatically from org.apache.hc.core5.net.Host for testing purposes + +package org.apache.hc.core5.net; + +import java.io.Serializable; +import org.apache.hc.core5.net.NamedEndpoint; + +public class Host implements NamedEndpoint, Serializable +{ + protected Host() {} + public Host(String p0, int p1){} + public String getHostName(){ return null; } + public String toString(){ return null; } + public boolean equals(Object p0){ return false; } + public int getPort(){ return 0; } + public int hashCode(){ return 0; } + public static Host create(String p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/net/NamedEndpoint.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/net/NamedEndpoint.java new file mode 100644 index 00000000000..9840de9d719 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/net/NamedEndpoint.java @@ -0,0 +1,10 @@ +// Generated automatically from org.apache.hc.core5.net.NamedEndpoint for testing purposes + +package org.apache.hc.core5.net; + + +public interface NamedEndpoint +{ + String getHostName(); + int getPort(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/net/URIAuthority.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/net/URIAuthority.java index 3bb5158370a..b8c0f7165d3 100644 --- a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/net/URIAuthority.java +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/net/URIAuthority.java @@ -1,55 +1,26 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ +// Generated automatically from org.apache.hc.core5.net.URIAuthority for testing purposes package org.apache.hc.core5.net; -public final class URIAuthority { - public String getUserInfo() { - return null; - } - - public String getHostName() { - return null; - } - - public int getPort() { - return 0; - } - - public String toString() { - return null; - } - - public boolean equals(final Object obj) { - return false; - } - - public int hashCode() { - return 0; - } +import java.io.Serializable; +import org.apache.hc.core5.net.Host; +import org.apache.hc.core5.net.NamedEndpoint; +public class URIAuthority implements NamedEndpoint, Serializable +{ + protected URIAuthority() {} + public String getHostName(){ return null; } + public String getUserInfo(){ return null; } + public String toString(){ return null; } + public URIAuthority(Host p0){} + public URIAuthority(NamedEndpoint p0){} + public URIAuthority(String p0){} + public URIAuthority(String p0, Host p1){} + public URIAuthority(String p0, NamedEndpoint p1){} + public URIAuthority(String p0, String p1, int p2){} + public URIAuthority(String p0, int p1){} + public boolean equals(Object p0){ return false; } + public int getPort(){ return 0; } + public int hashCode(){ return 0; } + public static URIAuthority create(String p0){ return null; } } diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ConnPool.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ConnPool.java new file mode 100644 index 00000000000..a36ddc7c758 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ConnPool.java @@ -0,0 +1,15 @@ +// Generated automatically from org.apache.hc.core5.pool.ConnPool for testing purposes + +package org.apache.hc.core5.pool; + +import java.util.concurrent.Future; +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.io.ModalCloseable; +import org.apache.hc.core5.pool.PoolEntry; +import org.apache.hc.core5.util.Timeout; + +public interface ConnPool +{ + java.util.concurrent.Future> lease(T p0, Object p1, Timeout p2, org.apache.hc.core5.concurrent.FutureCallback> p3); + void release(org.apache.hc.core5.pool.PoolEntry p0, boolean p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ConnPoolControl.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ConnPoolControl.java new file mode 100644 index 00000000000..bfd0b6353a9 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ConnPoolControl.java @@ -0,0 +1,20 @@ +// Generated automatically from org.apache.hc.core5.pool.ConnPoolControl for testing purposes + +package org.apache.hc.core5.pool; + +import java.util.Set; +import org.apache.hc.core5.pool.ConnPoolStats; +import org.apache.hc.core5.util.TimeValue; + +public interface ConnPoolControl extends org.apache.hc.core5.pool.ConnPoolStats +{ + int getDefaultMaxPerRoute(); + int getMaxPerRoute(T p0); + int getMaxTotal(); + java.util.Set getRoutes(); + void closeExpired(); + void closeIdle(TimeValue p0); + void setDefaultMaxPerRoute(int p0); + void setMaxPerRoute(T p0, int p1); + void setMaxTotal(int p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ConnPoolStats.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ConnPoolStats.java new file mode 100644 index 00000000000..eff20f6aa46 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ConnPoolStats.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.pool.ConnPoolStats for testing purposes + +package org.apache.hc.core5.pool; + +import org.apache.hc.core5.pool.PoolStats; + +public interface ConnPoolStats +{ + PoolStats getStats(T p0); + PoolStats getTotalStats(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/DisposalCallback.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/DisposalCallback.java new file mode 100644 index 00000000000..a0252fcfb27 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/DisposalCallback.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.pool.DisposalCallback for testing purposes + +package org.apache.hc.core5.pool; + +import org.apache.hc.core5.io.CloseMode; +import org.apache.hc.core5.io.ModalCloseable; + +public interface DisposalCallback +{ + void execute(T p0, CloseMode p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ManagedConnPool.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ManagedConnPool.java new file mode 100644 index 00000000000..d2afc54878c --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/ManagedConnPool.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.pool.ManagedConnPool for testing purposes + +package org.apache.hc.core5.pool; + +import org.apache.hc.core5.io.ModalCloseable; +import org.apache.hc.core5.pool.ConnPool; +import org.apache.hc.core5.pool.ConnPoolControl; + +public interface ManagedConnPool extends ConnPool, ConnPoolControl, ModalCloseable +{ +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/PoolEntry.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/PoolEntry.java new file mode 100644 index 00000000000..2214195628b --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/PoolEntry.java @@ -0,0 +1,30 @@ +// Generated automatically from org.apache.hc.core5.pool.PoolEntry for testing purposes + +package org.apache.hc.core5.pool; + +import org.apache.hc.core5.io.CloseMode; +import org.apache.hc.core5.io.ModalCloseable; +import org.apache.hc.core5.pool.DisposalCallback; +import org.apache.hc.core5.util.Deadline; +import org.apache.hc.core5.util.TimeValue; + +public class PoolEntry +{ + protected PoolEntry() {} + public C getConnection(){ return null; } + public Deadline getExpiryDeadline(){ return null; } + public Deadline getValidityDeadline(){ return null; } + public Object getState(){ return null; } + public PoolEntry(T p0){} + public PoolEntry(T p0, TimeValue p1){} + public PoolEntry(T p0, TimeValue p1, DisposalCallback p2){} + public String toString(){ return null; } + public T getRoute(){ return null; } + public boolean hasConnection(){ return false; } + public long getCreated(){ return 0; } + public long getUpdated(){ return 0; } + public void assignConnection(C p0){} + public void discardConnection(CloseMode p0){} + public void updateExpiry(TimeValue p0){} + public void updateState(Object p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/PoolStats.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/PoolStats.java new file mode 100644 index 00000000000..accad39aa19 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/pool/PoolStats.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.pool.PoolStats for testing purposes + +package org.apache.hc.core5.pool; + +import java.io.Serializable; + +public class PoolStats implements Serializable +{ + protected PoolStats() {} + public PoolStats(int p0, int p1, int p2, int p3){} + public String toString(){ return null; } + public int getAvailable(){ return 0; } + public int getLeased(){ return 0; } + public int getMax(){ return 0; } + public int getPending(){ return 0; } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/Command.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/Command.java new file mode 100644 index 00000000000..319138c605c --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/Command.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.hc.core5.reactor.Command for testing purposes + +package org.apache.hc.core5.reactor; + +import org.apache.hc.core5.concurrent.Cancellable; + +public interface Command extends Cancellable +{ + static public enum Priority + { + IMMEDIATE, NORMAL; + private Priority() {} + } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ConnectionInitiator.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ConnectionInitiator.java new file mode 100644 index 00000000000..2550c0263fc --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ConnectionInitiator.java @@ -0,0 +1,15 @@ +// Generated automatically from org.apache.hc.core5.reactor.ConnectionInitiator for testing purposes + +package org.apache.hc.core5.reactor; + +import java.net.SocketAddress; +import java.util.concurrent.Future; +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.net.NamedEndpoint; +import org.apache.hc.core5.reactor.IOSession; +import org.apache.hc.core5.util.Timeout; + +public interface ConnectionInitiator +{ + Future connect(NamedEndpoint p0, SocketAddress p1, SocketAddress p2, Timeout p3, Object p4, FutureCallback p5); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOEventHandler.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOEventHandler.java new file mode 100644 index 00000000000..bda19c344ec --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOEventHandler.java @@ -0,0 +1,17 @@ +// Generated automatically from org.apache.hc.core5.reactor.IOEventHandler for testing purposes + +package org.apache.hc.core5.reactor; + +import java.nio.ByteBuffer; +import org.apache.hc.core5.reactor.IOSession; +import org.apache.hc.core5.util.Timeout; + +public interface IOEventHandler +{ + void connected(IOSession p0); + void disconnected(IOSession p0); + void exception(IOSession p0, Exception p1); + void inputReady(IOSession p0, ByteBuffer p1); + void outputReady(IOSession p0); + void timeout(IOSession p0, Timeout p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOEventHandlerFactory.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOEventHandlerFactory.java new file mode 100644 index 00000000000..bab8ff29ad4 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOEventHandlerFactory.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.reactor.IOEventHandlerFactory for testing purposes + +package org.apache.hc.core5.reactor; + +import org.apache.hc.core5.reactor.IOEventHandler; +import org.apache.hc.core5.reactor.ProtocolIOSession; + +public interface IOEventHandlerFactory +{ + IOEventHandler createHandler(ProtocolIOSession p0, Object p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactor.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactor.java new file mode 100644 index 00000000000..94827b811ff --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactor.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.reactor.IOReactor for testing purposes + +package org.apache.hc.core5.reactor; + +import org.apache.hc.core5.io.CloseMode; +import org.apache.hc.core5.io.ModalCloseable; +import org.apache.hc.core5.reactor.IOReactorStatus; +import org.apache.hc.core5.util.TimeValue; + +public interface IOReactor extends ModalCloseable +{ + IOReactorStatus getStatus(); + void awaitShutdown(TimeValue p0); + void close(CloseMode p0); + void initiateShutdown(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactorConfig.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactorConfig.java new file mode 100644 index 00000000000..7f4c7ee0bb2 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactorConfig.java @@ -0,0 +1,54 @@ +// Generated automatically from org.apache.hc.core5.reactor.IOReactorConfig for testing purposes + +package org.apache.hc.core5.reactor; + +import java.net.SocketAddress; +import java.util.concurrent.TimeUnit; +import org.apache.hc.core5.util.TimeValue; +import org.apache.hc.core5.util.Timeout; + +public class IOReactorConfig +{ + protected IOReactorConfig() {} + public SocketAddress getSocksProxyAddress(){ return null; } + public String getSocksProxyPassword(){ return null; } + public String getSocksProxyUsername(){ return null; } + public String toString(){ return null; } + public TimeValue getSelectInterval(){ return null; } + public TimeValue getSoLinger(){ return null; } + public Timeout getSoTimeout(){ return null; } + public boolean isSoKeepAlive(){ return false; } + public boolean isSoKeepalive(){ return false; } + public boolean isSoReuseAddress(){ return false; } + public boolean isTcpNoDelay(){ return false; } + public int getBacklogSize(){ return 0; } + public int getIoThreadCount(){ return 0; } + public int getRcvBufSize(){ return 0; } + public int getSndBufSize(){ return 0; } + public int getTrafficClass(){ return 0; } + public static IOReactorConfig DEFAULT = null; + public static IOReactorConfig.Builder copy(IOReactorConfig p0){ return null; } + public static IOReactorConfig.Builder custom(){ return null; } + static public class Builder + { + public IOReactorConfig build(){ return null; } + public IOReactorConfig.Builder setBacklogSize(int p0){ return null; } + public IOReactorConfig.Builder setIoThreadCount(int p0){ return null; } + public IOReactorConfig.Builder setRcvBufSize(int p0){ return null; } + public IOReactorConfig.Builder setSelectInterval(TimeValue p0){ return null; } + public IOReactorConfig.Builder setSndBufSize(int p0){ return null; } + public IOReactorConfig.Builder setSoKeepAlive(boolean p0){ return null; } + public IOReactorConfig.Builder setSoLinger(TimeValue p0){ return null; } + public IOReactorConfig.Builder setSoLinger(int p0, TimeUnit p1){ return null; } + public IOReactorConfig.Builder setSoReuseAddress(boolean p0){ return null; } + public IOReactorConfig.Builder setSoTimeout(Timeout p0){ return null; } + public IOReactorConfig.Builder setSoTimeout(int p0, TimeUnit p1){ return null; } + public IOReactorConfig.Builder setSocksProxyAddress(SocketAddress p0){ return null; } + public IOReactorConfig.Builder setSocksProxyPassword(String p0){ return null; } + public IOReactorConfig.Builder setSocksProxyUsername(String p0){ return null; } + public IOReactorConfig.Builder setTcpNoDelay(boolean p0){ return null; } + public IOReactorConfig.Builder setTrafficClass(int p0){ return null; } + public static int getDefaultMaxIOThreadCount(){ return 0; } + public static void setDefaultMaxIOThreadCount(int p0){} + } +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactorService.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactorService.java new file mode 100644 index 00000000000..f00025ccb5c --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactorService.java @@ -0,0 +1,10 @@ +// Generated automatically from org.apache.hc.core5.reactor.IOReactorService for testing purposes + +package org.apache.hc.core5.reactor; + +import org.apache.hc.core5.reactor.IOReactor; + +public interface IOReactorService extends IOReactor +{ + void start(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactorStatus.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactorStatus.java new file mode 100644 index 00000000000..0e792f589c0 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOReactorStatus.java @@ -0,0 +1,10 @@ +// Generated automatically from org.apache.hc.core5.reactor.IOReactorStatus for testing purposes + +package org.apache.hc.core5.reactor; + + +public enum IOReactorStatus +{ + ACTIVE, INACTIVE, SHUTTING_DOWN, SHUT_DOWN; + private IOReactorStatus() {} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOSession.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOSession.java new file mode 100644 index 00000000000..fd9cb6db74b --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOSession.java @@ -0,0 +1,43 @@ +// Generated automatically from org.apache.hc.core5.reactor.IOSession for testing purposes + +package org.apache.hc.core5.reactor; + +import java.net.SocketAddress; +import java.nio.channels.ByteChannel; +import java.util.concurrent.locks.Lock; +import org.apache.hc.core5.http.SocketModalCloseable; +import org.apache.hc.core5.reactor.Command; +import org.apache.hc.core5.reactor.IOEventHandler; +import org.apache.hc.core5.util.Identifiable; +import org.apache.hc.core5.util.Timeout; + +public interface IOSession extends ByteChannel, Identifiable, SocketModalCloseable +{ + ByteChannel channel(); + Command poll(); + IOEventHandler getHandler(); + IOSession.Status getStatus(); + Lock getLock(); + SocketAddress getLocalAddress(); + SocketAddress getRemoteAddress(); + Timeout getSocketTimeout(); + boolean hasCommands(); + int getEventMask(); + long getLastEventTime(); + long getLastReadTime(); + long getLastWriteTime(); + static public enum Status + { + ACTIVE, CLOSED, CLOSING; + private Status() {} + } + void clearEvent(int p0); + void close(); + void enqueue(Command p0, Command.Priority p1); + void setEvent(int p0); + void setEventMask(int p0); + void setSocketTimeout(Timeout p0); + void updateReadTime(); + void updateWriteTime(); + void upgrade(IOEventHandler p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOSessionListener.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOSessionListener.java new file mode 100644 index 00000000000..209ccd16ff8 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/IOSessionListener.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.reactor.IOSessionListener for testing purposes + +package org.apache.hc.core5.reactor; + +import org.apache.hc.core5.reactor.IOSession; + +public interface IOSessionListener +{ + void connected(IOSession p0); + void disconnected(IOSession p0); + void exception(IOSession p0, Exception p1); + void inputReady(IOSession p0); + void outputReady(IOSession p0); + void startTls(IOSession p0); + void timeout(IOSession p0); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ProtocolIOSession.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ProtocolIOSession.java new file mode 100644 index 00000000000..846b3cbe558 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ProtocolIOSession.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.hc.core5.reactor.ProtocolIOSession for testing purposes + +package org.apache.hc.core5.reactor; + +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.net.NamedEndpoint; +import org.apache.hc.core5.reactor.IOSession; +import org.apache.hc.core5.reactor.ProtocolUpgradeHandler; +import org.apache.hc.core5.reactor.ssl.TransportSecurityLayer; + +public interface ProtocolIOSession extends IOSession, TransportSecurityLayer +{ + NamedEndpoint getInitialEndpoint(); + default void registerProtocol(String p0, ProtocolUpgradeHandler p1){} + default void switchProtocol(String p0, FutureCallback p1){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ProtocolUpgradeHandler.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ProtocolUpgradeHandler.java new file mode 100644 index 00000000000..a14a5286c22 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ProtocolUpgradeHandler.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.reactor.ProtocolUpgradeHandler for testing purposes + +package org.apache.hc.core5.reactor; + +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.reactor.ProtocolIOSession; + +public interface ProtocolUpgradeHandler +{ + void upgrade(ProtocolIOSession p0, FutureCallback p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/SSLBufferMode.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/SSLBufferMode.java new file mode 100644 index 00000000000..929529d3783 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/SSLBufferMode.java @@ -0,0 +1,10 @@ +// Generated automatically from org.apache.hc.core5.reactor.ssl.SSLBufferMode for testing purposes + +package org.apache.hc.core5.reactor.ssl; + + +public enum SSLBufferMode +{ + DYNAMIC, STATIC; + private SSLBufferMode() {} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/SSLSessionInitializer.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/SSLSessionInitializer.java new file mode 100644 index 00000000000..7897aed099e --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/SSLSessionInitializer.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.hc.core5.reactor.ssl.SSLSessionInitializer for testing purposes + +package org.apache.hc.core5.reactor.ssl; + +import javax.net.ssl.SSLEngine; +import org.apache.hc.core5.net.NamedEndpoint; + +public interface SSLSessionInitializer +{ + void initialize(NamedEndpoint p0, SSLEngine p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/SSLSessionVerifier.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/SSLSessionVerifier.java new file mode 100644 index 00000000000..973943941c7 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/SSLSessionVerifier.java @@ -0,0 +1,12 @@ +// Generated automatically from org.apache.hc.core5.reactor.ssl.SSLSessionVerifier for testing purposes + +package org.apache.hc.core5.reactor.ssl; + +import javax.net.ssl.SSLEngine; +import org.apache.hc.core5.net.NamedEndpoint; +import org.apache.hc.core5.reactor.ssl.TlsDetails; + +public interface SSLSessionVerifier +{ + TlsDetails verify(NamedEndpoint p0, SSLEngine p1); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/TlsDetails.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/TlsDetails.java new file mode 100644 index 00000000000..a48a28ace3d --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/TlsDetails.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.hc.core5.reactor.ssl.TlsDetails for testing purposes + +package org.apache.hc.core5.reactor.ssl; + +import javax.net.ssl.SSLSession; + +public class TlsDetails +{ + protected TlsDetails() {} + public SSLSession getSSLSession(){ return null; } + public String getApplicationProtocol(){ return null; } + public String toString(){ return null; } + public TlsDetails(SSLSession p0, String p1){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/TransportSecurityLayer.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/TransportSecurityLayer.java new file mode 100644 index 00000000000..b2fa9f5cd66 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/reactor/ssl/TransportSecurityLayer.java @@ -0,0 +1,19 @@ +// Generated automatically from org.apache.hc.core5.reactor.ssl.TransportSecurityLayer for testing purposes + +package org.apache.hc.core5.reactor.ssl; + +import javax.net.ssl.SSLContext; +import org.apache.hc.core5.concurrent.FutureCallback; +import org.apache.hc.core5.net.NamedEndpoint; +import org.apache.hc.core5.reactor.ssl.SSLBufferMode; +import org.apache.hc.core5.reactor.ssl.SSLSessionInitializer; +import org.apache.hc.core5.reactor.ssl.SSLSessionVerifier; +import org.apache.hc.core5.reactor.ssl.TlsDetails; +import org.apache.hc.core5.util.Timeout; + +public interface TransportSecurityLayer +{ + TlsDetails getTlsDetails(); + default void startTls(SSLContext p0, NamedEndpoint p1, SSLBufferMode p2, SSLSessionInitializer p3, SSLSessionVerifier p4, Timeout p5, FutureCallback p6){} + void startTls(SSLContext p0, NamedEndpoint p1, SSLBufferMode p2, SSLSessionInitializer p3, SSLSessionVerifier p4, Timeout p5); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/Deadline.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/Deadline.java new file mode 100644 index 00000000000..23bc6948152 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/Deadline.java @@ -0,0 +1,33 @@ +// Generated automatically from org.apache.hc.core5.util.Deadline for testing purposes + +package org.apache.hc.core5.util; + +import java.util.concurrent.TimeUnit; +import org.apache.hc.core5.util.TimeValue; + +public class Deadline +{ + protected Deadline() {} + public Deadline freeze(){ return null; } + public Deadline min(Deadline p0){ return null; } + public String format(TimeUnit p0){ return null; } + public String formatTarget(){ return null; } + public String toString(){ return null; } + public TimeValue remainingTimeValue(){ return null; } + public boolean equals(Object p0){ return false; } + public boolean isBefore(long p0){ return false; } + public boolean isExpired(){ return false; } + public boolean isMax(){ return false; } + public boolean isMin(){ return false; } + public boolean isNotExpired(){ return false; } + public int hashCode(){ return 0; } + public long getValue(){ return 0; } + public long remaining(){ return 0; } + public static Deadline MAX_VALUE = null; + public static Deadline MIN_VALUE = null; + public static Deadline calculate(TimeValue p0){ return null; } + public static Deadline calculate(long p0, TimeValue p1){ return null; } + public static Deadline fromUnixMilliseconds(long p0){ return null; } + public static Deadline parse(String p0){ return null; } + public static String DATE_FORMAT = null; +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/Identifiable.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/Identifiable.java new file mode 100644 index 00000000000..f41574105a2 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/Identifiable.java @@ -0,0 +1,9 @@ +// Generated automatically from org.apache.hc.core5.util.Identifiable for testing purposes + +package org.apache.hc.core5.util; + + +public interface Identifiable +{ + String getId(); +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/TimeValue.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/TimeValue.java new file mode 100644 index 00000000000..d27510be63f --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/TimeValue.java @@ -0,0 +1,57 @@ +// Generated automatically from org.apache.hc.core5.util.TimeValue for testing purposes + +package org.apache.hc.core5.util; + +import java.time.Duration; +import java.util.concurrent.TimeUnit; +import org.apache.hc.core5.util.Timeout; + +public class TimeValue implements Comparable +{ + protected TimeValue() {} + public Duration toDuration(){ return null; } + public String toString(){ return null; } + public TimeUnit getTimeUnit(){ return null; } + public TimeValue divide(long p0){ return null; } + public TimeValue divide(long p0, TimeUnit p1){ return null; } + public TimeValue min(TimeValue p0){ return null; } + public Timeout toTimeout(){ return null; } + public boolean equals(Object p0){ return false; } + public int compareTo(TimeValue p0){ return 0; } + public int hashCode(){ return 0; } + public int toMillisecondsIntBound(){ return 0; } + public int toSecondsIntBound(){ return 0; } + public long convert(TimeUnit p0){ return 0; } + public long getDuration(){ return 0; } + public long toDays(){ return 0; } + public long toHours(){ return 0; } + public long toMicroseconds(){ return 0; } + public long toMilliseconds(){ return 0; } + public long toMinutes(){ return 0; } + public long toNanoseconds(){ return 0; } + public long toSeconds(){ return 0; } + public static T defaultsTo(T p0, T p1){ return null; } + public static TimeValue MAX_VALUE = null; + public static TimeValue NEG_ONE_MILLISECOND = null; + public static TimeValue NEG_ONE_SECOND = null; + public static TimeValue ZERO_MILLISECONDS = null; + public static TimeValue defaultsToNegativeOneMillisecond(TimeValue p0){ return null; } + public static TimeValue defaultsToNegativeOneSecond(TimeValue p0){ return null; } + public static TimeValue defaultsToZeroMilliseconds(TimeValue p0){ return null; } + public static TimeValue of(Duration p0){ return null; } + public static TimeValue of(long p0, TimeUnit p1){ return null; } + public static TimeValue ofDays(long p0){ return null; } + public static TimeValue ofHours(long p0){ return null; } + public static TimeValue ofMicroseconds(long p0){ return null; } + public static TimeValue ofMilliseconds(long p0){ return null; } + public static TimeValue ofMinutes(long p0){ return null; } + public static TimeValue ofNanoseconds(long p0){ return null; } + public static TimeValue ofSeconds(long p0){ return null; } + public static TimeValue parse(String p0){ return null; } + public static boolean isNonNegative(TimeValue p0){ return false; } + public static boolean isPositive(TimeValue p0){ return false; } + public static int asBoundInt(long p0){ return 0; } + public void sleep(){} + public void timedJoin(Thread p0){} + public void timedWait(Object p0){} +} diff --git a/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/Timeout.java b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/Timeout.java new file mode 100644 index 00000000000..8de0d93c5e6 --- /dev/null +++ b/java/ql/test/stubs/apache-http-5/org/apache/hc/core5/util/Timeout.java @@ -0,0 +1,28 @@ +// Generated automatically from org.apache.hc.core5.util.Timeout for testing purposes + +package org.apache.hc.core5.util; + +import java.time.Duration; +import java.util.concurrent.TimeUnit; +import org.apache.hc.core5.util.TimeValue; + +public class Timeout extends TimeValue +{ + protected Timeout() {} + public boolean isDisabled(){ return false; } + public boolean isEnabled(){ return false; } + public static Timeout DISABLED = null; + public static Timeout ONE_MILLISECOND = null; + public static Timeout ZERO_MILLISECONDS = null; + public static Timeout defaultsToDisabled(Timeout p0){ return null; } + public static Timeout of(Duration p0){ return null; } + public static Timeout of(long p0, TimeUnit p1){ return null; } + public static Timeout ofDays(long p0){ return null; } + public static Timeout ofHours(long p0){ return null; } + public static Timeout ofMicroseconds(long p0){ return null; } + public static Timeout ofMilliseconds(long p0){ return null; } + public static Timeout ofMinutes(long p0){ return null; } + public static Timeout ofNanoseconds(long p0){ return null; } + public static Timeout ofSeconds(long p0){ return null; } + public static Timeout parse(String p0){ return null; } +} diff --git a/javascript/extractor/lib/typescript/src/type_table.ts b/javascript/extractor/lib/typescript/src/type_table.ts index cae9a19dcd9..2a3efd67a06 100644 --- a/javascript/extractor/lib/typescript/src/type_table.ts +++ b/javascript/extractor/lib/typescript/src/type_table.ts @@ -43,6 +43,9 @@ function isTypeAlwaysSafeToExpand(type: ts.Type): boolean { return false; } } + if (type.aliasSymbol != null) { + return false; + } return true; } @@ -447,7 +450,7 @@ export class TypeTable { this.isInShallowTypeContext ? TypeExtractionState.PendingShallow : TypeExtractionState.PendingFull); // If the type is the self-type for a named type (not a generic instantiation of it), // emit the self-type binding for that type. - if (content.startsWith("reference;") && !(isTypeReference(type) && type.target !== type)) { + if (content.startsWith("reference;") && isTypeSelfReference(type)) { this.selfTypes.symbols.push(this.getSymbolId(type.aliasSymbol || type.symbol)); this.selfTypes.selfTypes.push(id); } @@ -533,7 +536,7 @@ export class TypeTable { let enclosingType = getEnclosingTypeOfThisType(type); if (enclosingType != null) { return "this;" + this.getId(enclosingType, false); - } else if (symbol.parent == null) { + } else if (symbol.parent == null || isFunctionTypeOrTypeAlias(symbol.declarations?.[0])) { // The type variable is bound on a call signature. Only extract it by name. return "lextypevar;" + symbol.name; } else { @@ -614,14 +617,14 @@ export class TypeTable { // cannot be written using TypeScript syntax - so we ignore them entirely. return null; } - return this.makeTypeStringVector("union", unionType.types); + return this.makeDeduplicatedTypeStringVector("union", unionType.types); } if (flags & ts.TypeFlags.Intersection) { let intersectionType = type as ts.IntersectionType; if (intersectionType.types.length === 0) { return null; // Ignore malformed type. } - return this.makeTypeStringVector("intersection", intersectionType.types); + return this.makeDeduplicatedTypeStringVector("intersection", intersectionType.types); } if (isTypeReference(type) && (type.target.objectFlags & ts.ObjectFlags.Tuple)) { // Encode the minimum length and presence of rest element in the first two parts of the type string. @@ -784,6 +787,27 @@ export class TypeTable { return hash; } + /** + * Returns the given string with the IDs of the given types appended, + * ignoring duplicates, and each separated by `;`. + */ + private makeDeduplicatedTypeStringVector(tag: string, types: ReadonlyArray, length = types.length): string | null { + let seenIds = new Set(); + let numberOfSeenIds = 0; + let hash = tag; + for (let i = 0; i < length; ++i) { + let id = this.getId(types[i], false); + if (id == null) return null; + seenIds.add(id); + if (seenIds.size > numberOfSeenIds) { + // This ID was not seen before + ++numberOfSeenIds; + hash += ";" + id; + } + } + return hash; + } + /** Returns the type of `symbol` or `null` if it could not be computed. */ private tryGetTypeOfSymbol(symbol: ts.Symbol) { try { @@ -1328,3 +1352,35 @@ export class TypeTable { } } } + +function isFunctionTypeOrTypeAlias(declaration: ts.Declaration | undefined) { + if (declaration == null) return false; + return declaration.kind === ts.SyntaxKind.FunctionType || declaration.kind === ts.SyntaxKind.TypeAliasDeclaration; +} + +/** + * Given a `type` whose type-string is known to be a `reference`, returns true if this is the self-type for the referenced type. + * + * For example, for `type Foo = ...` this returns true if `type` is `Foo`. + */ +function isTypeSelfReference(type: ts.Type) { + if (type.aliasSymbol != null) { + const { aliasTypeArguments } = type; + if (aliasTypeArguments == null) return true; + let declaration = type.aliasSymbol.declarations?.[0]; + if (declaration == null || declaration.kind !== ts.SyntaxKind.TypeAliasDeclaration) return false; + let alias = declaration as ts.TypeAliasDeclaration; + for (let i = 0; i < aliasTypeArguments.length; ++i) { + if (aliasTypeArguments[i].symbol?.declarations?.[0] !== alias.typeParameters[i]) { + return false; + } + } + return true; + } else if (isTypeReference(type)) { + return type.target === type; + } else { + // Return true because we know we have mapped this type to kind `reference`, and in the cases + // not covered above (i.e. generic types) it is always a self-reference. + return true; + } +} diff --git a/javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java b/javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java index 8ded19a2a2c..01a6c7c15ae 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java +++ b/javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java @@ -26,6 +26,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -1237,19 +1238,29 @@ protected DependencyInstallationResult preparePackagesAndDependencies(Set List errors = loc == null ? Collections.emptyList() : loc.getParseErrors(); for (ParseError err : errors) { String msg = "A parse error occurred: " + StringUtil.quoteWithBackticks(err.getMessage().trim()) - + ". Check the syntax of the file. If the file is invalid, correct the error or [exclude](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/customizing-code-scanning) the file from analysis."; - // file, relative to the source root - DiagnosticLocation.Builder builder = DiagnosticLocation.builder(); + + "."; + + Optional diagLoc = Optional.empty(); if (file.startsWith(LGTM_SRC)) { - builder = builder.setFile(file.subpath(LGTM_SRC.getNameCount(), file.getNameCount()).toString()); - } - DiagnosticLocation diagLoc = builder + diagLoc = DiagnosticLocation.builder() + .setFile(file.subpath(LGTM_SRC.getNameCount(), file.getNameCount()).toString()) // file, relative to the source root .setStartLine(err.getPosition().getLine()) .setStartColumn(err.getPosition().getColumn() + 1) // convert from 0-based to 1-based .setEndLine(err.getPosition().getLine()) .setEndColumn(err.getPosition().getColumn() + 1) // convert from 0-based to 1-based - .build(); - writeDiagnostics(msg, JSDiagnosticKind.PARSE_ERROR, diagLoc); + .build() + .getOk(); + } + if (diagLoc.isPresent()) { + msg += " Check the syntax of the file. If the file is invalid, correct the error or " + + "[exclude](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-" + + "your-code-for-vulnerabilities-and-errors/customizing-code-scanning) the file from analysis."; + writeDiagnostics(msg, JSDiagnosticKind.PARSE_ERROR, diagLoc.get()); + } else { + msg += " The affected file is not located within the code being analyzed." + + (Env.systemEnv().isActions() ? " Please see the workflow run logs for more information." : ""); + writeDiagnostics(msg, JSDiagnosticKind.PARSE_ERROR); + } } logEndProcess(start, "Done extracting " + file); } catch (OutOfMemoryError oom) { diff --git a/javascript/extractor/src/com/semmle/js/extractor/YAMLExtractor.java b/javascript/extractor/src/com/semmle/js/extractor/YAMLExtractor.java index 2f98edfe964..4dba35a9951 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/YAMLExtractor.java +++ b/javascript/extractor/src/com/semmle/js/extractor/YAMLExtractor.java @@ -1,284 +1,28 @@ package com.semmle.js.extractor; -import com.semmle.util.data.StringUtil; -import com.semmle.util.exception.CatastrophicError; -import com.semmle.util.exception.UserError; -import com.semmle.util.locations.LineTable; -import com.semmle.util.trap.TrapWriter; -import com.semmle.util.trap.TrapWriter.Label; -import com.semmle.util.trap.TrapWriter.Table; - import java.util.Collections; -import org.yaml.snakeyaml.composer.Composer; -import org.yaml.snakeyaml.error.Mark; -import org.yaml.snakeyaml.error.MarkedYAMLException; -import org.yaml.snakeyaml.events.AliasEvent; -import org.yaml.snakeyaml.events.Event; -import org.yaml.snakeyaml.events.MappingStartEvent; -import org.yaml.snakeyaml.events.NodeEvent; -import org.yaml.snakeyaml.events.ScalarEvent; -import org.yaml.snakeyaml.events.SequenceStartEvent; -import org.yaml.snakeyaml.nodes.NodeId; -import org.yaml.snakeyaml.parser.Parser; -import org.yaml.snakeyaml.parser.ParserImpl; -import org.yaml.snakeyaml.reader.ReaderException; -import org.yaml.snakeyaml.reader.StreamReader; -import org.yaml.snakeyaml.resolver.Resolver; +import com.semmle.extractor.yaml.YamlPopulator; /** * Extractor for populating YAML files. * - *

    The extractor uses SnakeYAML to parse YAML. + *

    + * The extractor uses SnakeYAML to parse + * YAML. */ public class YAMLExtractor implements IExtractor { - /** The tables constituting the YAML dbscheme. */ - private static enum YAMLTables implements Table { - YAML(6), // yaml (id: @yaml_node, kind: int ref, parent: @yaml_node_parent ref, - // idx: int ref, tag: string ref, tostring: string ref) - YAML_ANCHORS(2), // yaml_anchors (node: @yaml_node ref, anchor: string ref) - YAML_ALIASES(2), // yaml_aliases (alias: @yaml_alias_node ref, target: string ref) - YAML_SCALARS( - 3), // yaml_scalars (scalar: @yaml_scalar_node ref, style: int ref, value: string ref) - YAML_ERRORS(2); // yaml_errors (id: @yaml_error, message: string ref) - - private final int arity; - - private YAMLTables(int arity) { - this.arity = arity; - } - - @Override - public String getName() { - return StringUtil.lc(name()); - } - - @Override - public int getArity() { - return arity; - } - - @Override - public boolean validate(Object... values) { - return true; - } - } - - /* - * case @yaml_node.kind of - * 0 = @yaml_scalar_node - * | 1 = @yaml_mapping_node - * | 2 = @yaml_sequence_node - * | 3 = @yaml_alias_node - */ - private static enum NodeKind { - SCALAR, - MAPPING, - SEQUENCE, - ALIAS - }; - private final boolean tolerateParseErrors; - private TextualExtractor textualExtractor; - private LocationManager locationManager; - private TrapWriter trapWriter; - private LineTable lineTable; - - /** - * The underlying SnakeYAML parser; we use the relatively low-level {@linkplain Parser} instead of - * the more high-level {@linkplain Composer}, since our dbscheme represents YAML documents in AST - * form, with aliases left unresolved. - */ - private Parser parser; - - /** The resolver used for resolving type tags. */ - private Resolver resolver; - public YAMLExtractor(ExtractorConfig config) { this.tolerateParseErrors = config.isTolerateParseErrors(); } - private LineTable getLineTable() { - if (lineTable == null) { - lineTable = new LineTable(this.textualExtractor.getSource()); - } - return lineTable; - } - @Override public ParseResultInfo extract(TextualExtractor textualExtractor) { - this.textualExtractor = textualExtractor; - locationManager = textualExtractor.getLocationManager(); - trapWriter = textualExtractor.getTrapwriter(); - - Label fileLabel = locationManager.getFileLabel(); - locationManager.setHasLocationTable("yaml_locations"); - try { - parser = new ParserImpl(new StreamReader(textualExtractor.getSource())); - resolver = new Resolver(); - int idx = 0; - while (!atStreamEnd()) - extractDocument(fileLabel, idx++, textualExtractor.getSource().codePoints().toArray()); - } catch (MarkedYAMLException e) { - int line = e.getProblemMark().getLine() + 1; - int column = e.getProblemMark().getColumn() + 1; - if (!this.tolerateParseErrors) - throw new UserError(e.getProblem() + ": " + line + ":" + column); - Label lbl = trapWriter.freshLabel(); - trapWriter.addTuple(YAMLTables.YAML_ERRORS, lbl, e.getProblem()); - locationManager.emitSnippetLocation(lbl, line, column, line, column); - } catch (ReaderException e) { - if (!this.tolerateParseErrors) throw new UserError(e.toString()); - int c = e.getCodePoint(); - String s = String.valueOf(Character.toChars(c)); - trapWriter.addTuple( - YAMLTables.YAML_ERRORS, - trapWriter.freshLabel(), - "Unexpected character " + s + "(" + c + ")"); - // unfortunately, SnakeYAML does not provide structured location information for - // ReaderExceptions - } - + new YamlPopulator(textualExtractor.getExtractedFile(), textualExtractor.getSource(), + textualExtractor.getTrapwriter(), + this.tolerateParseErrors).extract(); return new ParseResultInfo(0, 0, Collections.emptyList()); } - - /** Check whether the parser has encountered the end of the YAML input stream. */ - private boolean atStreamEnd() { - if (parser.checkEvent(Event.ID.StreamStart)) parser.getEvent(); - return parser.checkEvent(Event.ID.StreamEnd); - } - - /** Extract a complete YAML document; cf. {@link Composer#getNode}. */ - private void extractDocument(Label parent, int idx, int[] codepoints) { - // Drop the DOCUMENT-START event - parser.getEvent(); - extractNode(parent, idx, codepoints); - // Drop the DOCUMENT-END event - parser.getEvent(); - } - - /** Extract a single YAML node; cf. {@link Composer#composeNode}. */ - private void extractNode(Label parent, int idx, int[] codepoints) { - Label label = trapWriter.freshLabel(); - NodeKind kind; - String tag = ""; - Event start = parser.getEvent(), end = start; - - if (start.is(Event.ID.Alias)) { - kind = NodeKind.ALIAS; - trapWriter.addTuple(YAMLTables.YAML_ALIASES, label, ((AliasEvent) start).getAnchor()); - } else { - String anchor = start instanceof NodeEvent ? ((NodeEvent) start).getAnchor() : null; - if (anchor != null) trapWriter.addTuple(YAMLTables.YAML_ANCHORS, label, anchor); - - if (start.is(Event.ID.Scalar)) { - kind = NodeKind.SCALAR; - ScalarEvent scalar = (ScalarEvent) start; - tag = - getTag( - scalar.getTag(), - NodeId.scalar, - scalar.getValue(), - scalar.getImplicit().canOmitTagInPlainScalar()); - Character style = scalar.getStyle(); - int styleCode = style == null ? 0 : (int) style; - trapWriter.addTuple(YAMLTables.YAML_SCALARS, label, styleCode, scalar.getValue()); - } else if (start.is(Event.ID.SequenceStart)) { - kind = NodeKind.SEQUENCE; - SequenceStartEvent sequenceStart = (SequenceStartEvent) start; - tag = getTag(sequenceStart.getTag(), NodeId.sequence, null, sequenceStart.getImplicit()); - - int childIdx = 0; - while (!parser.checkEvent(Event.ID.SequenceEnd)) extractNode(label, childIdx++, codepoints); - - end = parser.getEvent(); - } else if (start.is(Event.ID.MappingStart)) { - kind = NodeKind.MAPPING; - MappingStartEvent mappingStart = (MappingStartEvent) start; - tag = getTag(mappingStart.getTag(), NodeId.mapping, null, mappingStart.getImplicit()); - - int childIdx = 1; - while (!parser.checkEvent(Event.ID.MappingEnd)) { - extractNode(label, childIdx, codepoints); - extractNode(label, -childIdx, codepoints); - ++childIdx; - } - - end = parser.getEvent(); - } else { - throw new CatastrophicError("Unexpected YAML parser event: " + start); - } - } - - trapWriter.addTuple( - YAMLTables.YAML, - label, - kind.ordinal(), - parent, - idx, - tag, - mkToString(start.getStartMark(), end.getEndMark(), codepoints)); - extractLocation(label, start.getStartMark(), end.getEndMark()); - } - - /** Determine the type tag of a node. */ - private String getTag(String explicitTag, NodeId kind, String value, boolean implicit) { - if (explicitTag == null || "!".equals(explicitTag)) - return resolver.resolve(kind, value, implicit).getValue(); - return explicitTag; - } - - private static boolean isNewLine(int codePoint) { - switch (codePoint) { - case '\n': - case '\r': - case '\u0085': - case '\u2028': - case '\u2029': - return true; - default: - return false; - } - } - - /** - * SnakeYAML doesn't directly expose the source text of nodes, but we also take the file contents - * as an array of Unicode code points. The start and end marks each contain an index into the code - * point stream (the end is exclusive), so we can reconstruct the snippet. For readability, we - * stop at the first encountered newline. - */ - private static String mkToString(Mark startMark, Mark endMark, int[] codepoints) { - StringBuilder b = new StringBuilder(); - for (int i = startMark.getIndex(); i < endMark.getIndex() && !isNewLine(codepoints[i]); i++) - b.appendCodePoint(codepoints[i]); - return TextualExtractor.sanitiseToString(b.toString()); - } - - /** Emit a source location for a YAML node. */ - private void extractLocation(Label label, Mark startMark, Mark endMark) { - int startLine, startColumn, endLine, endColumn; - - // SnakeYAML uses 0-based indexing for both lines and columns, so need to +1 - startLine = startMark.getLine() + 1; - startColumn = startMark.getColumn() + 1; - - // SnakeYAML's end positions are exclusive, so only need to +1 for the line - endLine = endMark.getLine() + 1; - endColumn = endMark.getColumn(); - - // Avoid emitting column zero for non-empty locations - if (endColumn == 0 && !(startLine == endLine && startColumn == endColumn)) { - String source = textualExtractor.getSource(); - int offset = getLineTable().getOffsetFromPoint(endMark.getLine(), endMark.getColumn()) - 1; - while (offset > 0 && isNewLine((int)source.charAt(offset))) { - --offset; - } - com.semmle.util.locations.Position adjustedEndPos = getLineTable().getEndPositionFromOffset(offset); - endLine = adjustedEndPos.getLine(); - endColumn = adjustedEndPos.getColumn(); - } - - locationManager.emitSnippetLocation(label, startLine, startColumn, endLine, endColumn); - } } diff --git a/javascript/ql/examples/queries.xml b/javascript/ql/examples/queries.xml deleted file mode 100644 index d4346295164..00000000000 --- a/javascript/ql/examples/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/queries.xml b/javascript/ql/experimental/adaptivethreatmodeling/src/queries.xml deleted file mode 100644 index d4346295164..00000000000 --- a/javascript/ql/experimental/adaptivethreatmodeling/src/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index 0ecd4aed192..24e199a69d7 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.6.1 + +### Major Analysis Improvements + +* The Yaml.qll library was moved into a shared library pack named `codeql/yaml` to make it possible for other languages to re-use it. This change should be backwards compatible for existing JavaScript queries. + ## 0.6.0 ### Major Analysis Improvements diff --git a/javascript/ql/lib/change-notes/released/0.6.1.md b/javascript/ql/lib/change-notes/released/0.6.1.md new file mode 100644 index 00000000000..4d19bca9956 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/0.6.1.md @@ -0,0 +1,5 @@ +## 0.6.1 + +### Major Analysis Improvements + +* The Yaml.qll library was moved into a shared library pack named `codeql/yaml` to make it possible for other languages to re-use it. This change should be backwards compatible for existing JavaScript queries. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index a3f820f884d..80fb0899f64 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.0 +lastReleaseVersion: 0.6.1 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index a93823b7ade..6dcd0f61acd 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 0.6.0 +version: 0.6.1 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript @@ -9,5 +9,6 @@ dependencies: codeql/regex: ${workspace} codeql/tutorial: ${workspace} codeql/util: ${workspace} + codeql/yaml: ${workspace} dataExtensions: - semmle/javascript/frameworks/**/model.yml diff --git a/javascript/ql/lib/semmle/javascript/Extend.qll b/javascript/ql/lib/semmle/javascript/Extend.qll index 221828200fb..40f7049c058 100644 --- a/javascript/ql/lib/semmle/javascript/Extend.qll +++ b/javascript/ql/lib/semmle/javascript/Extend.qll @@ -157,10 +157,12 @@ private class FunctionalExtendCallShallow extends ExtendCall { } /** - * A taint propagating data flow edge from the objects flowing into an extend call to its return value + * A value-preserving data flow edge from the objects flowing into an extend call to its return value * and to the source of the destination object. + * + * Since all object properties are preserved, we model this as a value-preserving step. */ -private class ExtendCallTaintStep extends TaintTracking::SharedTaintStep { +private class ExtendCallStep extends PreCallGraphStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists(ExtendCall extend | pred = extend.getASourceOperand() and succ = extend.getDestinationOperand().getALocalSource() diff --git a/javascript/ql/lib/semmle/javascript/InclusionTests.qll b/javascript/ql/lib/semmle/javascript/InclusionTests.qll index 3d9921bf6ff..849376374ad 100644 --- a/javascript/ql/lib/semmle/javascript/InclusionTests.qll +++ b/javascript/ql/lib/semmle/javascript/InclusionTests.qll @@ -69,6 +69,7 @@ module InclusionTest { inner.getContainerNode().getALocalSource() = DataFlow::parameterNode(callee.getAParameter()) } + pragma[assume_small_delta] override DataFlow::Node getContainerNode() { exists(int arg | inner.getContainerNode().getALocalSource() = @@ -77,6 +78,7 @@ module InclusionTest { ) } + pragma[assume_small_delta] override DataFlow::Node getContainedNode() { exists(int arg | inner.getContainedNode().getALocalSource() = diff --git a/javascript/ql/lib/semmle/javascript/PrintAst.qll b/javascript/ql/lib/semmle/javascript/PrintAst.qll index 6339d81a01c..5c4960e041c 100644 --- a/javascript/ql/lib/semmle/javascript/PrintAst.qll +++ b/javascript/ql/lib/semmle/javascript/PrintAst.qll @@ -51,7 +51,7 @@ private predicate isNotNeeded(Locatable el) { private string getQlClass(Locatable el) { result = "[" + el.getPrimaryQlClasses() + "] " // Alternative implementation -- do not delete. It is useful for QL class discovery. - // not el.getAPrimaryQlClass() = "???" and result = "[" + getPrimaryQlClasses() + "] " or el.getAPrimaryQlClass() = "???" and result = "??[" + concat(el.getAQlClass(), ",") + "] " + // not el.getAPrimaryQlClass() = "???" and result = "[" + el.getPrimaryQlClasses() + "] " or el.getAPrimaryQlClass() = "???" and result = "??[" + concat(el.getAQlClass(), ",") + "] " } /** diff --git a/javascript/ql/lib/semmle/javascript/StringOps.qll b/javascript/ql/lib/semmle/javascript/StringOps.qll index 6b7820e964d..da751b550d7 100644 --- a/javascript/ql/lib/semmle/javascript/StringOps.qll +++ b/javascript/ql/lib/semmle/javascript/StringOps.qll @@ -67,6 +67,7 @@ module StringOps { inner.getSubstring().getALocalSource().getEnclosingExpr() = callee.getAParameter() } + pragma[assume_small_delta] override DataFlow::Node getBaseString() { exists(int arg | inner.getBaseString().getALocalSource().getEnclosingExpr() = callee.getParameter(arg) and @@ -74,6 +75,7 @@ module StringOps { ) } + pragma[assume_small_delta] override DataFlow::Node getSubstring() { exists(int arg | inner.getSubstring().getALocalSource().getEnclosingExpr() = callee.getParameter(arg) and @@ -292,6 +294,7 @@ module StringOps { inner.getSubstring().getALocalSource().getEnclosingExpr() = callee.getAParameter() } + pragma[assume_small_delta] override DataFlow::Node getBaseString() { exists(int arg | inner.getBaseString().getALocalSource().getEnclosingExpr() = callee.getParameter(arg) and @@ -299,6 +302,7 @@ module StringOps { ) } + pragma[assume_small_delta] override DataFlow::Node getSubstring() { exists(int arg | inner.getSubstring().getALocalSource().getEnclosingExpr() = callee.getParameter(arg) and diff --git a/javascript/ql/lib/semmle/javascript/YAML.qll b/javascript/ql/lib/semmle/javascript/YAML.qll index e7b49165499..d8a8a696d21 100644 --- a/javascript/ql/lib/semmle/javascript/YAML.qll +++ b/javascript/ql/lib/semmle/javascript/YAML.qll @@ -6,563 +6,107 @@ */ import javascript +private import codeql.yaml.Yaml as LibYaml -/** - * A node in the AST representation of a YAML file, which may either be - * a YAML value (such as a scalar or a collection) or an alias node - * referring to some other YAML value. - * - * Examples: - * - * ``` - * # a mapping - * x: 1 - * << : *DEFAULTS # an alias node referring to anchor `DEFAULTS` - * ``` - */ -class YamlNode extends @yaml_node, Locatable { - override Location getLocation() { yaml_locations(this, result) } - - /** - * Gets the parent node of this node, which is always a collection. - */ - YamlCollection getParentNode() { yaml(this, _, result, _, _, _) } - - /** - * Gets the `i`th child node of this node. - * - * _Note_: The index of a child node relative to its parent is considered - * an implementation detail and may change between versions of the extractor. - */ - YamlNode getChildNode(int i) { yaml(result, _, this, i, _, _) } - - /** - * Gets a child node of this node. - */ - YamlNode getAChildNode() { result = this.getChildNode(_) } - - /** - * Gets the number of child nodes of this node. - */ - int getNumChild() { result = count(this.getAChildNode()) } - - /** - * Gets the `i`th child of this node, as a YAML value. - */ - YamlValue getChild(int i) { result = this.getChildNode(i).eval() } - - /** - * Gets a child of this node, as a YAML value. - */ - YamlValue getAChild() { result = this.getChild(_) } - - /** - * Gets the tag of this node. - */ - string getTag() { yaml(this, _, _, _, result, _) } - - /** - * Holds if this node is tagged with a standard type tag of the form - * `tag:yaml.org,2002:`. - */ - predicate hasStandardTypeTag(string t) { - t = this.getTag().regexpCapture("tag:yaml.org,2002:(.*)", 1) +private module YamlSig implements LibYaml::InputSig { + class LocatableBase extends @yaml_locatable, Locatable { + override Location getLocation() { yaml_locations(this, result) } } - override string toString() { yaml(this, _, _, _, _, result) } + import javascript - /** - * Gets the anchor associated with this node, if any. - */ - string getAnchor() { yaml_anchors(this, result) } + class NodeBase extends Locatable, LocatableBase, @yaml_node { + NodeBase getChildNode(int i) { yaml(result, _, this, i, _, _) } - /** - * Gets the toplevel document to which this node belongs. - */ - YamlDocument getDocument() { result = this.getParentNode*() } + string getTag() { yaml(this, _, _, _, result, _) } - /** - * Gets the YAML value this node corresponds to after resolving aliases and includes. - */ - YamlValue eval() { result = this } + string getAnchor() { yaml_anchors(this, result) } - override string getAPrimaryQlClass() { result = "YamlNode" } + override string toString() { yaml(this, _, _, _, _, result) } + } + + class ScalarNodeBase extends NodeBase, @yaml_scalar_node { + int getStyle() { yaml_scalars(this, result, _) } + + string getValue() { yaml_scalars(this, _, result) } + } + + class CollectionNodeBase extends NodeBase, @yaml_collection_node { } + + class MappingNodeBase extends CollectionNodeBase, @yaml_mapping_node { } + + class SequenceNodeBase extends CollectionNodeBase, @yaml_sequence_node { } + + class AliasNodeBase extends NodeBase, @yaml_alias_node { + string getTarget() { yaml_aliases(this, result) } + } + + class ParseErrorBase extends LocatableBase, @yaml_error { + string getMessage() { yaml_errors(this, result) } + } +} + +import LibYaml::Make + +// private class to forward the `toString` etc. predicates from `YamlNode` to `Locatable`. +private class MyYmlNode extends Locatable instanceof YamlNode { + override string getAPrimaryQlClass() { result = YamlNode.super.getAPrimaryQlClass() } + + override Location getLocation() { result = YamlNode.super.getLocation() } + + override string toString() { result = YamlNode.super.toString() } } /** DEPRECATED: Alias for YamlNode */ deprecated class YAMLNode = YamlNode; -/** - * A YAML value; that is, either a scalar or a collection. - * - * Examples: - * - * ``` - * --- - * "a string" - * --- - * - a - * - sequence - * ``` - */ -abstract class YamlValue extends YamlNode { } - /** DEPRECATED: Alias for YamlValue */ deprecated class YAMLValue = YamlValue; -/** - * A YAML scalar. - * - * Examples: - * - * ``` - * 42 - * 1.0 - * 2001-12-15T02:59:43.1Z - * true - * null - * "hello" - * ``` - */ -class YamlScalar extends YamlValue, @yaml_scalar_node { - /** - * Gets the style of this scalar, which is one of the following: - * - * - `""` (empty string): plain style - * - `"\""` (double quote): double quoted style - * - `"'"` (single quote): single quoted style - * - `">"` (greater-than): folded style - * - `"|"` (pipe): literal style - */ - string getStyle() { - exists(int s | yaml_scalars(this, s, _) | - s = 0 and result = "" - or - s = 34 and result = "\"" - or - s = 39 and result = "'" - or - s = 62 and result = ">" - or - s = 124 and result = "|" - ) - } - - /** - * Gets the value of this scalar, as a string. - */ - string getValue() { yaml_scalars(this, _, result) } - - override string getAPrimaryQlClass() { result = "YamlScalar" } -} - /** DEPRECATED: Alias for YamlScalar */ deprecated class YAMLScalar = YamlScalar; -/** - * A YAML scalar representing an integer value. - * - * Examples: - * - * ``` - * 42 - * 0xffff - * ``` - */ -class YamlInteger extends YamlScalar { - YamlInteger() { this.hasStandardTypeTag("int") } - - /** - * Gets the value of this scalar, as an integer. - */ - int getIntValue() { result = this.getValue().toInt() } -} - /** DEPRECATED: Alias for YamlInteger */ deprecated class YAMLInteger = YamlInteger; -/** - * A YAML scalar representing a floating point value. - * - * Examples: - * - * ``` - * 1.0 - * 6.626e-34 - * ``` - */ -class YamlFloat extends YamlScalar { - YamlFloat() { this.hasStandardTypeTag("float") } - - /** - * Gets the value of this scalar, as a floating point number. - */ - float getFloatValue() { result = this.getValue().toFloat() } -} - /** DEPRECATED: Alias for YamlFloat */ deprecated class YAMLFloat = YamlFloat; -/** - * A YAML scalar representing a time stamp. - * - * Example: - * - * ``` - * 2001-12-15T02:59:43.1Z - * ``` - */ -class YamlTimestamp extends YamlScalar { - YamlTimestamp() { this.hasStandardTypeTag("timestamp") } - - /** - * Gets the value of this scalar, as a date. - */ - date getDateValue() { result = this.getValue().toDate() } -} - /** DEPRECATED: Alias for YamlTimestamp */ deprecated class YAMLTimestamp = YamlTimestamp; -/** - * A YAML scalar representing a Boolean value. - * - * Example: - * - * ``` - * true - * ``` - */ -class YamlBool extends YamlScalar { - YamlBool() { this.hasStandardTypeTag("bool") } - - /** - * Gets the value of this scalar, as a Boolean. - */ - boolean getBoolValue() { if this.getValue() = "true" then result = true else result = false } -} - /** DEPRECATED: Alias for YamlBool */ deprecated class YAMLBool = YamlBool; -/** - * A YAML scalar representing the null value. - * - * Example: - * - * ``` - * null - * ``` - */ -class YamlNull extends YamlScalar { - YamlNull() { this.hasStandardTypeTag("null") } -} - /** DEPRECATED: Alias for YamlNull */ deprecated class YAMLNull = YamlNull; -/** - * A YAML scalar representing a string value. - * - * Example: - * - * ``` - * "hello" - * ``` - */ -class YamlString extends YamlScalar { - YamlString() { this.hasStandardTypeTag("str") } -} - /** DEPRECATED: Alias for YamlString */ deprecated class YAMLString = YamlString; -/** - * A YAML scalar representing a merge key. - * - * Example: - * - * ``` - * x: 1 - * << : *DEFAULTS # merge key - * ``` - */ -class YamlMergeKey extends YamlScalar { - YamlMergeKey() { this.hasStandardTypeTag("merge") } -} - /** DEPRECATED: Alias for YamlMergeKey */ deprecated class YAMLMergeKey = YamlMergeKey; -/** - * A YAML scalar representing an `!include` directive. - * - * ``` - * !include common.yaml - * ``` - */ -class YamlInclude extends YamlScalar { - YamlInclude() { this.getTag() = "!include" } - - override YamlValue eval() { - exists(YamlDocument targetDoc | - targetDoc.getFile().getAbsolutePath() = this.getTargetPath() and - result = targetDoc.eval() - ) - } - - /** - * Gets the absolute path of the file included by this directive. - */ - private string getTargetPath() { - exists(string path | path = this.getValue() | - if path.matches("/%") - then result = path - else result = this.getDocument().getFile().getParentContainer().getAbsolutePath() + "/" + path - ) - } -} - /** DEPRECATED: Alias for YamlInclude */ deprecated class YAMLInclude = YamlInclude; -/** - * A YAML collection, that is, either a mapping or a sequence. - * - * Examples: - * - * ``` - * --- - * # a mapping - * x: 0 - * y: 1 - * --- - * # a sequence - * - red - * - green - * - -blue - * ``` - */ -class YamlCollection extends YamlValue, @yaml_collection_node { - override string getAPrimaryQlClass() { result = "YamlCollection" } -} - /** DEPRECATED: Alias for YamlCollection */ deprecated class YAMLCollection = YamlCollection; -/** - * A YAML mapping. - * - * Example: - * - * ``` - * x: 0 - * y: 1 - * ``` - */ -class YamlMapping extends YamlCollection, @yaml_mapping_node { - /** - * Gets the `i`th key of this mapping. - */ - YamlNode getKeyNode(int i) { - i >= 0 and - exists(int j | i = j - 1 and result = this.getChildNode(j)) - } - - /** - * Gets the `i`th value of this mapping. - */ - YamlNode getValueNode(int i) { - i >= 0 and - exists(int j | i = -j - 1 and result = this.getChildNode(j)) - } - - /** - * Gets the `i`th key of this mapping, as a YAML value. - */ - YamlValue getKey(int i) { result = this.getKeyNode(i).eval() } - - /** - * Gets the `i`th value of this mapping, as a YAML value. - */ - YamlValue getValue(int i) { result = this.getValueNode(i).eval() } - - /** - * Holds if this mapping maps `key` to `value`. - */ - predicate maps(YamlValue key, YamlValue value) { - exists(int i | key = this.getKey(i) and value = this.getValue(i)) - or - exists(YamlMergeKey merge, YamlMapping that | this.maps(merge, that) | that.maps(key, value)) - } - - /** - * Gets the value that this mapping maps `key` to. - */ - YamlValue lookup(string key) { exists(YamlScalar s | s.getValue() = key | this.maps(s, result)) } - - override string getAPrimaryQlClass() { result = "YamlMapping" } -} - /** DEPRECATED: Alias for YamlMapping */ deprecated class YAMLMapping = YamlMapping; -/** - * A YAML sequence. - * - * Example: - * - * ``` - * - red - * - green - * - blue - * ``` - */ -class YamlSequence extends YamlCollection, @yaml_sequence_node { - /** - * Gets the `i`th element in this sequence. - */ - YamlNode getElementNode(int i) { result = this.getChildNode(i) } - - /** - * Gets the `i`th element in this sequence, as a YAML value. - */ - YamlValue getElement(int i) { result = this.getElementNode(i).eval() } - - override string getAPrimaryQlClass() { result = "YamlSequence" } -} - /** DEPRECATED: Alias for YamlSequence */ deprecated class YAMLSequence = YamlSequence; -/** - * A YAML alias node referring to a target anchor. - * - * Example: - * - * ``` - * *DEFAULTS - * ``` - */ -class YamlAliasNode extends YamlNode, @yaml_alias_node { - override YamlValue eval() { - result.getAnchor() = this.getTarget() and - result.getDocument() = this.getDocument() - } - - /** - * Gets the target anchor this alias refers to. - */ - string getTarget() { yaml_aliases(this, result) } - - override string getAPrimaryQlClass() { result = "YamlAliasNode" } -} - /** DEPRECATED: Alias for YamlAliasNode */ deprecated class YAMLAliasNode = YamlAliasNode; -/** - * A YAML document. - * - * Example: - * - * ``` - * --- - * x: 0 - * y: 1 - * ``` - */ -class YamlDocument extends YamlNode { - YamlDocument() { not exists(this.getParentNode()) } -} - /** DEPRECATED: Alias for YamlDocument */ deprecated class YAMLDocument = YamlDocument; -/** - * An error message produced by the YAML parser while processing a YAML file. - */ -class YamlParseError extends @yaml_error, Error { - override Location getLocation() { yaml_locations(this, result) } - - override string getMessage() { yaml_errors(this, result) } - - override string toString() { result = this.getMessage() } -} - /** DEPRECATED: Alias for YamlParseError */ deprecated class YAMLParseError = YamlParseError; -/** - * A YAML node that may contain sub-nodes that can be identified by a name. - * I.e. a mapping, sequence, or scalar. - * - * Is used in e.g. GithHub Actions, which is quite flexible in parsing YAML. - * - * For example: - * ``` - * on: pull_request - * ``` - * and - * ``` - * on: [pull_request] - * ``` - * and - * ``` - * on: - * pull_request: - * ``` - * - * are equivalent. - */ -class YamlMappingLikeNode extends YamlNode { - YamlMappingLikeNode() { - this instanceof YamlMapping - or - this instanceof YamlSequence - or - this instanceof YamlScalar - } - - /** Gets sub-name identified by `name`. */ - YamlNode getNode(string name) { - exists(YamlMapping mapping | - mapping = this and - result = mapping.lookup(name) - ) - or - exists(YamlSequence sequence, YamlNode node | - sequence = this and - sequence.getAChildNode() = node and - node.eval().toString() = name and - result = node - ) - or - exists(YamlScalar scalar | - scalar = this and - scalar.getValue() = name and - result = scalar - ) - } - - /** Gets the number of elements in this mapping or sequence. */ - int getElementCount() { - exists(YamlMapping mapping | - mapping = this and - result = mapping.getNumChild() / 2 - ) - or - exists(YamlSequence sequence | - sequence = this and - result = sequence.getNumChild() - ) - or - exists(YamlScalar scalar | - scalar = this and - result = 1 - ) - } -} - /** DEPRECATED: Alias for YamlMappingLikeNode */ deprecated class YAMLMappingLikeNode = YamlMappingLikeNode; diff --git a/javascript/ql/lib/semmle/javascript/dataflow/Configuration.qll b/javascript/ql/lib/semmle/javascript/dataflow/Configuration.qll index 86309cb1a6c..9b90da92a05 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/Configuration.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/Configuration.qll @@ -806,6 +806,10 @@ private predicate basicFlowStepNoBarrier( callStep(pred, succ) and summary = PathSummary::call() or + // Implied receiver flow + CallGraph::impliedReceiverStep(pred, succ) and + summary = PathSummary::call() + or // Flow out of function returnStep(pred, succ) and summary = PathSummary::return() diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/CallGraphs.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/CallGraphs.qll index e616772e789..d5a5b29d1dc 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/CallGraphs.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/CallGraphs.qll @@ -241,22 +241,26 @@ module CallGraph { ) } - private predicate shouldTrackObjectWithMethods(DataFlow::SourceNode node) { + private DataFlow::FunctionNode getAMethodOnPlainObject(DataFlow::SourceNode node) { ( ( node instanceof DataFlow::ObjectLiteralNode or node instanceof DataFlow::FunctionNode ) and - node.getAPropertySource() instanceof DataFlow::FunctionNode + result = node.getAPropertySource() or - exists(node.(DataFlow::ObjectLiteralNode).getPropertyGetter(_)) + result = node.(DataFlow::ObjectLiteralNode).getPropertyGetter(_) or - exists(node.(DataFlow::ObjectLiteralNode).getPropertySetter(_)) + result = node.(DataFlow::ObjectLiteralNode).getPropertySetter(_) ) and not node.getTopLevel().isExterns() } + private predicate shouldTrackObjectWithMethods(DataFlow::SourceNode node) { + exists(getAMethodOnPlainObject(node)) + } + /** * Gets a step summary for tracking object literals. * @@ -273,4 +277,22 @@ module CallGraph { or StepSummary::step(getAnAllocationSiteRef(node), result, objectWithMethodsStep()) } + + /** + * Holds if `pred` is assumed to flow to `succ` because a method is stored on an object that is assumed + * to be the receiver of calls to that method. + * + * For example, object literal below is assumed to flow to the receiver of the `foo` function: + * ```js + * let obj = {}; + * obj.foo = function() {} + * ``` + */ + cached + predicate impliedReceiverStep(DataFlow::SourceNode pred, DataFlow::SourceNode succ) { + exists(DataFlow::SourceNode host | + pred = getAnAllocationSiteRef(host) and + succ = getAMethodOnPlainObject(host).getReceiver() + ) + } } diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll index c479c3502c6..6593df32615 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll @@ -94,6 +94,10 @@ private module Cached { DataFlow::localFieldStep(pred, succ) and summary = LevelStep() or + // Implied flow of host object into 'this' of a method + CallGraph::impliedReceiverStep(pred, succ) and + summary = CallStep() + or exists(string prop | basicStoreStep(pred, succ, prop) and summary = StoreStep(prop) diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Express.qll b/javascript/ql/lib/semmle/javascript/frameworks/Express.qll index 2391ef89a35..bc6924cfd0f 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/Express.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/Express.qll @@ -164,9 +164,9 @@ module Express { */ DataFlow::Node getRouteHandlerNode(int index) { // The first argument is a URI pattern if it is a string. If it could possibly be - // a function, we consider it to be a route handler, otherwise a URI pattern. + // a non-string value, we consider it to be a route handler, otherwise a URI pattern. exists(AnalyzedNode firstArg | firstArg = this.getArgument(0).analyze() | - if firstArg.getAType() = TTFunction() + if firstArg.getAType() != TTString() then result = this.getArgument(index) else ( index >= 0 and result = this.getArgument(index + 1) @@ -215,6 +215,10 @@ module Express { or Http::routeHandlerStep(result, succ) and t = t2 + or + DataFlow::SharedFlowStep::storeStep(result.getALocalUse(), succ, + DataFlow::PseudoProperties::arrayElement()) and + t = t2.continue() ) } @@ -510,21 +514,6 @@ module Express { } } - /** - * Holds if `call` is a chainable method call on the response object of `handler`. - */ - private predicate isChainableResponseMethodCall( - RouteHandler handler, DataFlow::MethodCallNode call - ) { - exists(string name | call.calls(handler.getAResponseNode(), name) | - name = - [ - "append", "attachment", "location", "send", "sendStatus", "set", "status", "type", "vary", - "clearCookie", "contentType", "cookie", "format", "header", "json", "jsonp", "links" - ] - ) - } - /** An Express response source. */ abstract class ResponseSource extends Http::Servers::ResponseSource { } @@ -535,11 +524,7 @@ module Express { private class ExplicitResponseSource extends ResponseSource { RouteHandler rh; - ExplicitResponseSource() { - this = rh.getResponseParameter() - or - isChainableResponseMethodCall(rh, this) - } + ExplicitResponseSource() { this = rh.getResponseParameter() } /** * Gets the route handler that provides this response. @@ -556,6 +541,22 @@ module Express { override RouteHandler getRouteHandler() { none() } // Not known. } + private class ChainedResponse extends ResponseSource { + private ResponseSource base; + + ChainedResponse() { + this = + base.ref() + .getAMethodCall([ + "append", "attachment", "location", "send", "sendStatus", "set", "status", "type", + "vary", "clearCookie", "contentType", "cookie", "format", "header", "json", "jsonp", + "links" + ]) + } + + override Http::RouteHandler getRouteHandler() { result = base.getRouteHandler() } + } + /** An Express request source. */ abstract class RequestSource extends Http::Servers::RequestSource { } @@ -777,12 +778,12 @@ module Express { /** * Holds if `e` is an HTTP request object. */ - predicate isRequest(DataFlow::Node e) { any(RouteHandler rh).getARequestNode() = e } + predicate isRequest(DataFlow::Node e) { any(RequestSource src).ref().flowsTo(e) } /** * Holds if `e` is an HTTP response object. */ - predicate isResponse(DataFlow::Node e) { any(RouteHandler rh).getAResponseNode() = e } + predicate isResponse(DataFlow::Node e) { any(ResponseSource src).ref().flowsTo(e) } /** * An access to the HTTP request body. diff --git a/javascript/ql/lib/semmle/javascript/linters/ESLint.qll b/javascript/ql/lib/semmle/javascript/linters/ESLint.qll index 76164f25f18..380295dea1e 100644 --- a/javascript/ql/lib/semmle/javascript/linters/ESLint.qll +++ b/javascript/ql/lib/semmle/javascript/linters/ESLint.qll @@ -60,22 +60,24 @@ module ESLint { } /** An `.eslintrc.yaml` file. */ - private class EslintrcYaml extends Configuration, YamlDocument, YamlMapping { + private class EslintrcYaml extends Configuration instanceof YamlMapping, YamlDocument { EslintrcYaml() { exists(string n | n = getFile().getBaseName() | n = ".eslintrc.yaml" or n = ".eslintrc.yml" or n = ".eslintrc" ) } - override ConfigurationObject getGlobals() { result = lookup("globals") } + override ConfigurationObject getGlobals() { result = super.lookup("globals") } } /** An ESLint configuration object in YAML format. */ - private class YamlConfigurationObject extends ConfigurationObject, YamlMapping { - override Configuration getConfiguration() { this = result.(EslintrcYaml).getValue(_) } + private class YamlConfigurationObject extends ConfigurationObject instanceof YamlMapping { + override Configuration getConfiguration() { + this = result.(EslintrcYaml).(YamlMapping).getValue(_) + } override boolean getBooleanProperty(string p) { - exists(string v | v = lookup(p).(YamlBool).getValue() | + exists(string v | v = super.lookup(p).(YamlBool).getValue() | v = "true" and result = true or v = "false" and result = false diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/ClientSideUrlRedirectCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/ClientSideUrlRedirectCustomizations.qll index de19e549f9c..7b3b098b730 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/ClientSideUrlRedirectCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/ClientSideUrlRedirectCustomizations.qll @@ -222,6 +222,8 @@ module ClientSideUrlRedirect { HistoryWriteUrlSink() { this = History::getBrowserHistory().getMember(["push", "replace"]).getACall().getArgument(0) } + + override predicate isXssSink() { any() } } /** diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/PrototypePollutingAssignmentQuery.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/PrototypePollutingAssignmentQuery.qll index caabdefb8ae..4c624e7950c 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/PrototypePollutingAssignmentQuery.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/PrototypePollutingAssignmentQuery.qll @@ -55,6 +55,22 @@ class Configuration extends TaintTracking::Configuration { ) } + override predicate isSanitizerEdge( + DataFlow::Node pred, DataFlow::Node succ, DataFlow::FlowLabel lbl + ) { + // Suppress the value-preserving step src -> dst in `extend(dst, src)`. This is modeled as a value-preserving + // step because it preserves all properties, but the destination is not actually Object.prototype. + exists(ExtendCall call | + pred = call.getASourceOperand() and + ( + succ = call.getDestinationOperand().getALocalSource() + or + succ = call + ) and + lbl instanceof ObjectPrototype + ) + } + override predicate isAdditionalFlowStep( DataFlow::Node pred, DataFlow::Node succ, DataFlow::FlowLabel inlbl, DataFlow::FlowLabel outlbl ) { diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/UnsafeJQueryPluginCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/UnsafeJQueryPluginCustomizations.qll index 710e87ae026..b3e2057336e 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/UnsafeJQueryPluginCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/UnsafeJQueryPluginCustomizations.qll @@ -31,6 +31,13 @@ module UnsafeJQueryPlugin { */ abstract class Sanitizer extends DataFlow::Node { } + /** + * The receiver of a function, seen as a sanitizer. + * + * Plugins often do `$(this)` to coerce an existing DOM element to a jQuery object. + */ + private class ThisSanitizer extends Sanitizer instanceof DataFlow::ThisNode { } + /** * An argument that may act as an HTML fragment rather than a CSS selector, as a sink for remote unsafe jQuery plugins. */ diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index f1b742950bd..d0933ef06cf 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,15 @@ +## 0.6.1 + +### Minor Analysis Improvements + +* Improved the call graph to better handle the case where a function is stored on + a plain object and subsequently copied to a new host object via an `extend` call. + +### Bug Fixes + +* Fixes an issue that would cause TypeScript extraction to hang in rare cases when extracting + code containing recursive generic type aliases. + ## 0.6.0 ### Minor Analysis Improvements diff --git a/javascript/ql/src/Security/CWE-916/InsufficientPasswordHash.qhelp b/javascript/ql/src/Security/CWE-916/InsufficientPasswordHash.qhelp index f9e3a5b3857..1efdbe694b1 100644 --- a/javascript/ql/src/Security/CWE-916/InsufficientPasswordHash.qhelp +++ b/javascript/ql/src/Security/CWE-916/InsufficientPasswordHash.qhelp @@ -37,7 +37,7 @@ the hash of a password.

    - +

    This is not secure, since the password can be efficiently @@ -46,7 +46,7 @@ algorithm:

    - + diff --git a/javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_NodeJS.js b/javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash.js similarity index 100% rename from javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_NodeJS.js rename to javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash.js diff --git a/javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_CryptoJS.js b/javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_CryptoJS.js deleted file mode 100644 index c0a621f85b1..00000000000 --- a/javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_CryptoJS.js +++ /dev/null @@ -1,8 +0,0 @@ -const crypto = require('crypto-js') -function hashPassword(email, password) { - var algo = crypto.algo.SHA512.create() - algo.update(password, 'utf-8') // BAD - algo.update(email.toLowerCase(), 'utf-8') - var hash = algo.finalize() - return hash.toString(crypto.enc.Base64) -} \ No newline at end of file diff --git a/javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_CryptoJS_fixed b/javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_CryptoJS_fixed deleted file mode 100644 index 909f09f8f4e..00000000000 --- a/javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_CryptoJS_fixed +++ /dev/null @@ -1,8 +0,0 @@ -const crypto = require('crypto-js') -function hashPassword(email, password) { - var algo = crypto.algo.PBKDF2.create() - algo.update(password, 'utf-8') // GOOD - algo.update(email.toLowerCase(), 'utf-8') - var hash = algo.finalize() - return hash.toString(crypto.enc.Base64) -} \ No newline at end of file diff --git a/javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_NodeJS_fixed.js b/javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_fixed.js similarity index 100% rename from javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_NodeJS_fixed.js rename to javascript/ql/src/Security/CWE-916/examples/InsufficientPasswordHash_fixed.js diff --git a/javascript/ql/src/change-notes/released/0.6.1.md b/javascript/ql/src/change-notes/released/0.6.1.md new file mode 100644 index 00000000000..19f11dca896 --- /dev/null +++ b/javascript/ql/src/change-notes/released/0.6.1.md @@ -0,0 +1,11 @@ +## 0.6.1 + +### Minor Analysis Improvements + +* Improved the call graph to better handle the case where a function is stored on + a plain object and subsequently copied to a new host object via an `extend` call. + +### Bug Fixes + +* Fixes an issue that would cause TypeScript extraction to hang in rare cases when extracting + code containing recursive generic type aliases. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index a3f820f884d..80fb0899f64 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.0 +lastReleaseVersion: 0.6.1 diff --git a/javascript/ql/src/experimental/Security/CWE-444/InsecureHttpParser.qhelp b/javascript/ql/src/experimental/Security/CWE-444/InsecureHttpParser.qhelp new file mode 100644 index 00000000000..94ac0c68a7a --- /dev/null +++ b/javascript/ql/src/experimental/Security/CWE-444/InsecureHttpParser.qhelp @@ -0,0 +1,63 @@ + + + + + +

    + + Strict HTTP parsing may cause problems with interoperability with some + non-conformant HTTP implementations. But disabling it is strongly discouraged, + as it opens the door to several threats including HTTP Request Smuggling. + +

    + +
    + + + +

    + + Do not enable insecure http parser. + +

    + +
    + + + +

    + + The following example shows the instantiation of an http server. This + server is vulnerable to HTTP Request Smuggling because the + insecureHTTPParser option of the server instantiation is + set to true. As a consequence, malformed packets may attempt + to exploit any number of weaknesses including ranging from Web Cache Poisoning + Attacks to bypassing firewall protection mecahanisms. + +

    + + + +

    + + To make sure that packets are parsed correctly, the + invalidHTTPParser option should have its default value, + or be explicitly set to false. + +

    + +
    + + + +
  • NodeJS: February 20 Security Release
  • + +
  • Snyk: NodeJS Critical HTTP Vulnerability
  • + +
  • CWE-444: HTTP Request/Response Smuggling
  • + +
    + +
    \ No newline at end of file diff --git a/javascript/ql/src/experimental/Security/CWE-444/InsecureHttpParser.ql b/javascript/ql/src/experimental/Security/CWE-444/InsecureHttpParser.ql new file mode 100644 index 00000000000..ec2c34ba618 --- /dev/null +++ b/javascript/ql/src/experimental/Security/CWE-444/InsecureHttpParser.ql @@ -0,0 +1,42 @@ +/** + * @name Insecure http parser + * @description Using an insecure http parser can lead to http smuggling attacks. + * @kind problem + * @problem.severity warning + * @security-severity 9.0 + * @precision high + * @id js/insecure-http-parser + * @tags security + * external/cwe/cwe-444 + */ + +import javascript + +/** Gets options argument for a potential http or https connection */ +DataFlow::InvokeNode nodeInvocation() { + result instanceof ClientRequest + or + result instanceof Http::ServerDefinition +} + +/** Gets an options object for an http or https connection. */ +DataFlow::ObjectLiteralNode nodeOptions() { result.flowsTo(nodeInvocation().getAnArgument()) } + +from DataFlow::PropWrite disable +where + exists(DataFlow::SourceNode env | + env = NodeJSLib::process().getAPropertyRead("env") and + disable = env.getAPropertyWrite("NODE_OPTIONS") and + disable.getRhs().getStringValue().matches("%--insecure-http-parser%") + ) + or + ( + disable = nodeOptions().getAPropertyWrite("insecureHTTPParser") + or + // the same thing, but with API-nodes if they happen to be available + exists(API::Node nodeInvk | nodeInvk.getAnInvocation() = nodeInvocation() | + disable.getRhs() = nodeInvk.getAParameter().getMember("insecureHTTPParser").asSink() + ) + ) and + disable.getRhs().(AnalyzedNode).getTheBooleanValue() = true +select disable, "Allowing invalid HTTP headers is strongly discouraged." diff --git a/javascript/ql/src/experimental/Security/CWE-444/examples/InsecureHttpParser.js b/javascript/ql/src/experimental/Security/CWE-444/examples/InsecureHttpParser.js new file mode 100644 index 00000000000..0b082ca0d47 --- /dev/null +++ b/javascript/ql/src/experimental/Security/CWE-444/examples/InsecureHttpParser.js @@ -0,0 +1,7 @@ +const http = require('node:http'); + +http.createServer({ + insecureHTTPParser: true +}, (req, res) => { + res.end('hello world\n'); +}); \ No newline at end of file diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 70d4975a6ca..06d40a1599a 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 0.6.0 +version: 0.6.1 groups: - javascript - queries diff --git a/javascript/ql/src/queries.xml b/javascript/ql/src/queries.xml deleted file mode 100644 index d4346295164..00000000000 --- a/javascript/ql/src/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/test.expected b/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/test.expected new file mode 100644 index 00000000000..0be0c0ae251 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/test.expected @@ -0,0 +1,15 @@ +typeAliases +| tst.ts:1:8:1:41 | type Fo ... R \| A>; | +| tst.ts:3:8:3:42 | type Ba ... R, A]>; | +| tst.ts:5:8:5:47 | type Ba ... => A>; | +typeAliasType +| tst.ts:1:8:1:41 | type Fo ... R \| A>; | Foo | +| tst.ts:3:8:3:42 | type Ba ... R, A]>; | Bar | +| tst.ts:5:8:5:47 | type Ba ... => A>; | Baz | +getAliasedType +| Bar | () => Bar<[R, A]> | +| Bar<[R, A]> | () => Bar<[[R, A], A]> | +| Baz<(x: R) => A> | () => Baz<(x: (x: R) => A) => A> | +| Baz | () => Baz<(x: R) => A> | +| Foo | () => Foo | +| Foo | () => Foo | diff --git a/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/test.ql b/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/test.ql new file mode 100644 index 00000000000..5fa86781b95 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/test.ql @@ -0,0 +1,8 @@ +import javascript + +// The extractor would hang on this test case, it doesn't matter too much what the output of the test is. +query TypeAliasDeclaration typeAliases() { any() } + +query Type typeAliasType(TypeAliasDeclaration decl) { result = decl.getTypeName().getType() } + +query Type getAliasedType(TypeAliasReference ref) { result = ref.getAliasedType() } diff --git a/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/tsconfig.json b/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/tsconfig.json new file mode 100644 index 00000000000..82194fc7ab0 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/tsconfig.json @@ -0,0 +1,3 @@ +{ + "include": ["."] +} diff --git a/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/tst.ts b/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/tst.ts new file mode 100644 index 00000000000..92f63a28b96 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/RegressionTests/GenericTypeAlias/tst.ts @@ -0,0 +1,5 @@ +export type Foo = () => Foo; + +export type Bar = () => Bar<[R, A]>; + +export type Baz = () => Baz<(x: R) => A>; diff --git a/javascript/ql/test/library-tests/frameworks/Express/src/express3.js b/javascript/ql/test/library-tests/frameworks/Express/src/express3.js index 0fb39963c6e..69a0eeccd53 100644 --- a/javascript/ql/test/library-tests/frameworks/Express/src/express3.js +++ b/javascript/ql/test/library-tests/frameworks/Express/src/express3.js @@ -1,7 +1,7 @@ var express = require('express'); var app = express(); -app.get('/some/path', function(req, res) { +app.get('/some/path', function(req, res) { res.header(req.param("header"), req.param("val")); res.send("val"); }); @@ -10,3 +10,12 @@ function getHandler() { return function (req, res){} } app.use(getHandler()); + +function getHandler2() { + return function (req, res){} +} +app.use([getHandler2()]); + +function handler3(req, res) {} +let array = [handler3]; +app.use(array); diff --git a/javascript/ql/test/library-tests/frameworks/Express/tests.expected b/javascript/ql/test/library-tests/frameworks/Express/tests.expected index 6b1291c52ac..4d784329138 100644 --- a/javascript/ql/test/library-tests/frameworks/Express/tests.expected +++ b/javascript/ql/test/library-tests/frameworks/Express/tests.expected @@ -105,6 +105,8 @@ test_RouteSetup_getLastRouteHandlerExpr | src/express2.js:6:1:6:15 | app.use(router) | src/express2.js:6:9:6:14 | router | | src/express3.js:4:1:7:2 | app.get ... l");\\n}) | src/express3.js:4:23:7:1 | functio ... al");\\n} | | src/express3.js:12:1:12:21 | app.use ... dler()) | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:17:1:17:24 | app.use ... er2()]) | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:21:1:21:14 | app.use(array) | src/express3.js:21:9:21:13 | array | | src/express4.js:4:1:9:2 | app.get ... c1);\\n}) | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | | src/express.js:4:1:9:2 | app.get ... es);\\n}) | src/express.js:4:23:9:1 | functio ... res);\\n} | | src/express.js:16:3:18:4 | router. ... );\\n }) | src/express.js:16:19:18:3 | functio ... ");\\n } | @@ -745,7 +747,28 @@ test_RouterDefinition_getMiddlewareStackAt | src/express2.js:5:11:5:13 | e() | src/express2.js:6:1:6:15 | app.use(router) | src/express2.js:6:9:6:14 | router | | src/express2.js:5:11:5:13 | e() | src/express2.js:7:1:7:0 | exit node of | src/express2.js:6:9:6:14 | router | | src/express3.js:2:11:2:19 | express() | src/express3.js:12:1:12:21 | app.use ... dler()) | src/express3.js:12:9:12:20 | getHandler() | -| src/express3.js:2:11:2:19 | express() | src/express3.js:13:1:13:0 | exit node of | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:2:11:2:19 | express() | src/express3.js:14:1:16:1 | functio ... es){}\\n} | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:2:11:2:19 | express() | src/express3.js:17:1:17:3 | app | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:2:11:2:19 | express() | src/express3.js:17:1:17:7 | app.use | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:2:11:2:19 | express() | src/express3.js:17:1:17:24 | app.use ... er2()]) | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:17:1:17:25 | app.use ... r2()]); | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:2:11:2:19 | express() | src/express3.js:17:5:17:7 | use | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:2:11:2:19 | express() | src/express3.js:17:9:17:23 | [getHandler2()] | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:2:11:2:19 | express() | src/express3.js:17:10:17:20 | getHandler2 | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:2:11:2:19 | express() | src/express3.js:17:10:17:22 | getHandler2() | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:2:11:2:19 | express() | src/express3.js:19:1:19:30 | functio ... res) {} | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:20:1:20:23 | let arr ... dler3]; | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:20:5:20:9 | array | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:20:5:20:22 | array = [handler3] | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:20:13:20:22 | [handler3] | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:20:14:20:21 | handler3 | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:21:1:21:3 | app | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:21:1:21:7 | app.use | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:21:1:21:14 | app.use(array) | src/express3.js:21:9:21:13 | array | +| src/express3.js:2:11:2:19 | express() | src/express3.js:21:1:21:15 | app.use(array); | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:21:5:21:7 | use | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:21:9:21:13 | array | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:2:11:2:19 | express() | src/express3.js:22:1:22:0 | exit node of | src/express3.js:21:9:21:13 | array | | src/express.js:2:11:2:19 | express() | src/express.js:39:1:39:21 | app.use ... dler()) | src/express.js:39:9:39:20 | getHandler() | | src/express.js:2:11:2:19 | express() | src/express.js:41:1:43:1 | functio ... f();\\n} | src/express.js:39:9:39:20 | getHandler() | | src/express.js:2:11:2:19 | express() | src/express.js:44:1:44:3 | app | src/express.js:39:9:39:20 | getHandler() | @@ -882,6 +905,8 @@ test_isRequest | src/express3.js:5:14:5:16 | req | | src/express3.js:5:35:5:37 | req | | src/express3.js:10:22:10:24 | req | +| src/express3.js:15:20:15:22 | req | +| src/express3.js:19:19:19:21 | req | | src/express4.js:4:32:4:34 | req | | src/express4.js:4:32:4:34 | req | | src/express4.js:5:27:5:29 | req | @@ -965,6 +990,9 @@ test_isRequest | src/route-collection.js:3:7:3:9 | req | | src/route-collection.js:3:32:3:34 | req | | src/route.js:5:21:5:23 | req | +| typed_src/tst.ts:5:15:5:15 | x | +| typed_src/tst.ts:5:15:5:15 | x | +| typed_src/tst.ts:6:3:6:3 | x | test_RouteSetup_getRouter | src/advanced-routehandler-registration.js:10:3:10:24 | app.get ... es0[p]) | src/advanced-routehandler-registration.js:2:11:2:19 | express() | | src/advanced-routehandler-registration.js:19:3:19:18 | app.use(handler) | src/advanced-routehandler-registration.js:2:11:2:19 | express() | @@ -1005,6 +1033,8 @@ test_RouteSetup_getRouter | src/express2.js:6:1:6:15 | app.use(router) | src/express2.js:5:11:5:13 | e() | | src/express3.js:4:1:7:2 | app.get ... l");\\n}) | src/express3.js:2:11:2:19 | express() | | src/express3.js:12:1:12:21 | app.use ... dler()) | src/express3.js:2:11:2:19 | express() | +| src/express3.js:17:1:17:24 | app.use ... er2()]) | src/express3.js:2:11:2:19 | express() | +| src/express3.js:21:1:21:14 | app.use(array) | src/express3.js:2:11:2:19 | express() | | src/express4.js:4:1:9:2 | app.get ... c1);\\n}) | src/express4.js:2:11:2:19 | express() | | src/express.js:4:1:9:2 | app.get ... es);\\n}) | src/express.js:2:11:2:19 | express() | | src/express.js:16:3:18:4 | router. ... );\\n }) | src/express.js:2:11:2:19 | express() | @@ -1246,6 +1276,8 @@ test_ResponseExpr | src/express3.js:6:3:6:5 | res | src/express3.js:4:23:7:1 | functio ... al");\\n} | | src/express3.js:6:3:6:17 | res.send("val") | src/express3.js:4:23:7:1 | functio ... al");\\n} | | src/express3.js:10:27:10:29 | res | src/express3.js:10:12:10:32 | functio ... res){} | +| src/express3.js:15:25:15:27 | res | src/express3.js:15:10:15:30 | functio ... res){} | +| src/express3.js:19:24:19:26 | res | src/express3.js:19:1:19:30 | functio ... res) {} | | src/express4.js:4:37:4:39 | res | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | | src/express4.js:4:37:4:39 | res | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | | src/express4.js:8:3:8:5 | res | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | @@ -1464,6 +1496,8 @@ test_RouteHandlerExpr_getNextMiddleware | src/csurf-example.js:18:9:18:30 | csrf({ ... true }) | src/csurf-example.js:25:22:27:1 | functio ... ere')\\n} | | src/csurf-example.js:18:9:18:30 | csrf({ ... true }) | src/csurf-example.js:39:26:39:47 | functio ... res) {} | | src/csurf-example.js:18:9:18:30 | csrf({ ... true }) | src/csurf-example.js:40:27:40:48 | functio ... res) {} | +| src/express3.js:12:9:12:20 | getHandler() | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:17:9:17:23 | [getHandler2()] | src/express3.js:21:9:21:13 | array | | src/express.js:39:9:39:20 | getHandler() | src/express.js:44:9:44:25 | getArrowHandler() | | src/express.js:44:9:44:25 | getArrowHandler() | src/express.js:16:19:18:3 | functio ... ");\\n } | | src/express.js:44:9:44:25 | getArrowHandler() | src/express.js:46:22:51:1 | functio ... ame];\\n} | @@ -1585,6 +1619,8 @@ test_RouteHandlerExpr | src/express2.js:6:9:6:14 | router | src/express2.js:6:1:6:15 | app.use(router) | false | | src/express3.js:4:23:7:1 | functio ... al");\\n} | src/express3.js:4:1:7:2 | app.get ... l");\\n}) | true | | src/express3.js:12:9:12:20 | getHandler() | src/express3.js:12:1:12:21 | app.use ... dler()) | false | +| src/express3.js:17:9:17:23 | [getHandler2()] | src/express3.js:17:1:17:24 | app.use ... er2()]) | false | +| src/express3.js:21:9:21:13 | array | src/express3.js:21:1:21:14 | app.use(array) | false | | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | src/express4.js:4:1:9:2 | app.get ... c1);\\n}) | true | | src/express.js:4:23:9:1 | functio ... res);\\n} | src/express.js:4:1:9:2 | app.get ... es);\\n}) | true | | src/express.js:16:19:18:3 | functio ... ");\\n } | src/express.js:16:3:18:4 | router. ... );\\n }) | true | @@ -1633,6 +1669,8 @@ test_RouteSetup_handlesAllRequestMethods | src/csurf-example.js:18:1:18:31 | app.use ... rue })) | | src/express2.js:6:1:6:15 | app.use(router) | | src/express3.js:12:1:12:21 | app.use ... dler()) | +| src/express3.js:17:1:17:24 | app.use ... er2()]) | +| src/express3.js:21:1:21:14 | app.use(array) | | src/express.js:39:1:39:21 | app.use ... dler()) | | src/express.js:44:1:44:26 | app.use ... dler()) | | src/middleware-flow.js:13:5:13:25 | router. ... tallDb) | @@ -1807,6 +1845,8 @@ test_RouteHandler_getAResponseExpr | src/express3.js:4:23:7:1 | functio ... al");\\n} | src/express3.js:6:3:6:5 | res | | src/express3.js:4:23:7:1 | functio ... al");\\n} | src/express3.js:6:3:6:17 | res.send("val") | | src/express3.js:10:12:10:32 | functio ... res){} | src/express3.js:10:27:10:29 | res | +| src/express3.js:15:10:15:30 | functio ... res){} | src/express3.js:15:25:15:27 | res | +| src/express3.js:19:1:19:30 | functio ... res) {} | src/express3.js:19:24:19:26 | res | | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | src/express4.js:4:37:4:39 | res | | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | src/express4.js:4:37:4:39 | res | | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | src/express4.js:8:3:8:5 | res | @@ -2016,6 +2056,8 @@ test_isResponse | src/express3.js:6:3:6:5 | res | | src/express3.js:6:3:6:17 | res.send("val") | | src/express3.js:10:27:10:29 | res | +| src/express3.js:15:25:15:27 | res | +| src/express3.js:19:24:19:26 | res | | src/express4.js:4:37:4:39 | res | | src/express4.js:4:37:4:39 | res | | src/express4.js:8:3:8:5 | res | @@ -2140,6 +2182,10 @@ test_isResponse | src/route-collection.js:2:12:2:14 | res | | src/route-collection.js:3:12:3:14 | res | | src/route.js:5:26:5:28 | res | +| typed_src/tst.ts:5:35:5:37 | res | +| typed_src/tst.ts:5:35:5:37 | res | +| typed_src/tst.ts:7:3:7:5 | res | +| typed_src/tst.ts:7:3:7:17 | res.status(404) | test_ResponseBody | src/csurf-example.js:22:35:22:49 | req.csrfToken() | src/csurf-example.js:20:18:23:1 | functio ... () })\\n} | | src/csurf-example.js:26:12:26:42 | 'csrf w ... t here' | src/csurf-example.js:25:22:27:1 | functio ... ere')\\n} | @@ -2248,6 +2294,12 @@ test_RouteSetup_getARouteHandler | src/express3.js:12:1:12:21 | app.use ... dler()) | src/express3.js:9:1:11:1 | return of function getHandler | | src/express3.js:12:1:12:21 | app.use ... dler()) | src/express3.js:10:12:10:32 | functio ... res){} | | src/express3.js:12:1:12:21 | app.use ... dler()) | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:17:1:17:24 | app.use ... er2()]) | src/express3.js:14:1:16:1 | return of function getHandler2 | +| src/express3.js:17:1:17:24 | app.use ... er2()]) | src/express3.js:15:10:15:30 | functio ... res){} | +| src/express3.js:17:1:17:24 | app.use ... er2()]) | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:17:1:17:24 | app.use ... er2()]) | src/express3.js:17:10:17:22 | getHandler2() | +| src/express3.js:21:1:21:14 | app.use(array) | src/express3.js:19:1:19:30 | functio ... res) {} | +| src/express3.js:21:1:21:14 | app.use(array) | src/express3.js:20:13:20:22 | [handler3] | | src/express4.js:4:1:9:2 | app.get ... c1);\\n}) | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | | src/express.js:4:1:9:2 | app.get ... es);\\n}) | src/express.js:4:23:9:1 | functio ... res);\\n} | | src/express.js:16:3:18:4 | router. ... );\\n }) | src/express.js:16:19:18:3 | functio ... ");\\n } | @@ -2479,6 +2531,9 @@ test_RouteHandlerExpr_getAMatchingAncestor | src/csurf-example.js:40:27:40:48 | functio ... res) {} | src/csurf-example.js:16:9:16:50 | bodyPar ... alse }) | | src/csurf-example.js:40:27:40:48 | functio ... res) {} | src/csurf-example.js:17:9:17:22 | cookieParser() | | src/csurf-example.js:40:27:40:48 | functio ... res) {} | src/csurf-example.js:18:9:18:30 | csrf({ ... true }) | +| src/express3.js:17:9:17:23 | [getHandler2()] | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:21:9:21:13 | array | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:21:9:21:13 | array | src/express3.js:17:9:17:23 | [getHandler2()] | | src/express.js:16:19:18:3 | functio ... ");\\n } | src/express.js:39:9:39:20 | getHandler() | | src/express.js:16:19:18:3 | functio ... ");\\n } | src/express.js:44:9:44:25 | getArrowHandler() | | src/express.js:44:9:44:25 | getArrowHandler() | src/express.js:39:9:39:20 | getHandler() | @@ -2558,6 +2613,8 @@ test_RouteSetup_getRouteHandlerExpr | src/express2.js:6:1:6:15 | app.use(router) | 0 | src/express2.js:6:9:6:14 | router | | src/express3.js:4:1:7:2 | app.get ... l");\\n}) | 0 | src/express3.js:4:23:7:1 | functio ... al");\\n} | | src/express3.js:12:1:12:21 | app.use ... dler()) | 0 | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:17:1:17:24 | app.use ... er2()]) | 0 | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:21:1:21:14 | app.use(array) | 0 | src/express3.js:21:9:21:13 | array | | src/express4.js:4:1:9:2 | app.get ... c1);\\n}) | 0 | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | | src/express.js:4:1:9:2 | app.get ... es);\\n}) | 0 | src/express.js:4:23:9:1 | functio ... res);\\n} | | src/express.js:16:3:18:4 | router. ... );\\n }) | 0 | src/express.js:16:19:18:3 | functio ... ");\\n } | @@ -2622,7 +2679,7 @@ test_RouterDefinition_getMiddlewareStack | src/auth.js:1:13:1:32 | require('express')() | src/auth.js:4:9:4:52 | basicAu ... rd' }}) | | src/csurf-example.js:7:11:7:19 | express() | src/csurf-example.js:18:9:18:30 | csrf({ ... true }) | | src/express2.js:5:11:5:13 | e() | src/express2.js:6:9:6:14 | router | -| src/express3.js:2:11:2:19 | express() | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:2:11:2:19 | express() | src/express3.js:21:9:21:13 | array | | src/express.js:2:11:2:19 | express() | src/express.js:44:9:44:25 | getArrowHandler() | | src/subrouter.js:2:11:2:19 | express() | src/subrouter.js:5:14:5:28 | makeSubRouter() | test_RouteHandler @@ -2659,6 +2716,8 @@ test_RouteHandler | src/express2.js:4:32:4:76 | functio ... esult } | src/express2.js:4:41:4:47 | request | src/express2.js:4:50:4:55 | result | | src/express3.js:4:23:7:1 | functio ... al");\\n} | src/express3.js:4:32:4:34 | req | src/express3.js:4:37:4:39 | res | | src/express3.js:10:12:10:32 | functio ... res){} | src/express3.js:10:22:10:24 | req | src/express3.js:10:27:10:29 | res | +| src/express3.js:15:10:15:30 | functio ... res){} | src/express3.js:15:20:15:22 | req | src/express3.js:15:25:15:27 | res | +| src/express3.js:19:1:19:30 | functio ... res) {} | src/express3.js:19:19:19:21 | req | src/express3.js:19:24:19:26 | res | | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | src/express4.js:4:32:4:34 | req | src/express4.js:4:37:4:39 | res | | src/express.js:4:23:9:1 | functio ... res);\\n} | src/express.js:4:32:4:34 | req | src/express.js:4:37:4:39 | res | | src/express.js:16:19:18:3 | functio ... ");\\n } | src/express.js:16:28:16:30 | req | src/express.js:16:33:16:35 | res | @@ -2730,6 +2789,8 @@ test_RouteSetup_getARouteHandlerExpr | src/express2.js:6:1:6:15 | app.use(router) | src/express2.js:6:9:6:14 | router | | src/express3.js:4:1:7:2 | app.get ... l");\\n}) | src/express3.js:4:23:7:1 | functio ... al");\\n} | | src/express3.js:12:1:12:21 | app.use ... dler()) | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:17:1:17:24 | app.use ... er2()]) | src/express3.js:17:9:17:23 | [getHandler2()] | +| src/express3.js:21:1:21:14 | app.use(array) | src/express3.js:21:9:21:13 | array | | src/express4.js:4:1:9:2 | app.get ... c1);\\n}) | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | | src/express.js:4:1:9:2 | app.get ... es);\\n}) | src/express.js:4:23:9:1 | functio ... res);\\n} | | src/express.js:16:3:18:4 | router. ... );\\n }) | src/express.js:16:19:18:3 | functio ... ");\\n } | @@ -2800,6 +2861,8 @@ test_RouteHandlerExpr_getPreviousMiddleware | src/csurf-example.js:25:22:27:1 | functio ... ere')\\n} | src/csurf-example.js:18:9:18:30 | csrf({ ... true }) | | src/csurf-example.js:39:26:39:47 | functio ... res) {} | src/csurf-example.js:18:9:18:30 | csrf({ ... true }) | | src/csurf-example.js:40:27:40:48 | functio ... res) {} | src/csurf-example.js:18:9:18:30 | csrf({ ... true }) | +| src/express3.js:17:9:17:23 | [getHandler2()] | src/express3.js:12:9:12:20 | getHandler() | +| src/express3.js:21:9:21:13 | array | src/express3.js:17:9:17:23 | [getHandler2()] | | src/express.js:16:19:18:3 | functio ... ");\\n } | src/express.js:44:9:44:25 | getArrowHandler() | | src/express.js:44:9:44:25 | getArrowHandler() | src/express.js:39:9:39:20 | getHandler() | | src/express.js:46:22:51:1 | functio ... ame];\\n} | src/express.js:44:9:44:25 | getArrowHandler() | @@ -2913,6 +2976,8 @@ test_RequestExpr | src/express3.js:5:14:5:16 | req | src/express3.js:4:23:7:1 | functio ... al");\\n} | | src/express3.js:5:35:5:37 | req | src/express3.js:4:23:7:1 | functio ... al");\\n} | | src/express3.js:10:22:10:24 | req | src/express3.js:10:12:10:32 | functio ... res){} | +| src/express3.js:15:20:15:22 | req | src/express3.js:15:10:15:30 | functio ... res){} | +| src/express3.js:19:19:19:21 | req | src/express3.js:19:1:19:30 | functio ... res) {} | | src/express4.js:4:32:4:34 | req | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | | src/express4.js:4:32:4:34 | req | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | | src/express4.js:5:27:5:29 | req | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | @@ -3113,6 +3178,8 @@ test_RouteHandler_getARequestExpr | src/express3.js:4:23:7:1 | functio ... al");\\n} | src/express3.js:5:14:5:16 | req | | src/express3.js:4:23:7:1 | functio ... al");\\n} | src/express3.js:5:35:5:37 | req | | src/express3.js:10:12:10:32 | functio ... res){} | src/express3.js:10:22:10:24 | req | +| src/express3.js:15:10:15:30 | functio ... res){} | src/express3.js:15:20:15:22 | req | +| src/express3.js:19:1:19:30 | functio ... res) {} | src/express3.js:19:19:19:21 | req | | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | src/express4.js:4:32:4:34 | req | | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | src/express4.js:4:32:4:34 | req | | src/express4.js:4:23:9:1 | functio ... ic1);\\n} | src/express4.js:5:27:5:29 | req | diff --git a/javascript/ql/test/library-tests/frameworks/Express/typed_src/shim.d.ts b/javascript/ql/test/library-tests/frameworks/Express/typed_src/shim.d.ts index 47c739fa7d2..449522121eb 100644 --- a/javascript/ql/test/library-tests/frameworks/Express/typed_src/shim.d.ts +++ b/javascript/ql/test/library-tests/frameworks/Express/typed_src/shim.d.ts @@ -2,10 +2,13 @@ declare namespace ServeStaticCore { interface Request { body: any; } + interface Response { + } } declare module 'express' { interface Request extends ServeStaticCore.Request {} + interface Response extends ServeStaticCore.Response {} } declare module 'express-serve-static-core' { diff --git a/javascript/ql/test/library-tests/frameworks/Express/typed_src/tst.ts b/javascript/ql/test/library-tests/frameworks/Express/typed_src/tst.ts index 65f05af298d..8f0b47bb91c 100644 --- a/javascript/ql/test/library-tests/frameworks/Express/typed_src/tst.ts +++ b/javascript/ql/test/library-tests/frameworks/Express/typed_src/tst.ts @@ -2,6 +2,7 @@ import * as express from 'express'; -function test(x: express.Request) { +function test(x: express.Request, res: express.Response) { x.body; + res.status(404); } diff --git a/javascript/ql/test/library-tests/frameworks/HTTP-heuristics/tests.expected b/javascript/ql/test/library-tests/frameworks/HTTP-heuristics/tests.expected index 9c81a8f5416..02991c5dcaf 100644 --- a/javascript/ql/test/library-tests/frameworks/HTTP-heuristics/tests.expected +++ b/javascript/ql/test/library-tests/frameworks/HTTP-heuristics/tests.expected @@ -28,8 +28,10 @@ routeHandler | src/returned-handler.js:5:12:5:32 | functio ... res) {} | | src/tst.js:4:23:4:43 | functio ... res) {} | | src/tst.js:74:5:76:5 | functio ... \\n\\n } | +| src/tst.js:79:5:81:5 | functio ... \\n\\n } | | src/tst.js:91:5:93:5 | functio ... \\n\\n } | | src/tst.js:116:16:118:9 | functio ... } | +| src/tst.js:124:16:126:9 | functio ... } | | src/tst.js:142:16:144:9 | functio ... } | routeHandlerCandidate | src/RouterExample.js:4:65:10:1 | (req, r ... ;\\n }\\n} | diff --git a/javascript/ql/test/library-tests/frameworks/Nest/test.expected b/javascript/ql/test/library-tests/frameworks/Nest/test.expected index c659295f552..0098a9006f0 100644 --- a/javascript/ql/test/library-tests/frameworks/Nest/test.expected +++ b/javascript/ql/test/library-tests/frameworks/Nest/test.expected @@ -31,6 +31,7 @@ requestSource | local/routes.ts:61:23:61:25 | req | responseSource | local/routes.ts:61:35:61:37 | res | +| local/routes.ts:62:5:62:25 | res.sen ... uery.x) | requestInputAccess | body | local/routes.ts:40:16:40:19 | body | | body | local/routes.ts:66:26:66:29 | file | diff --git a/javascript/ql/test/queries.xml b/javascript/ql/test/queries.xml deleted file mode 100644 index d4346295164..00000000000 --- a/javascript/ql/test/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/javascript/ql/test/query-tests/Security/CWE-020/UntrustedDataToExternalAPI/UntrustedDataToExternalAPI.expected b/javascript/ql/test/query-tests/Security/CWE-020/UntrustedDataToExternalAPI/UntrustedDataToExternalAPI.expected index 010d75077cf..9d4a6fc4a9a 100644 --- a/javascript/ql/test/query-tests/Security/CWE-020/UntrustedDataToExternalAPI/UntrustedDataToExternalAPI.expected +++ b/javascript/ql/test/query-tests/Security/CWE-020/UntrustedDataToExternalAPI/UntrustedDataToExternalAPI.expected @@ -36,6 +36,8 @@ nodes | tst-UntrustedDataToExternalAPI.js:33:14:33:22 | untrusted | | tst-UntrustedDataToExternalAPI.js:34:34:34:42 | untrusted | | tst-UntrustedDataToExternalAPI.js:34:34:34:42 | untrusted | +| tst-UntrustedDataToExternalAPI.js:41:7:41:8 | {} | +| tst-UntrustedDataToExternalAPI.js:41:7:41:8 | {} | | tst-UntrustedDataToExternalAPI.js:41:11:45:1 | {\\n x ... usted\\n} | | tst-UntrustedDataToExternalAPI.js:41:11:45:1 | {\\n x ... usted\\n} | | tst-UntrustedDataToExternalAPI.js:42:8:42:16 | untrusted | @@ -83,6 +85,8 @@ edges | tst-UntrustedDataToExternalAPI.js:24:21:24:41 | JSON.pa ... rusted) | tst-UntrustedDataToExternalAPI.js:24:20:24:42 | [JSON.p ... usted)] | | tst-UntrustedDataToExternalAPI.js:24:21:24:41 | JSON.pa ... rusted) | tst-UntrustedDataToExternalAPI.js:24:20:24:42 | [JSON.p ... usted)] | | tst-UntrustedDataToExternalAPI.js:24:32:24:40 | untrusted | tst-UntrustedDataToExternalAPI.js:24:21:24:41 | JSON.pa ... rusted) | +| tst-UntrustedDataToExternalAPI.js:41:11:45:1 | {\\n x ... usted\\n} | tst-UntrustedDataToExternalAPI.js:41:7:41:8 | {} | +| tst-UntrustedDataToExternalAPI.js:41:11:45:1 | {\\n x ... usted\\n} | tst-UntrustedDataToExternalAPI.js:41:7:41:8 | {} | | tst-UntrustedDataToExternalAPI.js:42:8:42:16 | untrusted | tst-UntrustedDataToExternalAPI.js:41:11:45:1 | {\\n x ... usted\\n} | | tst-UntrustedDataToExternalAPI.js:42:8:42:16 | untrusted | tst-UntrustedDataToExternalAPI.js:41:11:45:1 | {\\n x ... usted\\n} | | tst-UntrustedDataToExternalAPI.js:43:8:43:16 | untrusted | tst-UntrustedDataToExternalAPI.js:41:11:45:1 | {\\n x ... usted\\n} | @@ -101,4 +105,5 @@ edges | tst-UntrustedDataToExternalAPI.js:30:13:30:30 | getDeepUntrusted() | tst-UntrustedDataToExternalAPI.js:3:17:3:27 | window.name | tst-UntrustedDataToExternalAPI.js:30:13:30:30 | getDeepUntrusted() | Call to external-lib() [param 0] with untrusted data from $@. | tst-UntrustedDataToExternalAPI.js:3:17:3:27 | window.name | window.name | | tst-UntrustedDataToExternalAPI.js:33:14:33:22 | untrusted | tst-UntrustedDataToExternalAPI.js:3:17:3:27 | window.name | tst-UntrustedDataToExternalAPI.js:33:14:33:22 | untrusted | Call to external-lib.get.[callback].[param 'res'].send() [param 0] with untrusted data from $@. | tst-UntrustedDataToExternalAPI.js:3:17:3:27 | window.name | window.name | | tst-UntrustedDataToExternalAPI.js:34:34:34:42 | untrusted | tst-UntrustedDataToExternalAPI.js:3:17:3:27 | window.name | tst-UntrustedDataToExternalAPI.js:34:34:34:42 | untrusted | Call to external-lib.get.[callback].[param 'req'].app.locals.something.foo() [param 0] with untrusted data from $@. | tst-UntrustedDataToExternalAPI.js:3:17:3:27 | window.name | window.name | +| tst-UntrustedDataToExternalAPI.js:41:7:41:8 | {} | tst-UntrustedDataToExternalAPI.js:3:17:3:27 | window.name | tst-UntrustedDataToExternalAPI.js:41:7:41:8 | {} | Call to lodash.merge() [param 0] with untrusted data from $@. | tst-UntrustedDataToExternalAPI.js:3:17:3:27 | window.name | window.name | | tst-UntrustedDataToExternalAPI.js:41:11:45:1 | {\\n x ... usted\\n} | tst-UntrustedDataToExternalAPI.js:3:17:3:27 | window.name | tst-UntrustedDataToExternalAPI.js:41:11:45:1 | {\\n x ... usted\\n} | Call to lodash.merge() [param 1] with untrusted data from $@. | tst-UntrustedDataToExternalAPI.js:3:17:3:27 | window.name | window.name | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected index 383f0a8f580..5f6c8b305af 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected @@ -1115,6 +1115,14 @@ nodes | tst.js:491:23:491:35 | location.hash | | tst.js:491:23:491:45 | locatio ... bstr(1) | | tst.js:491:23:491:45 | locatio ... bstr(1) | +| tst.js:494:18:494:30 | location.hash | +| tst.js:494:18:494:30 | location.hash | +| tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:501:43:501:62 | window.location.hash | +| tst.js:501:43:501:62 | window.location.hash | | typeahead.js:20:13:20:45 | target | | typeahead.js:20:22:20:45 | documen ... .search | | typeahead.js:20:22:20:45 | documen ... .search | @@ -2263,6 +2271,14 @@ edges | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | +| tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | | typeahead.js:20:13:20:45 | target | typeahead.js:21:12:21:17 | target | | typeahead.js:20:22:20:45 | documen ... .search | typeahead.js:20:13:20:45 | target | | typeahead.js:20:22:20:45 | documen ... .search | typeahead.js:20:13:20:45 | target | @@ -2550,6 +2566,8 @@ edges | tst.js:476:20:476:22 | url | tst.js:471:13:471:36 | documen ... .search | tst.js:476:20:476:22 | url | Cross-site scripting vulnerability due to $@. | tst.js:471:13:471:36 | documen ... .search | user-provided value | | tst.js:486:22:486:24 | url | tst.js:471:13:471:36 | documen ... .search | tst.js:486:22:486:24 | url | Cross-site scripting vulnerability due to $@. | tst.js:471:13:471:36 | documen ... .search | user-provided value | | tst.js:491:23:491:45 | locatio ... bstr(1) | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | Cross-site scripting vulnerability due to $@. | tst.js:491:23:491:35 | location.hash | user-provided value | +| tst.js:494:18:494:40 | locatio ... bstr(1) | tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | Cross-site scripting vulnerability due to $@. | tst.js:494:18:494:30 | location.hash | user-provided value | +| tst.js:501:33:501:63 | decodeU ... n.hash) | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | Cross-site scripting vulnerability due to $@. | tst.js:501:43:501:62 | window.location.hash | user-provided value | | typeahead.js:25:18:25:20 | val | typeahead.js:20:22:20:45 | documen ... .search | typeahead.js:25:18:25:20 | val | Cross-site scripting vulnerability due to $@. | typeahead.js:20:22:20:45 | documen ... .search | user-provided value | | v-html.vue:2:8:2:23 | v-html=tainted | v-html.vue:6:42:6:58 | document.location | v-html.vue:2:8:2:23 | v-html=tainted | Cross-site scripting vulnerability due to $@. | v-html.vue:6:42:6:58 | document.location | user-provided value | | various-concat-obfuscations.js:4:4:4:31 | "
    " ...
    " | various-concat-obfuscations.js:2:16:2:39 | documen ... .search | various-concat-obfuscations.js:4:4:4:31 | "
    " ...
    " | Cross-site scripting vulnerability due to $@. | various-concat-obfuscations.js:2:16:2:39 | documen ... .search | user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected index 5dbee3f5b43..5d744fb9580 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected @@ -1127,6 +1127,14 @@ nodes | tst.js:491:23:491:35 | location.hash | | tst.js:491:23:491:45 | locatio ... bstr(1) | | tst.js:491:23:491:45 | locatio ... bstr(1) | +| tst.js:494:18:494:30 | location.hash | +| tst.js:494:18:494:30 | location.hash | +| tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:501:43:501:62 | window.location.hash | +| tst.js:501:43:501:62 | window.location.hash | | typeahead.js:9:28:9:30 | loc | | typeahead.js:9:28:9:30 | loc | | typeahead.js:9:28:9:30 | loc | @@ -2325,6 +2333,14 @@ edges | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | +| tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | +| tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | | typeahead.js:9:28:9:30 | loc | typeahead.js:10:16:10:18 | loc | | typeahead.js:9:28:9:30 | loc | typeahead.js:10:16:10:18 | loc | | typeahead.js:9:28:9:30 | loc | typeahead.js:10:16:10:18 | loc | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/tst.js b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/tst.js index 3c609ddcc92..3a8c5992645 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/tst.js +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/tst.js @@ -313,7 +313,7 @@ function basicExceptions() { } function handlebarsSafeString() { - return new Handlebars.SafeString(location); // NOT OK! + return new Handlebars.SafeString(location); // NOT OK! } function test2() { @@ -355,15 +355,15 @@ function thisNodes() { var target = document.location.search this.html(target); // NOT OK. (this is a jQuery object) this.innerHTML = target // OK. (this is a jQuery object) - + this.each(function (i, e) { this.innerHTML = target; // NOT OK. (this is a DOM-node); this.html(target); // OK. (this is a DOM-node); - + e.innerHTML = target; // NOT OK. }); } - $.fn[pluginName] = myPlugin; + $.fn[pluginName] = myPlugin; } @@ -380,7 +380,7 @@ function test() { function test() { var target = document.location.search - + $('myId').html(target); // NOT OK $('myId').html(target.taint); // NOT OK @@ -401,7 +401,7 @@ function test() { if (random()) {return;} $('myId').html(target.taint6); // OK - + if (random()) {target.taint7 = "safe";} $('myId').html(target.taint7); // NOT OK @@ -489,4 +489,17 @@ function urlStuff() { window.open(location.hash.substr(1)); // OK - any JavaScript is executed in another context navigation.navigate(location.hash.substr(1)); // NOT OK + + const myHistory = require('history').createBrowserHistory(); + myHistory.push(location.hash.substr(1)); // NOT OK +} + +function Foo() { + this.foo = document; + var obj = { + bar: function() { + this.foo.body.innerHTML = decodeURI(window.location.hash); // NOT OK + } + }; + Object.assign(this, obj); } diff --git a/javascript/ql/test/query-tests/Security/CWE-079/UnsafeJQueryPlugin/unsafe-jquery-plugin.js b/javascript/ql/test/query-tests/Security/CWE-079/UnsafeJQueryPlugin/unsafe-jquery-plugin.js index b695c57fab8..bda981fe2b7 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/UnsafeJQueryPlugin/unsafe-jquery-plugin.js +++ b/javascript/ql/test/query-tests/Security/CWE-079/UnsafeJQueryPlugin/unsafe-jquery-plugin.js @@ -188,8 +188,18 @@ } // extending options options = $.extend( {}, options ); - + var target = $( options.of ); // NOT OK console.log(target); }; + + $.fn.blockReceiver = function( options ) { + $.extend({ + foo() { + $(this); // OK + } + }, + options, + ); + }; }); diff --git a/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingAssignment/tst.js b/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingAssignment/tst.js index 517d7d10230..d301fe40bf6 100644 --- a/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingAssignment/tst.js +++ b/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingAssignment/tst.js @@ -103,11 +103,23 @@ app.get('/bar', (req, res) => { let object = {}; object[taint][taint] = taint; // NOT OK - + const bad = ["__proto__", "constructor"]; if (bad.includes(taint)) { return; } object[taint][taint] = taint; // OK -}); \ No newline at end of file +}); + +app.get('/assign', (req, res) => { + let taint = String(req.query.data); + let plainObj = {}; + + let object = Object.assign({}, plainObj[taint]); + object[taint] = taint; // OK - 'object' is not Object.prototype itself (but possibly a copy) + + let dest = {}; + Object.assign(dest, plainObj[taint]); + dest[taint] = taint; // OK - 'dest' is not Object.prototype itself (but possibly a copy) +}); diff --git a/misc/bazel/workspace.bzl b/misc/bazel/workspace.bzl index ef89ccfb666..50f0d1393f0 100644 --- a/misc/bazel/workspace.bzl +++ b/misc/bazel/workspace.bzl @@ -43,3 +43,13 @@ def codeql_workspace(repository_name = "codeql"): "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz", ], ) + + maybe( + repo_rule = http_archive, + name = "absl", + sha256 = "cec2e5bf780532bd0ac672eb8d43c0f8bbe84ca5df8718320184034b7f59a398", + urls = [ + "https://github.com/abseil/abseil-cpp/archive/d2c5297a3c3948de765100cb7e5cccca1210d23c.tar.gz", + ], + strip_prefix = "abseil-cpp-d2c5297a3c3948de765100cb7e5cccca1210d23c", + ) diff --git a/misc/codegen/templates/cpp_classes_h.mustache b/misc/codegen/templates/cpp_classes_h.mustache index 157bbc31217..4f9d862370b 100644 --- a/misc/codegen/templates/cpp_classes_h.mustache +++ b/misc/codegen/templates/cpp_classes_h.mustache @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include "{{trap_library}}/TrapLabel.h" #include "{{trap_library}}/TrapTagTraits.h" @@ -80,3 +82,9 @@ struct detail::ToTrapClassFunctor<{{name}}Tag> { }; {{/classes}} } + +{{#classes}} +{{#final}} +BINLOG_ADAPT_STRUCT(codeql::{{name}}, id{{> cpp_list_fields}}); +{{/final}} +{{/classes}} diff --git a/misc/codegen/templates/cpp_list_fields.mustache b/misc/codegen/templates/cpp_list_fields.mustache new file mode 100644 index 00000000000..942b9dfdd1d --- /dev/null +++ b/misc/codegen/templates/cpp_list_fields.mustache @@ -0,0 +1 @@ +{{#bases}}{{#ref}}{{> cpp_list_fields}}{{/ref}}{{/bases}}{{#fields}}, {{field_name}}{{/fields}} diff --git a/misc/codegen/templates/ql_db.mustache b/misc/codegen/templates/ql_db.mustache index 55a83514d6e..d16416f4a5b 100644 --- a/misc/codegen/templates/ql_db.mustache +++ b/misc/codegen/templates/ql_db.mustache @@ -1,5 +1,15 @@ +/** + * INTERNAL: Do not use. + * This module holds thin fully generated class definitions around DB entities. + */ module Raw { {{#classes}} + /** + * INTERNAL: Do not use. + {{#doc}} + * {{.}} + {{/doc}} + */ class {{name}} extends {{db_id}}{{#bases}}, {{.}}{{/bases}} { {{#root}}string toString() { none() }{{/root}} {{#final}}override string toString() { result = "{{name}}" }{{/final}} diff --git a/misc/codegen/templates/ql_ipa_types.mustache b/misc/codegen/templates/ql_ipa_types.mustache index 430361f6776..d4244690930 100644 --- a/misc/codegen/templates/ql_ipa_types.mustache +++ b/misc/codegen/templates/ql_ipa_types.mustache @@ -1,22 +1,42 @@ +/** + * INTERNAL: Do not use. + * This module defines the IPA layer on top of raw DB entities, and the conversions between the two + * layers. + */ + private import {{import_prefix}}.SynthConstructors private import {{import_prefix}}.Raw cached module Synth { + /** + * INTERNAL: Do not use. + * The synthesized type of all elements. + */ cached newtype T{{root}} = {{#final_classes}} {{^first}} or {{/first}} + /** + * INTERNAL: Do not use. + */ T{{name}}({{#params}}{{^first}}, {{/first}}{{type}} {{param}}{{/params}}){{#has_params}} { construct{{name}}({{#params}}{{^first}}, {{/first}}{{param}}{{/params}}) }{{/has_params}} {{/final_classes}} {{#non_final_classes}} {{^root}} + /** + * INTERNAL: Do not use. + */ class T{{name}} = {{#derived}}{{^first}} or {{/first}}T{{name}}{{/derived}}; {{/root}} {{/non_final_classes}} {{#final_classes}} + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `T{{name}}`, if possible. + */ cached T{{name}} convert{{name}}FromRaw(Raw::Element e) { {{^is_fresh_ipa}} result = T{{name}}(e) @@ -28,6 +48,10 @@ cached module Synth { {{/final_classes}} {{#non_final_classes}} + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `T{{name}}`, if possible. + */ cached T{{name}} convert{{name}}FromRaw(Raw::Element e) { {{#derived}} {{^first}} @@ -39,6 +63,10 @@ cached module Synth { {{/non_final_classes}} {{#final_classes}} + /** + * INTERNAL: Do not use. + * Converts a synthesized `T{{name}}` to a raw DB element, if possible. + */ cached Raw::Element convert{{name}}ToRaw(T{{name}} e) { {{^is_fresh_ipa}} e = T{{name}}(result) @@ -50,6 +78,10 @@ cached module Synth { {{/final_classes}} {{#non_final_classes}} + /** + * INTERNAL: Do not use. + * Converts a synthesized `T{{name}}` to a raw DB element, if possible. + */ cached Raw::Element convert{{name}}ToRaw(T{{name}} e) { {{#derived}} {{^first}} diff --git a/misc/codegen/templates/trap_traps_h.mustache b/misc/codegen/templates/trap_traps_h.mustache index 987e980d24b..3892edebfb7 100644 --- a/misc/codegen/templates/trap_traps_h.mustache +++ b/misc/codegen/templates/trap_traps_h.mustache @@ -4,6 +4,7 @@ #include #include +#include #include "{{trap_library_dir}}/TrapLabel.h" #include "{{trap_library_dir}}/TrapTagTraits.h" @@ -43,3 +44,7 @@ struct ToBindingTrapFunctor<{{type}}> { {{/id}} {{/traps}} } + +{{#traps}} +BINLOG_ADAPT_STRUCT(codeql::{{name}}Trap{{#fields}}, {{field_name}}{{/fields}}); +{{/traps}} diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 6b8b7e44eb0..9621c2fa167 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.1 + +No user-facing changes. + ## 0.5.0 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/0.5.1.md b/misc/suite-helpers/change-notes/released/0.5.1.md new file mode 100644 index 00000000000..0275d38f63c --- /dev/null +++ b/misc/suite-helpers/change-notes/released/0.5.1.md @@ -0,0 +1,3 @@ +## 0.5.1 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index 30e271c5361..0bf7024c337 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.0 +lastReleaseVersion: 0.5.1 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 4e9b2eba90d..88548c64b91 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,3 +1,3 @@ name: codeql/suite-helpers -version: 0.5.0 +version: 0.5.1 groups: shared diff --git a/python/downgrades/0355ecf0ac589e66467a378e0e9d60f41ee4a757/old.dbscheme b/python/downgrades/0355ecf0ac589e66467a378e0e9d60f41ee4a757/old.dbscheme new file mode 100644 index 00000000000..0355ecf0ac5 --- /dev/null +++ b/python/downgrades/0355ecf0ac589e66467a378e0e9d60f41ee4a757/old.dbscheme @@ -0,0 +1,1147 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + + /* + * External artifacts + */ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +externalData( + int id : @externalDataElement, + varchar(900) queryPath : string ref, + int column: int ref, + varchar(900) data : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * Duplicate code + */ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/* + * Version history + */ + +svnentries( + int id : @svnentry, + varchar(500) revision : string ref, + varchar(500) author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + varchar(500) action : string ref +) + +svnentrymsg( + int id : @svnentry ref, + varchar(500) message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/**************************** + Python dbscheme +****************************/ + +files(unique int id: @file, + varchar(900) name: string ref); + +folders(unique int id: @folder, + varchar(900) name: string ref); + +@container = @folder | @file; + +containerparent(int parent: @container ref, + unique int child: @container ref); + +@sourceline = @file | @py_Module | @xmllocatable; + +numlines(int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref + ); + +@location = @location_ast | @location_default ; + +locations_default(unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; + +/* XML Files */ + +xmlEncoding (unique int id: @file ref, varchar(900) encoding: string ref); + +xmlDTDs (unique int id: @xmldtd, + varchar(900) root: string ref, + varchar(900) publicId: string ref, + varchar(900) systemId: string ref, + int fileid: @file ref); + +xmlElements (unique int id: @xmlelement, + varchar(900) name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs (unique int id: @xmlattribute, + int elementid: @xmlelement ref, + varchar(900) name: string ref, + varchar(3600) value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs (int id: @xmlnamespace, + varchar(900) prefixName: string ref, + varchar(900) URI: string ref, + int fileid: @file ref); + +xmlHasNs (int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments (unique int id: @xmlcomment, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars (unique int id: @xmlcharacters, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations(int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/** + * YAML + */ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + varchar(900) tag: string ref, + varchar(900) tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + varchar(900) anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + varchar(900) target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + varchar(900) value: string ref); + +yaml_errors (unique int id: @yaml_error, + varchar(900) message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; diff --git a/python/downgrades/0355ecf0ac589e66467a378e0e9d60f41ee4a757/semmlecode.python.dbscheme b/python/downgrades/0355ecf0ac589e66467a378e0e9d60f41ee4a757/semmlecode.python.dbscheme new file mode 100644 index 00000000000..47e552c4357 --- /dev/null +++ b/python/downgrades/0355ecf0ac589e66467a378e0e9d60f41ee4a757/semmlecode.python.dbscheme @@ -0,0 +1,1106 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + + /* + * External artifacts + */ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +externalData( + int id : @externalDataElement, + varchar(900) queryPath : string ref, + int column: int ref, + varchar(900) data : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * Duplicate code + */ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/* + * Version history + */ + +svnentries( + int id : @svnentry, + varchar(500) revision : string ref, + varchar(500) author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + varchar(500) action : string ref +) + +svnentrymsg( + int id : @svnentry ref, + varchar(500) message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/**************************** + Python dbscheme +****************************/ + +files(unique int id: @file, + varchar(900) name: string ref); + +folders(unique int id: @folder, + varchar(900) name: string ref); + +@container = @folder | @file; + +containerparent(int parent: @container ref, + unique int child: @container ref); + +@sourceline = @file | @py_Module | @xmllocatable; + +numlines(int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref + ); + +@location = @location_ast | @location_default ; + +locations_default(unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; + +/* XML Files */ + +xmlEncoding (unique int id: @file ref, varchar(900) encoding: string ref); + +xmlDTDs (unique int id: @xmldtd, + varchar(900) root: string ref, + varchar(900) publicId: string ref, + varchar(900) systemId: string ref, + int fileid: @file ref); + +xmlElements (unique int id: @xmlelement, + varchar(900) name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs (unique int id: @xmlattribute, + int elementid: @xmlelement ref, + varchar(900) name: string ref, + varchar(3600) value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs (int id: @xmlnamespace, + varchar(900) prefixName: string ref, + varchar(900) URI: string ref, + int fileid: @file ref); + +xmlHasNs (int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments (unique int id: @xmlcomment, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars (unique int id: @xmlcharacters, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations(int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; diff --git a/python/downgrades/0355ecf0ac589e66467a378e0e9d60f41ee4a757/upgrade.properties b/python/downgrades/0355ecf0ac589e66467a378e0e9d60f41ee4a757/upgrade.properties new file mode 100644 index 00000000000..6cfa73a753d --- /dev/null +++ b/python/downgrades/0355ecf0ac589e66467a378e0e9d60f41ee4a757/upgrade.properties @@ -0,0 +1,10 @@ +description: Add YAML tables +compatibility: backwards + +yaml.rel: delete +yaml_anchors.rel: delete +yaml_aliases.rel: delete +yaml_scalars.rel: delete +yaml_errors.rel: delete +yaml_locations.rel: delete + diff --git a/python/ql/examples/queries.xml b/python/ql/examples/queries.xml deleted file mode 100644 index 27449f34263..00000000000 --- a/python/ql/examples/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index 48eee676d82..b00d10f98d9 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.9.1 + +### Minor Analysis Improvements + +* Added support for querying the contents of YAML files. + ## 0.9.0 ### Deprecated APIs diff --git a/python/ql/lib/change-notes/released/0.9.1.md b/python/ql/lib/change-notes/released/0.9.1.md new file mode 100644 index 00000000000..35aa2225e2a --- /dev/null +++ b/python/ql/lib/change-notes/released/0.9.1.md @@ -0,0 +1,5 @@ +## 0.9.1 + +### Minor Analysis Improvements + +* Added support for querying the contents of YAML files. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 8b9fc185202..6789dcd18b7 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.9.0 +lastReleaseVersion: 0.9.1 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 0d54fcd89a6..ad9cd93be67 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 0.9.0 +version: 0.9.1 groups: python dbscheme: semmlecode.python.dbscheme extractor: python @@ -9,5 +9,6 @@ dependencies: codeql/regex: ${workspace} codeql/tutorial: ${workspace} codeql/util: ${workspace} + codeql/yaml: ${workspace} dataExtensions: - semmle/python/frameworks/**/model.yml diff --git a/python/ql/lib/semmle/python/PrintAst.qll b/python/ql/lib/semmle/python/PrintAst.qll index f385cfc97ef..96e76de0b77 100644 --- a/python/ql/lib/semmle/python/PrintAst.qll +++ b/python/ql/lib/semmle/python/PrintAst.qll @@ -8,6 +8,7 @@ import python import semmle.python.RegexTreeView +import semmle.python.Yaml private newtype TPrintAstConfiguration = MkPrintAstConfiguration() @@ -53,7 +54,9 @@ private newtype TPrintAstNode = shouldPrint(list.getAnItem(), _) and not list = any(Module mod).getBody() and not forall(AstNode child | child = list.getAnItem() | isNotNeeded(child)) - } + } or + TYamlNode(YamlNode node) or + TYamlMappingNode(YamlMapping mapping, int i) { exists(mapping.getKeyNode(i)) } /** * A node in the output tree. @@ -633,6 +636,80 @@ private module PrettyPrinting { } } +/** + * Classes for printing YAML AST. + */ +module PrintYaml { + /** + * A print node representing a YAML value in a .yml file. + */ + class YamlNodeNode extends PrintAstNode, TYamlNode { + YamlNode node; + + YamlNodeNode() { this = TYamlNode(node) } + + override string toString() { + result = "[" + concat(node.getAPrimaryQlClass(), ",") + "] " + node.toString() + } + + override Location getLocation() { result = node.getLocation() } + + /** + * Gets the `YAMLNode` represented by this node. + */ + final YamlNode getValue() { result = node } + + override PrintAstNode getChild(int childIndex) { + exists(YamlNode child | result.(YamlNodeNode).getValue() = child | + child = node.getChildNode(childIndex) + ) + } + } + + /** + * A print node representing a `YAMLMapping`. + * + * Each child of this node aggregates the key and value of a mapping. + */ + class YamlMappingNode extends YamlNodeNode { + override YamlMapping node; + + override PrintAstNode getChild(int childIndex) { + exists(YamlMappingMapNode map | map = result | map.maps(node, childIndex)) + } + } + + /** + * A print node representing the `i`th mapping in `mapping`. + */ + class YamlMappingMapNode extends PrintAstNode, TYamlMappingNode { + YamlMapping mapping; + int i; + + YamlMappingMapNode() { this = TYamlMappingNode(mapping, i) } + + override string toString() { + result = "(Mapping " + i + ")" and not exists(mapping.getKeyNode(i).(YamlScalar).getValue()) + or + result = "(Mapping " + i + ") " + mapping.getKeyNode(i).(YamlScalar).getValue() + ":" + } + + /** + * Holds if this print node represents the `index`th mapping of `m`. + */ + predicate maps(YamlMapping m, int index) { + m = mapping and + index = i + } + + override PrintAstNode getChild(int childIndex) { + childIndex = 0 and result.(YamlNodeNode).getValue() = mapping.getKeyNode(i) + or + childIndex = 1 and result.(YamlNodeNode).getValue() = mapping.getValueNode(i) + } + } +} + /** Holds if `node` belongs to the output tree, and its property `key` has the given `value`. */ query predicate nodes(PrintAstNode node, string key, string value) { value = node.getProperty(key) } diff --git a/python/ql/lib/semmle/python/Yaml.qll b/python/ql/lib/semmle/python/Yaml.qll new file mode 100644 index 00000000000..21a1fe02bb3 --- /dev/null +++ b/python/ql/lib/semmle/python/Yaml.qll @@ -0,0 +1,50 @@ +/** + * Provides classes for working with YAML data. + * + * YAML documents are represented as abstract syntax trees whose nodes + * are either YAML values or alias nodes referring to another YAML value. + */ + +private import codeql.yaml.Yaml as LibYaml + +private module YamlSig implements LibYaml::InputSig { + import semmle.python.Files + + class LocatableBase extends @yaml_locatable { + Location getLocation() { yaml_locations(this, result) } + + string toString() { none() } + } + + class NodeBase extends LocatableBase, @yaml_node { + NodeBase getChildNode(int i) { yaml(result, _, this, i, _, _) } + + string getTag() { yaml(this, _, _, _, result, _) } + + string getAnchor() { yaml_anchors(this, result) } + + override string toString() { yaml(this, _, _, _, _, result) } + } + + class ScalarNodeBase extends NodeBase, @yaml_scalar_node { + int getStyle() { yaml_scalars(this, result, _) } + + string getValue() { yaml_scalars(this, _, result) } + } + + class CollectionNodeBase extends NodeBase, @yaml_collection_node { } + + class MappingNodeBase extends CollectionNodeBase, @yaml_mapping_node { } + + class SequenceNodeBase extends CollectionNodeBase, @yaml_sequence_node { } + + class AliasNodeBase extends NodeBase, @yaml_alias_node { + string getTarget() { yaml_aliases(this, result) } + } + + class ParseErrorBase extends LocatableBase, @yaml_error { + string getMessage() { yaml_errors(this, result) } + } +} + +import LibYaml::Make diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll index 865d7b4d6ce..f34554d6eea 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll @@ -361,3 +361,52 @@ module MergePathGraph< } } } + +/** + * Constructs a `PathGraph` from three `PathGraph`s by disjoint union. + */ +module MergePathGraph3< + PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3, + PathGraphSig Graph1, PathGraphSig Graph2, PathGraphSig Graph3> +{ + private module MergedInner = MergePathGraph; + + private module Merged = + MergePathGraph; + + /** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */ + class PathNode instanceof Merged::PathNode { + /** Gets this as a projection on the first given `PathGraph`. */ + PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() } + + /** Gets this as a projection on the second given `PathGraph`. */ + PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() } + + /** Gets this as a projection on the third given `PathGraph`. */ + PathNode3 asPathNode3() { result = super.asPathNode2() } + + /** Gets a textual representation of this element. */ + string toString() { result = super.toString() } + + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + Node getNode() { result = super.getNode() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PathGraph = Merged::PathGraph; +} diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index d82931aff00..cdca96cc4ac 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -1200,6 +1200,7 @@ predicate normalCallArg(CallNode call, Node arg, ArgumentPosition apos) { * time the bound method is used, such that the `clear()` call would essentially be * translated into `l.clear()`, and we can still have use-use flow. */ +pragma[assume_small_delta] cached predicate getCallArg(CallNode call, Function target, CallType type, Node arg, ArgumentPosition apos) { Stages::DataFlow::ref() and diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll index 6ea97954bdf..cd8e992c980 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll @@ -3031,6 +3031,17 @@ module Impl { this instanceof PathNodeSinkGroup } + private string ppType() { + this instanceof PathNodeSink and result = "" + or + this.(PathNodeMid).getAp() instanceof AccessPathNil and result = "" + or + exists(DataFlowType t | t = this.(PathNodeMid).getAp().getHead().getContainerType() | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { this instanceof PathNodeSink and result = "" or @@ -3046,14 +3057,14 @@ module Impl { } /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -3998,14 +4009,14 @@ module Impl { */ class PartialPathNode extends TPartialPathNode { /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -4046,6 +4057,19 @@ module Impl { */ int getSinkDistance() { result = distSink(this.getNodeEx().getEnclosingCallable()) } + private string ppType() { + this instanceof PartialPathNodeRev and result = "" + or + this.(PartialPathNodeFwd).getAp() instanceof PartialAccessPathNil and result = "" + or + exists(DataFlowType t | + t = this.(PartialPathNodeFwd).getAp().(PartialAccessPathCons).getType() + | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { exists(string s | s = this.(PartialPathNodeFwd).getAp().toString() or diff --git a/python/ql/lib/semmlecode.python.dbscheme b/python/ql/lib/semmlecode.python.dbscheme index 47e552c4357..0355ecf0ac5 100644 --- a/python/ql/lib/semmlecode.python.dbscheme +++ b/python/ql/lib/semmlecode.python.dbscheme @@ -1104,3 +1104,44 @@ xmllocations(int xmlElement: @xmllocatable ref, int location: @location_default ref); @xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/** + * YAML + */ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + varchar(900) tag: string ref, + varchar(900) tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + varchar(900) anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + varchar(900) target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + varchar(900) value: string ref); + +yaml_errors (unique int id: @yaml_error, + varchar(900) message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; diff --git a/python/ql/lib/semmlecode.python.dbscheme.stats b/python/ql/lib/semmlecode.python.dbscheme.stats index 9d88f2e6cb1..1e6999b8a44 100644 --- a/python/ql/lib/semmlecode.python.dbscheme.stats +++ b/python/ql/lib/semmlecode.python.dbscheme.stats @@ -608,6 +608,30 @@ @xmlcharacters 100 + +@yaml_node +885 + + +@yaml_scalar_node +700 + + +@yaml_mapping_node +149 + + +@yaml_sequence_node +35 + + +@yaml_alias_node +1 + + +@yaml_error +1 + externalDefects @@ -17117,5 +17141,1412 @@ + +yaml +id +885 + + +id +885 + + +kind +4 + + +parent +204 + + +idx +25 + + +tag +8 + + +tostring +318 + + + + +id +kind + + +12 + + +
    1 +2 +885 + + + + + + +id +parent + + +12 + + +1 +2 +885 + + + + + + +id +idx + + +12 + + +1 +2 +885 + + + + + + +id +tag + + +12 + + +1 +2 +885 + + + + + + +id +tostring + + +12 + + +1 +2 +885 + + + + + + +kind +id + + +12 + + +1 +2 +1 + + +35 +36 +1 + + +149 +150 +1 + + +700 +701 +1 + + + + + + +kind +parent + + +12 + + +1 +2 +1 + + +33 +34 +1 + + +90 +91 +1 + + +183 +184 +1 + + + + + + +kind +idx + + +12 + + +1 +2 +1 + + +7 +8 +1 + + +11 +12 +1 + + +25 +26 +1 + + + + + + +kind +tag + + +12 + + +1 +2 +3 + + +5 +6 +1 + + + + + + +kind +tostring + + +12 + + +1 +2 +1 + + +10 +11 +1 + + +67 +68 +1 + + +240 +241 +1 + + + + + + +parent +id + + +12 + + +1 +2 +33 + + +2 +3 +72 + + +3 +4 +2 + + +4 +5 +35 + + +6 +7 +29 + + +8 +11 +14 + + +12 +21 +17 + + +22 +25 +2 + + + + + + +parent +kind + + +12 + + +1 +2 +131 + + +2 +3 +43 + + +3 +4 +30 + + + + + + +parent +idx + + +12 + + +1 +2 +33 + + +2 +3 +72 + + +3 +4 +2 + + +4 +5 +35 + + +6 +7 +29 + + +8 +11 +14 + + +12 +21 +17 + + +22 +25 +2 + + + + + + +parent +tag + + +12 + + +1 +2 +120 + + +2 +3 +41 + + +3 +4 +36 + + +4 +5 +7 + + + + + + +parent +tostring + + +12 + + +1 +2 +33 + + +2 +3 +72 + + +3 +4 +2 + + +4 +5 +35 + + +5 +6 +5 + + +6 +7 +24 + + +8 +11 +14 + + +12 +14 +16 + + +16 +23 +3 + + + + + + +idx +id + + +12 + + +1 +2 +2 + + +2 +3 +2 + + +4 +5 +7 + + +5 +20 +2 + + +20 +25 +2 + + +25 +33 +2 + + +33 +56 +2 + + +61 +64 +2 + + +95 +100 +2 + + +149 +172 +2 + + + + + + +idx +kind + + +12 + + +1 +2 +14 + + +2 +3 +4 + + +3 +4 +6 + + +4 +5 +1 + + + + + + +idx +parent + + +12 + + +1 +2 +2 + + +2 +3 +2 + + +4 +5 +7 + + +5 +20 +2 + + +20 +25 +2 + + +25 +33 +2 + + +33 +56 +2 + + +61 +64 +2 + + +95 +100 +2 + + +149 +172 +2 + + + + + + +idx +tag + + +12 + + +1 +2 +11 + + +2 +3 +5 + + +3 +4 +3 + + +4 +5 +4 + + +6 +7 +2 + + + + + + +idx +tostring + + +12 + + +1 +2 +2 + + +2 +3 +2 + + +3 +4 +3 + + +4 +5 +4 + + +5 +7 +2 + + +7 +11 +2 + + +12 +15 +2 + + +15 +16 +1 + + +18 +19 +2 + + +28 +31 +2 + + +52 +56 +2 + + +87 +88 +1 + + + + + + +tag +id + + +12 + + +1 +2 +2 + + +4 +5 +1 + + +15 +16 +1 + + +26 +27 +1 + + +35 +36 +1 + + +149 +150 +1 + + +654 +655 +1 + + + + + + +tag +kind + + +12 + + +1 +2 +8 + + + + + + +tag +parent + + +12 + + +1 +2 +2 + + +2 +3 +1 + + +3 +4 +1 + + +25 +26 +1 + + +33 +34 +1 + + +90 +91 +1 + + +183 +184 +1 + + + + + + +tag +idx + + +12 + + +1 +2 +2 + + +3 +4 +2 + + +7 +8 +1 + + +9 +10 +1 + + +11 +12 +1 + + +23 +24 +1 + + + + + + +tag +tostring + + +12 + + +1 +2 +3 + + +2 +3 +1 + + +10 +11 +1 + + +13 +14 +1 + + +67 +68 +1 + + +223 +224 +1 + + + + + + +tostring +id + + +12 + + +1 +2 +209 + + +2 +3 +42 + + +3 +6 +29 + + +6 +15 +25 + + +15 +18 +13 + + + + + + +tostring +kind + + +12 + + +1 +2 +318 + + + + + + +tostring +parent + + +12 + + +1 +2 +213 + + +2 +3 +41 + + +3 +6 +27 + + +6 +15 +25 + + +15 +18 +12 + + + + + + +tostring +idx + + +12 + + +1 +2 +272 + + +2 +3 +34 + + +3 +10 +12 + + + + + + +tostring +tag + + +12 + + +1 +2 +318 + + + + + + + + +yaml_anchors +1 + + +node +1 + + +anchor +1 + + + + +node +anchor + + +12 + + +1 +2 +1 + + + + + + +anchor +node + + +12 + + +1 +2 +1 + + + + + + + + +yaml_aliases +1 + + +alias +1 + + +target +1 + + + + +alias +target + + +12 + + +1 +2 +1 + + + + + + +target +alias + + +12 + + +1 +2 +1 + + + + + + + + +yaml_scalars +700 + + +scalar +700 + + +style +3 + + +value +241 + + + + +scalar +style + + +12 + + +1 +2 +700 + + + + + + +scalar +value + + +12 + + +1 +2 +700 + + + + + + +style +scalar + + +12 + + +14 +15 +1 + + +97 +98 +1 + + +589 +590 +1 + + + + + + +style +value + + +12 + + +12 +13 +1 + + +47 +48 +1 + + +183 +184 +1 + + + + + + +value +scalar + + +12 + + +1 +2 +158 + + +2 +3 +32 + + +3 +6 +19 + + +6 +15 +20 + + +15 +18 +12 + + + + + + +value +style + + +12 + + +1 +2 +240 + + +2 +3 +1 + + + + + + + + +yaml_errors +id +1 + + +id +1 + + +message +1 + + + + +id +message + + +12 + + +1 +2 +1 + + + + + + +message +id + + +12 + + +1 +2 +1 + + + + + + + + +yaml_locations +71 + + +locatable +71 + + +location +71 + + + + +locatable +location + + +12 + + +1 +2 +71 + + + + + + +location +locatable + + +12 + + +1 +2 +71 + + + + + + + diff --git a/python/ql/lib/upgrades/47e552c4357a04c5735355fad818630daee4a5ac/old.dbscheme b/python/ql/lib/upgrades/47e552c4357a04c5735355fad818630daee4a5ac/old.dbscheme new file mode 100644 index 00000000000..47e552c4357 --- /dev/null +++ b/python/ql/lib/upgrades/47e552c4357a04c5735355fad818630daee4a5ac/old.dbscheme @@ -0,0 +1,1106 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + + /* + * External artifacts + */ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +externalData( + int id : @externalDataElement, + varchar(900) queryPath : string ref, + int column: int ref, + varchar(900) data : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * Duplicate code + */ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/* + * Version history + */ + +svnentries( + int id : @svnentry, + varchar(500) revision : string ref, + varchar(500) author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + varchar(500) action : string ref +) + +svnentrymsg( + int id : @svnentry ref, + varchar(500) message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/**************************** + Python dbscheme +****************************/ + +files(unique int id: @file, + varchar(900) name: string ref); + +folders(unique int id: @folder, + varchar(900) name: string ref); + +@container = @folder | @file; + +containerparent(int parent: @container ref, + unique int child: @container ref); + +@sourceline = @file | @py_Module | @xmllocatable; + +numlines(int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref + ); + +@location = @location_ast | @location_default ; + +locations_default(unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; + +/* XML Files */ + +xmlEncoding (unique int id: @file ref, varchar(900) encoding: string ref); + +xmlDTDs (unique int id: @xmldtd, + varchar(900) root: string ref, + varchar(900) publicId: string ref, + varchar(900) systemId: string ref, + int fileid: @file ref); + +xmlElements (unique int id: @xmlelement, + varchar(900) name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs (unique int id: @xmlattribute, + int elementid: @xmlelement ref, + varchar(900) name: string ref, + varchar(3600) value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs (int id: @xmlnamespace, + varchar(900) prefixName: string ref, + varchar(900) URI: string ref, + int fileid: @file ref); + +xmlHasNs (int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments (unique int id: @xmlcomment, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars (unique int id: @xmlcharacters, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations(int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; diff --git a/python/ql/lib/upgrades/47e552c4357a04c5735355fad818630daee4a5ac/semmlecode.python.dbscheme b/python/ql/lib/upgrades/47e552c4357a04c5735355fad818630daee4a5ac/semmlecode.python.dbscheme new file mode 100644 index 00000000000..0355ecf0ac5 --- /dev/null +++ b/python/ql/lib/upgrades/47e552c4357a04c5735355fad818630daee4a5ac/semmlecode.python.dbscheme @@ -0,0 +1,1147 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + + /* + * External artifacts + */ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +externalData( + int id : @externalDataElement, + varchar(900) queryPath : string ref, + int column: int ref, + varchar(900) data : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * Duplicate code + */ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/* + * Version history + */ + +svnentries( + int id : @svnentry, + varchar(500) revision : string ref, + varchar(500) author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + varchar(500) action : string ref +) + +svnentrymsg( + int id : @svnentry ref, + varchar(500) message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/**************************** + Python dbscheme +****************************/ + +files(unique int id: @file, + varchar(900) name: string ref); + +folders(unique int id: @folder, + varchar(900) name: string ref); + +@container = @folder | @file; + +containerparent(int parent: @container ref, + unique int child: @container ref); + +@sourceline = @file | @py_Module | @xmllocatable; + +numlines(int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref + ); + +@location = @location_ast | @location_default ; + +locations_default(unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; + +/* XML Files */ + +xmlEncoding (unique int id: @file ref, varchar(900) encoding: string ref); + +xmlDTDs (unique int id: @xmldtd, + varchar(900) root: string ref, + varchar(900) publicId: string ref, + varchar(900) systemId: string ref, + int fileid: @file ref); + +xmlElements (unique int id: @xmlelement, + varchar(900) name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs (unique int id: @xmlattribute, + int elementid: @xmlelement ref, + varchar(900) name: string ref, + varchar(3600) value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs (int id: @xmlnamespace, + varchar(900) prefixName: string ref, + varchar(900) URI: string ref, + int fileid: @file ref); + +xmlHasNs (int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments (unique int id: @xmlcomment, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars (unique int id: @xmlcharacters, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations(int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/** + * YAML + */ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + varchar(900) tag: string ref, + varchar(900) tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + varchar(900) anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + varchar(900) target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + varchar(900) value: string ref); + +yaml_errors (unique int id: @yaml_error, + varchar(900) message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; diff --git a/python/ql/lib/upgrades/47e552c4357a04c5735355fad818630daee4a5ac/upgrade.properties b/python/ql/lib/upgrades/47e552c4357a04c5735355fad818630daee4a5ac/upgrade.properties new file mode 100644 index 00000000000..6a75c3fdaf3 --- /dev/null +++ b/python/ql/lib/upgrades/47e552c4357a04c5735355fad818630daee4a5ac/upgrade.properties @@ -0,0 +1,2 @@ +description: Add YAML tables +compatibility: full diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index 078d99339dd..36f736322c9 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.7.1 + +No user-facing changes. + ## 0.7.0 ### Bug Fixes diff --git a/python/ql/src/Security/CWE-295/MissingHostKeyValidation.ql b/python/ql/src/Security/CWE-295/MissingHostKeyValidation.ql index 403c4c42d4f..91041519ba8 100644 --- a/python/ql/src/Security/CWE-295/MissingHostKeyValidation.ql +++ b/python/ql/src/Security/CWE-295/MissingHostKeyValidation.ql @@ -16,11 +16,17 @@ import semmle.python.ApiGraphs private API::Node unsafe_paramiko_policy(string name) { name in ["AutoAddPolicy", "WarningPolicy"] and - result = API::moduleImport("paramiko").getMember("client").getMember(name) + ( + result = API::moduleImport("paramiko").getMember("client").getMember(name) + or + result = API::moduleImport("paramiko").getMember(name) + ) } private API::Node paramikoSshClientInstance() { result = API::moduleImport("paramiko").getMember("client").getMember("SSHClient").getReturn() + or + result = API::moduleImport("paramiko").getMember("SSHClient").getReturn() } from DataFlow::CallCfgNode call, DataFlow::Node arg, string name diff --git a/python/ql/src/change-notes/released/0.7.1.md b/python/ql/src/change-notes/released/0.7.1.md new file mode 100644 index 00000000000..86973d36042 --- /dev/null +++ b/python/ql/src/change-notes/released/0.7.1.md @@ -0,0 +1,3 @@ +## 0.7.1 + +No user-facing changes. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index c761f3e7ab4..e007a9aec3e 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.7.0 +lastReleaseVersion: 0.7.1 diff --git a/python/ql/src/experimental/Security/CWE-611/SimpleXmlRpcServer.ql b/python/ql/src/experimental/Security/CWE-611/SimpleXmlRpcServer.ql index 62ca6219b8b..f310c8c9aba 100644 --- a/python/ql/src/experimental/Security/CWE-611/SimpleXmlRpcServer.ql +++ b/python/ql/src/experimental/Security/CWE-611/SimpleXmlRpcServer.ql @@ -1,6 +1,6 @@ /** - * @name SimpleXMLRPCServer DoS vulnerability - * @description SimpleXMLRPCServer is vulnerable to DoS attacks from untrusted user input + * @name SimpleXMLRPCServer denial of service + * @description SimpleXMLRPCServer is vulnerable to denial of service attacks from untrusted user input * @kind problem * @problem.severity warning * @precision high diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 5aebf80463d..6faa88a0bd0 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 0.7.0 +version: 0.7.1 groups: - python - queries diff --git a/python/ql/src/queries.xml b/python/ql/src/queries.xml deleted file mode 100644 index 27449f34263..00000000000 --- a/python/ql/src/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/python/ql/test/library-tests/Yaml/err.yaml b/python/ql/test/library-tests/Yaml/err.yaml new file mode 100644 index 00000000000..96d2d75ddc0 --- /dev/null +++ b/python/ql/test/library-tests/Yaml/err.yaml @@ -0,0 +1,2 @@ +"unterminated string + diff --git a/python/ql/test/library-tests/Yaml/external.yml b/python/ql/test/library-tests/Yaml/external.yml new file mode 100644 index 00000000000..f70d7bba4ae --- /dev/null +++ b/python/ql/test/library-tests/Yaml/external.yml @@ -0,0 +1 @@ +42 \ No newline at end of file diff --git a/python/ql/test/library-tests/Yaml/merge.yaml b/python/ql/test/library-tests/Yaml/merge.yaml new file mode 100644 index 00000000000..0bd92fa725b --- /dev/null +++ b/python/ql/test/library-tests/Yaml/merge.yaml @@ -0,0 +1,3 @@ +- &A { x: 23, y: 42 } +- x: 56 + <<: *A \ No newline at end of file diff --git a/python/ql/test/library-tests/Yaml/printAst.expected b/python/ql/test/library-tests/Yaml/printAst.expected new file mode 100644 index 00000000000..e44da8042ad --- /dev/null +++ b/python/ql/test/library-tests/Yaml/printAst.expected @@ -0,0 +1,151 @@ +nodes +| external.yml:1:1:1:2 | [YamlScalar] 42 | semmle.label | [YamlScalar] 42 | +| external.yml:1:1:1:2 | [YamlScalar] 42 | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 0) name: | semmle.label | (Mapping 0) name: | +| file://:0:0:0:0 | (Mapping 0) name: | semmle.label | (Mapping 0) name: | +| file://:0:0:0:0 | (Mapping 0) street: | semmle.label | (Mapping 0) street: | +| file://:0:0:0:0 | (Mapping 0) street: | semmle.label | (Mapping 0) street: | +| file://:0:0:0:0 | (Mapping 0) x: | semmle.label | (Mapping 0) x: | +| file://:0:0:0:0 | (Mapping 0) x: | semmle.label | (Mapping 0) x: | +| file://:0:0:0:0 | (Mapping 1) <<: | semmle.label | (Mapping 1) <<: | +| file://:0:0:0:0 | (Mapping 1) address: | semmle.label | (Mapping 1) address: | +| file://:0:0:0:0 | (Mapping 1) address: | semmle.label | (Mapping 1) address: | +| file://:0:0:0:0 | (Mapping 1) number: | semmle.label | (Mapping 1) number: | +| file://:0:0:0:0 | (Mapping 1) number: | semmle.label | (Mapping 1) number: | +| file://:0:0:0:0 | (Mapping 1) y: | semmle.label | (Mapping 1) y: | +| file://:0:0:0:0 | (Mapping 2) country: | semmle.label | (Mapping 2) country: | +| file://:0:0:0:0 | (Mapping 2) country: | semmle.label | (Mapping 2) country: | +| merge.yaml:1:1:3:8 | [YamlSequence] - &A { ... y: 42 } | semmle.label | [YamlSequence] - &A { ... y: 42 } | +| merge.yaml:1:1:3:8 | [YamlSequence] - &A { ... y: 42 } | semmle.order | 2 | +| merge.yaml:1:3:1:21 | [YamlMapping] &A { x: 23, y: 42 } | semmle.label | [YamlMapping] &A { x: 23, y: 42 } | +| merge.yaml:1:8:1:8 | [YamlScalar] x | semmle.label | [YamlScalar] x | +| merge.yaml:1:11:1:12 | [YamlScalar] 23 | semmle.label | [YamlScalar] 23 | +| merge.yaml:1:15:1:15 | [YamlScalar] y | semmle.label | [YamlScalar] y | +| merge.yaml:1:18:1:19 | [YamlScalar] 42 | semmle.label | [YamlScalar] 42 | +| merge.yaml:2:3:2:3 | [YamlScalar] x | semmle.label | [YamlScalar] x | +| merge.yaml:2:3:3:8 | [YamlMapping] x: 56 | semmle.label | [YamlMapping] x: 56 | +| merge.yaml:2:6:2:7 | [YamlScalar] 56 | semmle.label | [YamlScalar] 56 | +| merge.yaml:3:3:3:4 | [YamlScalar] << | semmle.label | [YamlScalar] << | +| merge.yaml:3:7:3:8 | [YamlAliasNode] *A | semmle.label | [YamlAliasNode] *A | +| tst.yml:1:1:14:23 | [YamlSequence] - "name ... Knopf" | semmle.label | [YamlSequence] - "name ... Knopf" | +| tst.yml:1:1:14:23 | [YamlSequence] - "name ... Knopf" | semmle.order | 3 | +| tst.yml:1:3:1:8 | [YamlScalar] "name" | semmle.label | [YamlScalar] "name" | +| tst.yml:1:3:6:4 | [YamlMapping] "name": "Jim Knopf" | semmle.label | [YamlMapping] "name": "Jim Knopf" | +| tst.yml:1:11:1:21 | [YamlScalar] "Jim Knopf" | semmle.label | [YamlScalar] "Jim Knopf" | +| tst.yml:2:3:2:9 | [YamlScalar] address | semmle.label | [YamlScalar] address | +| tst.yml:2:12:6:3 | [YamlMapping] { | semmle.label | [YamlMapping] { | +| tst.yml:3:5:3:12 | [YamlScalar] "street" | semmle.label | [YamlScalar] "street" | +| tst.yml:3:14:3:13 | [YamlScalar] | semmle.label | [YamlScalar] | +| tst.yml:4:5:4:12 | [YamlScalar] "number" | semmle.label | [YamlScalar] "number" | +| tst.yml:4:15:4:16 | [YamlScalar] -1 | semmle.label | [YamlScalar] -1 | +| tst.yml:5:5:5:13 | [YamlScalar] "country" | semmle.label | [YamlScalar] "country" | +| tst.yml:5:16:5:27 | [YamlScalar] "Lummerland" | semmle.label | [YamlScalar] "Lummerland" | +| tst.yml:7:3:7:6 | [YamlScalar] name | semmle.label | [YamlScalar] name | +| tst.yml:7:3:13:19 | [YamlMapping] name: Frau Mahlzahn | semmle.label | [YamlMapping] name: Frau Mahlzahn | +| tst.yml:7:9:7:21 | [YamlScalar] Frau Mahlzahn | semmle.label | [YamlScalar] Frau Mahlzahn | +| tst.yml:8:3:8:9 | [YamlScalar] address | semmle.label | [YamlScalar] address | +| tst.yml:9:5:9:10 | [YamlScalar] street | semmle.label | [YamlScalar] street | +| tst.yml:9:5:13:19 | [YamlMapping] street: \| | semmle.label | [YamlMapping] street: \| | +| tst.yml:9:13:10:21 | [YamlScalar] \| | semmle.label | [YamlScalar] \| | +| tst.yml:11:5:11:10 | [YamlScalar] number | semmle.label | [YamlScalar] number | +| tst.yml:11:13:11:15 | [YamlScalar] 133 | semmle.label | [YamlScalar] 133 | +| tst.yml:12:5:12:11 | [YamlScalar] country | semmle.label | [YamlScalar] country | +| tst.yml:12:14:13:18 | [YamlScalar] < | semmle.label | [YamlScalar] < | +| tst.yml:14:3:14:23 | [YamlScalar] !includ ... nal.yml | semmle.label | [YamlScalar] !includ ... nal.yml | +edges +| file://:0:0:0:0 | (Mapping 0) name: | tst.yml:1:3:1:8 | [YamlScalar] "name" | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 0) name: | tst.yml:1:3:1:8 | [YamlScalar] "name" | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 0) name: | tst.yml:1:11:1:21 | [YamlScalar] "Jim Knopf" | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 0) name: | tst.yml:1:11:1:21 | [YamlScalar] "Jim Knopf" | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 0) name: | tst.yml:7:3:7:6 | [YamlScalar] name | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 0) name: | tst.yml:7:3:7:6 | [YamlScalar] name | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 0) name: | tst.yml:7:9:7:21 | [YamlScalar] Frau Mahlzahn | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 0) name: | tst.yml:7:9:7:21 | [YamlScalar] Frau Mahlzahn | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 0) street: | tst.yml:3:5:3:12 | [YamlScalar] "street" | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 0) street: | tst.yml:3:5:3:12 | [YamlScalar] "street" | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 0) street: | tst.yml:3:14:3:13 | [YamlScalar] | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 0) street: | tst.yml:3:14:3:13 | [YamlScalar] | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 0) street: | tst.yml:9:5:9:10 | [YamlScalar] street | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 0) street: | tst.yml:9:5:9:10 | [YamlScalar] street | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 0) street: | tst.yml:9:13:10:21 | [YamlScalar] \| | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 0) street: | tst.yml:9:13:10:21 | [YamlScalar] \| | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 0) x: | merge.yaml:1:8:1:8 | [YamlScalar] x | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 0) x: | merge.yaml:1:8:1:8 | [YamlScalar] x | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 0) x: | merge.yaml:1:11:1:12 | [YamlScalar] 23 | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 0) x: | merge.yaml:1:11:1:12 | [YamlScalar] 23 | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 0) x: | merge.yaml:2:3:2:3 | [YamlScalar] x | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 0) x: | merge.yaml:2:3:2:3 | [YamlScalar] x | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 0) x: | merge.yaml:2:6:2:7 | [YamlScalar] 56 | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 0) x: | merge.yaml:2:6:2:7 | [YamlScalar] 56 | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 1) <<: | merge.yaml:3:3:3:4 | [YamlScalar] << | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 1) <<: | merge.yaml:3:3:3:4 | [YamlScalar] << | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 1) <<: | merge.yaml:3:7:3:8 | [YamlAliasNode] *A | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 1) <<: | merge.yaml:3:7:3:8 | [YamlAliasNode] *A | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 1) address: | tst.yml:2:3:2:9 | [YamlScalar] address | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 1) address: | tst.yml:2:3:2:9 | [YamlScalar] address | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 1) address: | tst.yml:2:12:6:3 | [YamlMapping] { | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 1) address: | tst.yml:2:12:6:3 | [YamlMapping] { | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 1) address: | tst.yml:8:3:8:9 | [YamlScalar] address | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 1) address: | tst.yml:8:3:8:9 | [YamlScalar] address | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 1) address: | tst.yml:9:5:13:19 | [YamlMapping] street: \| | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 1) address: | tst.yml:9:5:13:19 | [YamlMapping] street: \| | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 1) number: | tst.yml:4:5:4:12 | [YamlScalar] "number" | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 1) number: | tst.yml:4:5:4:12 | [YamlScalar] "number" | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 1) number: | tst.yml:4:15:4:16 | [YamlScalar] -1 | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 1) number: | tst.yml:4:15:4:16 | [YamlScalar] -1 | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 1) number: | tst.yml:11:5:11:10 | [YamlScalar] number | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 1) number: | tst.yml:11:5:11:10 | [YamlScalar] number | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 1) number: | tst.yml:11:13:11:15 | [YamlScalar] 133 | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 1) number: | tst.yml:11:13:11:15 | [YamlScalar] 133 | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 1) y: | merge.yaml:1:15:1:15 | [YamlScalar] y | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 1) y: | merge.yaml:1:15:1:15 | [YamlScalar] y | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 1) y: | merge.yaml:1:18:1:19 | [YamlScalar] 42 | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 1) y: | merge.yaml:1:18:1:19 | [YamlScalar] 42 | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 2) country: | tst.yml:5:5:5:13 | [YamlScalar] "country" | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 2) country: | tst.yml:5:5:5:13 | [YamlScalar] "country" | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 2) country: | tst.yml:5:16:5:27 | [YamlScalar] "Lummerland" | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 2) country: | tst.yml:5:16:5:27 | [YamlScalar] "Lummerland" | semmle.order | 1 | +| file://:0:0:0:0 | (Mapping 2) country: | tst.yml:12:5:12:11 | [YamlScalar] country | semmle.label | 0 | +| file://:0:0:0:0 | (Mapping 2) country: | tst.yml:12:5:12:11 | [YamlScalar] country | semmle.order | 0 | +| file://:0:0:0:0 | (Mapping 2) country: | tst.yml:12:14:13:18 | [YamlScalar] < | semmle.label | 1 | +| file://:0:0:0:0 | (Mapping 2) country: | tst.yml:12:14:13:18 | [YamlScalar] < | semmle.order | 1 | +| merge.yaml:1:1:3:8 | [YamlSequence] - &A { ... y: 42 } | merge.yaml:1:3:1:21 | [YamlMapping] &A { x: 23, y: 42 } | semmle.label | 0 | +| merge.yaml:1:1:3:8 | [YamlSequence] - &A { ... y: 42 } | merge.yaml:1:3:1:21 | [YamlMapping] &A { x: 23, y: 42 } | semmle.order | 0 | +| merge.yaml:1:1:3:8 | [YamlSequence] - &A { ... y: 42 } | merge.yaml:2:3:3:8 | [YamlMapping] x: 56 | semmle.label | 1 | +| merge.yaml:1:1:3:8 | [YamlSequence] - &A { ... y: 42 } | merge.yaml:2:3:3:8 | [YamlMapping] x: 56 | semmle.order | 1 | +| merge.yaml:1:3:1:21 | [YamlMapping] &A { x: 23, y: 42 } | file://:0:0:0:0 | (Mapping 0) x: | semmle.label | 0 | +| merge.yaml:1:3:1:21 | [YamlMapping] &A { x: 23, y: 42 } | file://:0:0:0:0 | (Mapping 0) x: | semmle.order | 0 | +| merge.yaml:1:3:1:21 | [YamlMapping] &A { x: 23, y: 42 } | file://:0:0:0:0 | (Mapping 1) y: | semmle.label | 1 | +| merge.yaml:1:3:1:21 | [YamlMapping] &A { x: 23, y: 42 } | file://:0:0:0:0 | (Mapping 1) y: | semmle.order | 1 | +| merge.yaml:2:3:3:8 | [YamlMapping] x: 56 | file://:0:0:0:0 | (Mapping 0) x: | semmle.label | 0 | +| merge.yaml:2:3:3:8 | [YamlMapping] x: 56 | file://:0:0:0:0 | (Mapping 0) x: | semmle.order | 0 | +| merge.yaml:2:3:3:8 | [YamlMapping] x: 56 | file://:0:0:0:0 | (Mapping 1) <<: | semmle.label | 1 | +| merge.yaml:2:3:3:8 | [YamlMapping] x: 56 | file://:0:0:0:0 | (Mapping 1) <<: | semmle.order | 1 | +| tst.yml:1:1:14:23 | [YamlSequence] - "name ... Knopf" | tst.yml:1:3:6:4 | [YamlMapping] "name": "Jim Knopf" | semmle.label | 0 | +| tst.yml:1:1:14:23 | [YamlSequence] - "name ... Knopf" | tst.yml:1:3:6:4 | [YamlMapping] "name": "Jim Knopf" | semmle.order | 0 | +| tst.yml:1:1:14:23 | [YamlSequence] - "name ... Knopf" | tst.yml:7:3:13:19 | [YamlMapping] name: Frau Mahlzahn | semmle.label | 1 | +| tst.yml:1:1:14:23 | [YamlSequence] - "name ... Knopf" | tst.yml:7:3:13:19 | [YamlMapping] name: Frau Mahlzahn | semmle.order | 1 | +| tst.yml:1:1:14:23 | [YamlSequence] - "name ... Knopf" | tst.yml:14:3:14:23 | [YamlScalar] !includ ... nal.yml | semmle.label | 2 | +| tst.yml:1:1:14:23 | [YamlSequence] - "name ... Knopf" | tst.yml:14:3:14:23 | [YamlScalar] !includ ... nal.yml | semmle.order | 2 | +| tst.yml:1:3:6:4 | [YamlMapping] "name": "Jim Knopf" | file://:0:0:0:0 | (Mapping 0) name: | semmle.label | 0 | +| tst.yml:1:3:6:4 | [YamlMapping] "name": "Jim Knopf" | file://:0:0:0:0 | (Mapping 0) name: | semmle.order | 0 | +| tst.yml:1:3:6:4 | [YamlMapping] "name": "Jim Knopf" | file://:0:0:0:0 | (Mapping 1) address: | semmle.label | 1 | +| tst.yml:1:3:6:4 | [YamlMapping] "name": "Jim Knopf" | file://:0:0:0:0 | (Mapping 1) address: | semmle.order | 1 | +| tst.yml:2:12:6:3 | [YamlMapping] { | file://:0:0:0:0 | (Mapping 0) street: | semmle.label | 0 | +| tst.yml:2:12:6:3 | [YamlMapping] { | file://:0:0:0:0 | (Mapping 0) street: | semmle.order | 0 | +| tst.yml:2:12:6:3 | [YamlMapping] { | file://:0:0:0:0 | (Mapping 1) number: | semmle.label | 1 | +| tst.yml:2:12:6:3 | [YamlMapping] { | file://:0:0:0:0 | (Mapping 1) number: | semmle.order | 1 | +| tst.yml:2:12:6:3 | [YamlMapping] { | file://:0:0:0:0 | (Mapping 2) country: | semmle.label | 2 | +| tst.yml:2:12:6:3 | [YamlMapping] { | file://:0:0:0:0 | (Mapping 2) country: | semmle.order | 2 | +| tst.yml:7:3:13:19 | [YamlMapping] name: Frau Mahlzahn | file://:0:0:0:0 | (Mapping 0) name: | semmle.label | 0 | +| tst.yml:7:3:13:19 | [YamlMapping] name: Frau Mahlzahn | file://:0:0:0:0 | (Mapping 0) name: | semmle.order | 0 | +| tst.yml:7:3:13:19 | [YamlMapping] name: Frau Mahlzahn | file://:0:0:0:0 | (Mapping 1) address: | semmle.label | 1 | +| tst.yml:7:3:13:19 | [YamlMapping] name: Frau Mahlzahn | file://:0:0:0:0 | (Mapping 1) address: | semmle.order | 1 | +| tst.yml:9:5:13:19 | [YamlMapping] street: \| | file://:0:0:0:0 | (Mapping 0) street: | semmle.label | 0 | +| tst.yml:9:5:13:19 | [YamlMapping] street: \| | file://:0:0:0:0 | (Mapping 0) street: | semmle.order | 0 | +| tst.yml:9:5:13:19 | [YamlMapping] street: \| | file://:0:0:0:0 | (Mapping 1) number: | semmle.label | 1 | +| tst.yml:9:5:13:19 | [YamlMapping] street: \| | file://:0:0:0:0 | (Mapping 1) number: | semmle.order | 1 | +| tst.yml:9:5:13:19 | [YamlMapping] street: \| | file://:0:0:0:0 | (Mapping 2) country: | semmle.label | 2 | +| tst.yml:9:5:13:19 | [YamlMapping] street: \| | file://:0:0:0:0 | (Mapping 2) country: | semmle.order | 2 | +graphProperties +| semmle.graphKind | tree | diff --git a/python/ql/test/library-tests/Yaml/printAst.ql b/python/ql/test/library-tests/Yaml/printAst.ql new file mode 100644 index 00000000000..8b791c3ed35 --- /dev/null +++ b/python/ql/test/library-tests/Yaml/printAst.ql @@ -0,0 +1 @@ +import semmle.python.PrintAst diff --git a/python/ql/test/library-tests/Yaml/tests.expected b/python/ql/test/library-tests/Yaml/tests.expected new file mode 100644 index 00000000000..d3c596cbeca --- /dev/null +++ b/python/ql/test/library-tests/Yaml/tests.expected @@ -0,0 +1,89 @@ +anchors +| merge.yaml:1:3:1:21 | &A { x: 23, y: 42 } | A | +eval +| merge.yaml:3:7:3:8 | *A | merge.yaml:1:3:1:21 | &A { x: 23, y: 42 } | +| tst.yml:14:3:14:23 | !includ ... nal.yml | external.yml:1:1:1:2 | 42 | +yamlParseError +| err.yaml:3:1:3:1 | found unexpected end of stream | +yamlMapping_maps +| merge.yaml:1:3:1:21 | &A { x: 23, y: 42 } | merge.yaml:1:8:1:8 | x | merge.yaml:1:11:1:12 | 23 | +| merge.yaml:1:3:1:21 | &A { x: 23, y: 42 } | merge.yaml:1:15:1:15 | y | merge.yaml:1:18:1:19 | 42 | +| merge.yaml:2:3:3:8 | x: 56 | merge.yaml:1:8:1:8 | x | merge.yaml:1:11:1:12 | 23 | +| merge.yaml:2:3:3:8 | x: 56 | merge.yaml:1:15:1:15 | y | merge.yaml:1:18:1:19 | 42 | +| merge.yaml:2:3:3:8 | x: 56 | merge.yaml:2:3:2:3 | x | merge.yaml:2:6:2:7 | 56 | +| merge.yaml:2:3:3:8 | x: 56 | merge.yaml:3:3:3:4 | << | merge.yaml:1:3:1:21 | &A { x: 23, y: 42 } | +| tst.yml:1:3:6:4 | "name": "Jim Knopf" | tst.yml:1:3:1:8 | "name" | tst.yml:1:11:1:21 | "Jim Knopf" | +| tst.yml:1:3:6:4 | "name": "Jim Knopf" | tst.yml:2:3:2:9 | address | tst.yml:2:12:6:3 | { | +| tst.yml:2:12:6:3 | { | tst.yml:3:5:3:12 | "street" | tst.yml:3:14:3:13 | | +| tst.yml:2:12:6:3 | { | tst.yml:4:5:4:12 | "number" | tst.yml:4:15:4:16 | -1 | +| tst.yml:2:12:6:3 | { | tst.yml:5:5:5:13 | "country" | tst.yml:5:16:5:27 | "Lummerland" | +| tst.yml:7:3:13:19 | name: Frau Mahlzahn | tst.yml:7:3:7:6 | name | tst.yml:7:9:7:21 | Frau Mahlzahn | +| tst.yml:7:3:13:19 | name: Frau Mahlzahn | tst.yml:8:3:8:9 | address | tst.yml:9:5:13:19 | street: \| | +| tst.yml:9:5:13:19 | street: \| | tst.yml:9:5:9:10 | street | tst.yml:9:13:10:21 | \| | +| tst.yml:9:5:13:19 | street: \| | tst.yml:11:5:11:10 | number | tst.yml:11:13:11:15 | 133 | +| tst.yml:9:5:13:19 | street: \| | tst.yml:12:5:12:11 | country | tst.yml:12:14:13:18 | < | +yamlNode +| external.yml:1:1:1:2 | 42 | tag:yaml.org,2002:int | +| merge.yaml:1:1:3:8 | - &A { ... y: 42 } | tag:yaml.org,2002:seq | +| merge.yaml:1:3:1:21 | &A { x: 23, y: 42 } | tag:yaml.org,2002:map | +| merge.yaml:1:8:1:8 | x | tag:yaml.org,2002:str | +| merge.yaml:1:11:1:12 | 23 | tag:yaml.org,2002:int | +| merge.yaml:1:15:1:15 | y | tag:yaml.org,2002:str | +| merge.yaml:1:18:1:19 | 42 | tag:yaml.org,2002:int | +| merge.yaml:2:3:2:3 | x | tag:yaml.org,2002:str | +| merge.yaml:2:3:3:8 | x: 56 | tag:yaml.org,2002:map | +| merge.yaml:2:6:2:7 | 56 | tag:yaml.org,2002:int | +| merge.yaml:3:3:3:4 | << | tag:yaml.org,2002:merge | +| merge.yaml:3:7:3:8 | *A | | +| tst.yml:1:1:14:23 | - "name ... Knopf" | tag:yaml.org,2002:seq | +| tst.yml:1:3:1:8 | "name" | tag:yaml.org,2002:str | +| tst.yml:1:3:6:4 | "name": "Jim Knopf" | tag:yaml.org,2002:map | +| tst.yml:1:11:1:21 | "Jim Knopf" | tag:yaml.org,2002:str | +| tst.yml:2:3:2:9 | address | tag:yaml.org,2002:str | +| tst.yml:2:12:6:3 | { | tag:yaml.org,2002:map | +| tst.yml:3:5:3:12 | "street" | tag:yaml.org,2002:str | +| tst.yml:3:14:3:13 | | tag:yaml.org,2002:null | +| tst.yml:4:5:4:12 | "number" | tag:yaml.org,2002:str | +| tst.yml:4:15:4:16 | -1 | tag:yaml.org,2002:int | +| tst.yml:5:5:5:13 | "country" | tag:yaml.org,2002:str | +| tst.yml:5:16:5:27 | "Lummerland" | tag:yaml.org,2002:str | +| tst.yml:7:3:7:6 | name | tag:yaml.org,2002:str | +| tst.yml:7:3:13:19 | name: Frau Mahlzahn | tag:yaml.org,2002:map | +| tst.yml:7:9:7:21 | Frau Mahlzahn | tag:yaml.org,2002:str | +| tst.yml:8:3:8:9 | address | tag:yaml.org,2002:str | +| tst.yml:9:5:9:10 | street | tag:yaml.org,2002:str | +| tst.yml:9:5:13:19 | street: \| | tag:yaml.org,2002:map | +| tst.yml:9:13:10:21 | \| | tag:yaml.org,2002:str | +| tst.yml:11:5:11:10 | number | tag:yaml.org,2002:str | +| tst.yml:11:13:11:15 | 133 | tag:yaml.org,2002:int | +| tst.yml:12:5:12:11 | country | tag:yaml.org,2002:str | +| tst.yml:12:14:13:18 | < | tag:yaml.org,2002:str | +| tst.yml:14:3:14:23 | !includ ... nal.yml | !include | +yamlScalar +| external.yml:1:1:1:2 | 42 | | 42 | +| merge.yaml:1:8:1:8 | x | | x | +| merge.yaml:1:11:1:12 | 23 | | 23 | +| merge.yaml:1:15:1:15 | y | | y | +| merge.yaml:1:18:1:19 | 42 | | 42 | +| merge.yaml:2:3:2:3 | x | | x | +| merge.yaml:2:6:2:7 | 56 | | 56 | +| merge.yaml:3:3:3:4 | << | | << | +| tst.yml:1:3:1:8 | "name" | " | name | +| tst.yml:1:11:1:21 | "Jim Knopf" | " | Jim Knopf | +| tst.yml:2:3:2:9 | address | | address | +| tst.yml:3:5:3:12 | "street" | " | street | +| tst.yml:3:14:3:13 | | | | +| tst.yml:4:5:4:12 | "number" | " | number | +| tst.yml:4:15:4:16 | -1 | | -1 | +| tst.yml:5:5:5:13 | "country" | " | country | +| tst.yml:5:16:5:27 | "Lummerland" | " | Lummerland | +| tst.yml:7:3:7:6 | name | | name | +| tst.yml:7:9:7:21 | Frau Mahlzahn | | Frau Mahlzahn | +| tst.yml:8:3:8:9 | address | | address | +| tst.yml:9:5:9:10 | street | | street | +| tst.yml:9:13:10:21 | \| | \| | Alte Strasse\n | +| tst.yml:11:5:11:10 | number | | number | +| tst.yml:11:13:11:15 | 133 | | 133 | +| tst.yml:12:5:12:11 | country | | country | +| tst.yml:12:14:13:18 | < | | < Kummerland | +| tst.yml:14:3:14:23 | !includ ... nal.yml | | external.yml | diff --git a/python/ql/test/library-tests/Yaml/tests.ql b/python/ql/test/library-tests/Yaml/tests.ql new file mode 100644 index 00000000000..e5da588fe73 --- /dev/null +++ b/python/ql/test/library-tests/Yaml/tests.ql @@ -0,0 +1,18 @@ +import semmle.python.Yaml + +query predicate anchors(YamlNode n, string anchor) { n.getAnchor() = anchor } + +query predicate eval(YamlNode n, YamlValue eval) { + not n.eval() = n and + eval = n.eval() +} + +query predicate yamlParseError(YamlParseError err) { any() } + +query predicate yamlMapping_maps(YamlMapping m, YamlValue k, YamlValue v) { m.maps(k, v) } + +query predicate yamlNode(YamlNode n, string tag) { tag = n.getTag() } + +query predicate yamlScalar(YamlScalar s, string style, string value) { + style = s.getStyle() and value = s.getValue() +} diff --git a/python/ql/test/library-tests/Yaml/tst.yml b/python/ql/test/library-tests/Yaml/tst.yml new file mode 100644 index 00000000000..af3e855da15 --- /dev/null +++ b/python/ql/test/library-tests/Yaml/tst.yml @@ -0,0 +1,14 @@ +- "name": "Jim Knopf" + address: { + "street":, + "number": -1, + "country": "Lummerland" + } +- name: Frau Mahlzahn + address: + street: | + Alte Strasse + number: 133 + country: < + Kummerland +- !include external.yml \ No newline at end of file diff --git a/python/ql/test/queries.xml b/python/ql/test/queries.xml deleted file mode 100644 index 27449f34263..00000000000 --- a/python/ql/test/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/python/ql/test/query-tests/Security/CWE-295-MissingHostKeyValidation/MissingHostKeyValidation.expected b/python/ql/test/query-tests/Security/CWE-295-MissingHostKeyValidation/MissingHostKeyValidation.expected index bcbb79ad6ff..d7245c5e602 100644 --- a/python/ql/test/query-tests/Security/CWE-295-MissingHostKeyValidation/MissingHostKeyValidation.expected +++ b/python/ql/test/query-tests/Security/CWE-295-MissingHostKeyValidation/MissingHostKeyValidation.expected @@ -2,3 +2,4 @@ | paramiko_host_key.py:7:1:7:49 | ControlFlowNode for Attribute() | Setting missing host key policy to WarningPolicy may be unsafe. | | paramiko_host_key.py:11:1:11:51 | ControlFlowNode for Attribute() | Setting missing host key policy to AutoAddPolicy may be unsafe. | | paramiko_host_key.py:13:1:13:51 | ControlFlowNode for Attribute() | Setting missing host key policy to WarningPolicy may be unsafe. | +| paramiko_host_key.py:20:1:20:58 | ControlFlowNode for Attribute() | Setting missing host key policy to AutoAddPolicy may be unsafe. | diff --git a/python/ql/test/query-tests/Security/CWE-295-MissingHostKeyValidation/paramiko_host_key.py b/python/ql/test/query-tests/Security/CWE-295-MissingHostKeyValidation/paramiko_host_key.py index 2dd13aafe18..3d0a59dcd8f 100644 --- a/python/ql/test/query-tests/Security/CWE-295-MissingHostKeyValidation/paramiko_host_key.py +++ b/python/ql/test/query-tests/Security/CWE-295-MissingHostKeyValidation/paramiko_host_key.py @@ -11,3 +11,10 @@ client.set_missing_host_key_policy(WarningPolicy) # bad client.set_missing_host_key_policy(AutoAddPolicy()) # bad client.set_missing_host_key_policy(RejectPolicy()) # good client.set_missing_host_key_policy(WarningPolicy()) # bad + +# different import + +import paramiko + +client = paramiko.SSHClient() +client.set_missing_host_key_policy(paramiko.AutoAddPolicy) # bad diff --git a/ql/Cargo.lock b/ql/Cargo.lock index 9c3fb5d18d2..8a6de476fd9 100644 Binary files a/ql/Cargo.lock and b/ql/Cargo.lock differ diff --git a/ql/buramu/Cargo.toml b/ql/buramu/Cargo.toml index 5b87a8a90be..48fa148872c 100644 --- a/ql/buramu/Cargo.toml +++ b/ql/buramu/Cargo.toml @@ -9,4 +9,4 @@ edition = "2018" lazy_static = "1.4.0" chrono = "0.4.24" rayon = "1.7.0" -regex = "1.7.3" +regex = "1.8.1" diff --git a/ql/extractor/Cargo.toml b/ql/extractor/Cargo.toml index 3d37379c8a7..440b9434d34 100644 --- a/ql/extractor/Cargo.toml +++ b/ql/extractor/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "ql-extractor" +name = "codeql-extractor-ql" version = "0.1.0" authors = ["GitHub"] edition = "2018" @@ -13,9 +13,9 @@ tree-sitter-ql-dbscheme = { git = "https://github.com/erik-krogh/tree-sitter-ql- tree-sitter-ql-yaml = {git = "https://github.com/erik-krogh/tree-sitter-ql.git", rev = "cf704bf3671e1ae148e173464fb65a4d2bbf5f99"} tree-sitter-blame = {path = "../buramu/tree-sitter-blame"} tree-sitter-json = {git = "https://github.com/tausbn/tree-sitter-json.git", rev = "745663ee997f1576fe1e7187e6347e0db36ec7a9"} -clap = "4.2" +clap = { version = "4.2", features = ["derive"] } tracing = "0.1" -tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } +tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } rayon = "1.7.0" -regex = "1.7.3" +regex = "1.8.1" codeql-extractor = { path = "../../shared/tree-sitter-extractor" } diff --git a/ql/extractor/src/bin/autobuilder.rs b/ql/extractor/src/autobuilder.rs similarity index 88% rename from ql/extractor/src/bin/autobuilder.rs rename to ql/extractor/src/autobuilder.rs index 0d9605c4c1d..a17a4916239 100644 --- a/ql/extractor/src/bin/autobuilder.rs +++ b/ql/extractor/src/autobuilder.rs @@ -1,8 +1,13 @@ +use clap::Args; use std::env; use std::path::PathBuf; use std::process::Command; -fn main() -> std::io::Result<()> { +#[derive(Args)] +// The autobuilder takes no command-line options, but this may change in the future. +pub struct Options {} + +pub fn run(_: Options) -> std::io::Result<()> { let dist = env::var("CODEQL_DIST").expect("CODEQL_DIST not set"); let db = env::var("CODEQL_EXTRACTOR_QL_WIP_DATABASE") .expect("CODEQL_EXTRACTOR_QL_WIP_DATABASE not set"); diff --git a/ql/extractor/src/bin/extractor.rs b/ql/extractor/src/extractor.rs similarity index 88% rename from ql/extractor/src/bin/extractor.rs rename to ql/extractor/src/extractor.rs index 592c98b1b15..ca616b482c3 100644 --- a/ql/extractor/src/bin/extractor.rs +++ b/ql/extractor/src/extractor.rs @@ -1,3 +1,4 @@ +use clap::Args; use rayon::prelude::*; use std::fs; use std::io::BufRead; @@ -5,7 +6,22 @@ use std::path::{Path, PathBuf}; use codeql_extractor::{diagnostics, extractor, node_types, trap}; -fn main() -> std::io::Result<()> { +#[derive(Args)] +pub struct Options { + /// Sets a custom source achive folder + #[arg(long)] + source_archive_dir: PathBuf, + + /// Sets a custom trap folder + #[arg(long)] + output_dir: PathBuf, + + /// A text file containing the paths of the files to extract + #[arg(long)] + file_list: PathBuf, +} + +pub fn run(options: Options) -> std::io::Result<()> { tracing_subscriber::fmt() .with_target(false) .without_time() @@ -58,30 +74,9 @@ fn main() -> std::io::Result<()> { .build_global() .unwrap(); - let matches = clap::Command::new("QL extractor") - .version("1.0") - .author("GitHub") - .about("CodeQL QL extractor") - .args(&[ - clap::arg!(--"source-archive-dir" "Sets a custom source archive folder"), - clap::arg!(--"output-dir" "Sets a custom trap folder"), - clap::arg!(--"file-list" "A text file containing the paths of the files to extract"), - ]) - .get_matches(); - let src_archive_dir = matches - .get_one::("source-archive-dir") - .expect("missing --source-archive-dir"); - let src_archive_dir = PathBuf::from(src_archive_dir); - - let trap_dir = matches - .get_one::("output-dir") - .expect("missing --output-dir"); - let trap_dir = PathBuf::from(trap_dir); - - let file_list = matches - .get_one::("file-list") - .expect("missing --file-list"); - let file_list = fs::File::open(file_list)?; + let trap_dir = options.output_dir; + let file_list = fs::File::open(options.file_list)?; + let source_archive_dir = options.source_archive_dir; let language = tree_sitter_ql::language(); let dbscheme = tree_sitter_ql_dbscheme::language(); @@ -114,7 +109,7 @@ fn main() -> std::io::Result<()> { return Ok(()); } let path = PathBuf::from(line).canonicalize()?; - let src_archive_file = path_for(&src_archive_dir, &path, ""); + let src_archive_file = path_for(&source_archive_dir, &path, ""); let source = std::fs::read(&path)?; let code_ranges = vec![]; let mut trap_writer = trap::Writer::new(); diff --git a/ql/extractor/src/bin/generator.rs b/ql/extractor/src/generator.rs similarity index 54% rename from ql/extractor/src/bin/generator.rs rename to ql/extractor/src/generator.rs index 45a13f6a18d..cdfdd17df4d 100644 --- a/ql/extractor/src/bin/generator.rs +++ b/ql/extractor/src/generator.rs @@ -1,8 +1,20 @@ +use clap::Args; use std::path::PathBuf; use codeql_extractor::generator::{generate, language::Language}; -fn main() -> std::io::Result<()> { +#[derive(Args)] +pub struct Options { + /// Path of the generated dbscheme file + #[arg(long)] + dbscheme: PathBuf, + + /// Path of the generated QLL file + #[arg(long)] + library: PathBuf, +} + +pub fn run(options: Options) -> std::io::Result<()> { tracing_subscriber::fmt() .with_target(false) .without_time() @@ -10,25 +22,6 @@ fn main() -> std::io::Result<()> { .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) .init(); - let matches = clap::Command::new("QL dbscheme generator") - .version("1.0") - .author("GitHub") - .about("CodeQL QL dbscheme generator") - .args(&[ - clap::arg!(--dbscheme "Path of the generated dbscheme file"), - clap::arg!(--library "Path of the generated QLL file"), - ]) - .get_matches(); - let dbscheme_path = matches - .get_one::("dbscheme") - .expect("missing --dbscheme"); - let dbscheme_path = PathBuf::from(dbscheme_path); - - let ql_library_path = matches - .get_one::("library") - .expect("missing --library"); - let ql_library_path = PathBuf::from(ql_library_path); - let languages = vec![ Language { name: "QL".to_owned(), @@ -52,5 +45,5 @@ fn main() -> std::io::Result<()> { }, ]; - generate(languages, dbscheme_path, ql_library_path) + generate(languages, options.dbscheme, options.library) } diff --git a/ql/extractor/src/main.rs b/ql/extractor/src/main.rs new file mode 100644 index 00000000000..e6721d4e224 --- /dev/null +++ b/ql/extractor/src/main.rs @@ -0,0 +1,23 @@ +use clap::Parser; + +mod autobuilder; +mod extractor; +mod generator; + +#[derive(Parser)] +#[command(author, version, about)] +enum Cli { + Extract(extractor::Options), + Generate(generator::Options), + Autobuild(autobuilder::Options), +} + +fn main() -> std::io::Result<()> { + let cli = Cli::parse(); + + match cli { + Cli::Extract(options) => extractor::run(options), + Cli::Generate(options) => generator::run(options), + Cli::Autobuild(options) => autobuilder::run(options), + } +} diff --git a/ql/ql/src/codeql_ql/ast/Ast.qll b/ql/ql/src/codeql_ql/ast/Ast.qll index 818828d44fe..630b07bd680 100644 --- a/ql/ql/src/codeql_ql/ast/Ast.qll +++ b/ql/ql/src/codeql_ql/ast/Ast.qll @@ -211,17 +211,17 @@ class QueryDoc extends QLDoc { /** Gets the @name for the query */ string getQueryName() { - result = this.getContents().regexpCapture("(?s).*@name ([\\w-\\s]+)(?=\\n).*", 1) + result = this.getContents().regexpCapture("(?s).*@name (.+?)(?=\\n).*", 1) } /** Gets the id part (without language) of the @id */ string getQueryId() { - result = this.getContents().regexpCapture("(?s).*@id (\\w+)/([\\w\\-]+)\\s.*", 2) + result = this.getContents().regexpCapture("(?s).*@id (\\w+)/([\\w\\-/]+)\\s.*", 2) } /** Gets the language of the @id */ string getQueryLanguage() { - result = this.getContents().regexpCapture("(?s).*@id (\\w+)/([\\w\\-]+)\\s.*", 1) + result = this.getContents().regexpCapture("(?s).*@id (\\w+)/([\\w\\-/]+)\\s.*", 1) } } diff --git a/ql/scripts/create-extractor-pack.ps1 b/ql/scripts/create-extractor-pack.ps1 index 1229621c2c1..5c2d9777d71 100644 --- a/ql/scripts/create-extractor-pack.ps1 +++ b/ql/scripts/create-extractor-pack.ps1 @@ -1,6 +1,6 @@ cargo build --release -cargo run --release --bin generator -- --dbscheme ql/src/ql.dbscheme --library ql/src/codeql_ql/ast/internal/TreeSitter.qll +cargo run --release --bin codeql-extractor-ql -- generate --dbscheme ql/src/ql.dbscheme --library ql/src/codeql_ql/ast/internal/TreeSitter.qll codeql query format -i ql\src\codeql_ql\ast\internal\TreeSitter.qll if (Test-Path -Path extractor-pack) { @@ -10,5 +10,4 @@ mkdir extractor-pack | Out-Null cp codeql-extractor.yml, ql\src\ql.dbscheme, ql\src\ql.dbscheme.stats extractor-pack cp -Recurse tools extractor-pack mkdir extractor-pack\tools\win64 | Out-Null -cp target\release\extractor.exe extractor-pack\tools\win64\extractor.exe -cp target\release\autobuilder.exe extractor-pack\tools\win64\autobuilder.exe +cp target\release\codeql-extractor-ql.exe extractor-pack\tools\win64\extractor.exe diff --git a/ql/scripts/create-extractor-pack.sh b/ql/scripts/create-extractor-pack.sh index 01fbc2ad5a7..07a5b5da0be 100755 --- a/ql/scripts/create-extractor-pack.sh +++ b/ql/scripts/create-extractor-pack.sh @@ -20,12 +20,11 @@ else fi cargo build --release -cargo run --release --bin generator -- --dbscheme ql/src/ql.dbscheme --library ql/src/codeql_ql/ast/internal/TreeSitter.qll +cargo run --release --bin codeql-extractor-ql -- generate --dbscheme ql/src/ql.dbscheme --library ql/src/codeql_ql/ast/internal/TreeSitter.qll $CODEQL_BINARY query format -i ql/src/codeql_ql/ast/internal/TreeSitter.qll rm -rf extractor-pack mkdir -p extractor-pack cp -r codeql-extractor.yml tools ql/src/ql.dbscheme ql/src/ql.dbscheme.stats extractor-pack/ mkdir -p extractor-pack/tools/${platform} -cp target/release/extractor extractor-pack/tools/${platform}/extractor -cp target/release/autobuilder extractor-pack/tools/${platform}/autobuilder +cp target/release/codeql-extractor-ql extractor-pack/tools/${platform}/extractor diff --git a/ql/tools/autobuild.cmd b/ql/tools/autobuild.cmd index 1b8defd6d85..d3d642a4200 100644 --- a/ql/tools/autobuild.cmd +++ b/ql/tools/autobuild.cmd @@ -1,5 +1,5 @@ @echo off -type NUL && "%CODEQL_EXTRACTOR_QL_ROOT%\tools\%CODEQL_PLATFORM%\autobuilder" +type NUL && "%CODEQL_EXTRACTOR_QL_ROOT%\tools\%CODEQL_PLATFORM%\extractor" autobuild exit /b %ERRORLEVEL% diff --git a/ql/tools/autobuild.sh b/ql/tools/autobuild.sh index 650236bedad..74bf7bbd8f2 100755 --- a/ql/tools/autobuild.sh +++ b/ql/tools/autobuild.sh @@ -1,4 +1,4 @@ #!/bin/sh -exec "${CODEQL_EXTRACTOR_QL_ROOT}/tools/${CODEQL_PLATFORM}/autobuilder" +exec "${CODEQL_EXTRACTOR_QL_ROOT}/tools/${CODEQL_PLATFORM}/extractor" autobuild diff --git a/ql/tools/index-files.cmd b/ql/tools/index-files.cmd index f34b06f2aed..1e52d724af1 100644 --- a/ql/tools/index-files.cmd +++ b/ql/tools/index-files.cmd @@ -1,6 +1,7 @@ @echo off type NUL && "%CODEQL_EXTRACTOR_QL_ROOT%\tools\win64\extractor.exe" ^ + extract ^ --file-list "%1" ^ --source-archive-dir "%CODEQL_EXTRACTOR_QL_SOURCE_ARCHIVE_DIR%" ^ --output-dir "%CODEQL_EXTRACTOR_QL_TRAP_DIR%" diff --git a/ql/tools/index-files.sh b/ql/tools/index-files.sh index c4bff226747..1c33c94be9a 100755 --- a/ql/tools/index-files.sh +++ b/ql/tools/index-files.sh @@ -3,6 +3,7 @@ set -eu exec "${CODEQL_EXTRACTOR_QL_ROOT}/tools/${CODEQL_PLATFORM}/extractor" \ + extract \ --file-list "$1" \ --source-archive-dir "$CODEQL_EXTRACTOR_QL_SOURCE_ARCHIVE_DIR" \ --output-dir "$CODEQL_EXTRACTOR_QL_TRAP_DIR" diff --git a/ruby/Makefile b/ruby/Makefile index f106d42a3bf..5759d4fd64b 100644 --- a/ruby/Makefile +++ b/ruby/Makefile @@ -24,7 +24,7 @@ FILES=codeql-extractor.yml\ ql/lib/ruby.dbscheme.stats\ ql/lib/ruby.dbscheme -BIN_FILES=target/release/ruby-extractor$(EXE) target/release/ruby-autobuilder$(EXE) +BIN_FILES=target/release/codeql-extractor-ruby$(EXE) extractor-common: rm -rf build @@ -37,15 +37,14 @@ extractor-common: tools: $(BIN_FILES) rm -rf tools/bin mkdir tools/bin - cp -r target/release/ruby-autobuilder$(EXE) tools/bin/autobuilder$(EXE) - cp -r target/release/ruby-extractor$(EXE) tools/bin/extractor$(EXE) + cp -r target/release/codeql-extractor-ruby$(EXE) tools/bin/extractor$(EXE) target/release/%$(EXE): cd extractor && cargo build --release dbscheme: cd extractor && cargo build --release - extractor/target/release/generator --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll + extractor/target/release/codeql-extractor-ruby generate --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll codeql query format -i ql/lib/codeql/ruby/ast/internal/TreeSitter.qll .PHONY: extractor @@ -63,8 +62,7 @@ extractor: $(FILES) $(BIN_FILES) cp tools/autobuild.cmd extractor-pack/tools/autobuild.cmd cp ql/lib/ruby.dbscheme.stats extractor-pack/ruby.dbscheme.stats cp ql/lib/ruby.dbscheme extractor-pack/ruby.dbscheme - cp extractor/target/release/extractor$(EXE) extractor-pack/tools/$(CODEQL_PLATFORM)/extractor$(EXE) - cp extractor/target/release/autobuilder$(EXE) extractor-pack/tools/$(CODEQL_PLATFORM)/autobuilder$(EXE) + cp extractor/target/release/codeql-extractor-ruby$(EXE) extractor-pack/tools/$(CODEQL_PLATFORM)/extractor$(EXE) test: extractor dbscheme codeql test run --check-databases --check-unused-labels --check-repeated-labels --check-redefined-labels --check-use-before-definition --search-path extractor-pack --consistency-queries ql/consistency-queries ql/test diff --git a/ruby/extractor/Cargo.lock b/ruby/extractor/Cargo.lock index 500e73653e9..85c546b9b96 100644 Binary files a/ruby/extractor/Cargo.lock and b/ruby/extractor/Cargo.lock differ diff --git a/ruby/extractor/Cargo.toml b/ruby/extractor/Cargo.toml index cdd26b74ea1..133233f2f14 100644 --- a/ruby/extractor/Cargo.toml +++ b/ruby/extractor/Cargo.toml @@ -1,5 +1,6 @@ [package] -name = "ruby-extractor" +name = "codeql-extractor-ruby" +description = "CodeQL Ruby extractor" version = "0.1.0" authors = ["GitHub"] edition = "2018" @@ -10,7 +11,7 @@ edition = "2018" tree-sitter = "0.20" tree-sitter-embedded-template = { git = "https://github.com/tree-sitter/tree-sitter-embedded-template.git", rev = "203f7bd3c1bbfbd98fc19add4b8fcb213c059205" } tree-sitter-ruby = { git = "https://github.com/tree-sitter/tree-sitter-ruby.git", rev = "206c7077164372c596ffa8eaadb9435c28941364" } -clap = "4.2" +clap = { version = "4.2", features = ["derive"] } tracing = "0.1" tracing-subscriber = { version = "0.3.3", features = ["env-filter"] } rayon = "1.5.0" diff --git a/ruby/extractor/src/bin/autobuilder.rs b/ruby/extractor/src/autobuilder.rs similarity index 87% rename from ruby/extractor/src/bin/autobuilder.rs rename to ruby/extractor/src/autobuilder.rs index ae4aa816190..48db694df99 100644 --- a/ruby/extractor/src/bin/autobuilder.rs +++ b/ruby/extractor/src/autobuilder.rs @@ -1,8 +1,13 @@ +use clap::Args; use std::env; use std::path::PathBuf; use std::process::Command; -fn main() -> std::io::Result<()> { +#[derive(Args)] +// The autobuilder takes no command-line options, but this may change in the future. +pub struct Options {} + +pub fn run(_: Options) -> std::io::Result<()> { let dist = env::var("CODEQL_DIST").expect("CODEQL_DIST not set"); let db = env::var("CODEQL_EXTRACTOR_RUBY_WIP_DATABASE") .expect("CODEQL_EXTRACTOR_RUBY_WIP_DATABASE not set"); diff --git a/ruby/extractor/src/bin/generator.rs b/ruby/extractor/src/bin/generator.rs deleted file mode 100644 index fe05b7dab8c..00000000000 --- a/ruby/extractor/src/bin/generator.rs +++ /dev/null @@ -1,43 +0,0 @@ -use clap::arg; -use std::path::PathBuf; - -use codeql_extractor::generator::{generate, language::Language}; - -fn main() -> std::io::Result<()> { - tracing_subscriber::fmt() - .with_target(false) - .without_time() - .with_level(true) - .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) - .init(); - - let matches = clap::Command::new("Ruby dbscheme generator") - .version("1.0") - .author("GitHub") - .about("CodeQL Ruby dbscheme generator") - .arg(arg!(--dbscheme "Path of the generated dbscheme file")) - .arg(arg!(--library "Path of the generated QLL file")) - .get_matches(); - let dbscheme_path = matches - .get_one::("dbscheme") - .expect("missing --dbscheme"); - let dbscheme_path = PathBuf::from(dbscheme_path); - - let ql_library_path = matches - .get_one::("library") - .expect("missing --library"); - let ql_library_path = PathBuf::from(ql_library_path); - - let languages = vec![ - Language { - name: "Ruby".to_owned(), - node_types: tree_sitter_ruby::NODE_TYPES, - }, - Language { - name: "Erb".to_owned(), - node_types: tree_sitter_embedded_template::NODE_TYPES, - }, - ]; - - generate(languages, dbscheme_path, ql_library_path) -} diff --git a/ruby/extractor/src/bin/extractor.rs b/ruby/extractor/src/extractor.rs similarity index 94% rename from ruby/extractor/src/bin/extractor.rs rename to ruby/extractor/src/extractor.rs index 2902536390d..0614d25eb16 100644 --- a/ruby/extractor/src/bin/extractor.rs +++ b/ruby/extractor/src/extractor.rs @@ -1,7 +1,5 @@ -#[macro_use] -extern crate lazy_static; - -use clap::arg; +use clap::Args; +use lazy_static::lazy_static; use rayon::prelude::*; use std::borrow::Cow; use std::fs; @@ -11,23 +9,22 @@ use tree_sitter::{Language, Parser, Range}; use codeql_extractor::{diagnostics, extractor, file_paths, node_types, trap}; -lazy_static! { - static ref CP_NUMBER: regex::Regex = regex::Regex::new("cp([0-9]+)").unwrap(); +#[derive(Args)] +pub struct Options { + /// Sets a custom source achive folder + #[arg(long)] + source_archive_dir: String, + + /// Sets a custom trap folder + #[arg(long)] + output_dir: String, + + /// A text file containing the paths of the files to extract + #[arg(long)] + file_list: String, } -/// Returns the `encoding::Encoding` corresponding to the given encoding name, if one exists. -fn encoding_from_name(encoding_name: &str) -> Option<&(dyn encoding::Encoding + Send + Sync)> { - match encoding::label::encoding_from_whatwg_label(encoding_name) { - s @ Some(_) => s, - None => CP_NUMBER.captures(encoding_name).and_then(|cap| { - encoding::label::encoding_from_windows_code_page( - str::parse(cap.get(1).unwrap().as_str()).unwrap(), - ) - }), - } -} - -fn main() -> std::io::Result<()> { +pub fn run(options: Options) -> std::io::Result<()> { tracing_subscriber::fmt() .with_target(false) .without_time() @@ -82,29 +79,11 @@ fn main() -> std::io::Result<()> { .build_global() .unwrap(); - let matches = clap::Command::new("Ruby extractor") - .version("1.0") - .author("GitHub") - .about("CodeQL Ruby extractor") - .arg(arg!(--"source-archive-dir" "Sets a custom source archive folder")) - .arg(arg!(--"output-dir" "Sets a custom trap folder")) - .arg(arg!(--"file-list" "A text file containing the paths of the files to extract")) - .get_matches(); + let src_archive_dir = file_paths::path_from_string(&options.source_archive_dir); - let src_archive_dir = matches - .get_one::("source-archive-dir") - .expect("missing --source-archive-dir"); - let src_archive_dir = file_paths::path_from_string(src_archive_dir); + let trap_dir = file_paths::path_from_string(&options.output_dir); - let trap_dir = matches - .get_one::("output-dir") - .expect("missing --output-dir"); - let trap_dir = file_paths::path_from_string(&trap_dir); - - let file_list = matches - .get_one::("file-list") - .expect("missing --file-list"); - let file_list = fs::File::open(file_paths::path_from_string(&file_list))?; + let file_list = fs::File::open(file_paths::path_from_string(&options.file_list))?; let language = tree_sitter_ruby::language(); let erb = tree_sitter_embedded_template::language(); @@ -242,6 +221,22 @@ fn main() -> std::io::Result<()> { write_trap(&trap_dir, path, &trap_writer, trap_compression) } +lazy_static! { + static ref CP_NUMBER: regex::Regex = regex::Regex::new("cp([0-9]+)").unwrap(); +} + +/// Returns the `encoding::Encoding` corresponding to the given encoding name, if one exists. +fn encoding_from_name(encoding_name: &str) -> Option<&(dyn encoding::Encoding + Send + Sync)> { + match encoding::label::encoding_from_whatwg_label(encoding_name) { + s @ Some(_) => s, + None => CP_NUMBER.captures(encoding_name).and_then(|cap| { + encoding::label::encoding_from_windows_code_page( + str::parse(cap.get(1).unwrap().as_str()).unwrap(), + ) + }), + } +} + fn write_trap( trap_dir: &Path, path: PathBuf, diff --git a/ruby/extractor/src/generator.rs b/ruby/extractor/src/generator.rs new file mode 100644 index 00000000000..485dbd56b59 --- /dev/null +++ b/ruby/extractor/src/generator.rs @@ -0,0 +1,37 @@ +use clap::Args; +use std::path::PathBuf; + +use codeql_extractor::generator::{generate, language::Language}; + +#[derive(Args)] +pub struct Options { + /// Path of the generated dbscheme file + #[arg(long)] + dbscheme: PathBuf, + + /// Path of the generated QLL file + #[arg(long)] + library: PathBuf, +} + +pub fn run(options: Options) -> std::io::Result<()> { + tracing_subscriber::fmt() + .with_target(false) + .without_time() + .with_level(true) + .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) + .init(); + + let languages = vec![ + Language { + name: "Ruby".to_owned(), + node_types: tree_sitter_ruby::NODE_TYPES, + }, + Language { + name: "Erb".to_owned(), + node_types: tree_sitter_embedded_template::NODE_TYPES, + }, + ]; + + generate(languages, options.dbscheme, options.library) +} diff --git a/ruby/extractor/src/main.rs b/ruby/extractor/src/main.rs new file mode 100644 index 00000000000..e6721d4e224 --- /dev/null +++ b/ruby/extractor/src/main.rs @@ -0,0 +1,23 @@ +use clap::Parser; + +mod autobuilder; +mod extractor; +mod generator; + +#[derive(Parser)] +#[command(author, version, about)] +enum Cli { + Extract(extractor::Options), + Generate(generator::Options), + Autobuild(autobuilder::Options), +} + +fn main() -> std::io::Result<()> { + let cli = Cli::parse(); + + match cli { + Cli::Extract(options) => extractor::run(options), + Cli::Generate(options) => generator::run(options), + Cli::Autobuild(options) => autobuilder::run(options), + } +} diff --git a/ruby/ql/examples/queries.xml b/ruby/ql/examples/queries.xml deleted file mode 100644 index a7ce9735ef4..00000000000 --- a/ruby/ql/examples/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 55563c30830..2071494bb54 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.1 + +No user-facing changes. + ## 0.6.0 ### Deprecated APIs diff --git a/ruby/ql/lib/change-notes/released/0.6.1.md b/ruby/ql/lib/change-notes/released/0.6.1.md new file mode 100644 index 00000000000..6008e49b8e7 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/0.6.1.md @@ -0,0 +1,3 @@ +## 0.6.1 + +No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index a3f820f884d..80fb0899f64 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.0 +lastReleaseVersion: 0.6.1 diff --git a/ruby/ql/lib/codeql/ruby/ApiGraphs.qll b/ruby/ql/lib/codeql/ruby/ApiGraphs.qll index 35bdf1c25d3..b1320d047cc 100644 --- a/ruby/ql/lib/codeql/ruby/ApiGraphs.qll +++ b/ruby/ql/lib/codeql/ruby/ApiGraphs.qll @@ -99,9 +99,7 @@ module API { */ pragma[inline] DataFlow::Node getAValueReachableFromSource() { - exists(DataFlow::LocalSourceNode src | Impl::use(this, src) | - Impl::trackUseNode(src).flowsTo(result) - ) + result = getAValueReachableFromSourceInline(this) } /** @@ -121,7 +119,10 @@ module API { * end * ``` */ - DataFlow::LocalSourceNode asSource() { Impl::use(this, result) } + pragma[inline] + DataFlow::LocalSourceNode asSource() { + result = pragma[only_bind_out](this).(Node::Internal).asSourceInternal() + } /** * Gets a data-flow node where this value leaves the current codebase and flows into an @@ -167,6 +168,7 @@ module API { /** * Gets a call to a method on the receiver represented by this API component. */ + pragma[inline] DataFlow::CallNode getAMethodCall(string method) { result = this.getReturn(method).asSource() } /** @@ -177,15 +179,20 @@ module API { * - A submodule of a module * - An attribute of an object */ - bindingset[m] - bindingset[result] - Node getMember(string m) { result = this.getASuccessor(Label::member(m)) } + pragma[inline] + Node getMember(string m) { + result = pragma[only_bind_out](this).(Node::Internal).getMemberInternal(m) + } /** * Gets a node representing a member of this API component where the name of the member may * or may not be known statically. */ - Node getAMember() { result = this.getASuccessor(Label::member(_)) } + cached + Node getAMember() { + Impl::forceCachingInSameStage() and + result = this.getASuccessor(Label::member(_)) + } /** * Gets a node representing an instance of this API component, that is, an object whose @@ -198,41 +205,54 @@ module API { * This predicate may have multiple results when there are multiple constructor calls invoking this API component. * Consider using `getAnInstantiation()` if there is a need to distinguish between individual constructor calls. */ + pragma[inline] Node getInstance() { result = this.getASubclass().getReturn("new") } /** * Gets a node representing a call to `method` on the receiver represented by this node. */ + pragma[inline] MethodAccessNode getMethod(string method) { - result = this.getASubclass().getASuccessor(Label::method(method)) + result = pragma[only_bind_out](this).(Node::Internal).getMethodInternal(method) } /** * Gets a node representing the result of this call. */ - Node getReturn() { result = this.getASuccessor(Label::return()) } + pragma[inline] + Node getReturn() { result = pragma[only_bind_out](this).(Node::Internal).getReturnInternal() } /** * Gets a node representing the result of calling a method on the receiver represented by this node. */ + pragma[inline] Node getReturn(string method) { result = this.getMethod(method).getReturn() } /** Gets an API node representing the `n`th positional parameter. */ - pragma[nomagic] - Node getParameter(int n) { result = this.getASuccessor(Label::parameter(n)) } + cached + Node getParameter(int n) { + Impl::forceCachingInSameStage() and + result = this.getASuccessor(Label::parameter(n)) + } /** Gets an API node representing the given keyword parameter. */ - pragma[nomagic] + cached Node getKeywordParameter(string name) { + Impl::forceCachingInSameStage() and result = this.getASuccessor(Label::keywordParameter(name)) } /** Gets an API node representing the block parameter. */ - Node getBlock() { result = this.getASuccessor(Label::blockParameter()) } + cached + Node getBlock() { + Impl::forceCachingInSameStage() and + result = this.getASuccessor(Label::blockParameter()) + } /** * Gets a `new` call to the function represented by this API component. */ + pragma[inline] DataFlow::ExprNode getAnInstantiation() { result = this.getInstance().asSource() } /** @@ -255,12 +275,17 @@ module API { * ``` * In the example above, `getMember("A").getAnImmediateSubclass()` will return uses of `B` only. */ - Node getAnImmediateSubclass() { result = this.getASuccessor(Label::subclass()) } + cached + Node getAnImmediateSubclass() { + Impl::forceCachingInSameStage() and result = this.getASuccessor(Label::subclass()) + } /** * Gets a node representing the `content` stored on the base object. */ + cached Node getContent(DataFlow::Content content) { + Impl::forceCachingInSameStage() and result = this.getASuccessor(Label::content(content)) } @@ -274,10 +299,16 @@ module API { } /** Gets a node representing the instance field of the given `name`, which must include the `@` character. */ - Node getField(string name) { result = this.getContent(DataFlowPrivate::TFieldContent(name)) } + cached + Node getField(string name) { + Impl::forceCachingInSameStage() and + result = this.getContent(DataFlowPrivate::TFieldContent(name)) + } /** Gets a node representing an element of this collection (known or unknown). */ + cached Node getAnElement() { + Impl::forceCachingInSameStage() and result = this.getContents(any(DataFlow::ContentSet set | set.isAnyElement())) } @@ -328,6 +359,11 @@ module API { Location getLocation() { result = this.getInducingNode().getLocation() or + exists(DataFlow::ModuleNode mod | + this = Impl::MkModuleObject(mod) and + result = mod.getLocation() + ) + or // For nodes that do not have a meaningful location, `path` is the empty string and all other // parameters are zero. not exists(this.getInducingNode()) and @@ -337,7 +373,7 @@ module API { /** * Gets a textual representation of this element. */ - abstract string toString(); + string toString() { none() } /** * Gets a path of the given `length` from the root to this node. @@ -363,6 +399,65 @@ module API { int getDepth() { result = Impl::distanceFromRoot(this) } } + /** Companion module to the `Node` class. */ + module Node { + /** + * INTERNAL USE ONLY. + * + * An API node, with some internal predicates exposed. + */ + class Internal extends Node { + /** + * INTERNAL USE ONLY. + * + * Same as `asSource()` but without join-order hints. + */ + cached + DataFlow::LocalSourceNode asSourceInternal() { + Impl::forceCachingInSameStage() and + Impl::use(this, result) + } + + /** + * Same as `getMember` but without join-order hints. + */ + cached + Node getMemberInternal(string m) { + Impl::forceCachingInSameStage() and + result = this.getASuccessor(Label::member(m)) + } + + /** + * Same as `getMethod` but without join-order hints. + */ + cached + MethodAccessNode getMethodInternal(string method) { + Impl::forceCachingInSameStage() and + result = this.getASubclass().getASuccessor(Label::method(method)) + } + + /** + * INTERNAL USE ONLY. + * + * Same as `getReturn()` but without join-order hints. + */ + cached + Node getReturnInternal() { + Impl::forceCachingInSameStage() and result = this.getASuccessor(Label::return()) + } + } + } + + bindingset[node] + pragma[inline_late] + private DataFlow::Node getAValueReachableFromSourceInline(Node node) { + exists(DataFlow::LocalSourceNode src, DataFlow::LocalSourceNode dst | + Impl::use(node, pragma[only_bind_into](src)) and + pragma[only_bind_into](dst) = Impl::trackUseNode(src) and + dst.flowsTo(result) + ) + } + /** The root node of an API graph. */ class Root extends Node, Impl::MkRoot { override string toString() { result = "root" } @@ -443,7 +538,10 @@ module API { * you should use `.getMember` on the parent module/class. For example, for nodes corresponding to the class `Gem::Version`, * use `getTopLevelMember("Gem").getMember("Version")`. */ - Node getTopLevelMember(string m) { result = root().getMember(m) } + cached + Node getTopLevelMember(string m) { + Impl::forceCachingInSameStage() and result = root().(Node::Internal).getMemberInternal(m) + } /** * Provides the actual implementation of API graphs, cached for performance. @@ -469,6 +567,36 @@ module API { */ cached private module Impl { + cached + predicate forceCachingInSameStage() { any() } + + cached + predicate forceCachingBackref() { + 1 = 1 + or + exists(getTopLevelMember(_)) + or + exists( + any(Node n) + .(Node::Internal) + .getMemberInternal("foo") + .getAMember() + .(Node::Internal) + .getMethodInternal("foo") + .(Node::Internal) + .getReturnInternal() + .getParameter(0) + .getKeywordParameter("foo") + .getBlock() + .getAnImmediateSubclass() + .getContent(_) + .getField(_) + .getAnElement() + .(Node::Internal) + .asSourceInternal() + ) + } + cached newtype TApiNode = /** The root of the API graph. */ @@ -478,7 +606,9 @@ module API { /** A use of an API member at the node `nd`. */ MkUse(DataFlow::Node nd) { isUse(nd) } or /** A value that escapes into an external library at the node `nd` */ - MkDef(DataFlow::Node nd) { isDef(nd) } + MkDef(DataFlow::Node nd) { isDef(nd) } or + /** A module object seen as a use node. */ + MkModuleObject(DataFlow::ModuleNode mod) private string resolveTopLevel(ConstantReadAccess read) { result = read.getModule().getQualifiedName() and @@ -561,7 +691,14 @@ module API { * Holds if `ref` is a use of node `nd`. */ cached - predicate use(TApiNode nd, DataFlow::Node ref) { nd = MkUse(ref) } + predicate use(TApiNode nd, DataFlow::Node ref) { + nd = MkUse(ref) + or + exists(DataFlow::ModuleNode mod | + nd = MkModuleObject(mod) and + ref = mod.getAnImmediateReference() + ) + } /** * Holds if `rhs` is a RHS of node `nd`. @@ -679,6 +816,14 @@ module API { trackUseNode(use).flowsTo(call.getReceiver()) } + /** + * Holds if `superclass` is the superclass of `mod`. + */ + pragma[nomagic] + private predicate superclassNode(DataFlow::ModuleNode mod, DataFlow::Node superclass) { + superclass.asExpr().getExpr() = mod.getADeclaration().(ClassDeclaration).getSuperclassExpr() + } + /** * Holds if there is an edge from `pred` to `succ` in the API graph that is labeled with `lbl`. */ @@ -690,38 +835,35 @@ module API { useRoot(lbl, ref) or exists(DataFlow::Node node, DataFlow::Node src | - pred = MkUse(src) and + use(pred, src) and trackUseNode(src).flowsTo(node) and useStep(lbl, node, ref) ) or exists(DataFlow::Node callback | - pred = MkDef(callback) and + def(pred, callback) and parameterStep(lbl, trackDefNode(callback), ref) ) ) or exists(DataFlow::Node predNode, DataFlow::Node succNode | def(pred, predNode) and - def(succ, succNode) and + succ = MkDef(succNode) and defStep(lbl, trackDefNode(predNode), succNode) ) or - // `pred` is a use of class A - // `succ` is a use of class B - // there exists a class declaration B < A - exists(ClassDeclaration c, DataFlow::Node a, DataFlow::Node b | - use(pred, a) and - use(succ, b) and - b.asExpr().getExpr().(ConstantReadAccess).getAQualifiedName() = c.getAQualifiedName() and - pragma[only_bind_into](c).getSuperclassExpr() = a.asExpr().getExpr() and + exists(DataFlow::Node predNode, DataFlow::Node superclassNode, DataFlow::ModuleNode mod | + use(pred, predNode) and + trackUseNode(predNode).flowsTo(superclassNode) and + superclassNode(mod, superclassNode) and + succ = MkModuleObject(mod) and lbl = Label::subclass() ) or exists(DataFlow::CallNode call | // from receiver to method call node exists(DataFlow::Node receiver | - pred = MkUse(receiver) and + use(pred, receiver) and useNodeReachesReceiver(receiver, call) and lbl = Label::method(call.getMethodName()) and succ = MkMethodAccessNode(call) diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll index 6c92f401001..47a119ab951 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll @@ -952,6 +952,8 @@ private module DestructuredAssignDesugar { } abstract private class LhsWithReceiver extends Expr { + LhsWithReceiver() { this = any(DestructuredAssignExpr dae).getElement(_) } + abstract Expr getReceiver(); abstract SynthKind getSynthKind(); @@ -960,8 +962,14 @@ private module DestructuredAssignDesugar { private class LhsCall extends LhsWithReceiver instanceof MethodCall { final override Expr getReceiver() { result = MethodCall.super.getReceiver() } + pragma[nomagic] + private string getMethodName(int args) { + result = super.getMethodName() and + args = super.getNumberOfArguments() + } + final override SynthKind getSynthKind() { - result = MethodCallKind(super.getMethodName(), false, super.getNumberOfArguments()) + exists(int args | result = MethodCallKind(this.getMethodName(args), false, args)) } } @@ -1154,9 +1162,7 @@ private module DestructuredAssignDesugar { ) } - final override predicate excludeFromControlFlowTree(AstNode n) { - n = any(DestructuredAssignExpr tae).getElement(_).(LhsWithReceiver) - } + final override predicate excludeFromControlFlowTree(AstNode n) { n instanceof LhsWithReceiver } } } @@ -1169,12 +1175,11 @@ private module ArrayLiteralDesugar { child = SynthChild(MethodCallKind("[]", false, al.getNumberOfElements())) or parent = TMethodCallSynth(al, -1, _, _, _) and - ( - i = 0 and - child = SynthChild(ConstantReadAccessKind("::Array")) - or - child = childRef(al.getElement(i - 1)) - ) + i = 0 and + child = SynthChild(ConstantReadAccessKind("::Array")) + or + parent = TMethodCallSynth(al, -1, _, _, _) and + child = childRef(al.getElement(i - 1)) ) } @@ -1212,12 +1217,11 @@ private module HashLiteralDesugar { child = SynthChild(MethodCallKind("[]", false, hl.getNumberOfElements())) or parent = TMethodCallSynth(hl, -1, _, _, _) and - ( - i = 0 and - child = SynthChild(ConstantReadAccessKind("::Hash")) - or - child = childRef(hl.getElement(i - 1)) - ) + i = 0 and + child = SynthChild(ConstantReadAccessKind("::Hash")) + or + parent = TMethodCallSynth(hl, -1, _, _, _) and + child = childRef(hl.getElement(i - 1)) ) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll index 865d7b4d6ce..f34554d6eea 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll @@ -361,3 +361,52 @@ module MergePathGraph< } } } + +/** + * Constructs a `PathGraph` from three `PathGraph`s by disjoint union. + */ +module MergePathGraph3< + PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3, + PathGraphSig Graph1, PathGraphSig Graph2, PathGraphSig Graph3> +{ + private module MergedInner = MergePathGraph; + + private module Merged = + MergePathGraph; + + /** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */ + class PathNode instanceof Merged::PathNode { + /** Gets this as a projection on the first given `PathGraph`. */ + PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() } + + /** Gets this as a projection on the second given `PathGraph`. */ + PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() } + + /** Gets this as a projection on the third given `PathGraph`. */ + PathNode3 asPathNode3() { result = super.asPathNode2() } + + /** Gets a textual representation of this element. */ + string toString() { result = super.toString() } + + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + Node getNode() { result = super.getNode() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PathGraph = Merged::PathGraph; +} diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll index e81c83a0b6d..0a52c075dc2 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll @@ -191,13 +191,7 @@ private predicate moduleFlowsToMethodCallReceiver(RelevantCall call, Module m, s flowsToMethodCallReceiver(call, trackModuleAccess(m), method) } -private Block yieldCall(RelevantCall call) { - call.getExpr() instanceof YieldCall and - exists(BlockParameterNode node | - node = trackBlock(result) and - node.getMethod() = call.getExpr().getEnclosingMethod() - ) -} +private Block blockCall(RelevantCall call) { lambdaSourceCall(call, _, trackBlock(result)) } pragma[nomagic] private predicate superCall(RelevantCall call, Module cls, string method) { @@ -297,7 +291,7 @@ predicate isUserDefinedNew(SingletonMethod new) { private Callable viableSourceCallableNonInit(RelevantCall call) { result = getTarget(call) and - not call.getExpr() instanceof YieldCall // handled by `lambdaCreation`/`lambdaCall` + not result = blockCall(call) // handled by `lambdaCreation`/`lambdaCall` } private Callable viableSourceCallableInit(RelevantCall call) { result = getInitializeTarget(call) } @@ -394,7 +388,7 @@ private module Cached { result = lookupMethod(cls.getAnImmediateAncestor(), method) ) or - result = yieldCall(call) + result = blockCall(call) } /** Gets a viable run-time target for the call `call`. */ @@ -700,13 +694,19 @@ private DataFlow::LocalSourceNode trackBlock(Block block, TypeTracker t) { t.start() and result.asExpr().getExpr() = block or exists(TypeTracker t2, StepSummary summary | - result = trackBlockRec(block, t2, summary) and t = t2.append(summary) + result = trackBlockRec(block, t2, summary) and + t = t2.append(summary) ) } +/** + * We exclude steps into `self` parameters, which may happen when the code + * base contains implementations of `call`. + */ pragma[nomagic] private DataFlow::LocalSourceNode trackBlockRec(Block block, TypeTracker t, StepSummary summary) { - StepSummary::step(trackBlock(block, t), result, summary) + StepSummary::step(trackBlock(block, t), result, summary) and + not result instanceof SelfParameterNode } pragma[nomagic] diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll index 6ea97954bdf..cd8e992c980 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll @@ -3031,6 +3031,17 @@ module Impl { this instanceof PathNodeSinkGroup } + private string ppType() { + this instanceof PathNodeSink and result = "" + or + this.(PathNodeMid).getAp() instanceof AccessPathNil and result = "" + or + exists(DataFlowType t | t = this.(PathNodeMid).getAp().getHead().getContainerType() | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { this instanceof PathNodeSink and result = "" or @@ -3046,14 +3057,14 @@ module Impl { } /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -3998,14 +4009,14 @@ module Impl { */ class PartialPathNode extends TPartialPathNode { /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -4046,6 +4057,19 @@ module Impl { */ int getSinkDistance() { result = distSink(this.getNodeEx().getEnclosingCallable()) } + private string ppType() { + this instanceof PartialPathNodeRev and result = "" + or + this.(PartialPathNodeFwd).getAp() instanceof PartialAccessPathNil and result = "" + or + exists(DataFlowType t | + t = this.(PartialPathNodeFwd).getAp().(PartialAccessPathCons).getType() + | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { exists(string s | s = this.(PartialPathNodeFwd).getAp().toString() or diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 86bc852200d..39db6bda36c 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -1279,7 +1279,7 @@ class DataFlowType extends TDataFlowType { DataFlowType getNodeType(NodeImpl n) { result = TTodoDataFlowType() and exists(n) } /** Gets a string representation of a `DataFlowType`. */ -string ppReprType(DataFlowType t) { result = t.toString() } +string ppReprType(DataFlowType t) { none() } /** * Holds if `t1` and `t2` are compatible, that is, whether data can flow from @@ -1377,18 +1377,28 @@ predicate lambdaCreation(Node creation, LambdaCallKind kind, DataFlowCallable c) ) } -/** Holds if `call` is a lambda call of kind `kind` where `receiver` is the lambda expression. */ -predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { +/** + * Holds if `call` is a from-source lambda call of kind `kind` where `receiver` + * is the lambda expression. + */ +predicate lambdaSourceCall(CfgNodes::ExprNodes::CallCfgNode call, LambdaCallKind kind, Node receiver) { kind = TYieldCallKind() and - receiver.(BlockParameterNode).getMethod() = - call.asCall().getExpr().(YieldCall).getEnclosingMethod() + receiver.(BlockParameterNode).getMethod() = call.getExpr().(YieldCall).getEnclosingMethod() or kind = TLambdaCallKind() and - call.asCall() = + call = any(CfgNodes::ExprNodes::MethodCallCfgNode mc | receiver.asExpr() = mc.getReceiver() and mc.getExpr().getMethodName() = "call" ) +} + +/** + * Holds if `call` is a (from-source or from-summary) lambda call of kind `kind` + * where `receiver` is the lambda expression. + */ +predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { + lambdaSourceCall(call.asCall(), kind, receiver) or receiver = call.(SummaryCall).getReceiver() and if receiver.(ParameterNodeImpl).isParameterOf(_, any(ParameterPosition pos | pos.isBlock())) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll index 418e3f621d2..9d668e0b300 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll @@ -890,6 +890,9 @@ class ModuleNode instanceof Module { /** Gets a constant or `self` variable that refers to this module. */ LocalSourceNode getAnImmediateReference() { result.asExpr().getExpr() = super.getAnImmediateReference() + or + // Include 'self' parameters; these are not expressions and so not found by the case above + result = this.getAnOwnModuleSelf() } /** diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll index 1e10c2273f5..480a1f78035 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll @@ -511,6 +511,23 @@ ActionControllerClass getAssociatedControllerClass(ErbFile f) { ) } +pragma[nomagic] +private string getActionControllerClassRelativePath(ActionControllerClass cls) { + result = cls.getLocation().getFile().getRelativePath() +} + +pragma[nomagic] +private string getErbFileRelativePath(ErbFile templateFile) { + result = templateFile.getRelativePath() and + result.matches("%app/views/layouts/%") +} + +bindingset[result] +pragma[inline_late] +private string getErbFileRelativePathInlineLate(ErbFile templateFile) { + result = getErbFileRelativePath(templateFile) +} + // TODO: improve layout support, e.g. for `layout` method // https://guides.rubyonrails.org/layouts_and_rendering.html /** @@ -522,15 +539,18 @@ ActionControllerClass getAssociatedControllerClass(ErbFile f) { */ predicate controllerTemplateFile(ActionControllerClass cls, ErbFile templateFile) { exists(string sourcePrefix, string subPath, string controllerPath | - controllerPath = cls.getLocation().getFile().getRelativePath() and + controllerPath = getActionControllerClassRelativePath(cls) and // `sourcePrefix` is either a prefix path ending in a slash, or empty if // the rails app is at the source root sourcePrefix = [controllerPath.regexpCapture("^(.*/)app/controllers/(?:.*?)/(?:[^/]*)$", 1), ""] and - controllerPath = sourcePrefix + "app/controllers/" + subPath + "_controller.rb" and - ( - sourcePrefix + "app/views/" + subPath = templateFile.getParentContainer().getRelativePath() - or - templateFile.getRelativePath().matches(sourcePrefix + "app/views/layouts/" + subPath + "%") + controllerPath = sourcePrefix + "app/controllers/" + subPath + "_controller.rb" + | + sourcePrefix + "app/views/" + subPath = templateFile.getParentContainer().getRelativePath() + or + exists(string path | + path = getErbFileRelativePath(_) and + path.matches(sourcePrefix + "app/views/layouts/" + subPath + "%") and + path = getErbFileRelativePathInlineLate(templateFile) ) ) } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll index 7317196ce1b..5869486ac91 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll @@ -40,7 +40,7 @@ private API::Node activeRecordClassApiNode() { // In Rails applications `ApplicationRecord` typically extends `ActiveRecord::Base`, but we // treat it separately in case the `ApplicationRecord` definition is not in the database. API::getTopLevelMember("ApplicationRecord") - ].getASubclass() + ] } /** @@ -58,7 +58,7 @@ private API::Node activeRecordClassApiNode() { class ActiveRecordModelClass extends ClassDeclaration { ActiveRecordModelClass() { this.getSuperclassExpr() = - activeRecordClassApiNode().getAValueReachableFromSource().asExpr().getExpr() + activeRecordClassApiNode().getASubclass().getAValueReachableFromSource().asExpr().getExpr() } // Gets the class declaration for this class and all of its super classes diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveResource.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveResource.qll index 61ce4b862f9..96219915770 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActiveResource.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveResource.qll @@ -17,8 +17,9 @@ module ActiveResource { /** * An ActiveResource model class. This is any (transitive) subclass of ActiveResource. */ + pragma[nomagic] private API::Node modelApiNode() { - result = API::getTopLevelMember("ActiveResource").getMember("Base").getASubclass+() + result = API::getTopLevelMember("ActiveResource").getMember("Base").getASubclass() } /** diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveStorage.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveStorage.qll index 4dc5aec6b50..d79d086425e 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActiveStorage.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveStorage.qll @@ -85,7 +85,6 @@ module ActiveStorage { // Class methods API::getTopLevelMember("ActiveStorage") .getMember("Blob") - .getASubclass() .getAMethodCall(["create_after_unfurling!", "create_and_upload!"]), // Instance methods any(BlobInstance i, DataFlow::CallNode c | diff --git a/ruby/ql/lib/codeql/ruby/frameworks/GraphQL.qll b/ruby/ql/lib/codeql/ruby/frameworks/GraphQL.qll index daf9a9fb578..8e673c4255d 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/GraphQL.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/GraphQL.qll @@ -42,7 +42,7 @@ private class GraphqlRelayClassicMutationClass extends ClassDeclaration { this.getSuperclassExpr() = graphQlSchema() .getMember("RelayClassicMutation") - .getASubclass*() + .getASubclass() .getAValueReachableFromSource() .asExpr() .getExpr() diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Twirp.qll b/ruby/ql/lib/codeql/ruby/frameworks/Twirp.qll index 38bdac5944f..73ef87f5fd5 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Twirp.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Twirp.qll @@ -18,8 +18,7 @@ module Twirp { */ class ServiceInstantiation extends DataFlow::CallNode { ServiceInstantiation() { - this = - API::getTopLevelMember("Twirp").getMember("Service").getASubclass().getAnInstantiation() + this = API::getTopLevelMember("Twirp").getMember("Service").getAnInstantiation() } /** @@ -62,7 +61,7 @@ module Twirp { */ class ClientInstantiation extends DataFlow::CallNode { ClientInstantiation() { - this = API::getTopLevelMember("Twirp").getMember("Client").getASubclass().getAnInstantiation() + this = API::getTopLevelMember("Twirp").getMember("Client").getAnInstantiation() } } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsSpecific.qll b/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsSpecific.qll index 6627bd3faf1..7f9b7232a76 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsSpecific.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsSpecific.qll @@ -113,16 +113,18 @@ API::Node getExtraNodeFromType(string type) { | suffix = "!" and ( - result.asSource() = constRef + result.(API::Node::Internal).asSourceInternal() = constRef or - result.asSource() = constRef.getADescendentModule().getAnOwnModuleSelf() + result.(API::Node::Internal).asSourceInternal() = + constRef.getADescendentModule().getAnOwnModuleSelf() ) or suffix = "" and ( - result.asSource() = constRef.getAMethodCall("new") + result.(API::Node::Internal).asSourceInternal() = constRef.getAMethodCall("new") or - result.asSource() = constRef.getADescendentModule().getAnInstanceSelf() + result.(API::Node::Internal).asSourceInternal() = + constRef.getADescendentModule().getAnInstanceSelf() ) ) or diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 383dba5ade0..1a9ef01efe2 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 0.6.0 +version: 0.6.1 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index e62e1907f81..20ece6388aa 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.1 + +No user-facing changes. + ## 0.6.0 ### New Queries diff --git a/ruby/ql/src/change-notes/released/0.6.1.md b/ruby/ql/src/change-notes/released/0.6.1.md new file mode 100644 index 00000000000..6008e49b8e7 --- /dev/null +++ b/ruby/ql/src/change-notes/released/0.6.1.md @@ -0,0 +1,3 @@ +## 0.6.1 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index a3f820f884d..80fb0899f64 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.0 +lastReleaseVersion: 0.6.1 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 61f9c05dd83..e6669a5a3ec 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 0.6.0 +version: 0.6.1 groups: - ruby - queries diff --git a/ruby/ql/src/queries.xml b/ruby/ql/src/queries.xml deleted file mode 100644 index a7ce9735ef4..00000000000 --- a/ruby/ql/src/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/ruby/ql/src/queries/security/cwe-078/NonConstantKernelOpen.ql b/ruby/ql/src/queries/security/cwe-078/NonConstantKernelOpen.ql index bdb3527ec47..5360ae1c367 100644 --- a/ruby/ql/src/queries/security/cwe-078/NonConstantKernelOpen.ql +++ b/ruby/ql/src/queries/security/cwe-078/NonConstantKernelOpen.ql @@ -18,23 +18,41 @@ import codeql.ruby.security.KernelOpenQuery import codeql.ruby.AST import codeql.ruby.ApiGraphs +import codeql.ruby.DataFlow from AmbiguousPathCall call where - not hasConstantPrefix(call.getPathArgument().getALocalSource().asExpr().getExpr()) and + call.getNumberOfArguments() > 0 and + not hasConstantPrefix(call.getPathArgument()) and not call.getPathArgument().getALocalSource() = API::getTopLevelMember("File").getAMethodCall("join") select call, "Call to " + call.getName() + " with a non-constant value. Consider replacing it with " + call.getReplacement() + "." -predicate hasConstantPrefix(Expr e) { +predicate hasConstantPrefix(DataFlow::Node node) { + hasConstantPrefix(node.getALocalSource()) + or // if it's a format string, then the first argument is not a constant string - e.(StringlikeLiteral).getComponent(0) instanceof StringTextComponent + node.asExpr().getExpr().(StringlikeLiteral).getComponent(0) instanceof StringTextComponent or // it is not a constant string argument - exists(e.getConstantValue()) + exists(node.getConstantValue()) or // not a concatenation that starts with a constant string - hasConstantPrefix(e.(AddExpr).getLeftOperand()) + exists(DataFlow::ExprNode prefix | + node.asExpr().getExpr().(AddExpr).getLeftOperand() = prefix.asExpr().getExpr() and + hasConstantPrefix(prefix) + ) + or + // is a .freeze call on a constant string + exists(DataFlow::CallNode call | node = call and call.getMethodName() = "freeze" | + hasConstantPrefix(call.getReceiver()) + ) + or + // is a constant read of a constant string + exists(DataFlow::Node constant | + constant.asExpr().getExpr() = node.asExpr().getExpr().(ConstantReadAccess).getValue() and + hasConstantPrefix(constant) + ) } diff --git a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected index 35bbaabef87..f1d10325a46 100644 --- a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected @@ -1,9434 +1,9434 @@ failures edges -| array_flow.rb:2:5:2:5 | a [element 0] : | array_flow.rb:3:10:3:10 | a [element 0] : | -| array_flow.rb:2:5:2:5 | a [element 0] : | array_flow.rb:3:10:3:10 | a [element 0] : | -| array_flow.rb:2:5:2:5 | a [element 0] : | array_flow.rb:5:10:5:10 | a [element 0] : | -| array_flow.rb:2:5:2:5 | a [element 0] : | array_flow.rb:5:10:5:10 | a [element 0] : | -| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:2:5:2:5 | a [element 0] : | -| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:2:5:2:5 | a [element 0] : | -| array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:2:9:2:20 | * ... [element 0] : | -| array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:2:9:2:20 | * ... [element 0] : | -| array_flow.rb:3:10:3:10 | a [element 0] : | array_flow.rb:3:10:3:13 | ...[...] | -| array_flow.rb:3:10:3:10 | a [element 0] : | array_flow.rb:3:10:3:13 | ...[...] | -| array_flow.rb:5:10:5:10 | a [element 0] : | array_flow.rb:5:10:5:13 | ...[...] | -| array_flow.rb:5:10:5:10 | a [element 0] : | array_flow.rb:5:10:5:13 | ...[...] | -| array_flow.rb:9:5:9:5 | a [element 1] : | array_flow.rb:11:10:11:10 | a [element 1] : | -| array_flow.rb:9:5:9:5 | a [element 1] : | array_flow.rb:11:10:11:10 | a [element 1] : | -| array_flow.rb:9:5:9:5 | a [element 1] : | array_flow.rb:13:10:13:10 | a [element 1] : | -| array_flow.rb:9:5:9:5 | a [element 1] : | array_flow.rb:13:10:13:10 | a [element 1] : | -| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:9:5:9:5 | a [element 1] : | -| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:9:5:9:5 | a [element 1] : | -| array_flow.rb:11:10:11:10 | a [element 1] : | array_flow.rb:11:10:11:13 | ...[...] | -| array_flow.rb:11:10:11:10 | a [element 1] : | array_flow.rb:11:10:11:13 | ...[...] | -| array_flow.rb:13:10:13:10 | a [element 1] : | array_flow.rb:13:10:13:13 | ...[...] | -| array_flow.rb:13:10:13:10 | a [element 1] : | array_flow.rb:13:10:13:13 | ...[...] | -| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:18:10:18:10 | a [element] : | -| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:18:10:18:10 | a [element] : | -| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:19:10:19:10 | a [element] : | -| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:19:10:19:10 | a [element] : | -| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:21:19:21:19 | a [element] : | -| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:21:19:21:19 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:17:5:17:5 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:17:5:17:5 | a [element] : | -| array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:17:9:17:33 | call to new [element] : | -| array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:17:9:17:33 | call to new [element] : | -| array_flow.rb:18:10:18:10 | a [element] : | array_flow.rb:18:10:18:13 | ...[...] | -| array_flow.rb:18:10:18:10 | a [element] : | array_flow.rb:18:10:18:13 | ...[...] | -| array_flow.rb:19:10:19:10 | a [element] : | array_flow.rb:19:10:19:13 | ...[...] | -| array_flow.rb:19:10:19:10 | a [element] : | array_flow.rb:19:10:19:13 | ...[...] | -| array_flow.rb:21:5:21:5 | b [element] : | array_flow.rb:22:10:22:10 | b [element] : | -| array_flow.rb:21:5:21:5 | b [element] : | array_flow.rb:22:10:22:10 | b [element] : | -| array_flow.rb:21:5:21:5 | b [element] : | array_flow.rb:23:10:23:10 | b [element] : | -| array_flow.rb:21:5:21:5 | b [element] : | array_flow.rb:23:10:23:10 | b [element] : | -| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:21:5:21:5 | b [element] : | -| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:21:5:21:5 | b [element] : | -| array_flow.rb:21:19:21:19 | a [element] : | array_flow.rb:21:9:21:20 | call to new [element] : | -| array_flow.rb:21:19:21:19 | a [element] : | array_flow.rb:21:9:21:20 | call to new [element] : | -| array_flow.rb:22:10:22:10 | b [element] : | array_flow.rb:22:10:22:13 | ...[...] | -| array_flow.rb:22:10:22:10 | b [element] : | array_flow.rb:22:10:22:13 | ...[...] | -| array_flow.rb:23:10:23:10 | b [element] : | array_flow.rb:23:10:23:13 | ...[...] | -| array_flow.rb:23:10:23:10 | b [element] : | array_flow.rb:23:10:23:13 | ...[...] | -| array_flow.rb:25:5:25:5 | c [element] : | array_flow.rb:28:10:28:10 | c [element] : | -| array_flow.rb:25:5:25:5 | c [element] : | array_flow.rb:28:10:28:10 | c [element] : | -| array_flow.rb:25:5:25:5 | c [element] : | array_flow.rb:29:10:29:10 | c [element] : | -| array_flow.rb:25:5:25:5 | c [element] : | array_flow.rb:29:10:29:10 | c [element] : | -| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:25:5:25:5 | c [element] : | -| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:25:5:25:5 | c [element] : | -| array_flow.rb:26:9:26:19 | call to source : | array_flow.rb:25:9:27:7 | call to new [element] : | -| array_flow.rb:26:9:26:19 | call to source : | array_flow.rb:25:9:27:7 | call to new [element] : | -| array_flow.rb:28:10:28:10 | c [element] : | array_flow.rb:28:10:28:13 | ...[...] | -| array_flow.rb:28:10:28:10 | c [element] : | array_flow.rb:28:10:28:13 | ...[...] | -| array_flow.rb:29:10:29:10 | c [element] : | array_flow.rb:29:10:29:13 | ...[...] | -| array_flow.rb:29:10:29:10 | c [element] : | array_flow.rb:29:10:29:13 | ...[...] | -| array_flow.rb:33:5:33:5 | a [element 0] : | array_flow.rb:34:27:34:27 | a [element 0] : | -| array_flow.rb:33:5:33:5 | a [element 0] : | array_flow.rb:34:27:34:27 | a [element 0] : | -| array_flow.rb:33:10:33:18 | call to source : | array_flow.rb:33:5:33:5 | a [element 0] : | -| array_flow.rb:33:10:33:18 | call to source : | array_flow.rb:33:5:33:5 | a [element 0] : | -| array_flow.rb:34:5:34:5 | b [element 0] : | array_flow.rb:35:10:35:10 | b [element 0] : | -| array_flow.rb:34:5:34:5 | b [element 0] : | array_flow.rb:35:10:35:10 | b [element 0] : | -| array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | array_flow.rb:34:5:34:5 | b [element 0] : | -| array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | array_flow.rb:34:5:34:5 | b [element 0] : | -| array_flow.rb:34:27:34:27 | a [element 0] : | array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | -| array_flow.rb:34:27:34:27 | a [element 0] : | array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | -| array_flow.rb:35:10:35:10 | b [element 0] : | array_flow.rb:35:10:35:13 | ...[...] | -| array_flow.rb:35:10:35:10 | b [element 0] : | array_flow.rb:35:10:35:13 | ...[...] | -| array_flow.rb:40:5:40:5 | a [element 0] : | array_flow.rb:42:9:42:9 | a [element 0] : | -| array_flow.rb:40:5:40:5 | a [element 0] : | array_flow.rb:42:9:42:9 | a [element 0] : | -| array_flow.rb:40:10:40:20 | call to source : | array_flow.rb:40:5:40:5 | a [element 0] : | -| array_flow.rb:40:10:40:20 | call to source : | array_flow.rb:40:5:40:5 | a [element 0] : | -| array_flow.rb:41:5:41:5 | b [element 2] : | array_flow.rb:42:13:42:13 | b [element 2] : | -| array_flow.rb:41:5:41:5 | b [element 2] : | array_flow.rb:42:13:42:13 | b [element 2] : | -| array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:41:5:41:5 | b [element 2] : | -| array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:41:5:41:5 | b [element 2] : | -| array_flow.rb:42:5:42:5 | c [element] : | array_flow.rb:43:10:43:10 | c [element] : | -| array_flow.rb:42:5:42:5 | c [element] : | array_flow.rb:43:10:43:10 | c [element] : | -| array_flow.rb:42:5:42:5 | c [element] : | array_flow.rb:44:10:44:10 | c [element] : | -| array_flow.rb:42:5:42:5 | c [element] : | array_flow.rb:44:10:44:10 | c [element] : | -| array_flow.rb:42:9:42:9 | a [element 0] : | array_flow.rb:42:9:42:13 | ... & ... [element] : | -| array_flow.rb:42:9:42:9 | a [element 0] : | array_flow.rb:42:9:42:13 | ... & ... [element] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:42:5:42:5 | c [element] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:42:5:42:5 | c [element] : | -| array_flow.rb:42:13:42:13 | b [element 2] : | array_flow.rb:42:9:42:13 | ... & ... [element] : | -| array_flow.rb:42:13:42:13 | b [element 2] : | array_flow.rb:42:9:42:13 | ... & ... [element] : | -| array_flow.rb:43:10:43:10 | c [element] : | array_flow.rb:43:10:43:13 | ...[...] | -| array_flow.rb:43:10:43:10 | c [element] : | array_flow.rb:43:10:43:13 | ...[...] | -| array_flow.rb:44:10:44:10 | c [element] : | array_flow.rb:44:10:44:13 | ...[...] | -| array_flow.rb:44:10:44:10 | c [element] : | array_flow.rb:44:10:44:13 | ...[...] | -| array_flow.rb:48:5:48:5 | a [element 0] : | array_flow.rb:49:9:49:9 | a [element 0] : | -| array_flow.rb:48:5:48:5 | a [element 0] : | array_flow.rb:49:9:49:9 | a [element 0] : | -| array_flow.rb:48:10:48:18 | call to source : | array_flow.rb:48:5:48:5 | a [element 0] : | -| array_flow.rb:48:10:48:18 | call to source : | array_flow.rb:48:5:48:5 | a [element 0] : | -| array_flow.rb:49:5:49:5 | b [element] : | array_flow.rb:50:10:50:10 | b [element] : | -| array_flow.rb:49:5:49:5 | b [element] : | array_flow.rb:50:10:50:10 | b [element] : | -| array_flow.rb:49:5:49:5 | b [element] : | array_flow.rb:51:10:51:10 | b [element] : | -| array_flow.rb:49:5:49:5 | b [element] : | array_flow.rb:51:10:51:10 | b [element] : | -| array_flow.rb:49:9:49:9 | a [element 0] : | array_flow.rb:49:9:49:13 | ... * ... [element] : | -| array_flow.rb:49:9:49:9 | a [element 0] : | array_flow.rb:49:9:49:13 | ... * ... [element] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:49:5:49:5 | b [element] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:49:5:49:5 | b [element] : | -| array_flow.rb:50:10:50:10 | b [element] : | array_flow.rb:50:10:50:13 | ...[...] | -| array_flow.rb:50:10:50:10 | b [element] : | array_flow.rb:50:10:50:13 | ...[...] | -| array_flow.rb:51:10:51:10 | b [element] : | array_flow.rb:51:10:51:13 | ...[...] | -| array_flow.rb:51:10:51:10 | b [element] : | array_flow.rb:51:10:51:13 | ...[...] | -| array_flow.rb:55:5:55:5 | a [element 0] : | array_flow.rb:57:9:57:9 | a [element 0] : | -| array_flow.rb:55:5:55:5 | a [element 0] : | array_flow.rb:57:9:57:9 | a [element 0] : | -| array_flow.rb:55:10:55:20 | call to source : | array_flow.rb:55:5:55:5 | a [element 0] : | -| array_flow.rb:55:10:55:20 | call to source : | array_flow.rb:55:5:55:5 | a [element 0] : | -| array_flow.rb:56:5:56:5 | b [element 1] : | array_flow.rb:57:13:57:13 | b [element 1] : | -| array_flow.rb:56:5:56:5 | b [element 1] : | array_flow.rb:57:13:57:13 | b [element 1] : | -| array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:56:5:56:5 | b [element 1] : | -| array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:56:5:56:5 | b [element 1] : | -| array_flow.rb:57:5:57:5 | c [element 0] : | array_flow.rb:58:10:58:10 | c [element 0] : | -| array_flow.rb:57:5:57:5 | c [element 0] : | array_flow.rb:58:10:58:10 | c [element 0] : | -| array_flow.rb:57:5:57:5 | c [element] : | array_flow.rb:58:10:58:10 | c [element] : | -| array_flow.rb:57:5:57:5 | c [element] : | array_flow.rb:58:10:58:10 | c [element] : | -| array_flow.rb:57:5:57:5 | c [element] : | array_flow.rb:59:10:59:10 | c [element] : | -| array_flow.rb:57:5:57:5 | c [element] : | array_flow.rb:59:10:59:10 | c [element] : | -| array_flow.rb:57:9:57:9 | a [element 0] : | array_flow.rb:57:9:57:13 | ... + ... [element 0] : | -| array_flow.rb:57:9:57:9 | a [element 0] : | array_flow.rb:57:9:57:13 | ... + ... [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] : | array_flow.rb:57:5:57:5 | c [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] : | array_flow.rb:57:5:57:5 | c [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:57:5:57:5 | c [element] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:57:5:57:5 | c [element] : | -| array_flow.rb:57:13:57:13 | b [element 1] : | array_flow.rb:57:9:57:13 | ... + ... [element] : | -| array_flow.rb:57:13:57:13 | b [element 1] : | array_flow.rb:57:9:57:13 | ... + ... [element] : | -| array_flow.rb:58:10:58:10 | c [element 0] : | array_flow.rb:58:10:58:13 | ...[...] | -| array_flow.rb:58:10:58:10 | c [element 0] : | array_flow.rb:58:10:58:13 | ...[...] | -| array_flow.rb:58:10:58:10 | c [element] : | array_flow.rb:58:10:58:13 | ...[...] | -| array_flow.rb:58:10:58:10 | c [element] : | array_flow.rb:58:10:58:13 | ...[...] | -| array_flow.rb:59:10:59:10 | c [element] : | array_flow.rb:59:10:59:13 | ...[...] | -| array_flow.rb:59:10:59:10 | c [element] : | array_flow.rb:59:10:59:13 | ...[...] | -| array_flow.rb:63:5:63:5 | a [element 0] : | array_flow.rb:65:9:65:9 | a [element 0] : | -| array_flow.rb:63:5:63:5 | a [element 0] : | array_flow.rb:65:9:65:9 | a [element 0] : | -| array_flow.rb:63:10:63:20 | call to source : | array_flow.rb:63:5:63:5 | a [element 0] : | -| array_flow.rb:63:10:63:20 | call to source : | array_flow.rb:63:5:63:5 | a [element 0] : | -| array_flow.rb:65:5:65:5 | c [element] : | array_flow.rb:66:10:66:10 | c [element] : | -| array_flow.rb:65:5:65:5 | c [element] : | array_flow.rb:66:10:66:10 | c [element] : | -| array_flow.rb:65:5:65:5 | c [element] : | array_flow.rb:67:10:67:10 | c [element] : | -| array_flow.rb:65:5:65:5 | c [element] : | array_flow.rb:67:10:67:10 | c [element] : | -| array_flow.rb:65:9:65:9 | a [element 0] : | array_flow.rb:65:9:65:13 | ... - ... [element] : | -| array_flow.rb:65:9:65:9 | a [element 0] : | array_flow.rb:65:9:65:13 | ... - ... [element] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:65:5:65:5 | c [element] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:65:5:65:5 | c [element] : | -| array_flow.rb:66:10:66:10 | c [element] : | array_flow.rb:66:10:66:13 | ...[...] | -| array_flow.rb:66:10:66:10 | c [element] : | array_flow.rb:66:10:66:13 | ...[...] | -| array_flow.rb:67:10:67:10 | c [element] : | array_flow.rb:67:10:67:13 | ...[...] | -| array_flow.rb:67:10:67:10 | c [element] : | array_flow.rb:67:10:67:13 | ...[...] | -| array_flow.rb:71:5:71:5 | a [element 0] : | array_flow.rb:72:9:72:9 | a [element 0] : | -| array_flow.rb:71:5:71:5 | a [element 0] : | array_flow.rb:72:9:72:9 | a [element 0] : | -| array_flow.rb:71:5:71:5 | a [element 0] : | array_flow.rb:73:10:73:10 | a [element 0] : | -| array_flow.rb:71:5:71:5 | a [element 0] : | array_flow.rb:73:10:73:10 | a [element 0] : | -| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:71:5:71:5 | a [element 0] : | -| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:71:5:71:5 | a [element 0] : | -| array_flow.rb:72:5:72:5 | b : | array_flow.rb:75:10:75:10 | b : | -| array_flow.rb:72:5:72:5 | b : | array_flow.rb:76:10:76:10 | b : | -| array_flow.rb:72:5:72:5 | b [element 0] : | array_flow.rb:75:10:75:10 | b [element 0] : | -| array_flow.rb:72:5:72:5 | b [element 0] : | array_flow.rb:75:10:75:10 | b [element 0] : | -| array_flow.rb:72:5:72:5 | b [element] : | array_flow.rb:75:10:75:10 | b [element] : | -| array_flow.rb:72:5:72:5 | b [element] : | array_flow.rb:75:10:75:10 | b [element] : | -| array_flow.rb:72:5:72:5 | b [element] : | array_flow.rb:76:10:76:10 | b [element] : | -| array_flow.rb:72:5:72:5 | b [element] : | array_flow.rb:76:10:76:10 | b [element] : | -| array_flow.rb:72:9:72:9 | [post] a [element] : | array_flow.rb:73:10:73:10 | a [element] : | -| array_flow.rb:72:9:72:9 | [post] a [element] : | array_flow.rb:73:10:73:10 | a [element] : | -| array_flow.rb:72:9:72:9 | [post] a [element] : | array_flow.rb:74:10:74:10 | a [element] : | -| array_flow.rb:72:9:72:9 | [post] a [element] : | array_flow.rb:74:10:74:10 | a [element] : | -| array_flow.rb:72:9:72:9 | a [element 0] : | array_flow.rb:72:9:72:24 | ... << ... [element 0] : | -| array_flow.rb:72:9:72:9 | a [element 0] : | array_flow.rb:72:9:72:24 | ... << ... [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] : | array_flow.rb:72:5:72:5 | b [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] : | array_flow.rb:72:5:72:5 | b [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:72:5:72:5 | b [element] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:72:5:72:5 | b [element] : | -| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:5:72:5 | b : | -| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:9 | [post] a [element] : | -| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:9 | [post] a [element] : | -| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:24 | ... << ... [element] : | -| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:24 | ... << ... [element] : | -| array_flow.rb:73:10:73:10 | a [element 0] : | array_flow.rb:73:10:73:13 | ...[...] | -| array_flow.rb:73:10:73:10 | a [element 0] : | array_flow.rb:73:10:73:13 | ...[...] | -| array_flow.rb:73:10:73:10 | a [element] : | array_flow.rb:73:10:73:13 | ...[...] | -| array_flow.rb:73:10:73:10 | a [element] : | array_flow.rb:73:10:73:13 | ...[...] | -| array_flow.rb:74:10:74:10 | a [element] : | array_flow.rb:74:10:74:13 | ...[...] | -| array_flow.rb:74:10:74:10 | a [element] : | array_flow.rb:74:10:74:13 | ...[...] | -| array_flow.rb:75:10:75:10 | b : | array_flow.rb:75:10:75:13 | ...[...] | -| array_flow.rb:75:10:75:10 | b [element 0] : | array_flow.rb:75:10:75:13 | ...[...] | -| array_flow.rb:75:10:75:10 | b [element 0] : | array_flow.rb:75:10:75:13 | ...[...] | -| array_flow.rb:75:10:75:10 | b [element] : | array_flow.rb:75:10:75:13 | ...[...] | -| array_flow.rb:75:10:75:10 | b [element] : | array_flow.rb:75:10:75:13 | ...[...] | -| array_flow.rb:76:10:76:10 | b : | array_flow.rb:76:10:76:13 | ...[...] | -| array_flow.rb:76:10:76:10 | b [element] : | array_flow.rb:76:10:76:13 | ...[...] | -| array_flow.rb:76:10:76:10 | b [element] : | array_flow.rb:76:10:76:13 | ...[...] | -| array_flow.rb:80:5:80:5 | a [element 1] : | array_flow.rb:81:15:81:15 | a [element 1] : | -| array_flow.rb:80:5:80:5 | a [element 1] : | array_flow.rb:81:15:81:15 | a [element 1] : | -| array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:80:5:80:5 | a [element 1] : | -| array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:80:5:80:5 | a [element 1] : | -| array_flow.rb:81:8:81:8 | c : | array_flow.rb:83:10:83:10 | c | -| array_flow.rb:81:8:81:8 | c : | array_flow.rb:83:10:83:10 | c | -| array_flow.rb:81:15:81:15 | __synth__3 [element 1] : | array_flow.rb:81:8:81:8 | c : | -| array_flow.rb:81:15:81:15 | __synth__3 [element 1] : | array_flow.rb:81:8:81:8 | c : | -| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:81:15:81:15 | __synth__3 [element 1] : | -| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:81:15:81:15 | __synth__3 [element 1] : | -| array_flow.rb:88:5:88:5 | a [element 1] : | array_flow.rb:89:9:89:9 | a [element 1] : | -| array_flow.rb:88:5:88:5 | a [element 1] : | array_flow.rb:89:9:89:9 | a [element 1] : | -| array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:88:5:88:5 | a [element 1] : | -| array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:88:5:88:5 | a [element 1] : | -| array_flow.rb:89:5:89:5 | b [element 1] : | array_flow.rb:91:10:91:10 | b [element 1] : | -| array_flow.rb:89:5:89:5 | b [element 1] : | array_flow.rb:91:10:91:10 | b [element 1] : | -| array_flow.rb:89:5:89:5 | b [element 1] : | array_flow.rb:92:10:92:10 | b [element 1] : | -| array_flow.rb:89:5:89:5 | b [element 1] : | array_flow.rb:92:10:92:10 | b [element 1] : | -| array_flow.rb:89:9:89:9 | a [element 1] : | array_flow.rb:89:9:89:15 | ...[...] [element 1] : | -| array_flow.rb:89:9:89:9 | a [element 1] : | array_flow.rb:89:9:89:15 | ...[...] [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:89:5:89:5 | b [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:89:5:89:5 | b [element 1] : | -| array_flow.rb:91:10:91:10 | b [element 1] : | array_flow.rb:91:10:91:13 | ...[...] | -| array_flow.rb:91:10:91:10 | b [element 1] : | array_flow.rb:91:10:91:13 | ...[...] | -| array_flow.rb:92:10:92:10 | b [element 1] : | array_flow.rb:92:10:92:13 | ...[...] | -| array_flow.rb:92:10:92:10 | b [element 1] : | array_flow.rb:92:10:92:13 | ...[...] | -| array_flow.rb:96:5:96:5 | a [element 1] : | array_flow.rb:97:9:97:9 | a [element 1] : | -| array_flow.rb:96:5:96:5 | a [element 1] : | array_flow.rb:97:9:97:9 | a [element 1] : | -| array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:96:5:96:5 | a [element 1] : | -| array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:96:5:96:5 | a [element 1] : | -| array_flow.rb:97:5:97:5 | b [element 1] : | array_flow.rb:99:10:99:10 | b [element 1] : | -| array_flow.rb:97:5:97:5 | b [element 1] : | array_flow.rb:99:10:99:10 | b [element 1] : | -| array_flow.rb:97:5:97:5 | b [element 1] : | array_flow.rb:101:10:101:10 | b [element 1] : | -| array_flow.rb:97:5:97:5 | b [element 1] : | array_flow.rb:101:10:101:10 | b [element 1] : | -| array_flow.rb:97:9:97:9 | a [element 1] : | array_flow.rb:97:9:97:15 | ...[...] [element 1] : | -| array_flow.rb:97:9:97:9 | a [element 1] : | array_flow.rb:97:9:97:15 | ...[...] [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:97:5:97:5 | b [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:97:5:97:5 | b [element 1] : | -| array_flow.rb:99:10:99:10 | b [element 1] : | array_flow.rb:99:10:99:13 | ...[...] | -| array_flow.rb:99:10:99:10 | b [element 1] : | array_flow.rb:99:10:99:13 | ...[...] | -| array_flow.rb:101:10:101:10 | b [element 1] : | array_flow.rb:101:10:101:13 | ...[...] | -| array_flow.rb:101:10:101:10 | b [element 1] : | array_flow.rb:101:10:101:13 | ...[...] | -| array_flow.rb:103:5:103:5 | a [element 1] : | array_flow.rb:104:9:104:9 | a [element 1] : | -| array_flow.rb:103:5:103:5 | a [element 1] : | array_flow.rb:104:9:104:9 | a [element 1] : | -| array_flow.rb:103:13:103:24 | call to source : | array_flow.rb:103:5:103:5 | a [element 1] : | -| array_flow.rb:103:13:103:24 | call to source : | array_flow.rb:103:5:103:5 | a [element 1] : | -| array_flow.rb:104:5:104:5 | b [element 1] : | array_flow.rb:106:10:106:10 | b [element 1] : | -| array_flow.rb:104:5:104:5 | b [element 1] : | array_flow.rb:106:10:106:10 | b [element 1] : | -| array_flow.rb:104:9:104:9 | a [element 1] : | array_flow.rb:104:9:104:16 | ...[...] [element 1] : | -| array_flow.rb:104:9:104:9 | a [element 1] : | array_flow.rb:104:9:104:16 | ...[...] [element 1] : | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] : | array_flow.rb:104:5:104:5 | b [element 1] : | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] : | array_flow.rb:104:5:104:5 | b [element 1] : | -| array_flow.rb:106:10:106:10 | b [element 1] : | array_flow.rb:106:10:106:13 | ...[...] | -| array_flow.rb:106:10:106:10 | b [element 1] : | array_flow.rb:106:10:106:13 | ...[...] | -| array_flow.rb:109:5:109:5 | a [element 1] : | array_flow.rb:110:9:110:9 | a [element 1] : | -| array_flow.rb:109:5:109:5 | a [element 1] : | array_flow.rb:110:9:110:9 | a [element 1] : | -| array_flow.rb:109:5:109:5 | a [element 1] : | array_flow.rb:114:9:114:9 | a [element 1] : | -| array_flow.rb:109:5:109:5 | a [element 1] : | array_flow.rb:114:9:114:9 | a [element 1] : | -| array_flow.rb:109:5:109:5 | a [element 3] : | array_flow.rb:110:9:110:9 | a [element 3] : | -| array_flow.rb:109:5:109:5 | a [element 3] : | array_flow.rb:110:9:110:9 | a [element 3] : | -| array_flow.rb:109:5:109:5 | a [element 3] : | array_flow.rb:114:9:114:9 | a [element 3] : | -| array_flow.rb:109:5:109:5 | a [element 3] : | array_flow.rb:114:9:114:9 | a [element 3] : | -| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:109:5:109:5 | a [element 1] : | -| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:109:5:109:5 | a [element 1] : | -| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:109:5:109:5 | a [element 3] : | -| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:109:5:109:5 | a [element 3] : | -| array_flow.rb:110:5:110:5 | b [element] : | array_flow.rb:111:10:111:10 | b [element] : | -| array_flow.rb:110:5:110:5 | b [element] : | array_flow.rb:111:10:111:10 | b [element] : | -| array_flow.rb:110:5:110:5 | b [element] : | array_flow.rb:112:10:112:10 | b [element] : | -| array_flow.rb:110:5:110:5 | b [element] : | array_flow.rb:112:10:112:10 | b [element] : | -| array_flow.rb:110:9:110:9 | a [element 1] : | array_flow.rb:110:9:110:18 | ...[...] [element] : | -| array_flow.rb:110:9:110:9 | a [element 1] : | array_flow.rb:110:9:110:18 | ...[...] [element] : | -| array_flow.rb:110:9:110:9 | a [element 3] : | array_flow.rb:110:9:110:18 | ...[...] [element] : | -| array_flow.rb:110:9:110:9 | a [element 3] : | array_flow.rb:110:9:110:18 | ...[...] [element] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:110:5:110:5 | b [element] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:110:5:110:5 | b [element] : | -| array_flow.rb:111:10:111:10 | b [element] : | array_flow.rb:111:10:111:13 | ...[...] | -| array_flow.rb:111:10:111:10 | b [element] : | array_flow.rb:111:10:111:13 | ...[...] | -| array_flow.rb:112:10:112:10 | b [element] : | array_flow.rb:112:10:112:13 | ...[...] | -| array_flow.rb:112:10:112:10 | b [element] : | array_flow.rb:112:10:112:13 | ...[...] | -| array_flow.rb:114:5:114:5 | b [element] : | array_flow.rb:115:10:115:10 | b [element] : | -| array_flow.rb:114:5:114:5 | b [element] : | array_flow.rb:115:10:115:10 | b [element] : | -| array_flow.rb:114:5:114:5 | b [element] : | array_flow.rb:116:10:116:10 | b [element] : | -| array_flow.rb:114:5:114:5 | b [element] : | array_flow.rb:116:10:116:10 | b [element] : | -| array_flow.rb:114:9:114:9 | a [element 1] : | array_flow.rb:114:9:114:19 | ...[...] [element] : | -| array_flow.rb:114:9:114:9 | a [element 1] : | array_flow.rb:114:9:114:19 | ...[...] [element] : | -| array_flow.rb:114:9:114:9 | a [element 3] : | array_flow.rb:114:9:114:19 | ...[...] [element] : | -| array_flow.rb:114:9:114:9 | a [element 3] : | array_flow.rb:114:9:114:19 | ...[...] [element] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:114:5:114:5 | b [element] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:114:5:114:5 | b [element] : | -| array_flow.rb:115:10:115:10 | b [element] : | array_flow.rb:115:10:115:13 | ...[...] | -| array_flow.rb:115:10:115:10 | b [element] : | array_flow.rb:115:10:115:13 | ...[...] | -| array_flow.rb:116:10:116:10 | b [element] : | array_flow.rb:116:10:116:13 | ...[...] | -| array_flow.rb:116:10:116:10 | b [element] : | array_flow.rb:116:10:116:13 | ...[...] | -| array_flow.rb:121:5:121:5 | [post] a [element] : | array_flow.rb:122:10:122:10 | a [element] : | -| array_flow.rb:121:5:121:5 | [post] a [element] : | array_flow.rb:122:10:122:10 | a [element] : | -| array_flow.rb:121:5:121:5 | [post] a [element] : | array_flow.rb:123:10:123:10 | a [element] : | -| array_flow.rb:121:5:121:5 | [post] a [element] : | array_flow.rb:123:10:123:10 | a [element] : | -| array_flow.rb:121:5:121:5 | [post] a [element] : | array_flow.rb:124:10:124:10 | a [element] : | -| array_flow.rb:121:5:121:5 | [post] a [element] : | array_flow.rb:124:10:124:10 | a [element] : | -| array_flow.rb:121:15:121:24 | call to source : | array_flow.rb:121:5:121:5 | [post] a [element] : | -| array_flow.rb:121:15:121:24 | call to source : | array_flow.rb:121:5:121:5 | [post] a [element] : | -| array_flow.rb:122:10:122:10 | a [element] : | array_flow.rb:122:10:122:13 | ...[...] | -| array_flow.rb:122:10:122:10 | a [element] : | array_flow.rb:122:10:122:13 | ...[...] | -| array_flow.rb:123:10:123:10 | a [element] : | array_flow.rb:123:10:123:13 | ...[...] | -| array_flow.rb:123:10:123:10 | a [element] : | array_flow.rb:123:10:123:13 | ...[...] | -| array_flow.rb:124:10:124:10 | a [element] : | array_flow.rb:124:10:124:13 | ...[...] | -| array_flow.rb:124:10:124:10 | a [element] : | array_flow.rb:124:10:124:13 | ...[...] | -| array_flow.rb:129:5:129:5 | [post] a [element] : | array_flow.rb:130:10:130:10 | a [element] : | -| array_flow.rb:129:5:129:5 | [post] a [element] : | array_flow.rb:130:10:130:10 | a [element] : | -| array_flow.rb:129:5:129:5 | [post] a [element] : | array_flow.rb:131:10:131:10 | a [element] : | -| array_flow.rb:129:5:129:5 | [post] a [element] : | array_flow.rb:131:10:131:10 | a [element] : | -| array_flow.rb:129:5:129:5 | [post] a [element] : | array_flow.rb:132:10:132:10 | a [element] : | -| array_flow.rb:129:5:129:5 | [post] a [element] : | array_flow.rb:132:10:132:10 | a [element] : | -| array_flow.rb:129:19:129:28 | call to source : | array_flow.rb:129:5:129:5 | [post] a [element] : | -| array_flow.rb:129:19:129:28 | call to source : | array_flow.rb:129:5:129:5 | [post] a [element] : | -| array_flow.rb:130:10:130:10 | a [element] : | array_flow.rb:130:10:130:13 | ...[...] | -| array_flow.rb:130:10:130:10 | a [element] : | array_flow.rb:130:10:130:13 | ...[...] | -| array_flow.rb:131:10:131:10 | a [element] : | array_flow.rb:131:10:131:13 | ...[...] | -| array_flow.rb:131:10:131:10 | a [element] : | array_flow.rb:131:10:131:13 | ...[...] | -| array_flow.rb:132:10:132:10 | a [element] : | array_flow.rb:132:10:132:13 | ...[...] | -| array_flow.rb:132:10:132:10 | a [element] : | array_flow.rb:132:10:132:13 | ...[...] | -| array_flow.rb:137:5:137:5 | [post] a [element] : | array_flow.rb:138:10:138:10 | a [element] : | -| array_flow.rb:137:5:137:5 | [post] a [element] : | array_flow.rb:138:10:138:10 | a [element] : | -| array_flow.rb:137:5:137:5 | [post] a [element] : | array_flow.rb:139:10:139:10 | a [element] : | -| array_flow.rb:137:5:137:5 | [post] a [element] : | array_flow.rb:139:10:139:10 | a [element] : | -| array_flow.rb:137:5:137:5 | [post] a [element] : | array_flow.rb:140:10:140:10 | a [element] : | -| array_flow.rb:137:5:137:5 | [post] a [element] : | array_flow.rb:140:10:140:10 | a [element] : | -| array_flow.rb:137:15:137:24 | call to source : | array_flow.rb:137:5:137:5 | [post] a [element] : | -| array_flow.rb:137:15:137:24 | call to source : | array_flow.rb:137:5:137:5 | [post] a [element] : | -| array_flow.rb:138:10:138:10 | a [element] : | array_flow.rb:138:10:138:13 | ...[...] | -| array_flow.rb:138:10:138:10 | a [element] : | array_flow.rb:138:10:138:13 | ...[...] | -| array_flow.rb:139:10:139:10 | a [element] : | array_flow.rb:139:10:139:13 | ...[...] | -| array_flow.rb:139:10:139:10 | a [element] : | array_flow.rb:139:10:139:13 | ...[...] | -| array_flow.rb:140:10:140:10 | a [element] : | array_flow.rb:140:10:140:13 | ...[...] | -| array_flow.rb:140:10:140:10 | a [element] : | array_flow.rb:140:10:140:13 | ...[...] | -| array_flow.rb:145:5:145:5 | [post] a [element] : | array_flow.rb:146:10:146:10 | a [element] : | -| array_flow.rb:145:5:145:5 | [post] a [element] : | array_flow.rb:146:10:146:10 | a [element] : | -| array_flow.rb:145:5:145:5 | [post] a [element] : | array_flow.rb:147:10:147:10 | a [element] : | -| array_flow.rb:145:5:145:5 | [post] a [element] : | array_flow.rb:147:10:147:10 | a [element] : | -| array_flow.rb:145:5:145:5 | [post] a [element] : | array_flow.rb:148:10:148:10 | a [element] : | -| array_flow.rb:145:5:145:5 | [post] a [element] : | array_flow.rb:148:10:148:10 | a [element] : | -| array_flow.rb:145:19:145:28 | call to source : | array_flow.rb:145:5:145:5 | [post] a [element] : | -| array_flow.rb:145:19:145:28 | call to source : | array_flow.rb:145:5:145:5 | [post] a [element] : | -| array_flow.rb:146:10:146:10 | a [element] : | array_flow.rb:146:10:146:13 | ...[...] | -| array_flow.rb:146:10:146:10 | a [element] : | array_flow.rb:146:10:146:13 | ...[...] | -| array_flow.rb:147:10:147:10 | a [element] : | array_flow.rb:147:10:147:13 | ...[...] | -| array_flow.rb:147:10:147:10 | a [element] : | array_flow.rb:147:10:147:13 | ...[...] | -| array_flow.rb:148:10:148:10 | a [element] : | array_flow.rb:148:10:148:13 | ...[...] | -| array_flow.rb:148:10:148:10 | a [element] : | array_flow.rb:148:10:148:13 | ...[...] | -| array_flow.rb:152:5:152:5 | a [element 2] : | array_flow.rb:153:5:153:5 | a [element 2] : | -| array_flow.rb:152:5:152:5 | a [element 2] : | array_flow.rb:153:5:153:5 | a [element 2] : | -| array_flow.rb:152:16:152:25 | call to source : | array_flow.rb:152:5:152:5 | a [element 2] : | -| array_flow.rb:152:16:152:25 | call to source : | array_flow.rb:152:5:152:5 | a [element 2] : | -| array_flow.rb:153:5:153:5 | a [element 2] : | array_flow.rb:153:16:153:16 | x : | -| array_flow.rb:153:5:153:5 | a [element 2] : | array_flow.rb:153:16:153:16 | x : | -| array_flow.rb:153:16:153:16 | x : | array_flow.rb:154:14:154:14 | x | -| array_flow.rb:153:16:153:16 | x : | array_flow.rb:154:14:154:14 | x | -| array_flow.rb:159:5:159:5 | a [element 2] : | array_flow.rb:160:5:160:5 | a [element 2] : | -| array_flow.rb:159:5:159:5 | a [element 2] : | array_flow.rb:160:5:160:5 | a [element 2] : | -| array_flow.rb:159:16:159:25 | call to source : | array_flow.rb:159:5:159:5 | a [element 2] : | -| array_flow.rb:159:16:159:25 | call to source : | array_flow.rb:159:5:159:5 | a [element 2] : | -| array_flow.rb:160:5:160:5 | a [element 2] : | array_flow.rb:160:16:160:16 | x : | -| array_flow.rb:160:5:160:5 | a [element 2] : | array_flow.rb:160:16:160:16 | x : | -| array_flow.rb:160:16:160:16 | x : | array_flow.rb:161:14:161:14 | x | -| array_flow.rb:160:16:160:16 | x : | array_flow.rb:161:14:161:14 | x | -| array_flow.rb:166:5:166:5 | a [element 0] : | array_flow.rb:167:9:167:9 | a [element 0] : | -| array_flow.rb:166:5:166:5 | a [element 0] : | array_flow.rb:167:9:167:9 | a [element 0] : | -| array_flow.rb:166:5:166:5 | a [element 0] : | array_flow.rb:168:10:168:10 | a [element 0] : | -| array_flow.rb:166:5:166:5 | a [element 0] : | array_flow.rb:168:10:168:10 | a [element 0] : | -| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:166:5:166:5 | a [element 0] : | -| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:166:5:166:5 | a [element 0] : | -| array_flow.rb:167:5:167:5 | b [element 0] : | array_flow.rb:170:10:170:10 | b [element 0] : | -| array_flow.rb:167:5:167:5 | b [element 0] : | array_flow.rb:170:10:170:10 | b [element 0] : | -| array_flow.rb:167:5:167:5 | b [element] : | array_flow.rb:170:10:170:10 | b [element] : | -| array_flow.rb:167:5:167:5 | b [element] : | array_flow.rb:170:10:170:10 | b [element] : | -| array_flow.rb:167:5:167:5 | b [element] : | array_flow.rb:171:10:171:10 | b [element] : | -| array_flow.rb:167:5:167:5 | b [element] : | array_flow.rb:171:10:171:10 | b [element] : | -| array_flow.rb:167:9:167:9 | [post] a [element] : | array_flow.rb:168:10:168:10 | a [element] : | -| array_flow.rb:167:9:167:9 | [post] a [element] : | array_flow.rb:168:10:168:10 | a [element] : | -| array_flow.rb:167:9:167:9 | [post] a [element] : | array_flow.rb:169:10:169:10 | a [element] : | -| array_flow.rb:167:9:167:9 | [post] a [element] : | array_flow.rb:169:10:169:10 | a [element] : | -| array_flow.rb:167:9:167:9 | a [element 0] : | array_flow.rb:167:9:167:44 | call to append [element 0] : | -| array_flow.rb:167:9:167:9 | a [element 0] : | array_flow.rb:167:9:167:44 | call to append [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element 0] : | array_flow.rb:167:5:167:5 | b [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element 0] : | array_flow.rb:167:5:167:5 | b [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:167:5:167:5 | b [element] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:167:5:167:5 | b [element] : | -| array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:9 | [post] a [element] : | -| array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:9 | [post] a [element] : | -| array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:44 | call to append [element] : | -| array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:44 | call to append [element] : | -| array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:167:9:167:9 | [post] a [element] : | -| array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:167:9:167:9 | [post] a [element] : | -| array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:167:9:167:44 | call to append [element] : | -| array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:167:9:167:44 | call to append [element] : | -| array_flow.rb:168:10:168:10 | a [element 0] : | array_flow.rb:168:10:168:13 | ...[...] | -| array_flow.rb:168:10:168:10 | a [element 0] : | array_flow.rb:168:10:168:13 | ...[...] | -| array_flow.rb:168:10:168:10 | a [element] : | array_flow.rb:168:10:168:13 | ...[...] | -| array_flow.rb:168:10:168:10 | a [element] : | array_flow.rb:168:10:168:13 | ...[...] | -| array_flow.rb:169:10:169:10 | a [element] : | array_flow.rb:169:10:169:13 | ...[...] | -| array_flow.rb:169:10:169:10 | a [element] : | array_flow.rb:169:10:169:13 | ...[...] | -| array_flow.rb:170:10:170:10 | b [element 0] : | array_flow.rb:170:10:170:13 | ...[...] | -| array_flow.rb:170:10:170:10 | b [element 0] : | array_flow.rb:170:10:170:13 | ...[...] | -| array_flow.rb:170:10:170:10 | b [element] : | array_flow.rb:170:10:170:13 | ...[...] | -| array_flow.rb:170:10:170:10 | b [element] : | array_flow.rb:170:10:170:13 | ...[...] | -| array_flow.rb:171:10:171:10 | b [element] : | array_flow.rb:171:10:171:13 | ...[...] | -| array_flow.rb:171:10:171:10 | b [element] : | array_flow.rb:171:10:171:13 | ...[...] | -| array_flow.rb:177:5:177:5 | c [element 1] : | array_flow.rb:178:16:178:16 | c [element 1] : | -| array_flow.rb:177:5:177:5 | c [element 1] : | array_flow.rb:178:16:178:16 | c [element 1] : | -| array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:177:5:177:5 | c [element 1] : | -| array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:177:5:177:5 | c [element 1] : | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | array_flow.rb:179:11:179:11 | d [element 2, element 1] : | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | array_flow.rb:179:11:179:11 | d [element 2, element 1] : | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | array_flow.rb:180:11:180:11 | d [element 2, element 1] : | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | array_flow.rb:180:11:180:11 | d [element 2, element 1] : | -| array_flow.rb:178:16:178:16 | c [element 1] : | array_flow.rb:178:5:178:5 | d [element 2, element 1] : | -| array_flow.rb:178:16:178:16 | c [element 1] : | array_flow.rb:178:5:178:5 | d [element 2, element 1] : | -| array_flow.rb:179:11:179:11 | d [element 2, element 1] : | array_flow.rb:179:11:179:22 | call to assoc [element 1] : | -| array_flow.rb:179:11:179:11 | d [element 2, element 1] : | array_flow.rb:179:11:179:22 | call to assoc [element 1] : | -| array_flow.rb:179:11:179:22 | call to assoc [element 1] : | array_flow.rb:179:11:179:25 | ...[...] : | -| array_flow.rb:179:11:179:22 | call to assoc [element 1] : | array_flow.rb:179:11:179:25 | ...[...] : | -| array_flow.rb:179:11:179:25 | ...[...] : | array_flow.rb:179:10:179:26 | ( ... ) | -| array_flow.rb:179:11:179:25 | ...[...] : | array_flow.rb:179:10:179:26 | ( ... ) | -| array_flow.rb:180:11:180:11 | d [element 2, element 1] : | array_flow.rb:180:11:180:22 | call to assoc [element 1] : | -| array_flow.rb:180:11:180:11 | d [element 2, element 1] : | array_flow.rb:180:11:180:22 | call to assoc [element 1] : | -| array_flow.rb:180:11:180:22 | call to assoc [element 1] : | array_flow.rb:180:11:180:25 | ...[...] : | -| array_flow.rb:180:11:180:22 | call to assoc [element 1] : | array_flow.rb:180:11:180:25 | ...[...] : | -| array_flow.rb:180:11:180:25 | ...[...] : | array_flow.rb:180:10:180:26 | ( ... ) | -| array_flow.rb:180:11:180:25 | ...[...] : | array_flow.rb:180:10:180:26 | ( ... ) | -| array_flow.rb:184:5:184:5 | a [element 1] : | array_flow.rb:186:10:186:10 | a [element 1] : | -| array_flow.rb:184:5:184:5 | a [element 1] : | array_flow.rb:186:10:186:10 | a [element 1] : | -| array_flow.rb:184:5:184:5 | a [element 1] : | array_flow.rb:188:10:188:10 | a [element 1] : | -| array_flow.rb:184:5:184:5 | a [element 1] : | array_flow.rb:188:10:188:10 | a [element 1] : | -| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:184:5:184:5 | a [element 1] : | -| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:184:5:184:5 | a [element 1] : | -| array_flow.rb:186:10:186:10 | a [element 1] : | array_flow.rb:186:10:186:16 | call to at | -| array_flow.rb:186:10:186:10 | a [element 1] : | array_flow.rb:186:10:186:16 | call to at | -| array_flow.rb:188:10:188:10 | a [element 1] : | array_flow.rb:188:10:188:16 | call to at | -| array_flow.rb:188:10:188:10 | a [element 1] : | array_flow.rb:188:10:188:16 | call to at | -| array_flow.rb:192:5:192:5 | a [element 2] : | array_flow.rb:193:9:193:9 | a [element 2] : | -| array_flow.rb:192:5:192:5 | a [element 2] : | array_flow.rb:193:9:193:9 | a [element 2] : | -| array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:192:5:192:5 | a [element 2] : | -| array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:192:5:192:5 | a [element 2] : | -| array_flow.rb:193:5:193:5 | b : | array_flow.rb:196:10:196:10 | b | -| array_flow.rb:193:5:193:5 | b : | array_flow.rb:196:10:196:10 | b | -| array_flow.rb:193:9:193:9 | a [element 2] : | array_flow.rb:193:9:195:7 | call to bsearch : | -| array_flow.rb:193:9:193:9 | a [element 2] : | array_flow.rb:193:9:195:7 | call to bsearch : | -| array_flow.rb:193:9:193:9 | a [element 2] : | array_flow.rb:193:23:193:23 | x : | -| array_flow.rb:193:9:193:9 | a [element 2] : | array_flow.rb:193:23:193:23 | x : | -| array_flow.rb:193:9:195:7 | call to bsearch : | array_flow.rb:193:5:193:5 | b : | -| array_flow.rb:193:9:195:7 | call to bsearch : | array_flow.rb:193:5:193:5 | b : | -| array_flow.rb:193:23:193:23 | x : | array_flow.rb:194:14:194:14 | x | -| array_flow.rb:193:23:193:23 | x : | array_flow.rb:194:14:194:14 | x | -| array_flow.rb:200:5:200:5 | a [element 2] : | array_flow.rb:201:9:201:9 | a [element 2] : | -| array_flow.rb:200:5:200:5 | a [element 2] : | array_flow.rb:201:9:201:9 | a [element 2] : | -| array_flow.rb:200:16:200:25 | call to source : | array_flow.rb:200:5:200:5 | a [element 2] : | -| array_flow.rb:200:16:200:25 | call to source : | array_flow.rb:200:5:200:5 | a [element 2] : | -| array_flow.rb:201:9:201:9 | a [element 2] : | array_flow.rb:201:29:201:29 | x : | -| array_flow.rb:201:9:201:9 | a [element 2] : | array_flow.rb:201:29:201:29 | x : | -| array_flow.rb:201:29:201:29 | x : | array_flow.rb:202:14:202:14 | x | -| array_flow.rb:201:29:201:29 | x : | array_flow.rb:202:14:202:14 | x | -| array_flow.rb:208:5:208:5 | a [element 2] : | array_flow.rb:209:5:209:5 | a [element 2] : | -| array_flow.rb:208:5:208:5 | a [element 2] : | array_flow.rb:209:5:209:5 | a [element 2] : | -| array_flow.rb:208:16:208:25 | call to source : | array_flow.rb:208:5:208:5 | a [element 2] : | -| array_flow.rb:208:16:208:25 | call to source : | array_flow.rb:208:5:208:5 | a [element 2] : | -| array_flow.rb:209:5:209:5 | a [element 2] : | array_flow.rb:209:17:209:17 | x : | -| array_flow.rb:209:5:209:5 | a [element 2] : | array_flow.rb:209:17:209:17 | x : | -| array_flow.rb:209:17:209:17 | x : | array_flow.rb:210:14:210:14 | x | -| array_flow.rb:209:17:209:17 | x : | array_flow.rb:210:14:210:14 | x | -| array_flow.rb:215:5:215:5 | a [element 2] : | array_flow.rb:216:9:216:9 | a [element 2] : | -| array_flow.rb:215:5:215:5 | a [element 2] : | array_flow.rb:216:9:216:9 | a [element 2] : | -| array_flow.rb:215:5:215:5 | a [element 3] : | array_flow.rb:216:9:216:9 | a [element 3] : | -| array_flow.rb:215:5:215:5 | a [element 3] : | array_flow.rb:216:9:216:9 | a [element 3] : | -| array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:215:5:215:5 | a [element 2] : | -| array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:215:5:215:5 | a [element 2] : | -| array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:215:5:215:5 | a [element 3] : | -| array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:215:5:215:5 | a [element 3] : | -| array_flow.rb:216:9:216:9 | a [element 2] : | array_flow.rb:216:27:216:27 | x : | -| array_flow.rb:216:9:216:9 | a [element 2] : | array_flow.rb:216:27:216:27 | x : | -| array_flow.rb:216:9:216:9 | a [element 2] : | array_flow.rb:216:30:216:30 | y : | -| array_flow.rb:216:9:216:9 | a [element 2] : | array_flow.rb:216:30:216:30 | y : | -| array_flow.rb:216:9:216:9 | a [element 3] : | array_flow.rb:216:27:216:27 | x : | -| array_flow.rb:216:9:216:9 | a [element 3] : | array_flow.rb:216:27:216:27 | x : | -| array_flow.rb:216:9:216:9 | a [element 3] : | array_flow.rb:216:30:216:30 | y : | -| array_flow.rb:216:9:216:9 | a [element 3] : | array_flow.rb:216:30:216:30 | y : | -| array_flow.rb:216:27:216:27 | x : | array_flow.rb:217:14:217:14 | x | -| array_flow.rb:216:27:216:27 | x : | array_flow.rb:217:14:217:14 | x | -| array_flow.rb:216:30:216:30 | y : | array_flow.rb:218:14:218:14 | y | -| array_flow.rb:216:30:216:30 | y : | array_flow.rb:218:14:218:14 | y | -| array_flow.rb:231:5:231:5 | a [element 2] : | array_flow.rb:232:9:232:9 | a [element 2] : | -| array_flow.rb:231:5:231:5 | a [element 2] : | array_flow.rb:232:9:232:9 | a [element 2] : | -| array_flow.rb:231:16:231:27 | call to source : | array_flow.rb:231:5:231:5 | a [element 2] : | -| array_flow.rb:231:16:231:27 | call to source : | array_flow.rb:231:5:231:5 | a [element 2] : | -| array_flow.rb:232:5:232:5 | b [element] : | array_flow.rb:236:10:236:10 | b [element] : | -| array_flow.rb:232:5:232:5 | b [element] : | array_flow.rb:236:10:236:10 | b [element] : | -| array_flow.rb:232:9:232:9 | a [element 2] : | array_flow.rb:232:23:232:23 | x : | -| array_flow.rb:232:9:232:9 | a [element 2] : | array_flow.rb:232:23:232:23 | x : | -| array_flow.rb:232:9:235:7 | call to collect [element] : | array_flow.rb:232:5:232:5 | b [element] : | -| array_flow.rb:232:9:235:7 | call to collect [element] : | array_flow.rb:232:5:232:5 | b [element] : | -| array_flow.rb:232:23:232:23 | x : | array_flow.rb:233:14:233:14 | x | -| array_flow.rb:232:23:232:23 | x : | array_flow.rb:233:14:233:14 | x | -| array_flow.rb:234:9:234:19 | call to source : | array_flow.rb:232:9:235:7 | call to collect [element] : | -| array_flow.rb:234:9:234:19 | call to source : | array_flow.rb:232:9:235:7 | call to collect [element] : | -| array_flow.rb:236:10:236:10 | b [element] : | array_flow.rb:236:10:236:13 | ...[...] | -| array_flow.rb:236:10:236:10 | b [element] : | array_flow.rb:236:10:236:13 | ...[...] | -| array_flow.rb:240:5:240:5 | a [element 2] : | array_flow.rb:241:9:241:9 | a [element 2] : | -| array_flow.rb:240:5:240:5 | a [element 2] : | array_flow.rb:241:9:241:9 | a [element 2] : | -| array_flow.rb:240:16:240:27 | call to source : | array_flow.rb:240:5:240:5 | a [element 2] : | -| array_flow.rb:240:16:240:27 | call to source : | array_flow.rb:240:5:240:5 | a [element 2] : | -| array_flow.rb:241:5:241:5 | b [element] : | array_flow.rb:246:10:246:10 | b [element] : | -| array_flow.rb:241:5:241:5 | b [element] : | array_flow.rb:246:10:246:10 | b [element] : | -| array_flow.rb:241:9:241:9 | [post] a [element] : | array_flow.rb:245:10:245:10 | a [element] : | -| array_flow.rb:241:9:241:9 | [post] a [element] : | array_flow.rb:245:10:245:10 | a [element] : | -| array_flow.rb:241:9:241:9 | a [element 2] : | array_flow.rb:241:24:241:24 | x : | -| array_flow.rb:241:9:241:9 | a [element 2] : | array_flow.rb:241:24:241:24 | x : | -| array_flow.rb:241:9:244:7 | call to collect! [element] : | array_flow.rb:241:5:241:5 | b [element] : | -| array_flow.rb:241:9:244:7 | call to collect! [element] : | array_flow.rb:241:5:241:5 | b [element] : | -| array_flow.rb:241:24:241:24 | x : | array_flow.rb:242:14:242:14 | x | -| array_flow.rb:241:24:241:24 | x : | array_flow.rb:242:14:242:14 | x | -| array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:241:9:241:9 | [post] a [element] : | -| array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:241:9:241:9 | [post] a [element] : | -| array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:241:9:244:7 | call to collect! [element] : | -| array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:241:9:244:7 | call to collect! [element] : | -| array_flow.rb:245:10:245:10 | a [element] : | array_flow.rb:245:10:245:13 | ...[...] | -| array_flow.rb:245:10:245:10 | a [element] : | array_flow.rb:245:10:245:13 | ...[...] | -| array_flow.rb:246:10:246:10 | b [element] : | array_flow.rb:246:10:246:13 | ...[...] | -| array_flow.rb:246:10:246:10 | b [element] : | array_flow.rb:246:10:246:13 | ...[...] | -| array_flow.rb:250:5:250:5 | a [element 2] : | array_flow.rb:251:9:251:9 | a [element 2] : | -| array_flow.rb:250:5:250:5 | a [element 2] : | array_flow.rb:251:9:251:9 | a [element 2] : | -| array_flow.rb:250:5:250:5 | a [element 2] : | array_flow.rb:256:9:256:9 | a [element 2] : | -| array_flow.rb:250:5:250:5 | a [element 2] : | array_flow.rb:256:9:256:9 | a [element 2] : | -| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:250:5:250:5 | a [element 2] : | -| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:250:5:250:5 | a [element 2] : | -| array_flow.rb:251:5:251:5 | b [element] : | array_flow.rb:255:10:255:10 | b [element] : | -| array_flow.rb:251:5:251:5 | b [element] : | array_flow.rb:255:10:255:10 | b [element] : | -| array_flow.rb:251:9:251:9 | a [element 2] : | array_flow.rb:251:9:254:7 | call to collect_concat [element] : | -| array_flow.rb:251:9:251:9 | a [element 2] : | array_flow.rb:251:9:254:7 | call to collect_concat [element] : | -| array_flow.rb:251:9:251:9 | a [element 2] : | array_flow.rb:251:30:251:30 | x : | -| array_flow.rb:251:9:251:9 | a [element 2] : | array_flow.rb:251:30:251:30 | x : | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] : | array_flow.rb:251:5:251:5 | b [element] : | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] : | array_flow.rb:251:5:251:5 | b [element] : | -| array_flow.rb:251:30:251:30 | x : | array_flow.rb:252:14:252:14 | x | -| array_flow.rb:251:30:251:30 | x : | array_flow.rb:252:14:252:14 | x | -| array_flow.rb:253:13:253:24 | call to source : | array_flow.rb:251:9:254:7 | call to collect_concat [element] : | -| array_flow.rb:253:13:253:24 | call to source : | array_flow.rb:251:9:254:7 | call to collect_concat [element] : | -| array_flow.rb:255:10:255:10 | b [element] : | array_flow.rb:255:10:255:13 | ...[...] | -| array_flow.rb:255:10:255:10 | b [element] : | array_flow.rb:255:10:255:13 | ...[...] | -| array_flow.rb:256:5:256:5 | b [element] : | array_flow.rb:260:10:260:10 | b [element] : | -| array_flow.rb:256:5:256:5 | b [element] : | array_flow.rb:260:10:260:10 | b [element] : | -| array_flow.rb:256:9:256:9 | a [element 2] : | array_flow.rb:256:30:256:30 | x : | -| array_flow.rb:256:9:256:9 | a [element 2] : | array_flow.rb:256:30:256:30 | x : | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] : | array_flow.rb:256:5:256:5 | b [element] : | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] : | array_flow.rb:256:5:256:5 | b [element] : | -| array_flow.rb:256:30:256:30 | x : | array_flow.rb:257:14:257:14 | x | -| array_flow.rb:256:30:256:30 | x : | array_flow.rb:257:14:257:14 | x | -| array_flow.rb:258:9:258:20 | call to source : | array_flow.rb:256:9:259:7 | call to collect_concat [element] : | -| array_flow.rb:258:9:258:20 | call to source : | array_flow.rb:256:9:259:7 | call to collect_concat [element] : | -| array_flow.rb:260:10:260:10 | b [element] : | array_flow.rb:260:10:260:13 | ...[...] | -| array_flow.rb:260:10:260:10 | b [element] : | array_flow.rb:260:10:260:13 | ...[...] | -| array_flow.rb:264:5:264:5 | a [element 2] : | array_flow.rb:265:9:265:9 | a [element 2] : | -| array_flow.rb:264:5:264:5 | a [element 2] : | array_flow.rb:265:9:265:9 | a [element 2] : | -| array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:264:5:264:5 | a [element 2] : | -| array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:264:5:264:5 | a [element 2] : | -| array_flow.rb:265:5:265:5 | b [element 2] : | array_flow.rb:269:10:269:10 | b [element 2] : | -| array_flow.rb:265:5:265:5 | b [element 2] : | array_flow.rb:269:10:269:10 | b [element 2] : | -| array_flow.rb:265:9:265:9 | a [element 2] : | array_flow.rb:265:9:267:7 | call to combination [element 2] : | -| array_flow.rb:265:9:265:9 | a [element 2] : | array_flow.rb:265:9:267:7 | call to combination [element 2] : | -| array_flow.rb:265:9:265:9 | a [element 2] : | array_flow.rb:265:30:265:30 | x [element] : | -| array_flow.rb:265:9:265:9 | a [element 2] : | array_flow.rb:265:30:265:30 | x [element] : | -| array_flow.rb:265:9:267:7 | call to combination [element 2] : | array_flow.rb:265:5:265:5 | b [element 2] : | -| array_flow.rb:265:9:267:7 | call to combination [element 2] : | array_flow.rb:265:5:265:5 | b [element 2] : | -| array_flow.rb:265:30:265:30 | x [element] : | array_flow.rb:266:14:266:14 | x [element] : | -| array_flow.rb:265:30:265:30 | x [element] : | array_flow.rb:266:14:266:14 | x [element] : | -| array_flow.rb:266:14:266:14 | x [element] : | array_flow.rb:266:14:266:17 | ...[...] | -| array_flow.rb:266:14:266:14 | x [element] : | array_flow.rb:266:14:266:17 | ...[...] | -| array_flow.rb:269:10:269:10 | b [element 2] : | array_flow.rb:269:10:269:13 | ...[...] | -| array_flow.rb:269:10:269:10 | b [element 2] : | array_flow.rb:269:10:269:13 | ...[...] | -| array_flow.rb:273:5:273:5 | a [element 2] : | array_flow.rb:274:9:274:9 | a [element 2] : | -| array_flow.rb:273:5:273:5 | a [element 2] : | array_flow.rb:274:9:274:9 | a [element 2] : | -| array_flow.rb:273:16:273:25 | call to source : | array_flow.rb:273:5:273:5 | a [element 2] : | -| array_flow.rb:273:16:273:25 | call to source : | array_flow.rb:273:5:273:5 | a [element 2] : | -| array_flow.rb:274:5:274:5 | b [element] : | array_flow.rb:275:10:275:10 | b [element] : | -| array_flow.rb:274:5:274:5 | b [element] : | array_flow.rb:275:10:275:10 | b [element] : | -| array_flow.rb:274:9:274:9 | a [element 2] : | array_flow.rb:274:9:274:17 | call to compact [element] : | -| array_flow.rb:274:9:274:9 | a [element 2] : | array_flow.rb:274:9:274:17 | call to compact [element] : | -| array_flow.rb:274:9:274:17 | call to compact [element] : | array_flow.rb:274:5:274:5 | b [element] : | -| array_flow.rb:274:9:274:17 | call to compact [element] : | array_flow.rb:274:5:274:5 | b [element] : | -| array_flow.rb:275:10:275:10 | b [element] : | array_flow.rb:275:10:275:13 | ...[...] | -| array_flow.rb:275:10:275:10 | b [element] : | array_flow.rb:275:10:275:13 | ...[...] | -| array_flow.rb:279:5:279:5 | a [element 2] : | array_flow.rb:280:9:280:9 | a [element 2] : | -| array_flow.rb:279:5:279:5 | a [element 2] : | array_flow.rb:280:9:280:9 | a [element 2] : | -| array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:279:5:279:5 | a [element 2] : | -| array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:279:5:279:5 | a [element 2] : | -| array_flow.rb:280:5:280:5 | b [element] : | array_flow.rb:282:10:282:10 | b [element] : | -| array_flow.rb:280:5:280:5 | b [element] : | array_flow.rb:282:10:282:10 | b [element] : | -| array_flow.rb:280:9:280:9 | [post] a [element] : | array_flow.rb:281:10:281:10 | a [element] : | -| array_flow.rb:280:9:280:9 | [post] a [element] : | array_flow.rb:281:10:281:10 | a [element] : | -| array_flow.rb:280:9:280:9 | a [element 2] : | array_flow.rb:280:9:280:9 | [post] a [element] : | -| array_flow.rb:280:9:280:9 | a [element 2] : | array_flow.rb:280:9:280:9 | [post] a [element] : | -| array_flow.rb:280:9:280:9 | a [element 2] : | array_flow.rb:280:9:280:18 | call to compact! [element] : | -| array_flow.rb:280:9:280:9 | a [element 2] : | array_flow.rb:280:9:280:18 | call to compact! [element] : | -| array_flow.rb:280:9:280:18 | call to compact! [element] : | array_flow.rb:280:5:280:5 | b [element] : | -| array_flow.rb:280:9:280:18 | call to compact! [element] : | array_flow.rb:280:5:280:5 | b [element] : | -| array_flow.rb:281:10:281:10 | a [element] : | array_flow.rb:281:10:281:13 | ...[...] | -| array_flow.rb:281:10:281:10 | a [element] : | array_flow.rb:281:10:281:13 | ...[...] | -| array_flow.rb:282:10:282:10 | b [element] : | array_flow.rb:282:10:282:13 | ...[...] | -| array_flow.rb:282:10:282:10 | b [element] : | array_flow.rb:282:10:282:13 | ...[...] | -| array_flow.rb:286:5:286:5 | a [element 2] : | array_flow.rb:290:10:290:10 | a [element 2] : | -| array_flow.rb:286:5:286:5 | a [element 2] : | array_flow.rb:290:10:290:10 | a [element 2] : | -| array_flow.rb:286:16:286:27 | call to source : | array_flow.rb:286:5:286:5 | a [element 2] : | -| array_flow.rb:286:16:286:27 | call to source : | array_flow.rb:286:5:286:5 | a [element 2] : | -| array_flow.rb:287:5:287:5 | b [element 2] : | array_flow.rb:288:14:288:14 | b [element 2] : | -| array_flow.rb:287:5:287:5 | b [element 2] : | array_flow.rb:288:14:288:14 | b [element 2] : | -| array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:287:5:287:5 | b [element 2] : | -| array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:287:5:287:5 | b [element 2] : | -| array_flow.rb:288:5:288:5 | [post] a [element] : | array_flow.rb:289:10:289:10 | a [element] : | -| array_flow.rb:288:5:288:5 | [post] a [element] : | array_flow.rb:289:10:289:10 | a [element] : | -| array_flow.rb:288:5:288:5 | [post] a [element] : | array_flow.rb:290:10:290:10 | a [element] : | -| array_flow.rb:288:5:288:5 | [post] a [element] : | array_flow.rb:290:10:290:10 | a [element] : | -| array_flow.rb:288:14:288:14 | b [element 2] : | array_flow.rb:288:5:288:5 | [post] a [element] : | -| array_flow.rb:288:14:288:14 | b [element 2] : | array_flow.rb:288:5:288:5 | [post] a [element] : | -| array_flow.rb:289:10:289:10 | a [element] : | array_flow.rb:289:10:289:13 | ...[...] | -| array_flow.rb:289:10:289:10 | a [element] : | array_flow.rb:289:10:289:13 | ...[...] | -| array_flow.rb:290:10:290:10 | a [element 2] : | array_flow.rb:290:10:290:13 | ...[...] | -| array_flow.rb:290:10:290:10 | a [element 2] : | array_flow.rb:290:10:290:13 | ...[...] | -| array_flow.rb:290:10:290:10 | a [element] : | array_flow.rb:290:10:290:13 | ...[...] | -| array_flow.rb:290:10:290:10 | a [element] : | array_flow.rb:290:10:290:13 | ...[...] | -| array_flow.rb:294:5:294:5 | a [element 2] : | array_flow.rb:295:5:295:5 | a [element 2] : | -| array_flow.rb:294:5:294:5 | a [element 2] : | array_flow.rb:295:5:295:5 | a [element 2] : | -| array_flow.rb:294:16:294:25 | call to source : | array_flow.rb:294:5:294:5 | a [element 2] : | -| array_flow.rb:294:16:294:25 | call to source : | array_flow.rb:294:5:294:5 | a [element 2] : | -| array_flow.rb:295:5:295:5 | a [element 2] : | array_flow.rb:295:17:295:17 | x : | -| array_flow.rb:295:5:295:5 | a [element 2] : | array_flow.rb:295:17:295:17 | x : | -| array_flow.rb:295:17:295:17 | x : | array_flow.rb:296:14:296:14 | x | -| array_flow.rb:295:17:295:17 | x : | array_flow.rb:296:14:296:14 | x | -| array_flow.rb:301:5:301:5 | a [element 2] : | array_flow.rb:302:5:302:5 | a [element 2] : | -| array_flow.rb:301:5:301:5 | a [element 2] : | array_flow.rb:302:5:302:5 | a [element 2] : | -| array_flow.rb:301:16:301:25 | call to source : | array_flow.rb:301:5:301:5 | a [element 2] : | -| array_flow.rb:301:16:301:25 | call to source : | array_flow.rb:301:5:301:5 | a [element 2] : | -| array_flow.rb:302:5:302:5 | a [element 2] : | array_flow.rb:302:20:302:20 | x : | -| array_flow.rb:302:5:302:5 | a [element 2] : | array_flow.rb:302:20:302:20 | x : | -| array_flow.rb:302:20:302:20 | x : | array_flow.rb:303:14:303:14 | x | -| array_flow.rb:302:20:302:20 | x : | array_flow.rb:303:14:303:14 | x | -| array_flow.rb:308:5:308:5 | a [element 2] : | array_flow.rb:309:9:309:9 | a [element 2] : | -| array_flow.rb:308:5:308:5 | a [element 2] : | array_flow.rb:309:9:309:9 | a [element 2] : | -| array_flow.rb:308:16:308:25 | call to source : | array_flow.rb:308:5:308:5 | a [element 2] : | -| array_flow.rb:308:16:308:25 | call to source : | array_flow.rb:308:5:308:5 | a [element 2] : | -| array_flow.rb:309:5:309:5 | b [element 2] : | array_flow.rb:312:10:312:10 | b [element 2] : | -| array_flow.rb:309:5:309:5 | b [element 2] : | array_flow.rb:312:10:312:10 | b [element 2] : | -| array_flow.rb:309:9:309:9 | a [element 2] : | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | -| array_flow.rb:309:9:309:9 | a [element 2] : | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | array_flow.rb:309:5:309:5 | b [element 2] : | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | array_flow.rb:309:5:309:5 | b [element 2] : | -| array_flow.rb:312:10:312:10 | b [element 2] : | array_flow.rb:312:10:312:13 | ...[...] | -| array_flow.rb:312:10:312:10 | b [element 2] : | array_flow.rb:312:10:312:13 | ...[...] | -| array_flow.rb:316:5:316:5 | a [element 2] : | array_flow.rb:317:9:317:9 | a [element 2] : | -| array_flow.rb:316:5:316:5 | a [element 2] : | array_flow.rb:317:9:317:9 | a [element 2] : | -| array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:316:5:316:5 | a [element 2] : | -| array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:316:5:316:5 | a [element 2] : | -| array_flow.rb:317:5:317:5 | b : | array_flow.rb:318:10:318:10 | b | -| array_flow.rb:317:5:317:5 | b : | array_flow.rb:318:10:318:10 | b | -| array_flow.rb:317:9:317:9 | a [element 2] : | array_flow.rb:317:9:317:36 | call to delete : | -| array_flow.rb:317:9:317:9 | a [element 2] : | array_flow.rb:317:9:317:36 | call to delete : | -| array_flow.rb:317:9:317:36 | call to delete : | array_flow.rb:317:5:317:5 | b : | -| array_flow.rb:317:9:317:36 | call to delete : | array_flow.rb:317:5:317:5 | b : | -| array_flow.rb:317:23:317:34 | call to source : | array_flow.rb:317:9:317:36 | call to delete : | -| array_flow.rb:317:23:317:34 | call to source : | array_flow.rb:317:9:317:36 | call to delete : | -| array_flow.rb:325:5:325:5 | a [element 2] : | array_flow.rb:326:9:326:9 | a [element 2] : | -| array_flow.rb:325:5:325:5 | a [element 2] : | array_flow.rb:326:9:326:9 | a [element 2] : | -| array_flow.rb:325:5:325:5 | a [element 3] : | array_flow.rb:326:9:326:9 | a [element 3] : | -| array_flow.rb:325:5:325:5 | a [element 3] : | array_flow.rb:326:9:326:9 | a [element 3] : | -| array_flow.rb:325:16:325:27 | call to source : | array_flow.rb:325:5:325:5 | a [element 2] : | -| array_flow.rb:325:16:325:27 | call to source : | array_flow.rb:325:5:325:5 | a [element 2] : | -| array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:325:5:325:5 | a [element 3] : | -| array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:325:5:325:5 | a [element 3] : | -| array_flow.rb:326:5:326:5 | b : | array_flow.rb:327:10:327:10 | b | -| array_flow.rb:326:5:326:5 | b : | array_flow.rb:327:10:327:10 | b | -| array_flow.rb:326:9:326:9 | [post] a [element 2] : | array_flow.rb:328:10:328:10 | a [element 2] : | -| array_flow.rb:326:9:326:9 | [post] a [element 2] : | array_flow.rb:328:10:328:10 | a [element 2] : | -| array_flow.rb:326:9:326:9 | a [element 2] : | array_flow.rb:326:9:326:22 | call to delete_at : | -| array_flow.rb:326:9:326:9 | a [element 2] : | array_flow.rb:326:9:326:22 | call to delete_at : | -| array_flow.rb:326:9:326:9 | a [element 3] : | array_flow.rb:326:9:326:9 | [post] a [element 2] : | -| array_flow.rb:326:9:326:9 | a [element 3] : | array_flow.rb:326:9:326:9 | [post] a [element 2] : | -| array_flow.rb:326:9:326:22 | call to delete_at : | array_flow.rb:326:5:326:5 | b : | -| array_flow.rb:326:9:326:22 | call to delete_at : | array_flow.rb:326:5:326:5 | b : | -| array_flow.rb:328:10:328:10 | a [element 2] : | array_flow.rb:328:10:328:13 | ...[...] | -| array_flow.rb:328:10:328:10 | a [element 2] : | array_flow.rb:328:10:328:13 | ...[...] | -| array_flow.rb:330:5:330:5 | a [element 2] : | array_flow.rb:331:9:331:9 | a [element 2] : | -| array_flow.rb:330:5:330:5 | a [element 2] : | array_flow.rb:331:9:331:9 | a [element 2] : | -| array_flow.rb:330:5:330:5 | a [element 3] : | array_flow.rb:331:9:331:9 | a [element 3] : | -| array_flow.rb:330:5:330:5 | a [element 3] : | array_flow.rb:331:9:331:9 | a [element 3] : | -| array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:330:5:330:5 | a [element 2] : | -| array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:330:5:330:5 | a [element 2] : | -| array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:330:5:330:5 | a [element 3] : | -| array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:330:5:330:5 | a [element 3] : | -| array_flow.rb:331:5:331:5 | b : | array_flow.rb:332:10:332:10 | b | -| array_flow.rb:331:5:331:5 | b : | array_flow.rb:332:10:332:10 | b | -| array_flow.rb:331:9:331:9 | [post] a [element] : | array_flow.rb:333:10:333:10 | a [element] : | -| array_flow.rb:331:9:331:9 | [post] a [element] : | array_flow.rb:333:10:333:10 | a [element] : | -| array_flow.rb:331:9:331:9 | [post] a [element] : | array_flow.rb:334:10:334:10 | a [element] : | -| array_flow.rb:331:9:331:9 | [post] a [element] : | array_flow.rb:334:10:334:10 | a [element] : | -| array_flow.rb:331:9:331:9 | a [element 2] : | array_flow.rb:331:9:331:9 | [post] a [element] : | -| array_flow.rb:331:9:331:9 | a [element 2] : | array_flow.rb:331:9:331:9 | [post] a [element] : | -| array_flow.rb:331:9:331:9 | a [element 2] : | array_flow.rb:331:9:331:22 | call to delete_at : | -| array_flow.rb:331:9:331:9 | a [element 2] : | array_flow.rb:331:9:331:22 | call to delete_at : | -| array_flow.rb:331:9:331:9 | a [element 3] : | array_flow.rb:331:9:331:9 | [post] a [element] : | -| array_flow.rb:331:9:331:9 | a [element 3] : | array_flow.rb:331:9:331:9 | [post] a [element] : | -| array_flow.rb:331:9:331:9 | a [element 3] : | array_flow.rb:331:9:331:22 | call to delete_at : | -| array_flow.rb:331:9:331:9 | a [element 3] : | array_flow.rb:331:9:331:22 | call to delete_at : | -| array_flow.rb:331:9:331:22 | call to delete_at : | array_flow.rb:331:5:331:5 | b : | -| array_flow.rb:331:9:331:22 | call to delete_at : | array_flow.rb:331:5:331:5 | b : | -| array_flow.rb:333:10:333:10 | a [element] : | array_flow.rb:333:10:333:13 | ...[...] | -| array_flow.rb:333:10:333:10 | a [element] : | array_flow.rb:333:10:333:13 | ...[...] | -| array_flow.rb:334:10:334:10 | a [element] : | array_flow.rb:334:10:334:13 | ...[...] | -| array_flow.rb:334:10:334:10 | a [element] : | array_flow.rb:334:10:334:13 | ...[...] | -| array_flow.rb:338:5:338:5 | a [element 2] : | array_flow.rb:339:9:339:9 | a [element 2] : | -| array_flow.rb:338:5:338:5 | a [element 2] : | array_flow.rb:339:9:339:9 | a [element 2] : | -| array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:338:5:338:5 | a [element 2] : | -| array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:338:5:338:5 | a [element 2] : | -| array_flow.rb:339:5:339:5 | b [element] : | array_flow.rb:342:10:342:10 | b [element] : | -| array_flow.rb:339:5:339:5 | b [element] : | array_flow.rb:342:10:342:10 | b [element] : | -| array_flow.rb:339:9:339:9 | [post] a [element] : | array_flow.rb:343:10:343:10 | a [element] : | -| array_flow.rb:339:9:339:9 | [post] a [element] : | array_flow.rb:343:10:343:10 | a [element] : | -| array_flow.rb:339:9:339:9 | [post] a [element] : | array_flow.rb:344:10:344:10 | a [element] : | -| array_flow.rb:339:9:339:9 | [post] a [element] : | array_flow.rb:344:10:344:10 | a [element] : | -| array_flow.rb:339:9:339:9 | [post] a [element] : | array_flow.rb:345:10:345:10 | a [element] : | -| array_flow.rb:339:9:339:9 | [post] a [element] : | array_flow.rb:345:10:345:10 | a [element] : | -| array_flow.rb:339:9:339:9 | a [element 2] : | array_flow.rb:339:9:339:9 | [post] a [element] : | -| array_flow.rb:339:9:339:9 | a [element 2] : | array_flow.rb:339:9:339:9 | [post] a [element] : | -| array_flow.rb:339:9:339:9 | a [element 2] : | array_flow.rb:339:9:341:7 | call to delete_if [element] : | -| array_flow.rb:339:9:339:9 | a [element 2] : | array_flow.rb:339:9:341:7 | call to delete_if [element] : | -| array_flow.rb:339:9:339:9 | a [element 2] : | array_flow.rb:339:25:339:25 | x : | -| array_flow.rb:339:9:339:9 | a [element 2] : | array_flow.rb:339:25:339:25 | x : | -| array_flow.rb:339:9:341:7 | call to delete_if [element] : | array_flow.rb:339:5:339:5 | b [element] : | -| array_flow.rb:339:9:341:7 | call to delete_if [element] : | array_flow.rb:339:5:339:5 | b [element] : | -| array_flow.rb:339:25:339:25 | x : | array_flow.rb:340:14:340:14 | x | -| array_flow.rb:339:25:339:25 | x : | array_flow.rb:340:14:340:14 | x | -| array_flow.rb:342:10:342:10 | b [element] : | array_flow.rb:342:10:342:13 | ...[...] | -| array_flow.rb:342:10:342:10 | b [element] : | array_flow.rb:342:10:342:13 | ...[...] | -| array_flow.rb:343:10:343:10 | a [element] : | array_flow.rb:343:10:343:13 | ...[...] | -| array_flow.rb:343:10:343:10 | a [element] : | array_flow.rb:343:10:343:13 | ...[...] | -| array_flow.rb:344:10:344:10 | a [element] : | array_flow.rb:344:10:344:13 | ...[...] | -| array_flow.rb:344:10:344:10 | a [element] : | array_flow.rb:344:10:344:13 | ...[...] | -| array_flow.rb:345:10:345:10 | a [element] : | array_flow.rb:345:10:345:13 | ...[...] | -| array_flow.rb:345:10:345:10 | a [element] : | array_flow.rb:345:10:345:13 | ...[...] | -| array_flow.rb:349:5:349:5 | a [element 2] : | array_flow.rb:350:9:350:9 | a [element 2] : | -| array_flow.rb:349:5:349:5 | a [element 2] : | array_flow.rb:350:9:350:9 | a [element 2] : | -| array_flow.rb:349:16:349:25 | call to source : | array_flow.rb:349:5:349:5 | a [element 2] : | -| array_flow.rb:349:16:349:25 | call to source : | array_flow.rb:349:5:349:5 | a [element 2] : | -| array_flow.rb:350:5:350:5 | b [element] : | array_flow.rb:351:10:351:10 | b [element] : | -| array_flow.rb:350:5:350:5 | b [element] : | array_flow.rb:351:10:351:10 | b [element] : | -| array_flow.rb:350:9:350:9 | a [element 2] : | array_flow.rb:350:9:350:25 | call to difference [element] : | -| array_flow.rb:350:9:350:9 | a [element 2] : | array_flow.rb:350:9:350:25 | call to difference [element] : | -| array_flow.rb:350:9:350:25 | call to difference [element] : | array_flow.rb:350:5:350:5 | b [element] : | -| array_flow.rb:350:9:350:25 | call to difference [element] : | array_flow.rb:350:5:350:5 | b [element] : | -| array_flow.rb:351:10:351:10 | b [element] : | array_flow.rb:351:10:351:13 | ...[...] | -| array_flow.rb:351:10:351:10 | b [element] : | array_flow.rb:351:10:351:13 | ...[...] | -| array_flow.rb:355:5:355:5 | a [element 2] : | array_flow.rb:357:10:357:10 | a [element 2] : | -| array_flow.rb:355:5:355:5 | a [element 2] : | array_flow.rb:357:10:357:10 | a [element 2] : | -| array_flow.rb:355:5:355:5 | a [element 2] : | array_flow.rb:358:10:358:10 | a [element 2] : | -| array_flow.rb:355:5:355:5 | a [element 2] : | array_flow.rb:358:10:358:10 | a [element 2] : | -| array_flow.rb:355:5:355:5 | a [element 3, element 1] : | array_flow.rb:360:10:360:10 | a [element 3, element 1] : | -| array_flow.rb:355:5:355:5 | a [element 3, element 1] : | array_flow.rb:360:10:360:10 | a [element 3, element 1] : | -| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:355:5:355:5 | a [element 2] : | -| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:355:5:355:5 | a [element 2] : | -| array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:355:5:355:5 | a [element 3, element 1] : | -| array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:355:5:355:5 | a [element 3, element 1] : | -| array_flow.rb:357:10:357:10 | a [element 2] : | array_flow.rb:357:10:357:17 | call to dig | -| array_flow.rb:357:10:357:10 | a [element 2] : | array_flow.rb:357:10:357:17 | call to dig | -| array_flow.rb:358:10:358:10 | a [element 2] : | array_flow.rb:358:10:358:17 | call to dig | -| array_flow.rb:358:10:358:10 | a [element 2] : | array_flow.rb:358:10:358:17 | call to dig | -| array_flow.rb:360:10:360:10 | a [element 3, element 1] : | array_flow.rb:360:10:360:19 | call to dig | -| array_flow.rb:360:10:360:10 | a [element 3, element 1] : | array_flow.rb:360:10:360:19 | call to dig | -| array_flow.rb:364:5:364:5 | a [element 2] : | array_flow.rb:365:9:365:9 | a [element 2] : | -| array_flow.rb:364:5:364:5 | a [element 2] : | array_flow.rb:365:9:365:9 | a [element 2] : | -| array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:364:5:364:5 | a [element 2] : | -| array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:364:5:364:5 | a [element 2] : | -| array_flow.rb:365:5:365:5 | b : | array_flow.rb:368:10:368:10 | b | -| array_flow.rb:365:5:365:5 | b : | array_flow.rb:368:10:368:10 | b | -| array_flow.rb:365:9:365:9 | a [element 2] : | array_flow.rb:365:9:367:7 | call to detect : | -| array_flow.rb:365:9:365:9 | a [element 2] : | array_flow.rb:365:9:367:7 | call to detect : | -| array_flow.rb:365:9:365:9 | a [element 2] : | array_flow.rb:365:43:365:43 | x : | -| array_flow.rb:365:9:365:9 | a [element 2] : | array_flow.rb:365:43:365:43 | x : | -| array_flow.rb:365:9:367:7 | call to detect : | array_flow.rb:365:5:365:5 | b : | -| array_flow.rb:365:9:367:7 | call to detect : | array_flow.rb:365:5:365:5 | b : | -| array_flow.rb:365:23:365:34 | call to source : | array_flow.rb:365:9:367:7 | call to detect : | -| array_flow.rb:365:23:365:34 | call to source : | array_flow.rb:365:9:367:7 | call to detect : | -| array_flow.rb:365:43:365:43 | x : | array_flow.rb:366:14:366:14 | x | -| array_flow.rb:365:43:365:43 | x : | array_flow.rb:366:14:366:14 | x | -| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:373:9:373:9 | a [element 2] : | -| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:373:9:373:9 | a [element 2] : | -| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:375:9:375:9 | a [element 2] : | -| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:375:9:375:9 | a [element 2] : | -| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:380:9:380:9 | a [element 2] : | -| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:380:9:380:9 | a [element 2] : | -| array_flow.rb:372:5:372:5 | a [element 3] : | array_flow.rb:373:9:373:9 | a [element 3] : | -| array_flow.rb:372:5:372:5 | a [element 3] : | array_flow.rb:373:9:373:9 | a [element 3] : | -| array_flow.rb:372:5:372:5 | a [element 3] : | array_flow.rb:375:9:375:9 | a [element 3] : | -| array_flow.rb:372:5:372:5 | a [element 3] : | array_flow.rb:375:9:375:9 | a [element 3] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:372:5:372:5 | a [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:372:5:372:5 | a [element 2] : | -| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:372:5:372:5 | a [element 3] : | -| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:372:5:372:5 | a [element 3] : | -| array_flow.rb:373:5:373:5 | b [element] : | array_flow.rb:374:10:374:10 | b [element] : | -| array_flow.rb:373:5:373:5 | b [element] : | array_flow.rb:374:10:374:10 | b [element] : | -| array_flow.rb:373:9:373:9 | a [element 2] : | array_flow.rb:373:9:373:17 | call to drop [element] : | -| array_flow.rb:373:9:373:9 | a [element 2] : | array_flow.rb:373:9:373:17 | call to drop [element] : | -| array_flow.rb:373:9:373:9 | a [element 3] : | array_flow.rb:373:9:373:17 | call to drop [element] : | -| array_flow.rb:373:9:373:9 | a [element 3] : | array_flow.rb:373:9:373:17 | call to drop [element] : | -| array_flow.rb:373:9:373:17 | call to drop [element] : | array_flow.rb:373:5:373:5 | b [element] : | -| array_flow.rb:373:9:373:17 | call to drop [element] : | array_flow.rb:373:5:373:5 | b [element] : | -| array_flow.rb:374:10:374:10 | b [element] : | array_flow.rb:374:10:374:13 | ...[...] | -| array_flow.rb:374:10:374:10 | b [element] : | array_flow.rb:374:10:374:13 | ...[...] | -| array_flow.rb:375:5:375:5 | b [element 1] : | array_flow.rb:377:10:377:10 | b [element 1] : | -| array_flow.rb:375:5:375:5 | b [element 1] : | array_flow.rb:377:10:377:10 | b [element 1] : | -| array_flow.rb:375:5:375:5 | b [element 1] : | array_flow.rb:378:10:378:10 | b [element 1] : | -| array_flow.rb:375:5:375:5 | b [element 1] : | array_flow.rb:378:10:378:10 | b [element 1] : | -| array_flow.rb:375:5:375:5 | b [element 2] : | array_flow.rb:378:10:378:10 | b [element 2] : | -| array_flow.rb:375:5:375:5 | b [element 2] : | array_flow.rb:378:10:378:10 | b [element 2] : | -| array_flow.rb:375:9:375:9 | a [element 2] : | array_flow.rb:375:9:375:17 | call to drop [element 1] : | -| array_flow.rb:375:9:375:9 | a [element 2] : | array_flow.rb:375:9:375:17 | call to drop [element 1] : | -| array_flow.rb:375:9:375:9 | a [element 3] : | array_flow.rb:375:9:375:17 | call to drop [element 2] : | -| array_flow.rb:375:9:375:9 | a [element 3] : | array_flow.rb:375:9:375:17 | call to drop [element 2] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:375:5:375:5 | b [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:375:5:375:5 | b [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 2] : | array_flow.rb:375:5:375:5 | b [element 2] : | -| array_flow.rb:375:9:375:17 | call to drop [element 2] : | array_flow.rb:375:5:375:5 | b [element 2] : | -| array_flow.rb:377:10:377:10 | b [element 1] : | array_flow.rb:377:10:377:13 | ...[...] | -| array_flow.rb:377:10:377:10 | b [element 1] : | array_flow.rb:377:10:377:13 | ...[...] | -| array_flow.rb:378:10:378:10 | b [element 1] : | array_flow.rb:378:10:378:13 | ...[...] | -| array_flow.rb:378:10:378:10 | b [element 1] : | array_flow.rb:378:10:378:13 | ...[...] | -| array_flow.rb:378:10:378:10 | b [element 2] : | array_flow.rb:378:10:378:13 | ...[...] | -| array_flow.rb:378:10:378:10 | b [element 2] : | array_flow.rb:378:10:378:13 | ...[...] | -| array_flow.rb:379:5:379:5 | [post] a [element] : | array_flow.rb:380:9:380:9 | a [element] : | -| array_flow.rb:379:5:379:5 | [post] a [element] : | array_flow.rb:380:9:380:9 | a [element] : | -| array_flow.rb:379:12:379:23 | call to source : | array_flow.rb:379:5:379:5 | [post] a [element] : | -| array_flow.rb:379:12:379:23 | call to source : | array_flow.rb:379:5:379:5 | [post] a [element] : | -| array_flow.rb:380:5:380:5 | b [element 1] : | array_flow.rb:381:10:381:10 | b [element 1] : | -| array_flow.rb:380:5:380:5 | b [element 1] : | array_flow.rb:381:10:381:10 | b [element 1] : | -| array_flow.rb:380:5:380:5 | b [element] : | array_flow.rb:381:10:381:10 | b [element] : | -| array_flow.rb:380:5:380:5 | b [element] : | array_flow.rb:381:10:381:10 | b [element] : | -| array_flow.rb:380:5:380:5 | b [element] : | array_flow.rb:382:9:382:9 | b [element] : | -| array_flow.rb:380:5:380:5 | b [element] : | array_flow.rb:382:9:382:9 | b [element] : | -| array_flow.rb:380:9:380:9 | a [element 2] : | array_flow.rb:380:9:380:17 | call to drop [element 1] : | -| array_flow.rb:380:9:380:9 | a [element 2] : | array_flow.rb:380:9:380:17 | call to drop [element 1] : | -| array_flow.rb:380:9:380:9 | a [element] : | array_flow.rb:380:9:380:17 | call to drop [element] : | -| array_flow.rb:380:9:380:9 | a [element] : | array_flow.rb:380:9:380:17 | call to drop [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element 1] : | array_flow.rb:380:5:380:5 | b [element 1] : | -| array_flow.rb:380:9:380:17 | call to drop [element 1] : | array_flow.rb:380:5:380:5 | b [element 1] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:380:5:380:5 | b [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:380:5:380:5 | b [element] : | -| array_flow.rb:381:10:381:10 | b [element 1] : | array_flow.rb:381:10:381:13 | ...[...] | -| array_flow.rb:381:10:381:10 | b [element 1] : | array_flow.rb:381:10:381:13 | ...[...] | -| array_flow.rb:381:10:381:10 | b [element] : | array_flow.rb:381:10:381:13 | ...[...] | -| array_flow.rb:381:10:381:10 | b [element] : | array_flow.rb:381:10:381:13 | ...[...] | -| array_flow.rb:382:5:382:5 | c [element] : | array_flow.rb:383:10:383:10 | c [element] : | -| array_flow.rb:382:5:382:5 | c [element] : | array_flow.rb:383:10:383:10 | c [element] : | -| array_flow.rb:382:9:382:9 | b [element] : | array_flow.rb:382:9:382:19 | call to drop [element] : | -| array_flow.rb:382:9:382:9 | b [element] : | array_flow.rb:382:9:382:19 | call to drop [element] : | -| array_flow.rb:382:9:382:19 | call to drop [element] : | array_flow.rb:382:5:382:5 | c [element] : | -| array_flow.rb:382:9:382:19 | call to drop [element] : | array_flow.rb:382:5:382:5 | c [element] : | -| array_flow.rb:383:10:383:10 | c [element] : | array_flow.rb:383:10:383:13 | ...[...] | -| array_flow.rb:383:10:383:10 | c [element] : | array_flow.rb:383:10:383:13 | ...[...] | -| array_flow.rb:387:5:387:5 | a [element 2] : | array_flow.rb:388:9:388:9 | a [element 2] : | -| array_flow.rb:387:5:387:5 | a [element 2] : | array_flow.rb:388:9:388:9 | a [element 2] : | -| array_flow.rb:387:5:387:5 | a [element 3] : | array_flow.rb:388:9:388:9 | a [element 3] : | -| array_flow.rb:387:5:387:5 | a [element 3] : | array_flow.rb:388:9:388:9 | a [element 3] : | -| array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:387:5:387:5 | a [element 2] : | -| array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:387:5:387:5 | a [element 2] : | -| array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:387:5:387:5 | a [element 3] : | -| array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:387:5:387:5 | a [element 3] : | -| array_flow.rb:388:5:388:5 | b [element] : | array_flow.rb:391:10:391:10 | b [element] : | -| array_flow.rb:388:5:388:5 | b [element] : | array_flow.rb:391:10:391:10 | b [element] : | -| array_flow.rb:388:9:388:9 | a [element 2] : | array_flow.rb:388:9:390:7 | call to drop_while [element] : | -| array_flow.rb:388:9:388:9 | a [element 2] : | array_flow.rb:388:9:390:7 | call to drop_while [element] : | -| array_flow.rb:388:9:388:9 | a [element 2] : | array_flow.rb:388:26:388:26 | x : | -| array_flow.rb:388:9:388:9 | a [element 2] : | array_flow.rb:388:26:388:26 | x : | -| array_flow.rb:388:9:388:9 | a [element 3] : | array_flow.rb:388:9:390:7 | call to drop_while [element] : | -| array_flow.rb:388:9:388:9 | a [element 3] : | array_flow.rb:388:9:390:7 | call to drop_while [element] : | -| array_flow.rb:388:9:388:9 | a [element 3] : | array_flow.rb:388:26:388:26 | x : | -| array_flow.rb:388:9:388:9 | a [element 3] : | array_flow.rb:388:26:388:26 | x : | -| array_flow.rb:388:9:390:7 | call to drop_while [element] : | array_flow.rb:388:5:388:5 | b [element] : | -| array_flow.rb:388:9:390:7 | call to drop_while [element] : | array_flow.rb:388:5:388:5 | b [element] : | -| array_flow.rb:388:26:388:26 | x : | array_flow.rb:389:14:389:14 | x | -| array_flow.rb:388:26:388:26 | x : | array_flow.rb:389:14:389:14 | x | -| array_flow.rb:391:10:391:10 | b [element] : | array_flow.rb:391:10:391:13 | ...[...] | -| array_flow.rb:391:10:391:10 | b [element] : | array_flow.rb:391:10:391:13 | ...[...] | -| array_flow.rb:395:5:395:5 | a [element 2] : | array_flow.rb:396:9:396:9 | a [element 2] : | -| array_flow.rb:395:5:395:5 | a [element 2] : | array_flow.rb:396:9:396:9 | a [element 2] : | -| array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:395:5:395:5 | a [element 2] : | -| array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:395:5:395:5 | a [element 2] : | -| array_flow.rb:396:5:396:5 | b [element 2] : | array_flow.rb:399:10:399:10 | b [element 2] : | -| array_flow.rb:396:5:396:5 | b [element 2] : | array_flow.rb:399:10:399:10 | b [element 2] : | -| array_flow.rb:396:9:396:9 | a [element 2] : | array_flow.rb:396:9:398:7 | call to each [element 2] : | -| array_flow.rb:396:9:396:9 | a [element 2] : | array_flow.rb:396:9:398:7 | call to each [element 2] : | -| array_flow.rb:396:9:396:9 | a [element 2] : | array_flow.rb:396:20:396:20 | x : | -| array_flow.rb:396:9:396:9 | a [element 2] : | array_flow.rb:396:20:396:20 | x : | -| array_flow.rb:396:9:398:7 | call to each [element 2] : | array_flow.rb:396:5:396:5 | b [element 2] : | -| array_flow.rb:396:9:398:7 | call to each [element 2] : | array_flow.rb:396:5:396:5 | b [element 2] : | -| array_flow.rb:396:20:396:20 | x : | array_flow.rb:397:14:397:14 | x | -| array_flow.rb:396:20:396:20 | x : | array_flow.rb:397:14:397:14 | x | -| array_flow.rb:399:10:399:10 | b [element 2] : | array_flow.rb:399:10:399:13 | ...[...] | -| array_flow.rb:399:10:399:10 | b [element 2] : | array_flow.rb:399:10:399:13 | ...[...] | -| array_flow.rb:403:5:403:5 | a [element 2] : | array_flow.rb:404:18:404:18 | a [element 2] : | -| array_flow.rb:403:5:403:5 | a [element 2] : | array_flow.rb:404:18:404:18 | a [element 2] : | -| array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:403:5:403:5 | a [element 2] : | -| array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:403:5:403:5 | a [element 2] : | -| array_flow.rb:404:5:404:5 | b [element 2] : | array_flow.rb:408:10:408:10 | b [element 2] : | -| array_flow.rb:404:5:404:5 | b [element 2] : | array_flow.rb:408:10:408:10 | b [element 2] : | -| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:404:13:404:13 | x : | -| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:404:13:404:13 | x : | -| array_flow.rb:404:13:404:13 | x : | array_flow.rb:405:14:405:14 | x | -| array_flow.rb:404:13:404:13 | x : | array_flow.rb:405:14:405:14 | x | -| array_flow.rb:404:13:404:13 | x : | array_flow.rb:407:10:407:10 | x | -| array_flow.rb:404:13:404:13 | x : | array_flow.rb:407:10:407:10 | x | -| array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:404:5:404:5 | b [element 2] : | -| array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:404:5:404:5 | b [element 2] : | -| array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:404:9:406:7 | __synth__0__1 : | -| array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:404:9:406:7 | __synth__0__1 : | -| array_flow.rb:408:10:408:10 | b [element 2] : | array_flow.rb:408:10:408:13 | ...[...] | -| array_flow.rb:408:10:408:10 | b [element 2] : | array_flow.rb:408:10:408:13 | ...[...] | -| array_flow.rb:412:5:412:5 | a [element 2] : | array_flow.rb:413:5:413:5 | a [element 2] : | -| array_flow.rb:412:5:412:5 | a [element 2] : | array_flow.rb:413:5:413:5 | a [element 2] : | -| array_flow.rb:412:16:412:25 | call to source : | array_flow.rb:412:5:412:5 | a [element 2] : | -| array_flow.rb:412:16:412:25 | call to source : | array_flow.rb:412:5:412:5 | a [element 2] : | -| array_flow.rb:413:5:413:5 | a [element 2] : | array_flow.rb:413:24:413:24 | x [element] : | -| array_flow.rb:413:5:413:5 | a [element 2] : | array_flow.rb:413:24:413:24 | x [element] : | -| array_flow.rb:413:24:413:24 | x [element] : | array_flow.rb:414:15:414:15 | x [element] : | -| array_flow.rb:413:24:413:24 | x [element] : | array_flow.rb:414:15:414:15 | x [element] : | -| array_flow.rb:414:15:414:15 | x [element] : | array_flow.rb:414:15:414:18 | ...[...] : | -| array_flow.rb:414:15:414:15 | x [element] : | array_flow.rb:414:15:414:18 | ...[...] : | -| array_flow.rb:414:15:414:18 | ...[...] : | array_flow.rb:414:14:414:19 | ( ... ) | -| array_flow.rb:414:15:414:18 | ...[...] : | array_flow.rb:414:14:414:19 | ( ... ) | -| array_flow.rb:419:5:419:5 | a [element 2] : | array_flow.rb:420:9:420:9 | a [element 2] : | -| array_flow.rb:419:5:419:5 | a [element 2] : | array_flow.rb:420:9:420:9 | a [element 2] : | -| array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:419:5:419:5 | a [element 2] : | -| array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:419:5:419:5 | a [element 2] : | -| array_flow.rb:420:5:420:5 | b [element 2] : | array_flow.rb:423:10:423:10 | b [element 2] : | -| array_flow.rb:420:5:420:5 | b [element 2] : | array_flow.rb:423:10:423:10 | b [element 2] : | -| array_flow.rb:420:9:420:9 | a [element 2] : | array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | -| array_flow.rb:420:9:420:9 | a [element 2] : | array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | -| array_flow.rb:420:9:420:9 | a [element 2] : | array_flow.rb:420:26:420:26 | x : | -| array_flow.rb:420:9:420:9 | a [element 2] : | array_flow.rb:420:26:420:26 | x : | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | array_flow.rb:420:5:420:5 | b [element 2] : | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | array_flow.rb:420:5:420:5 | b [element 2] : | -| array_flow.rb:420:26:420:26 | x : | array_flow.rb:421:14:421:14 | x | -| array_flow.rb:420:26:420:26 | x : | array_flow.rb:421:14:421:14 | x | -| array_flow.rb:423:10:423:10 | b [element 2] : | array_flow.rb:423:10:423:13 | ...[...] | -| array_flow.rb:423:10:423:10 | b [element 2] : | array_flow.rb:423:10:423:13 | ...[...] | -| array_flow.rb:427:5:427:5 | a [element 2] : | array_flow.rb:428:9:428:9 | a [element 2] : | -| array_flow.rb:427:5:427:5 | a [element 2] : | array_flow.rb:428:9:428:9 | a [element 2] : | -| array_flow.rb:427:16:427:25 | call to source : | array_flow.rb:427:5:427:5 | a [element 2] : | -| array_flow.rb:427:16:427:25 | call to source : | array_flow.rb:427:5:427:5 | a [element 2] : | -| array_flow.rb:428:5:428:5 | b [element 2] : | array_flow.rb:431:10:431:10 | b [element 2] : | -| array_flow.rb:428:5:428:5 | b [element 2] : | array_flow.rb:431:10:431:10 | b [element 2] : | -| array_flow.rb:428:9:428:9 | a [element 2] : | array_flow.rb:428:9:430:7 | call to each_index [element 2] : | -| array_flow.rb:428:9:428:9 | a [element 2] : | array_flow.rb:428:9:430:7 | call to each_index [element 2] : | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] : | array_flow.rb:428:5:428:5 | b [element 2] : | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] : | array_flow.rb:428:5:428:5 | b [element 2] : | -| array_flow.rb:431:10:431:10 | b [element 2] : | array_flow.rb:431:10:431:13 | ...[...] | -| array_flow.rb:431:10:431:10 | b [element 2] : | array_flow.rb:431:10:431:13 | ...[...] | -| array_flow.rb:435:5:435:5 | a [element 3] : | array_flow.rb:436:5:436:5 | a [element 3] : | -| array_flow.rb:435:5:435:5 | a [element 3] : | array_flow.rb:436:5:436:5 | a [element 3] : | -| array_flow.rb:435:19:435:28 | call to source : | array_flow.rb:435:5:435:5 | a [element 3] : | -| array_flow.rb:435:19:435:28 | call to source : | array_flow.rb:435:5:435:5 | a [element 3] : | -| array_flow.rb:436:5:436:5 | a [element 3] : | array_flow.rb:436:25:436:25 | x [element] : | -| array_flow.rb:436:5:436:5 | a [element 3] : | array_flow.rb:436:25:436:25 | x [element] : | -| array_flow.rb:436:25:436:25 | x [element] : | array_flow.rb:437:14:437:14 | x [element] : | -| array_flow.rb:436:25:436:25 | x [element] : | array_flow.rb:437:14:437:14 | x [element] : | -| array_flow.rb:437:14:437:14 | x [element] : | array_flow.rb:437:14:437:17 | ...[...] | -| array_flow.rb:437:14:437:14 | x [element] : | array_flow.rb:437:14:437:17 | ...[...] | -| array_flow.rb:442:5:442:5 | a [element 3] : | array_flow.rb:443:9:443:9 | a [element 3] : | -| array_flow.rb:442:5:442:5 | a [element 3] : | array_flow.rb:443:9:443:9 | a [element 3] : | -| array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:442:5:442:5 | a [element 3] : | -| array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:442:5:442:5 | a [element 3] : | -| array_flow.rb:443:5:443:5 | b [element 3] : | array_flow.rb:447:10:447:10 | b [element 3] : | -| array_flow.rb:443:5:443:5 | b [element 3] : | array_flow.rb:447:10:447:10 | b [element 3] : | -| array_flow.rb:443:9:443:9 | a [element 3] : | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | -| array_flow.rb:443:9:443:9 | a [element 3] : | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | -| array_flow.rb:443:9:443:9 | a [element 3] : | array_flow.rb:443:31:443:31 | x : | -| array_flow.rb:443:9:443:9 | a [element 3] : | array_flow.rb:443:31:443:31 | x : | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | array_flow.rb:443:5:443:5 | b [element 3] : | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | array_flow.rb:443:5:443:5 | b [element 3] : | -| array_flow.rb:443:31:443:31 | x : | array_flow.rb:444:14:444:14 | x | -| array_flow.rb:443:31:443:31 | x : | array_flow.rb:444:14:444:14 | x | -| array_flow.rb:447:10:447:10 | b [element 3] : | array_flow.rb:447:10:447:13 | ...[...] | -| array_flow.rb:447:10:447:10 | b [element 3] : | array_flow.rb:447:10:447:13 | ...[...] | -| array_flow.rb:451:5:451:5 | a [element 3] : | array_flow.rb:452:9:452:9 | a [element 3] : | -| array_flow.rb:451:5:451:5 | a [element 3] : | array_flow.rb:452:9:452:9 | a [element 3] : | -| array_flow.rb:451:19:451:30 | call to source : | array_flow.rb:451:5:451:5 | a [element 3] : | -| array_flow.rb:451:19:451:30 | call to source : | array_flow.rb:451:5:451:5 | a [element 3] : | -| array_flow.rb:452:5:452:5 | b : | array_flow.rb:456:10:456:10 | b | -| array_flow.rb:452:5:452:5 | b : | array_flow.rb:456:10:456:10 | b | -| array_flow.rb:452:9:452:9 | a [element 3] : | array_flow.rb:452:46:452:46 | x : | -| array_flow.rb:452:9:452:9 | a [element 3] : | array_flow.rb:452:46:452:46 | x : | -| array_flow.rb:452:9:455:7 | call to each_with_object : | array_flow.rb:452:5:452:5 | b : | -| array_flow.rb:452:9:455:7 | call to each_with_object : | array_flow.rb:452:5:452:5 | b : | -| array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:452:9:455:7 | call to each_with_object : | -| array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:452:9:455:7 | call to each_with_object : | -| array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:452:48:452:48 | a : | -| array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:452:48:452:48 | a : | -| array_flow.rb:452:46:452:46 | x : | array_flow.rb:453:14:453:14 | x | -| array_flow.rb:452:46:452:46 | x : | array_flow.rb:453:14:453:14 | x | -| array_flow.rb:452:48:452:48 | a : | array_flow.rb:454:14:454:14 | a | -| array_flow.rb:452:48:452:48 | a : | array_flow.rb:454:14:454:14 | a | -| array_flow.rb:460:5:460:5 | a [element 3] : | array_flow.rb:461:9:461:9 | a [element 3] : | -| array_flow.rb:460:5:460:5 | a [element 3] : | array_flow.rb:461:9:461:9 | a [element 3] : | -| array_flow.rb:460:19:460:28 | call to source : | array_flow.rb:460:5:460:5 | a [element 3] : | -| array_flow.rb:460:19:460:28 | call to source : | array_flow.rb:460:5:460:5 | a [element 3] : | -| array_flow.rb:461:5:461:5 | b [element 3] : | array_flow.rb:462:10:462:10 | b [element 3] : | -| array_flow.rb:461:5:461:5 | b [element 3] : | array_flow.rb:462:10:462:10 | b [element 3] : | -| array_flow.rb:461:9:461:9 | a [element 3] : | array_flow.rb:461:9:461:17 | call to entries [element 3] : | -| array_flow.rb:461:9:461:9 | a [element 3] : | array_flow.rb:461:9:461:17 | call to entries [element 3] : | -| array_flow.rb:461:9:461:17 | call to entries [element 3] : | array_flow.rb:461:5:461:5 | b [element 3] : | -| array_flow.rb:461:9:461:17 | call to entries [element 3] : | array_flow.rb:461:5:461:5 | b [element 3] : | -| array_flow.rb:462:10:462:10 | b [element 3] : | array_flow.rb:462:10:462:13 | ...[...] | -| array_flow.rb:462:10:462:10 | b [element 3] : | array_flow.rb:462:10:462:13 | ...[...] | -| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:467:9:467:9 | a [element 3] : | -| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:467:9:467:9 | a [element 3] : | -| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:471:9:471:9 | a [element 3] : | -| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:471:9:471:9 | a [element 3] : | -| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:473:9:473:9 | a [element 3] : | -| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:473:9:473:9 | a [element 3] : | -| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:477:9:477:9 | a [element 3] : | -| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:477:9:477:9 | a [element 3] : | -| array_flow.rb:466:5:466:5 | a [element 4] : | array_flow.rb:467:9:467:9 | a [element 4] : | -| array_flow.rb:466:5:466:5 | a [element 4] : | array_flow.rb:467:9:467:9 | a [element 4] : | -| array_flow.rb:466:5:466:5 | a [element 4] : | array_flow.rb:477:9:477:9 | a [element 4] : | -| array_flow.rb:466:5:466:5 | a [element 4] : | array_flow.rb:477:9:477:9 | a [element 4] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:466:5:466:5 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:466:5:466:5 | a [element 3] : | -| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:466:5:466:5 | a [element 4] : | -| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:466:5:466:5 | a [element 4] : | -| array_flow.rb:467:5:467:5 | b : | array_flow.rb:470:10:470:10 | b | -| array_flow.rb:467:5:467:5 | b : | array_flow.rb:470:10:470:10 | b | -| array_flow.rb:467:9:467:9 | a [element 3] : | array_flow.rb:467:9:469:7 | call to fetch : | -| array_flow.rb:467:9:467:9 | a [element 3] : | array_flow.rb:467:9:469:7 | call to fetch : | -| array_flow.rb:467:9:467:9 | a [element 4] : | array_flow.rb:467:9:469:7 | call to fetch : | -| array_flow.rb:467:9:467:9 | a [element 4] : | array_flow.rb:467:9:469:7 | call to fetch : | -| array_flow.rb:467:9:469:7 | call to fetch : | array_flow.rb:467:5:467:5 | b : | -| array_flow.rb:467:9:469:7 | call to fetch : | array_flow.rb:467:5:467:5 | b : | -| array_flow.rb:467:17:467:28 | call to source : | array_flow.rb:467:35:467:35 | x : | -| array_flow.rb:467:17:467:28 | call to source : | array_flow.rb:467:35:467:35 | x : | -| array_flow.rb:467:35:467:35 | x : | array_flow.rb:468:14:468:14 | x | -| array_flow.rb:467:35:467:35 | x : | array_flow.rb:468:14:468:14 | x | -| array_flow.rb:471:5:471:5 | b : | array_flow.rb:472:10:472:10 | b | -| array_flow.rb:471:5:471:5 | b : | array_flow.rb:472:10:472:10 | b | -| array_flow.rb:471:9:471:9 | a [element 3] : | array_flow.rb:471:9:471:18 | call to fetch : | -| array_flow.rb:471:9:471:9 | a [element 3] : | array_flow.rb:471:9:471:18 | call to fetch : | -| array_flow.rb:471:9:471:18 | call to fetch : | array_flow.rb:471:5:471:5 | b : | -| array_flow.rb:471:9:471:18 | call to fetch : | array_flow.rb:471:5:471:5 | b : | -| array_flow.rb:473:5:473:5 | b : | array_flow.rb:474:10:474:10 | b | -| array_flow.rb:473:5:473:5 | b : | array_flow.rb:474:10:474:10 | b | -| array_flow.rb:473:9:473:9 | a [element 3] : | array_flow.rb:473:9:473:32 | call to fetch : | -| array_flow.rb:473:9:473:9 | a [element 3] : | array_flow.rb:473:9:473:32 | call to fetch : | -| array_flow.rb:473:9:473:32 | call to fetch : | array_flow.rb:473:5:473:5 | b : | -| array_flow.rb:473:9:473:32 | call to fetch : | array_flow.rb:473:5:473:5 | b : | -| array_flow.rb:473:20:473:31 | call to source : | array_flow.rb:473:9:473:32 | call to fetch : | -| array_flow.rb:473:20:473:31 | call to source : | array_flow.rb:473:9:473:32 | call to fetch : | -| array_flow.rb:475:5:475:5 | b : | array_flow.rb:476:10:476:10 | b | -| array_flow.rb:475:5:475:5 | b : | array_flow.rb:476:10:476:10 | b | -| array_flow.rb:475:9:475:34 | call to fetch : | array_flow.rb:475:5:475:5 | b : | -| array_flow.rb:475:9:475:34 | call to fetch : | array_flow.rb:475:5:475:5 | b : | -| array_flow.rb:475:22:475:33 | call to source : | array_flow.rb:475:9:475:34 | call to fetch : | -| array_flow.rb:475:22:475:33 | call to source : | array_flow.rb:475:9:475:34 | call to fetch : | -| array_flow.rb:477:5:477:5 | b : | array_flow.rb:478:10:478:10 | b | -| array_flow.rb:477:5:477:5 | b : | array_flow.rb:478:10:478:10 | b | -| array_flow.rb:477:9:477:9 | a [element 3] : | array_flow.rb:477:9:477:32 | call to fetch : | -| array_flow.rb:477:9:477:9 | a [element 3] : | array_flow.rb:477:9:477:32 | call to fetch : | -| array_flow.rb:477:9:477:9 | a [element 4] : | array_flow.rb:477:9:477:32 | call to fetch : | -| array_flow.rb:477:9:477:9 | a [element 4] : | array_flow.rb:477:9:477:32 | call to fetch : | -| array_flow.rb:477:9:477:32 | call to fetch : | array_flow.rb:477:5:477:5 | b : | -| array_flow.rb:477:9:477:32 | call to fetch : | array_flow.rb:477:5:477:5 | b : | -| array_flow.rb:477:20:477:31 | call to source : | array_flow.rb:477:9:477:32 | call to fetch : | -| array_flow.rb:477:20:477:31 | call to source : | array_flow.rb:477:9:477:32 | call to fetch : | -| array_flow.rb:482:5:482:5 | a [element 3] : | array_flow.rb:484:10:484:10 | a [element 3] : | -| array_flow.rb:482:5:482:5 | a [element 3] : | array_flow.rb:484:10:484:10 | a [element 3] : | -| array_flow.rb:482:19:482:30 | call to source : | array_flow.rb:482:5:482:5 | a [element 3] : | -| array_flow.rb:482:19:482:30 | call to source : | array_flow.rb:482:5:482:5 | a [element 3] : | -| array_flow.rb:483:5:483:5 | [post] a [element] : | array_flow.rb:484:10:484:10 | a [element] : | -| array_flow.rb:483:5:483:5 | [post] a [element] : | array_flow.rb:484:10:484:10 | a [element] : | -| array_flow.rb:483:12:483:23 | call to source : | array_flow.rb:483:5:483:5 | [post] a [element] : | -| array_flow.rb:483:12:483:23 | call to source : | array_flow.rb:483:5:483:5 | [post] a [element] : | -| array_flow.rb:484:10:484:10 | a [element 3] : | array_flow.rb:484:10:484:13 | ...[...] | -| array_flow.rb:484:10:484:10 | a [element 3] : | array_flow.rb:484:10:484:13 | ...[...] | -| array_flow.rb:484:10:484:10 | a [element] : | array_flow.rb:484:10:484:13 | ...[...] | -| array_flow.rb:484:10:484:10 | a [element] : | array_flow.rb:484:10:484:13 | ...[...] | -| array_flow.rb:485:5:485:5 | [post] a [element] : | array_flow.rb:486:10:486:10 | a [element] : | -| array_flow.rb:485:5:485:5 | [post] a [element] : | array_flow.rb:486:10:486:10 | a [element] : | -| array_flow.rb:485:12:485:23 | call to source : | array_flow.rb:485:5:485:5 | [post] a [element] : | -| array_flow.rb:485:12:485:23 | call to source : | array_flow.rb:485:5:485:5 | [post] a [element] : | -| array_flow.rb:486:10:486:10 | a [element] : | array_flow.rb:486:10:486:13 | ...[...] | -| array_flow.rb:486:10:486:10 | a [element] : | array_flow.rb:486:10:486:13 | ...[...] | -| array_flow.rb:487:5:487:5 | [post] a [element] : | array_flow.rb:490:10:490:10 | a [element] : | -| array_flow.rb:487:5:487:5 | [post] a [element] : | array_flow.rb:490:10:490:10 | a [element] : | -| array_flow.rb:487:5:487:5 | [post] a [element] : | array_flow.rb:494:10:494:10 | a [element] : | -| array_flow.rb:487:5:487:5 | [post] a [element] : | array_flow.rb:494:10:494:10 | a [element] : | -| array_flow.rb:488:9:488:20 | call to source : | array_flow.rb:487:5:487:5 | [post] a [element] : | -| array_flow.rb:488:9:488:20 | call to source : | array_flow.rb:487:5:487:5 | [post] a [element] : | -| array_flow.rb:490:10:490:10 | a [element] : | array_flow.rb:490:10:490:13 | ...[...] | -| array_flow.rb:490:10:490:10 | a [element] : | array_flow.rb:490:10:490:13 | ...[...] | -| array_flow.rb:491:5:491:5 | [post] a [element] : | array_flow.rb:494:10:494:10 | a [element] : | -| array_flow.rb:491:5:491:5 | [post] a [element] : | array_flow.rb:494:10:494:10 | a [element] : | -| array_flow.rb:492:9:492:20 | call to source : | array_flow.rb:491:5:491:5 | [post] a [element] : | -| array_flow.rb:492:9:492:20 | call to source : | array_flow.rb:491:5:491:5 | [post] a [element] : | -| array_flow.rb:494:10:494:10 | a [element] : | array_flow.rb:494:10:494:13 | ...[...] | -| array_flow.rb:494:10:494:10 | a [element] : | array_flow.rb:494:10:494:13 | ...[...] | -| array_flow.rb:498:5:498:5 | a [element 3] : | array_flow.rb:499:9:499:9 | a [element 3] : | -| array_flow.rb:498:5:498:5 | a [element 3] : | array_flow.rb:499:9:499:9 | a [element 3] : | -| array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:498:5:498:5 | a [element 3] : | -| array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:498:5:498:5 | a [element 3] : | -| array_flow.rb:499:5:499:5 | b [element] : | array_flow.rb:502:10:502:10 | b [element] : | -| array_flow.rb:499:5:499:5 | b [element] : | array_flow.rb:502:10:502:10 | b [element] : | -| array_flow.rb:499:9:499:9 | a [element 3] : | array_flow.rb:499:9:501:7 | call to filter [element] : | -| array_flow.rb:499:9:499:9 | a [element 3] : | array_flow.rb:499:9:501:7 | call to filter [element] : | -| array_flow.rb:499:9:499:9 | a [element 3] : | array_flow.rb:499:22:499:22 | x : | -| array_flow.rb:499:9:499:9 | a [element 3] : | array_flow.rb:499:22:499:22 | x : | -| array_flow.rb:499:9:501:7 | call to filter [element] : | array_flow.rb:499:5:499:5 | b [element] : | -| array_flow.rb:499:9:501:7 | call to filter [element] : | array_flow.rb:499:5:499:5 | b [element] : | -| array_flow.rb:499:22:499:22 | x : | array_flow.rb:500:14:500:14 | x | -| array_flow.rb:499:22:499:22 | x : | array_flow.rb:500:14:500:14 | x | -| array_flow.rb:502:10:502:10 | b [element] : | array_flow.rb:502:10:502:13 | ...[...] | -| array_flow.rb:502:10:502:10 | b [element] : | array_flow.rb:502:10:502:13 | ...[...] | -| array_flow.rb:506:5:506:5 | a [element 3] : | array_flow.rb:507:9:507:9 | a [element 3] : | -| array_flow.rb:506:5:506:5 | a [element 3] : | array_flow.rb:507:9:507:9 | a [element 3] : | -| array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:506:5:506:5 | a [element 3] : | -| array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:506:5:506:5 | a [element 3] : | -| array_flow.rb:507:5:507:5 | b [element] : | array_flow.rb:510:10:510:10 | b [element] : | -| array_flow.rb:507:5:507:5 | b [element] : | array_flow.rb:510:10:510:10 | b [element] : | -| array_flow.rb:507:9:507:9 | a [element 3] : | array_flow.rb:507:9:509:7 | call to filter_map [element] : | -| array_flow.rb:507:9:507:9 | a [element 3] : | array_flow.rb:507:9:509:7 | call to filter_map [element] : | -| array_flow.rb:507:9:507:9 | a [element 3] : | array_flow.rb:507:26:507:26 | x : | -| array_flow.rb:507:9:507:9 | a [element 3] : | array_flow.rb:507:26:507:26 | x : | -| array_flow.rb:507:9:509:7 | call to filter_map [element] : | array_flow.rb:507:5:507:5 | b [element] : | -| array_flow.rb:507:9:509:7 | call to filter_map [element] : | array_flow.rb:507:5:507:5 | b [element] : | -| array_flow.rb:507:26:507:26 | x : | array_flow.rb:508:14:508:14 | x | -| array_flow.rb:507:26:507:26 | x : | array_flow.rb:508:14:508:14 | x | -| array_flow.rb:510:10:510:10 | b [element] : | array_flow.rb:510:10:510:13 | ...[...] | -| array_flow.rb:510:10:510:10 | b [element] : | array_flow.rb:510:10:510:13 | ...[...] | -| array_flow.rb:514:5:514:5 | a [element 3] : | array_flow.rb:515:9:515:9 | a [element 3] : | -| array_flow.rb:514:5:514:5 | a [element 3] : | array_flow.rb:515:9:515:9 | a [element 3] : | -| array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:514:5:514:5 | a [element 3] : | -| array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:514:5:514:5 | a [element 3] : | -| array_flow.rb:515:5:515:5 | b [element] : | array_flow.rb:520:10:520:10 | b [element] : | -| array_flow.rb:515:5:515:5 | b [element] : | array_flow.rb:520:10:520:10 | b [element] : | -| array_flow.rb:515:9:515:9 | [post] a [element] : | array_flow.rb:519:10:519:10 | a [element] : | -| array_flow.rb:515:9:515:9 | [post] a [element] : | array_flow.rb:519:10:519:10 | a [element] : | -| array_flow.rb:515:9:515:9 | a [element 3] : | array_flow.rb:515:9:515:9 | [post] a [element] : | -| array_flow.rb:515:9:515:9 | a [element 3] : | array_flow.rb:515:9:515:9 | [post] a [element] : | -| array_flow.rb:515:9:515:9 | a [element 3] : | array_flow.rb:515:9:518:7 | call to filter! [element] : | -| array_flow.rb:515:9:515:9 | a [element 3] : | array_flow.rb:515:9:518:7 | call to filter! [element] : | -| array_flow.rb:515:9:515:9 | a [element 3] : | array_flow.rb:515:23:515:23 | x : | -| array_flow.rb:515:9:515:9 | a [element 3] : | array_flow.rb:515:23:515:23 | x : | -| array_flow.rb:515:9:518:7 | call to filter! [element] : | array_flow.rb:515:5:515:5 | b [element] : | -| array_flow.rb:515:9:518:7 | call to filter! [element] : | array_flow.rb:515:5:515:5 | b [element] : | -| array_flow.rb:515:23:515:23 | x : | array_flow.rb:516:14:516:14 | x | -| array_flow.rb:515:23:515:23 | x : | array_flow.rb:516:14:516:14 | x | -| array_flow.rb:519:10:519:10 | a [element] : | array_flow.rb:519:10:519:13 | ...[...] | -| array_flow.rb:519:10:519:10 | a [element] : | array_flow.rb:519:10:519:13 | ...[...] | -| array_flow.rb:520:10:520:10 | b [element] : | array_flow.rb:520:10:520:13 | ...[...] | -| array_flow.rb:520:10:520:10 | b [element] : | array_flow.rb:520:10:520:13 | ...[...] | -| array_flow.rb:524:5:524:5 | a [element 3] : | array_flow.rb:525:9:525:9 | a [element 3] : | -| array_flow.rb:524:5:524:5 | a [element 3] : | array_flow.rb:525:9:525:9 | a [element 3] : | -| array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:524:5:524:5 | a [element 3] : | -| array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:524:5:524:5 | a [element 3] : | -| array_flow.rb:525:5:525:5 | b : | array_flow.rb:528:10:528:10 | b | -| array_flow.rb:525:5:525:5 | b : | array_flow.rb:528:10:528:10 | b | -| array_flow.rb:525:9:525:9 | a [element 3] : | array_flow.rb:525:9:527:7 | call to find : | -| array_flow.rb:525:9:525:9 | a [element 3] : | array_flow.rb:525:9:527:7 | call to find : | -| array_flow.rb:525:9:525:9 | a [element 3] : | array_flow.rb:525:41:525:41 | x : | -| array_flow.rb:525:9:525:9 | a [element 3] : | array_flow.rb:525:41:525:41 | x : | -| array_flow.rb:525:9:527:7 | call to find : | array_flow.rb:525:5:525:5 | b : | -| array_flow.rb:525:9:527:7 | call to find : | array_flow.rb:525:5:525:5 | b : | -| array_flow.rb:525:21:525:32 | call to source : | array_flow.rb:525:9:527:7 | call to find : | -| array_flow.rb:525:21:525:32 | call to source : | array_flow.rb:525:9:527:7 | call to find : | -| array_flow.rb:525:41:525:41 | x : | array_flow.rb:526:14:526:14 | x | -| array_flow.rb:525:41:525:41 | x : | array_flow.rb:526:14:526:14 | x | -| array_flow.rb:532:5:532:5 | a [element 3] : | array_flow.rb:533:9:533:9 | a [element 3] : | -| array_flow.rb:532:5:532:5 | a [element 3] : | array_flow.rb:533:9:533:9 | a [element 3] : | -| array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:532:5:532:5 | a [element 3] : | -| array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:532:5:532:5 | a [element 3] : | -| array_flow.rb:533:5:533:5 | b [element] : | array_flow.rb:536:10:536:10 | b [element] : | -| array_flow.rb:533:5:533:5 | b [element] : | array_flow.rb:536:10:536:10 | b [element] : | -| array_flow.rb:533:9:533:9 | a [element 3] : | array_flow.rb:533:9:535:7 | call to find_all [element] : | -| array_flow.rb:533:9:533:9 | a [element 3] : | array_flow.rb:533:9:535:7 | call to find_all [element] : | -| array_flow.rb:533:9:533:9 | a [element 3] : | array_flow.rb:533:24:533:24 | x : | -| array_flow.rb:533:9:533:9 | a [element 3] : | array_flow.rb:533:24:533:24 | x : | -| array_flow.rb:533:9:535:7 | call to find_all [element] : | array_flow.rb:533:5:533:5 | b [element] : | -| array_flow.rb:533:9:535:7 | call to find_all [element] : | array_flow.rb:533:5:533:5 | b [element] : | -| array_flow.rb:533:24:533:24 | x : | array_flow.rb:534:14:534:14 | x | -| array_flow.rb:533:24:533:24 | x : | array_flow.rb:534:14:534:14 | x | -| array_flow.rb:536:10:536:10 | b [element] : | array_flow.rb:536:10:536:13 | ...[...] | -| array_flow.rb:536:10:536:10 | b [element] : | array_flow.rb:536:10:536:13 | ...[...] | -| array_flow.rb:540:5:540:5 | a [element 3] : | array_flow.rb:541:5:541:5 | a [element 3] : | -| array_flow.rb:540:5:540:5 | a [element 3] : | array_flow.rb:541:5:541:5 | a [element 3] : | -| array_flow.rb:540:19:540:28 | call to source : | array_flow.rb:540:5:540:5 | a [element 3] : | -| array_flow.rb:540:19:540:28 | call to source : | array_flow.rb:540:5:540:5 | a [element 3] : | -| array_flow.rb:541:5:541:5 | a [element 3] : | array_flow.rb:541:22:541:22 | x : | -| array_flow.rb:541:5:541:5 | a [element 3] : | array_flow.rb:541:22:541:22 | x : | -| array_flow.rb:541:22:541:22 | x : | array_flow.rb:542:14:542:14 | x | -| array_flow.rb:541:22:541:22 | x : | array_flow.rb:542:14:542:14 | x | -| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:549:10:549:10 | a [element 0] : | -| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:549:10:549:10 | a [element 0] : | -| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:550:9:550:9 | a [element 0] : | -| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:550:9:550:9 | a [element 0] : | -| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:553:9:553:9 | a [element 0] : | -| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:553:9:553:9 | a [element 0] : | -| array_flow.rb:547:5:547:5 | a [element 3] : | array_flow.rb:553:9:553:9 | a [element 3] : | -| array_flow.rb:547:5:547:5 | a [element 3] : | array_flow.rb:553:9:553:9 | a [element 3] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:547:5:547:5 | a [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:547:5:547:5 | a [element 0] : | -| array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:547:5:547:5 | a [element 3] : | -| array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:547:5:547:5 | a [element 3] : | -| array_flow.rb:548:5:548:5 | [post] a [element] : | array_flow.rb:549:10:549:10 | a [element] : | -| array_flow.rb:548:5:548:5 | [post] a [element] : | array_flow.rb:549:10:549:10 | a [element] : | -| array_flow.rb:548:5:548:5 | [post] a [element] : | array_flow.rb:550:9:550:9 | a [element] : | -| array_flow.rb:548:5:548:5 | [post] a [element] : | array_flow.rb:550:9:550:9 | a [element] : | -| array_flow.rb:548:5:548:5 | [post] a [element] : | array_flow.rb:553:9:553:9 | a [element] : | -| array_flow.rb:548:5:548:5 | [post] a [element] : | array_flow.rb:553:9:553:9 | a [element] : | -| array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:548:5:548:5 | [post] a [element] : | -| array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:548:5:548:5 | [post] a [element] : | -| array_flow.rb:549:10:549:10 | a [element 0] : | array_flow.rb:549:10:549:16 | call to first | -| array_flow.rb:549:10:549:10 | a [element 0] : | array_flow.rb:549:10:549:16 | call to first | -| array_flow.rb:549:10:549:10 | a [element] : | array_flow.rb:549:10:549:16 | call to first | -| array_flow.rb:549:10:549:10 | a [element] : | array_flow.rb:549:10:549:16 | call to first | -| array_flow.rb:550:5:550:5 | b [element 0] : | array_flow.rb:551:10:551:10 | b [element 0] : | -| array_flow.rb:550:5:550:5 | b [element 0] : | array_flow.rb:551:10:551:10 | b [element 0] : | -| array_flow.rb:550:5:550:5 | b [element] : | array_flow.rb:551:10:551:10 | b [element] : | -| array_flow.rb:550:5:550:5 | b [element] : | array_flow.rb:551:10:551:10 | b [element] : | -| array_flow.rb:550:5:550:5 | b [element] : | array_flow.rb:552:10:552:10 | b [element] : | -| array_flow.rb:550:5:550:5 | b [element] : | array_flow.rb:552:10:552:10 | b [element] : | -| array_flow.rb:550:9:550:9 | a [element 0] : | array_flow.rb:550:9:550:18 | call to first [element 0] : | -| array_flow.rb:550:9:550:9 | a [element 0] : | array_flow.rb:550:9:550:18 | call to first [element 0] : | -| array_flow.rb:550:9:550:9 | a [element] : | array_flow.rb:550:9:550:18 | call to first [element] : | -| array_flow.rb:550:9:550:9 | a [element] : | array_flow.rb:550:9:550:18 | call to first [element] : | -| array_flow.rb:550:9:550:18 | call to first [element 0] : | array_flow.rb:550:5:550:5 | b [element 0] : | -| array_flow.rb:550:9:550:18 | call to first [element 0] : | array_flow.rb:550:5:550:5 | b [element 0] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:550:5:550:5 | b [element] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:550:5:550:5 | b [element] : | -| array_flow.rb:551:10:551:10 | b [element 0] : | array_flow.rb:551:10:551:13 | ...[...] | -| array_flow.rb:551:10:551:10 | b [element 0] : | array_flow.rb:551:10:551:13 | ...[...] | -| array_flow.rb:551:10:551:10 | b [element] : | array_flow.rb:551:10:551:13 | ...[...] | -| array_flow.rb:551:10:551:10 | b [element] : | array_flow.rb:551:10:551:13 | ...[...] | -| array_flow.rb:552:10:552:10 | b [element] : | array_flow.rb:552:10:552:13 | ...[...] | -| array_flow.rb:552:10:552:10 | b [element] : | array_flow.rb:552:10:552:13 | ...[...] | -| array_flow.rb:553:5:553:5 | c [element 0] : | array_flow.rb:554:10:554:10 | c [element 0] : | -| array_flow.rb:553:5:553:5 | c [element 0] : | array_flow.rb:554:10:554:10 | c [element 0] : | -| array_flow.rb:553:5:553:5 | c [element 3] : | array_flow.rb:555:10:555:10 | c [element 3] : | -| array_flow.rb:553:5:553:5 | c [element 3] : | array_flow.rb:555:10:555:10 | c [element 3] : | -| array_flow.rb:553:5:553:5 | c [element] : | array_flow.rb:554:10:554:10 | c [element] : | -| array_flow.rb:553:5:553:5 | c [element] : | array_flow.rb:554:10:554:10 | c [element] : | -| array_flow.rb:553:5:553:5 | c [element] : | array_flow.rb:555:10:555:10 | c [element] : | -| array_flow.rb:553:5:553:5 | c [element] : | array_flow.rb:555:10:555:10 | c [element] : | -| array_flow.rb:553:9:553:9 | a [element 0] : | array_flow.rb:553:9:553:18 | call to first [element 0] : | -| array_flow.rb:553:9:553:9 | a [element 0] : | array_flow.rb:553:9:553:18 | call to first [element 0] : | -| array_flow.rb:553:9:553:9 | a [element 3] : | array_flow.rb:553:9:553:18 | call to first [element 3] : | -| array_flow.rb:553:9:553:9 | a [element 3] : | array_flow.rb:553:9:553:18 | call to first [element 3] : | -| array_flow.rb:553:9:553:9 | a [element] : | array_flow.rb:553:9:553:18 | call to first [element] : | -| array_flow.rb:553:9:553:9 | a [element] : | array_flow.rb:553:9:553:18 | call to first [element] : | -| array_flow.rb:553:9:553:18 | call to first [element 0] : | array_flow.rb:553:5:553:5 | c [element 0] : | -| array_flow.rb:553:9:553:18 | call to first [element 0] : | array_flow.rb:553:5:553:5 | c [element 0] : | -| array_flow.rb:553:9:553:18 | call to first [element 3] : | array_flow.rb:553:5:553:5 | c [element 3] : | -| array_flow.rb:553:9:553:18 | call to first [element 3] : | array_flow.rb:553:5:553:5 | c [element 3] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:553:5:553:5 | c [element] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:553:5:553:5 | c [element] : | -| array_flow.rb:554:10:554:10 | c [element 0] : | array_flow.rb:554:10:554:13 | ...[...] | -| array_flow.rb:554:10:554:10 | c [element 0] : | array_flow.rb:554:10:554:13 | ...[...] | -| array_flow.rb:554:10:554:10 | c [element] : | array_flow.rb:554:10:554:13 | ...[...] | -| array_flow.rb:554:10:554:10 | c [element] : | array_flow.rb:554:10:554:13 | ...[...] | -| array_flow.rb:555:10:555:10 | c [element 3] : | array_flow.rb:555:10:555:13 | ...[...] | -| array_flow.rb:555:10:555:10 | c [element 3] : | array_flow.rb:555:10:555:13 | ...[...] | -| array_flow.rb:555:10:555:10 | c [element] : | array_flow.rb:555:10:555:13 | ...[...] | -| array_flow.rb:555:10:555:10 | c [element] : | array_flow.rb:555:10:555:13 | ...[...] | -| array_flow.rb:559:5:559:5 | a [element 2] : | array_flow.rb:560:9:560:9 | a [element 2] : | -| array_flow.rb:559:5:559:5 | a [element 2] : | array_flow.rb:560:9:560:9 | a [element 2] : | -| array_flow.rb:559:5:559:5 | a [element 2] : | array_flow.rb:565:9:565:9 | a [element 2] : | -| array_flow.rb:559:5:559:5 | a [element 2] : | array_flow.rb:565:9:565:9 | a [element 2] : | -| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:559:5:559:5 | a [element 2] : | -| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:559:5:559:5 | a [element 2] : | -| array_flow.rb:560:5:560:5 | b [element] : | array_flow.rb:564:10:564:10 | b [element] : | -| array_flow.rb:560:5:560:5 | b [element] : | array_flow.rb:564:10:564:10 | b [element] : | -| array_flow.rb:560:9:560:9 | a [element 2] : | array_flow.rb:560:9:563:7 | call to flat_map [element] : | -| array_flow.rb:560:9:560:9 | a [element 2] : | array_flow.rb:560:9:563:7 | call to flat_map [element] : | -| array_flow.rb:560:9:560:9 | a [element 2] : | array_flow.rb:560:24:560:24 | x : | -| array_flow.rb:560:9:560:9 | a [element 2] : | array_flow.rb:560:24:560:24 | x : | -| array_flow.rb:560:9:563:7 | call to flat_map [element] : | array_flow.rb:560:5:560:5 | b [element] : | -| array_flow.rb:560:9:563:7 | call to flat_map [element] : | array_flow.rb:560:5:560:5 | b [element] : | -| array_flow.rb:560:24:560:24 | x : | array_flow.rb:561:14:561:14 | x | -| array_flow.rb:560:24:560:24 | x : | array_flow.rb:561:14:561:14 | x | -| array_flow.rb:562:13:562:24 | call to source : | array_flow.rb:560:9:563:7 | call to flat_map [element] : | -| array_flow.rb:562:13:562:24 | call to source : | array_flow.rb:560:9:563:7 | call to flat_map [element] : | -| array_flow.rb:564:10:564:10 | b [element] : | array_flow.rb:564:10:564:13 | ...[...] | -| array_flow.rb:564:10:564:10 | b [element] : | array_flow.rb:564:10:564:13 | ...[...] | -| array_flow.rb:565:5:565:5 | b [element] : | array_flow.rb:569:10:569:10 | b [element] : | -| array_flow.rb:565:5:565:5 | b [element] : | array_flow.rb:569:10:569:10 | b [element] : | -| array_flow.rb:565:9:565:9 | a [element 2] : | array_flow.rb:565:24:565:24 | x : | -| array_flow.rb:565:9:565:9 | a [element 2] : | array_flow.rb:565:24:565:24 | x : | -| array_flow.rb:565:9:568:7 | call to flat_map [element] : | array_flow.rb:565:5:565:5 | b [element] : | -| array_flow.rb:565:9:568:7 | call to flat_map [element] : | array_flow.rb:565:5:565:5 | b [element] : | -| array_flow.rb:565:24:565:24 | x : | array_flow.rb:566:14:566:14 | x | -| array_flow.rb:565:24:565:24 | x : | array_flow.rb:566:14:566:14 | x | -| array_flow.rb:567:9:567:20 | call to source : | array_flow.rb:565:9:568:7 | call to flat_map [element] : | -| array_flow.rb:567:9:567:20 | call to source : | array_flow.rb:565:9:568:7 | call to flat_map [element] : | -| array_flow.rb:569:10:569:10 | b [element] : | array_flow.rb:569:10:569:13 | ...[...] | -| array_flow.rb:569:10:569:10 | b [element] : | array_flow.rb:569:10:569:13 | ...[...] | -| array_flow.rb:573:5:573:5 | a [element 2, element 1] : | array_flow.rb:574:9:574:9 | a [element 2, element 1] : | -| array_flow.rb:573:5:573:5 | a [element 2, element 1] : | array_flow.rb:574:9:574:9 | a [element 2, element 1] : | -| array_flow.rb:573:20:573:29 | call to source : | array_flow.rb:573:5:573:5 | a [element 2, element 1] : | -| array_flow.rb:573:20:573:29 | call to source : | array_flow.rb:573:5:573:5 | a [element 2, element 1] : | -| array_flow.rb:574:5:574:5 | b [element] : | array_flow.rb:575:10:575:10 | b [element] : | -| array_flow.rb:574:5:574:5 | b [element] : | array_flow.rb:575:10:575:10 | b [element] : | -| array_flow.rb:574:9:574:9 | a [element 2, element 1] : | array_flow.rb:574:9:574:17 | call to flatten [element] : | -| array_flow.rb:574:9:574:9 | a [element 2, element 1] : | array_flow.rb:574:9:574:17 | call to flatten [element] : | -| array_flow.rb:574:9:574:17 | call to flatten [element] : | array_flow.rb:574:5:574:5 | b [element] : | -| array_flow.rb:574:9:574:17 | call to flatten [element] : | array_flow.rb:574:5:574:5 | b [element] : | -| array_flow.rb:575:10:575:10 | b [element] : | array_flow.rb:575:10:575:13 | ...[...] | -| array_flow.rb:575:10:575:10 | b [element] : | array_flow.rb:575:10:575:13 | ...[...] | -| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | array_flow.rb:580:10:580:10 | a [element 2, element 1] : | -| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | array_flow.rb:580:10:580:10 | a [element 2, element 1] : | -| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | array_flow.rb:581:9:581:9 | a [element 2, element 1] : | -| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | array_flow.rb:581:9:581:9 | a [element 2, element 1] : | -| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:579:5:579:5 | a [element 2, element 1] : | -| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:579:5:579:5 | a [element 2, element 1] : | -| array_flow.rb:580:10:580:10 | a [element 2, element 1] : | array_flow.rb:580:10:580:13 | ...[...] [element 1] : | -| array_flow.rb:580:10:580:10 | a [element 2, element 1] : | array_flow.rb:580:10:580:13 | ...[...] [element 1] : | -| array_flow.rb:580:10:580:13 | ...[...] [element 1] : | array_flow.rb:580:10:580:16 | ...[...] | -| array_flow.rb:580:10:580:13 | ...[...] [element 1] : | array_flow.rb:580:10:580:16 | ...[...] | -| array_flow.rb:581:5:581:5 | b [element, element 1] : | array_flow.rb:585:10:585:10 | b [element, element 1] : | -| array_flow.rb:581:5:581:5 | b [element, element 1] : | array_flow.rb:585:10:585:10 | b [element, element 1] : | -| array_flow.rb:581:5:581:5 | b [element] : | array_flow.rb:584:10:584:10 | b [element] : | -| array_flow.rb:581:5:581:5 | b [element] : | array_flow.rb:584:10:584:10 | b [element] : | -| array_flow.rb:581:5:581:5 | b [element] : | array_flow.rb:585:10:585:10 | b [element] : | -| array_flow.rb:581:9:581:9 | [post] a [element, element 1] : | array_flow.rb:583:10:583:10 | a [element, element 1] : | -| array_flow.rb:581:9:581:9 | [post] a [element, element 1] : | array_flow.rb:583:10:583:10 | a [element, element 1] : | -| array_flow.rb:581:9:581:9 | [post] a [element] : | array_flow.rb:582:10:582:10 | a [element] : | -| array_flow.rb:581:9:581:9 | [post] a [element] : | array_flow.rb:582:10:582:10 | a [element] : | -| array_flow.rb:581:9:581:9 | [post] a [element] : | array_flow.rb:583:10:583:10 | a [element] : | -| array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:9 | [post] a [element, element 1] : | -| array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:9 | [post] a [element, element 1] : | -| array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:9 | [post] a [element] : | -| array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:9 | [post] a [element] : | -| array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | -| array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | -| array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [element] : | -| array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [element] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | array_flow.rb:581:5:581:5 | b [element, element 1] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | array_flow.rb:581:5:581:5 | b [element, element 1] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element] : | array_flow.rb:581:5:581:5 | b [element] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element] : | array_flow.rb:581:5:581:5 | b [element] : | -| array_flow.rb:582:10:582:10 | a [element] : | array_flow.rb:582:10:582:13 | ...[...] | -| array_flow.rb:582:10:582:10 | a [element] : | array_flow.rb:582:10:582:13 | ...[...] | -| array_flow.rb:583:10:583:10 | a [element, element 1] : | array_flow.rb:583:10:583:13 | ...[...] [element 1] : | -| array_flow.rb:583:10:583:10 | a [element, element 1] : | array_flow.rb:583:10:583:13 | ...[...] [element 1] : | -| array_flow.rb:583:10:583:10 | a [element] : | array_flow.rb:583:10:583:13 | ...[...] : | -| array_flow.rb:583:10:583:13 | ...[...] : | array_flow.rb:583:10:583:16 | ...[...] | -| array_flow.rb:583:10:583:13 | ...[...] [element 1] : | array_flow.rb:583:10:583:16 | ...[...] | -| array_flow.rb:583:10:583:13 | ...[...] [element 1] : | array_flow.rb:583:10:583:16 | ...[...] | -| array_flow.rb:584:10:584:10 | b [element] : | array_flow.rb:584:10:584:13 | ...[...] | -| array_flow.rb:584:10:584:10 | b [element] : | array_flow.rb:584:10:584:13 | ...[...] | -| array_flow.rb:585:10:585:10 | b [element, element 1] : | array_flow.rb:585:10:585:13 | ...[...] [element 1] : | -| array_flow.rb:585:10:585:10 | b [element, element 1] : | array_flow.rb:585:10:585:13 | ...[...] [element 1] : | -| array_flow.rb:585:10:585:10 | b [element] : | array_flow.rb:585:10:585:13 | ...[...] : | -| array_flow.rb:585:10:585:13 | ...[...] : | array_flow.rb:585:10:585:16 | ...[...] | -| array_flow.rb:585:10:585:13 | ...[...] [element 1] : | array_flow.rb:585:10:585:16 | ...[...] | -| array_flow.rb:585:10:585:13 | ...[...] [element 1] : | array_flow.rb:585:10:585:16 | ...[...] | -| array_flow.rb:589:5:589:5 | a [element 3] : | array_flow.rb:590:9:590:9 | a [element 3] : | -| array_flow.rb:589:5:589:5 | a [element 3] : | array_flow.rb:590:9:590:9 | a [element 3] : | -| array_flow.rb:589:5:589:5 | a [element 3] : | array_flow.rb:592:9:592:9 | a [element 3] : | -| array_flow.rb:589:5:589:5 | a [element 3] : | array_flow.rb:592:9:592:9 | a [element 3] : | -| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:589:5:589:5 | a [element 3] : | -| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:589:5:589:5 | a [element 3] : | -| array_flow.rb:590:5:590:5 | b [element] : | array_flow.rb:591:10:591:10 | b [element] : | -| array_flow.rb:590:5:590:5 | b [element] : | array_flow.rb:591:10:591:10 | b [element] : | -| array_flow.rb:590:9:590:9 | a [element 3] : | array_flow.rb:590:9:590:20 | call to grep [element] : | -| array_flow.rb:590:9:590:9 | a [element 3] : | array_flow.rb:590:9:590:20 | call to grep [element] : | -| array_flow.rb:590:9:590:20 | call to grep [element] : | array_flow.rb:590:5:590:5 | b [element] : | -| array_flow.rb:590:9:590:20 | call to grep [element] : | array_flow.rb:590:5:590:5 | b [element] : | -| array_flow.rb:591:10:591:10 | b [element] : | array_flow.rb:591:10:591:13 | ...[...] | -| array_flow.rb:591:10:591:10 | b [element] : | array_flow.rb:591:10:591:13 | ...[...] | -| array_flow.rb:592:5:592:5 | b [element] : | array_flow.rb:596:10:596:10 | b [element] : | -| array_flow.rb:592:5:592:5 | b [element] : | array_flow.rb:596:10:596:10 | b [element] : | -| array_flow.rb:592:9:592:9 | a [element 3] : | array_flow.rb:592:26:592:26 | x : | -| array_flow.rb:592:9:592:9 | a [element 3] : | array_flow.rb:592:26:592:26 | x : | -| array_flow.rb:592:9:595:7 | call to grep [element] : | array_flow.rb:592:5:592:5 | b [element] : | -| array_flow.rb:592:9:595:7 | call to grep [element] : | array_flow.rb:592:5:592:5 | b [element] : | -| array_flow.rb:592:26:592:26 | x : | array_flow.rb:593:14:593:14 | x | -| array_flow.rb:592:26:592:26 | x : | array_flow.rb:593:14:593:14 | x | -| array_flow.rb:594:9:594:20 | call to source : | array_flow.rb:592:9:595:7 | call to grep [element] : | -| array_flow.rb:594:9:594:20 | call to source : | array_flow.rb:592:9:595:7 | call to grep [element] : | -| array_flow.rb:596:10:596:10 | b [element] : | array_flow.rb:596:10:596:13 | ...[...] | -| array_flow.rb:596:10:596:10 | b [element] : | array_flow.rb:596:10:596:13 | ...[...] | -| array_flow.rb:600:5:600:5 | a [element 3] : | array_flow.rb:601:9:601:9 | a [element 3] : | -| array_flow.rb:600:5:600:5 | a [element 3] : | array_flow.rb:601:9:601:9 | a [element 3] : | -| array_flow.rb:600:5:600:5 | a [element 3] : | array_flow.rb:603:9:603:9 | a [element 3] : | -| array_flow.rb:600:5:600:5 | a [element 3] : | array_flow.rb:603:9:603:9 | a [element 3] : | -| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:600:5:600:5 | a [element 3] : | -| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:600:5:600:5 | a [element 3] : | -| array_flow.rb:601:5:601:5 | b [element] : | array_flow.rb:602:10:602:10 | b [element] : | -| array_flow.rb:601:5:601:5 | b [element] : | array_flow.rb:602:10:602:10 | b [element] : | -| array_flow.rb:601:9:601:9 | a [element 3] : | array_flow.rb:601:9:601:21 | call to grep_v [element] : | -| array_flow.rb:601:9:601:9 | a [element 3] : | array_flow.rb:601:9:601:21 | call to grep_v [element] : | -| array_flow.rb:601:9:601:21 | call to grep_v [element] : | array_flow.rb:601:5:601:5 | b [element] : | -| array_flow.rb:601:9:601:21 | call to grep_v [element] : | array_flow.rb:601:5:601:5 | b [element] : | -| array_flow.rb:602:10:602:10 | b [element] : | array_flow.rb:602:10:602:13 | ...[...] | -| array_flow.rb:602:10:602:10 | b [element] : | array_flow.rb:602:10:602:13 | ...[...] | -| array_flow.rb:603:5:603:5 | b [element] : | array_flow.rb:607:10:607:10 | b [element] : | -| array_flow.rb:603:5:603:5 | b [element] : | array_flow.rb:607:10:607:10 | b [element] : | -| array_flow.rb:603:9:603:9 | a [element 3] : | array_flow.rb:603:27:603:27 | x : | -| array_flow.rb:603:9:603:9 | a [element 3] : | array_flow.rb:603:27:603:27 | x : | -| array_flow.rb:603:9:606:7 | call to grep_v [element] : | array_flow.rb:603:5:603:5 | b [element] : | -| array_flow.rb:603:9:606:7 | call to grep_v [element] : | array_flow.rb:603:5:603:5 | b [element] : | -| array_flow.rb:603:27:603:27 | x : | array_flow.rb:604:14:604:14 | x | -| array_flow.rb:603:27:603:27 | x : | array_flow.rb:604:14:604:14 | x | -| array_flow.rb:605:9:605:20 | call to source : | array_flow.rb:603:9:606:7 | call to grep_v [element] : | -| array_flow.rb:605:9:605:20 | call to source : | array_flow.rb:603:9:606:7 | call to grep_v [element] : | -| array_flow.rb:607:10:607:10 | b [element] : | array_flow.rb:607:10:607:13 | ...[...] | -| array_flow.rb:607:10:607:10 | b [element] : | array_flow.rb:607:10:607:13 | ...[...] | -| array_flow.rb:611:5:611:5 | a [element 3] : | array_flow.rb:612:9:612:9 | a [element 3] : | -| array_flow.rb:611:5:611:5 | a [element 3] : | array_flow.rb:612:9:612:9 | a [element 3] : | -| array_flow.rb:611:19:611:30 | call to source : | array_flow.rb:611:5:611:5 | a [element 3] : | -| array_flow.rb:611:19:611:30 | call to source : | array_flow.rb:611:5:611:5 | a [element 3] : | -| array_flow.rb:612:9:612:9 | a [element 3] : | array_flow.rb:612:24:612:24 | x : | -| array_flow.rb:612:9:612:9 | a [element 3] : | array_flow.rb:612:24:612:24 | x : | -| array_flow.rb:612:24:612:24 | x : | array_flow.rb:613:14:613:14 | x | -| array_flow.rb:612:24:612:24 | x : | array_flow.rb:613:14:613:14 | x | -| array_flow.rb:620:5:620:5 | a [element 3] : | array_flow.rb:621:5:621:5 | a [element 3] : | -| array_flow.rb:620:5:620:5 | a [element 3] : | array_flow.rb:621:5:621:5 | a [element 3] : | -| array_flow.rb:620:19:620:28 | call to source : | array_flow.rb:620:5:620:5 | a [element 3] : | -| array_flow.rb:620:19:620:28 | call to source : | array_flow.rb:620:5:620:5 | a [element 3] : | -| array_flow.rb:621:5:621:5 | a [element 3] : | array_flow.rb:621:17:621:17 | x : | -| array_flow.rb:621:5:621:5 | a [element 3] : | array_flow.rb:621:17:621:17 | x : | -| array_flow.rb:621:17:621:17 | x : | array_flow.rb:622:14:622:14 | x | -| array_flow.rb:621:17:621:17 | x : | array_flow.rb:622:14:622:14 | x | -| array_flow.rb:627:5:627:5 | a [element 0] : | array_flow.rb:628:9:628:9 | a [element 0] : | -| array_flow.rb:627:5:627:5 | a [element 0] : | array_flow.rb:628:9:628:9 | a [element 0] : | -| array_flow.rb:627:5:627:5 | a [element 0] : | array_flow.rb:634:9:634:9 | a [element 0] : | -| array_flow.rb:627:5:627:5 | a [element 0] : | array_flow.rb:634:9:634:9 | a [element 0] : | -| array_flow.rb:627:5:627:5 | a [element 2] : | array_flow.rb:628:9:628:9 | a [element 2] : | -| array_flow.rb:627:5:627:5 | a [element 2] : | array_flow.rb:628:9:628:9 | a [element 2] : | -| array_flow.rb:627:5:627:5 | a [element 2] : | array_flow.rb:634:9:634:9 | a [element 2] : | -| array_flow.rb:627:5:627:5 | a [element 2] : | array_flow.rb:634:9:634:9 | a [element 2] : | -| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:627:5:627:5 | a [element 0] : | -| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:627:5:627:5 | a [element 0] : | -| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:627:5:627:5 | a [element 2] : | -| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:627:5:627:5 | a [element 2] : | -| array_flow.rb:628:5:628:5 | b : | array_flow.rb:633:10:633:10 | b | -| array_flow.rb:628:5:628:5 | b : | array_flow.rb:633:10:633:10 | b | -| array_flow.rb:628:9:628:9 | a [element 0] : | array_flow.rb:628:22:628:22 | x : | -| array_flow.rb:628:9:628:9 | a [element 0] : | array_flow.rb:628:22:628:22 | x : | -| array_flow.rb:628:9:628:9 | a [element 2] : | array_flow.rb:628:25:628:25 | y : | -| array_flow.rb:628:9:628:9 | a [element 2] : | array_flow.rb:628:25:628:25 | y : | -| array_flow.rb:628:9:632:7 | call to inject : | array_flow.rb:628:5:628:5 | b : | -| array_flow.rb:628:9:632:7 | call to inject : | array_flow.rb:628:5:628:5 | b : | -| array_flow.rb:628:22:628:22 | x : | array_flow.rb:629:14:629:14 | x | -| array_flow.rb:628:22:628:22 | x : | array_flow.rb:629:14:629:14 | x | -| array_flow.rb:628:25:628:25 | y : | array_flow.rb:630:14:630:14 | y | -| array_flow.rb:628:25:628:25 | y : | array_flow.rb:630:14:630:14 | y | -| array_flow.rb:631:9:631:19 | call to source : | array_flow.rb:628:9:632:7 | call to inject : | -| array_flow.rb:631:9:631:19 | call to source : | array_flow.rb:628:9:632:7 | call to inject : | -| array_flow.rb:634:5:634:5 | c : | array_flow.rb:639:10:639:10 | c | -| array_flow.rb:634:5:634:5 | c : | array_flow.rb:639:10:639:10 | c | -| array_flow.rb:634:9:634:9 | a [element 0] : | array_flow.rb:634:28:634:28 | y : | -| array_flow.rb:634:9:634:9 | a [element 0] : | array_flow.rb:634:28:634:28 | y : | -| array_flow.rb:634:9:634:9 | a [element 2] : | array_flow.rb:634:28:634:28 | y : | -| array_flow.rb:634:9:634:9 | a [element 2] : | array_flow.rb:634:28:634:28 | y : | -| array_flow.rb:634:9:638:7 | call to inject : | array_flow.rb:634:5:634:5 | c : | -| array_flow.rb:634:9:638:7 | call to inject : | array_flow.rb:634:5:634:5 | c : | -| array_flow.rb:634:28:634:28 | y : | array_flow.rb:636:14:636:14 | y | -| array_flow.rb:634:28:634:28 | y : | array_flow.rb:636:14:636:14 | y | -| array_flow.rb:637:9:637:19 | call to source : | array_flow.rb:634:9:638:7 | call to inject : | -| array_flow.rb:637:9:637:19 | call to source : | array_flow.rb:634:9:638:7 | call to inject : | -| array_flow.rb:644:5:644:5 | a [element 2] : | array_flow.rb:645:9:645:9 | a [element 2] : | -| array_flow.rb:644:5:644:5 | a [element 2] : | array_flow.rb:645:9:645:9 | a [element 2] : | -| array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:644:5:644:5 | a [element 2] : | -| array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:644:5:644:5 | a [element 2] : | -| array_flow.rb:645:5:645:5 | b [element 1] : | array_flow.rb:652:10:652:10 | b [element 1] : | -| array_flow.rb:645:5:645:5 | b [element 1] : | array_flow.rb:652:10:652:10 | b [element 1] : | -| array_flow.rb:645:5:645:5 | b [element 2] : | array_flow.rb:653:10:653:10 | b [element 2] : | -| array_flow.rb:645:5:645:5 | b [element 2] : | array_flow.rb:653:10:653:10 | b [element 2] : | -| array_flow.rb:645:5:645:5 | b [element 4] : | array_flow.rb:655:10:655:10 | b [element 4] : | -| array_flow.rb:645:5:645:5 | b [element 4] : | array_flow.rb:655:10:655:10 | b [element 4] : | -| array_flow.rb:645:9:645:9 | [post] a [element 1] : | array_flow.rb:647:10:647:10 | a [element 1] : | -| array_flow.rb:645:9:645:9 | [post] a [element 1] : | array_flow.rb:647:10:647:10 | a [element 1] : | -| array_flow.rb:645:9:645:9 | [post] a [element 2] : | array_flow.rb:648:10:648:10 | a [element 2] : | -| array_flow.rb:645:9:645:9 | [post] a [element 2] : | array_flow.rb:648:10:648:10 | a [element 2] : | -| array_flow.rb:645:9:645:9 | [post] a [element 4] : | array_flow.rb:650:10:650:10 | a [element 4] : | -| array_flow.rb:645:9:645:9 | [post] a [element 4] : | array_flow.rb:650:10:650:10 | a [element 4] : | -| array_flow.rb:645:9:645:9 | a [element 2] : | array_flow.rb:645:9:645:9 | [post] a [element 4] : | -| array_flow.rb:645:9:645:9 | a [element 2] : | array_flow.rb:645:9:645:9 | [post] a [element 4] : | -| array_flow.rb:645:9:645:9 | a [element 2] : | array_flow.rb:645:9:645:47 | call to insert [element 4] : | -| array_flow.rb:645:9:645:9 | a [element 2] : | array_flow.rb:645:9:645:47 | call to insert [element 4] : | -| array_flow.rb:645:9:645:47 | call to insert [element 1] : | array_flow.rb:645:5:645:5 | b [element 1] : | -| array_flow.rb:645:9:645:47 | call to insert [element 1] : | array_flow.rb:645:5:645:5 | b [element 1] : | -| array_flow.rb:645:9:645:47 | call to insert [element 2] : | array_flow.rb:645:5:645:5 | b [element 2] : | -| array_flow.rb:645:9:645:47 | call to insert [element 2] : | array_flow.rb:645:5:645:5 | b [element 2] : | -| array_flow.rb:645:9:645:47 | call to insert [element 4] : | array_flow.rb:645:5:645:5 | b [element 4] : | -| array_flow.rb:645:9:645:47 | call to insert [element 4] : | array_flow.rb:645:5:645:5 | b [element 4] : | -| array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:9 | [post] a [element 1] : | -| array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:9 | [post] a [element 1] : | -| array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:47 | call to insert [element 1] : | -| array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:47 | call to insert [element 1] : | -| array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:645:9:645:9 | [post] a [element 2] : | -| array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:645:9:645:9 | [post] a [element 2] : | -| array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:645:9:645:47 | call to insert [element 2] : | -| array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:645:9:645:47 | call to insert [element 2] : | -| array_flow.rb:647:10:647:10 | a [element 1] : | array_flow.rb:647:10:647:13 | ...[...] | -| array_flow.rb:647:10:647:10 | a [element 1] : | array_flow.rb:647:10:647:13 | ...[...] | -| array_flow.rb:648:10:648:10 | a [element 2] : | array_flow.rb:648:10:648:13 | ...[...] | -| array_flow.rb:648:10:648:10 | a [element 2] : | array_flow.rb:648:10:648:13 | ...[...] | -| array_flow.rb:650:10:650:10 | a [element 4] : | array_flow.rb:650:10:650:13 | ...[...] | -| array_flow.rb:650:10:650:10 | a [element 4] : | array_flow.rb:650:10:650:13 | ...[...] | -| array_flow.rb:652:10:652:10 | b [element 1] : | array_flow.rb:652:10:652:13 | ...[...] | -| array_flow.rb:652:10:652:10 | b [element 1] : | array_flow.rb:652:10:652:13 | ...[...] | -| array_flow.rb:653:10:653:10 | b [element 2] : | array_flow.rb:653:10:653:13 | ...[...] | -| array_flow.rb:653:10:653:10 | b [element 2] : | array_flow.rb:653:10:653:13 | ...[...] | -| array_flow.rb:655:10:655:10 | b [element 4] : | array_flow.rb:655:10:655:13 | ...[...] | -| array_flow.rb:655:10:655:10 | b [element 4] : | array_flow.rb:655:10:655:13 | ...[...] | -| array_flow.rb:658:5:658:5 | c [element 2] : | array_flow.rb:659:9:659:9 | c [element 2] : | -| array_flow.rb:658:5:658:5 | c [element 2] : | array_flow.rb:659:9:659:9 | c [element 2] : | -| array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:658:5:658:5 | c [element 2] : | -| array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:658:5:658:5 | c [element 2] : | -| array_flow.rb:659:5:659:5 | d [element] : | array_flow.rb:661:10:661:10 | d [element] : | -| array_flow.rb:659:5:659:5 | d [element] : | array_flow.rb:661:10:661:10 | d [element] : | -| array_flow.rb:659:9:659:9 | [post] c [element] : | array_flow.rb:660:10:660:10 | c [element] : | -| array_flow.rb:659:9:659:9 | [post] c [element] : | array_flow.rb:660:10:660:10 | c [element] : | -| array_flow.rb:659:9:659:9 | c [element 2] : | array_flow.rb:659:9:659:9 | [post] c [element] : | -| array_flow.rb:659:9:659:9 | c [element 2] : | array_flow.rb:659:9:659:9 | [post] c [element] : | -| array_flow.rb:659:9:659:9 | c [element 2] : | array_flow.rb:659:9:659:47 | call to insert [element] : | -| array_flow.rb:659:9:659:9 | c [element 2] : | array_flow.rb:659:9:659:47 | call to insert [element] : | -| array_flow.rb:659:9:659:47 | call to insert [element] : | array_flow.rb:659:5:659:5 | d [element] : | -| array_flow.rb:659:9:659:47 | call to insert [element] : | array_flow.rb:659:5:659:5 | d [element] : | -| array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:9 | [post] c [element] : | -| array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:9 | [post] c [element] : | -| array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:47 | call to insert [element] : | -| array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:47 | call to insert [element] : | -| array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:659:9:659:9 | [post] c [element] : | -| array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:659:9:659:9 | [post] c [element] : | -| array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:659:9:659:47 | call to insert [element] : | -| array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:659:9:659:47 | call to insert [element] : | -| array_flow.rb:660:10:660:10 | c [element] : | array_flow.rb:660:10:660:13 | ...[...] | -| array_flow.rb:660:10:660:10 | c [element] : | array_flow.rb:660:10:660:13 | ...[...] | -| array_flow.rb:661:10:661:10 | d [element] : | array_flow.rb:661:10:661:13 | ...[...] | -| array_flow.rb:661:10:661:10 | d [element] : | array_flow.rb:661:10:661:13 | ...[...] | -| array_flow.rb:672:5:672:5 | a [element 2] : | array_flow.rb:673:9:673:9 | a [element 2] : | -| array_flow.rb:672:5:672:5 | a [element 2] : | array_flow.rb:673:9:673:9 | a [element 2] : | -| array_flow.rb:672:16:672:27 | call to source : | array_flow.rb:672:5:672:5 | a [element 2] : | -| array_flow.rb:672:16:672:27 | call to source : | array_flow.rb:672:5:672:5 | a [element 2] : | -| array_flow.rb:673:5:673:5 | b [element] : | array_flow.rb:674:10:674:10 | b [element] : | -| array_flow.rb:673:5:673:5 | b [element] : | array_flow.rb:674:10:674:10 | b [element] : | -| array_flow.rb:673:9:673:9 | a [element 2] : | array_flow.rb:673:9:673:60 | call to intersection [element] : | -| array_flow.rb:673:9:673:9 | a [element 2] : | array_flow.rb:673:9:673:60 | call to intersection [element] : | -| array_flow.rb:673:9:673:60 | call to intersection [element] : | array_flow.rb:673:5:673:5 | b [element] : | -| array_flow.rb:673:9:673:60 | call to intersection [element] : | array_flow.rb:673:5:673:5 | b [element] : | -| array_flow.rb:673:31:673:42 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [element] : | -| array_flow.rb:673:31:673:42 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [element] : | -| array_flow.rb:673:47:673:58 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [element] : | -| array_flow.rb:673:47:673:58 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [element] : | -| array_flow.rb:674:10:674:10 | b [element] : | array_flow.rb:674:10:674:13 | ...[...] | -| array_flow.rb:674:10:674:10 | b [element] : | array_flow.rb:674:10:674:13 | ...[...] | -| array_flow.rb:678:5:678:5 | a [element 2] : | array_flow.rb:679:9:679:9 | a [element 2] : | -| array_flow.rb:678:5:678:5 | a [element 2] : | array_flow.rb:679:9:679:9 | a [element 2] : | -| array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:678:5:678:5 | a [element 2] : | -| array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:678:5:678:5 | a [element 2] : | -| array_flow.rb:679:5:679:5 | b [element] : | array_flow.rb:684:10:684:10 | b [element] : | -| array_flow.rb:679:5:679:5 | b [element] : | array_flow.rb:684:10:684:10 | b [element] : | -| array_flow.rb:679:9:679:9 | [post] a [element] : | array_flow.rb:683:10:683:10 | a [element] : | -| array_flow.rb:679:9:679:9 | [post] a [element] : | array_flow.rb:683:10:683:10 | a [element] : | -| array_flow.rb:679:9:679:9 | a [element 2] : | array_flow.rb:679:9:679:9 | [post] a [element] : | -| array_flow.rb:679:9:679:9 | a [element 2] : | array_flow.rb:679:9:679:9 | [post] a [element] : | -| array_flow.rb:679:9:679:9 | a [element 2] : | array_flow.rb:679:9:682:7 | call to keep_if [element] : | -| array_flow.rb:679:9:679:9 | a [element 2] : | array_flow.rb:679:9:682:7 | call to keep_if [element] : | -| array_flow.rb:679:9:679:9 | a [element 2] : | array_flow.rb:679:23:679:23 | x : | -| array_flow.rb:679:9:679:9 | a [element 2] : | array_flow.rb:679:23:679:23 | x : | -| array_flow.rb:679:9:682:7 | call to keep_if [element] : | array_flow.rb:679:5:679:5 | b [element] : | -| array_flow.rb:679:9:682:7 | call to keep_if [element] : | array_flow.rb:679:5:679:5 | b [element] : | -| array_flow.rb:679:23:679:23 | x : | array_flow.rb:680:14:680:14 | x | -| array_flow.rb:679:23:679:23 | x : | array_flow.rb:680:14:680:14 | x | -| array_flow.rb:683:10:683:10 | a [element] : | array_flow.rb:683:10:683:13 | ...[...] | -| array_flow.rb:683:10:683:10 | a [element] : | array_flow.rb:683:10:683:13 | ...[...] | -| array_flow.rb:684:10:684:10 | b [element] : | array_flow.rb:684:10:684:13 | ...[...] | -| array_flow.rb:684:10:684:10 | b [element] : | array_flow.rb:684:10:684:13 | ...[...] | -| array_flow.rb:688:5:688:5 | a [element 2] : | array_flow.rb:690:10:690:10 | a [element 2] : | -| array_flow.rb:688:5:688:5 | a [element 2] : | array_flow.rb:690:10:690:10 | a [element 2] : | -| array_flow.rb:688:5:688:5 | a [element 2] : | array_flow.rb:691:9:691:9 | a [element 2] : | -| array_flow.rb:688:5:688:5 | a [element 2] : | array_flow.rb:691:9:691:9 | a [element 2] : | -| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:688:5:688:5 | a [element 2] : | -| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:688:5:688:5 | a [element 2] : | -| array_flow.rb:689:5:689:5 | [post] a [element] : | array_flow.rb:690:10:690:10 | a [element] : | -| array_flow.rb:689:5:689:5 | [post] a [element] : | array_flow.rb:690:10:690:10 | a [element] : | -| array_flow.rb:689:5:689:5 | [post] a [element] : | array_flow.rb:691:9:691:9 | a [element] : | -| array_flow.rb:689:5:689:5 | [post] a [element] : | array_flow.rb:691:9:691:9 | a [element] : | -| array_flow.rb:689:12:689:23 | call to source : | array_flow.rb:689:5:689:5 | [post] a [element] : | -| array_flow.rb:689:12:689:23 | call to source : | array_flow.rb:689:5:689:5 | [post] a [element] : | -| array_flow.rb:690:10:690:10 | a [element 2] : | array_flow.rb:690:10:690:15 | call to last | -| array_flow.rb:690:10:690:10 | a [element 2] : | array_flow.rb:690:10:690:15 | call to last | -| array_flow.rb:690:10:690:10 | a [element] : | array_flow.rb:690:10:690:15 | call to last | -| array_flow.rb:690:10:690:10 | a [element] : | array_flow.rb:690:10:690:15 | call to last | -| array_flow.rb:691:5:691:5 | b [element] : | array_flow.rb:692:10:692:10 | b [element] : | -| array_flow.rb:691:5:691:5 | b [element] : | array_flow.rb:692:10:692:10 | b [element] : | -| array_flow.rb:691:5:691:5 | b [element] : | array_flow.rb:693:10:693:10 | b [element] : | -| array_flow.rb:691:5:691:5 | b [element] : | array_flow.rb:693:10:693:10 | b [element] : | -| array_flow.rb:691:9:691:9 | a [element 2] : | array_flow.rb:691:9:691:17 | call to last [element] : | -| array_flow.rb:691:9:691:9 | a [element 2] : | array_flow.rb:691:9:691:17 | call to last [element] : | -| array_flow.rb:691:9:691:9 | a [element] : | array_flow.rb:691:9:691:17 | call to last [element] : | -| array_flow.rb:691:9:691:9 | a [element] : | array_flow.rb:691:9:691:17 | call to last [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:691:5:691:5 | b [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:691:5:691:5 | b [element] : | -| array_flow.rb:692:10:692:10 | b [element] : | array_flow.rb:692:10:692:13 | ...[...] | -| array_flow.rb:692:10:692:10 | b [element] : | array_flow.rb:692:10:692:13 | ...[...] | -| array_flow.rb:693:10:693:10 | b [element] : | array_flow.rb:693:10:693:13 | ...[...] | -| array_flow.rb:693:10:693:10 | b [element] : | array_flow.rb:693:10:693:13 | ...[...] | -| array_flow.rb:697:5:697:5 | a [element 2] : | array_flow.rb:698:9:698:9 | a [element 2] : | -| array_flow.rb:697:5:697:5 | a [element 2] : | array_flow.rb:698:9:698:9 | a [element 2] : | -| array_flow.rb:697:16:697:27 | call to source : | array_flow.rb:697:5:697:5 | a [element 2] : | -| array_flow.rb:697:16:697:27 | call to source : | array_flow.rb:697:5:697:5 | a [element 2] : | -| array_flow.rb:698:5:698:5 | b [element] : | array_flow.rb:702:10:702:10 | b [element] : | -| array_flow.rb:698:5:698:5 | b [element] : | array_flow.rb:702:10:702:10 | b [element] : | -| array_flow.rb:698:9:698:9 | a [element 2] : | array_flow.rb:698:19:698:19 | x : | -| array_flow.rb:698:9:698:9 | a [element 2] : | array_flow.rb:698:19:698:19 | x : | -| array_flow.rb:698:9:701:7 | call to map [element] : | array_flow.rb:698:5:698:5 | b [element] : | -| array_flow.rb:698:9:701:7 | call to map [element] : | array_flow.rb:698:5:698:5 | b [element] : | -| array_flow.rb:698:19:698:19 | x : | array_flow.rb:699:14:699:14 | x | -| array_flow.rb:698:19:698:19 | x : | array_flow.rb:699:14:699:14 | x | -| array_flow.rb:700:9:700:19 | call to source : | array_flow.rb:698:9:701:7 | call to map [element] : | -| array_flow.rb:700:9:700:19 | call to source : | array_flow.rb:698:9:701:7 | call to map [element] : | -| array_flow.rb:702:10:702:10 | b [element] : | array_flow.rb:702:10:702:13 | ...[...] | -| array_flow.rb:702:10:702:10 | b [element] : | array_flow.rb:702:10:702:13 | ...[...] | -| array_flow.rb:706:5:706:5 | a [element 2] : | array_flow.rb:707:9:707:9 | a [element 2] : | -| array_flow.rb:706:5:706:5 | a [element 2] : | array_flow.rb:707:9:707:9 | a [element 2] : | -| array_flow.rb:706:16:706:27 | call to source : | array_flow.rb:706:5:706:5 | a [element 2] : | -| array_flow.rb:706:16:706:27 | call to source : | array_flow.rb:706:5:706:5 | a [element 2] : | -| array_flow.rb:707:5:707:5 | b [element] : | array_flow.rb:711:10:711:10 | b [element] : | -| array_flow.rb:707:5:707:5 | b [element] : | array_flow.rb:711:10:711:10 | b [element] : | -| array_flow.rb:707:9:707:9 | a [element 2] : | array_flow.rb:707:20:707:20 | x : | -| array_flow.rb:707:9:707:9 | a [element 2] : | array_flow.rb:707:20:707:20 | x : | -| array_flow.rb:707:9:710:7 | call to map! [element] : | array_flow.rb:707:5:707:5 | b [element] : | -| array_flow.rb:707:9:710:7 | call to map! [element] : | array_flow.rb:707:5:707:5 | b [element] : | -| array_flow.rb:707:20:707:20 | x : | array_flow.rb:708:14:708:14 | x | -| array_flow.rb:707:20:707:20 | x : | array_flow.rb:708:14:708:14 | x | -| array_flow.rb:709:9:709:19 | call to source : | array_flow.rb:707:9:710:7 | call to map! [element] : | -| array_flow.rb:709:9:709:19 | call to source : | array_flow.rb:707:9:710:7 | call to map! [element] : | -| array_flow.rb:711:10:711:10 | b [element] : | array_flow.rb:711:10:711:13 | ...[...] | -| array_flow.rb:711:10:711:10 | b [element] : | array_flow.rb:711:10:711:13 | ...[...] | -| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:718:9:718:9 | a [element 2] : | -| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:718:9:718:9 | a [element 2] : | -| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:722:9:722:9 | a [element 2] : | -| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:722:9:722:9 | a [element 2] : | -| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:726:9:726:9 | a [element 2] : | -| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:726:9:726:9 | a [element 2] : | -| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:734:9:734:9 | a [element 2] : | -| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:734:9:734:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:715:5:715:5 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:715:5:715:5 | a [element 2] : | -| array_flow.rb:718:5:718:5 | b : | array_flow.rb:719:10:719:10 | b | -| array_flow.rb:718:5:718:5 | b : | array_flow.rb:719:10:719:10 | b | -| array_flow.rb:718:9:718:9 | a [element 2] : | array_flow.rb:718:9:718:13 | call to max : | -| array_flow.rb:718:9:718:9 | a [element 2] : | array_flow.rb:718:9:718:13 | call to max : | -| array_flow.rb:718:9:718:13 | call to max : | array_flow.rb:718:5:718:5 | b : | -| array_flow.rb:718:9:718:13 | call to max : | array_flow.rb:718:5:718:5 | b : | -| array_flow.rb:722:5:722:5 | c [element] : | array_flow.rb:723:10:723:10 | c [element] : | -| array_flow.rb:722:5:722:5 | c [element] : | array_flow.rb:723:10:723:10 | c [element] : | -| array_flow.rb:722:9:722:9 | a [element 2] : | array_flow.rb:722:9:722:16 | call to max [element] : | -| array_flow.rb:722:9:722:9 | a [element 2] : | array_flow.rb:722:9:722:16 | call to max [element] : | -| array_flow.rb:722:9:722:16 | call to max [element] : | array_flow.rb:722:5:722:5 | c [element] : | -| array_flow.rb:722:9:722:16 | call to max [element] : | array_flow.rb:722:5:722:5 | c [element] : | -| array_flow.rb:723:10:723:10 | c [element] : | array_flow.rb:723:10:723:13 | ...[...] | -| array_flow.rb:723:10:723:10 | c [element] : | array_flow.rb:723:10:723:13 | ...[...] | -| array_flow.rb:726:5:726:5 | d : | array_flow.rb:731:10:731:10 | d | -| array_flow.rb:726:5:726:5 | d : | array_flow.rb:731:10:731:10 | d | -| array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:9:730:7 | call to max : | -| array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:9:730:7 | call to max : | -| array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:19:726:19 | x : | -| array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:19:726:19 | x : | -| array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:22:726:22 | y : | -| array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:22:726:22 | y : | -| array_flow.rb:726:9:730:7 | call to max : | array_flow.rb:726:5:726:5 | d : | -| array_flow.rb:726:9:730:7 | call to max : | array_flow.rb:726:5:726:5 | d : | -| array_flow.rb:726:19:726:19 | x : | array_flow.rb:727:14:727:14 | x | -| array_flow.rb:726:19:726:19 | x : | array_flow.rb:727:14:727:14 | x | -| array_flow.rb:726:22:726:22 | y : | array_flow.rb:728:14:728:14 | y | -| array_flow.rb:726:22:726:22 | y : | array_flow.rb:728:14:728:14 | y | -| array_flow.rb:734:5:734:5 | e [element] : | array_flow.rb:739:10:739:10 | e [element] : | -| array_flow.rb:734:5:734:5 | e [element] : | array_flow.rb:739:10:739:10 | e [element] : | -| array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:9:738:7 | call to max [element] : | -| array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:9:738:7 | call to max [element] : | -| array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:22:734:22 | x : | -| array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:22:734:22 | x : | -| array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:25:734:25 | y : | -| array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:25:734:25 | y : | -| array_flow.rb:734:9:738:7 | call to max [element] : | array_flow.rb:734:5:734:5 | e [element] : | -| array_flow.rb:734:9:738:7 | call to max [element] : | array_flow.rb:734:5:734:5 | e [element] : | -| array_flow.rb:734:22:734:22 | x : | array_flow.rb:735:14:735:14 | x | -| array_flow.rb:734:22:734:22 | x : | array_flow.rb:735:14:735:14 | x | -| array_flow.rb:734:25:734:25 | y : | array_flow.rb:736:14:736:14 | y | -| array_flow.rb:734:25:734:25 | y : | array_flow.rb:736:14:736:14 | y | -| array_flow.rb:739:10:739:10 | e [element] : | array_flow.rb:739:10:739:13 | ...[...] | -| array_flow.rb:739:10:739:10 | e [element] : | array_flow.rb:739:10:739:13 | ...[...] | -| array_flow.rb:743:5:743:5 | a [element 2] : | array_flow.rb:746:9:746:9 | a [element 2] : | -| array_flow.rb:743:5:743:5 | a [element 2] : | array_flow.rb:746:9:746:9 | a [element 2] : | -| array_flow.rb:743:5:743:5 | a [element 2] : | array_flow.rb:753:9:753:9 | a [element 2] : | -| array_flow.rb:743:5:743:5 | a [element 2] : | array_flow.rb:753:9:753:9 | a [element 2] : | -| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:743:5:743:5 | a [element 2] : | -| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:743:5:743:5 | a [element 2] : | -| array_flow.rb:746:5:746:5 | b : | array_flow.rb:750:10:750:10 | b | -| array_flow.rb:746:5:746:5 | b : | array_flow.rb:750:10:750:10 | b | -| array_flow.rb:746:9:746:9 | a [element 2] : | array_flow.rb:746:9:749:7 | call to max_by : | -| array_flow.rb:746:9:746:9 | a [element 2] : | array_flow.rb:746:9:749:7 | call to max_by : | -| array_flow.rb:746:9:746:9 | a [element 2] : | array_flow.rb:746:22:746:22 | x : | -| array_flow.rb:746:9:746:9 | a [element 2] : | array_flow.rb:746:22:746:22 | x : | -| array_flow.rb:746:9:749:7 | call to max_by : | array_flow.rb:746:5:746:5 | b : | -| array_flow.rb:746:9:749:7 | call to max_by : | array_flow.rb:746:5:746:5 | b : | -| array_flow.rb:746:22:746:22 | x : | array_flow.rb:747:14:747:14 | x | -| array_flow.rb:746:22:746:22 | x : | array_flow.rb:747:14:747:14 | x | -| array_flow.rb:753:5:753:5 | c [element] : | array_flow.rb:757:10:757:10 | c [element] : | -| array_flow.rb:753:5:753:5 | c [element] : | array_flow.rb:757:10:757:10 | c [element] : | -| array_flow.rb:753:9:753:9 | a [element 2] : | array_flow.rb:753:9:756:7 | call to max_by [element] : | -| array_flow.rb:753:9:753:9 | a [element 2] : | array_flow.rb:753:9:756:7 | call to max_by [element] : | -| array_flow.rb:753:9:753:9 | a [element 2] : | array_flow.rb:753:25:753:25 | x : | -| array_flow.rb:753:9:753:9 | a [element 2] : | array_flow.rb:753:25:753:25 | x : | -| array_flow.rb:753:9:756:7 | call to max_by [element] : | array_flow.rb:753:5:753:5 | c [element] : | -| array_flow.rb:753:9:756:7 | call to max_by [element] : | array_flow.rb:753:5:753:5 | c [element] : | -| array_flow.rb:753:25:753:25 | x : | array_flow.rb:754:14:754:14 | x | -| array_flow.rb:753:25:753:25 | x : | array_flow.rb:754:14:754:14 | x | -| array_flow.rb:757:10:757:10 | c [element] : | array_flow.rb:757:10:757:13 | ...[...] | -| array_flow.rb:757:10:757:10 | c [element] : | array_flow.rb:757:10:757:13 | ...[...] | -| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:764:9:764:9 | a [element 2] : | -| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:764:9:764:9 | a [element 2] : | -| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:768:9:768:9 | a [element 2] : | -| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:768:9:768:9 | a [element 2] : | -| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:772:9:772:9 | a [element 2] : | -| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:772:9:772:9 | a [element 2] : | -| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:780:9:780:9 | a [element 2] : | -| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:780:9:780:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:761:5:761:5 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:761:5:761:5 | a [element 2] : | -| array_flow.rb:764:5:764:5 | b : | array_flow.rb:765:10:765:10 | b | -| array_flow.rb:764:5:764:5 | b : | array_flow.rb:765:10:765:10 | b | -| array_flow.rb:764:9:764:9 | a [element 2] : | array_flow.rb:764:9:764:13 | call to min : | -| array_flow.rb:764:9:764:9 | a [element 2] : | array_flow.rb:764:9:764:13 | call to min : | -| array_flow.rb:764:9:764:13 | call to min : | array_flow.rb:764:5:764:5 | b : | -| array_flow.rb:764:9:764:13 | call to min : | array_flow.rb:764:5:764:5 | b : | -| array_flow.rb:768:5:768:5 | c [element] : | array_flow.rb:769:10:769:10 | c [element] : | -| array_flow.rb:768:5:768:5 | c [element] : | array_flow.rb:769:10:769:10 | c [element] : | -| array_flow.rb:768:9:768:9 | a [element 2] : | array_flow.rb:768:9:768:16 | call to min [element] : | -| array_flow.rb:768:9:768:9 | a [element 2] : | array_flow.rb:768:9:768:16 | call to min [element] : | -| array_flow.rb:768:9:768:16 | call to min [element] : | array_flow.rb:768:5:768:5 | c [element] : | -| array_flow.rb:768:9:768:16 | call to min [element] : | array_flow.rb:768:5:768:5 | c [element] : | -| array_flow.rb:769:10:769:10 | c [element] : | array_flow.rb:769:10:769:13 | ...[...] | -| array_flow.rb:769:10:769:10 | c [element] : | array_flow.rb:769:10:769:13 | ...[...] | -| array_flow.rb:772:5:772:5 | d : | array_flow.rb:777:10:777:10 | d | -| array_flow.rb:772:5:772:5 | d : | array_flow.rb:777:10:777:10 | d | -| array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:9:776:7 | call to min : | -| array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:9:776:7 | call to min : | -| array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:19:772:19 | x : | -| array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:19:772:19 | x : | -| array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:22:772:22 | y : | -| array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:22:772:22 | y : | -| array_flow.rb:772:9:776:7 | call to min : | array_flow.rb:772:5:772:5 | d : | -| array_flow.rb:772:9:776:7 | call to min : | array_flow.rb:772:5:772:5 | d : | -| array_flow.rb:772:19:772:19 | x : | array_flow.rb:773:14:773:14 | x | -| array_flow.rb:772:19:772:19 | x : | array_flow.rb:773:14:773:14 | x | -| array_flow.rb:772:22:772:22 | y : | array_flow.rb:774:14:774:14 | y | -| array_flow.rb:772:22:772:22 | y : | array_flow.rb:774:14:774:14 | y | -| array_flow.rb:780:5:780:5 | e [element] : | array_flow.rb:785:10:785:10 | e [element] : | -| array_flow.rb:780:5:780:5 | e [element] : | array_flow.rb:785:10:785:10 | e [element] : | -| array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:9:784:7 | call to min [element] : | -| array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:9:784:7 | call to min [element] : | -| array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:22:780:22 | x : | -| array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:22:780:22 | x : | -| array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:25:780:25 | y : | -| array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:25:780:25 | y : | -| array_flow.rb:780:9:784:7 | call to min [element] : | array_flow.rb:780:5:780:5 | e [element] : | -| array_flow.rb:780:9:784:7 | call to min [element] : | array_flow.rb:780:5:780:5 | e [element] : | -| array_flow.rb:780:22:780:22 | x : | array_flow.rb:781:14:781:14 | x | -| array_flow.rb:780:22:780:22 | x : | array_flow.rb:781:14:781:14 | x | -| array_flow.rb:780:25:780:25 | y : | array_flow.rb:782:14:782:14 | y | -| array_flow.rb:780:25:780:25 | y : | array_flow.rb:782:14:782:14 | y | -| array_flow.rb:785:10:785:10 | e [element] : | array_flow.rb:785:10:785:13 | ...[...] | -| array_flow.rb:785:10:785:10 | e [element] : | array_flow.rb:785:10:785:13 | ...[...] | -| array_flow.rb:789:5:789:5 | a [element 2] : | array_flow.rb:792:9:792:9 | a [element 2] : | -| array_flow.rb:789:5:789:5 | a [element 2] : | array_flow.rb:792:9:792:9 | a [element 2] : | -| array_flow.rb:789:5:789:5 | a [element 2] : | array_flow.rb:799:9:799:9 | a [element 2] : | -| array_flow.rb:789:5:789:5 | a [element 2] : | array_flow.rb:799:9:799:9 | a [element 2] : | -| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:789:5:789:5 | a [element 2] : | -| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:789:5:789:5 | a [element 2] : | -| array_flow.rb:792:5:792:5 | b : | array_flow.rb:796:10:796:10 | b | -| array_flow.rb:792:5:792:5 | b : | array_flow.rb:796:10:796:10 | b | -| array_flow.rb:792:9:792:9 | a [element 2] : | array_flow.rb:792:9:795:7 | call to min_by : | -| array_flow.rb:792:9:792:9 | a [element 2] : | array_flow.rb:792:9:795:7 | call to min_by : | -| array_flow.rb:792:9:792:9 | a [element 2] : | array_flow.rb:792:22:792:22 | x : | -| array_flow.rb:792:9:792:9 | a [element 2] : | array_flow.rb:792:22:792:22 | x : | -| array_flow.rb:792:9:795:7 | call to min_by : | array_flow.rb:792:5:792:5 | b : | -| array_flow.rb:792:9:795:7 | call to min_by : | array_flow.rb:792:5:792:5 | b : | -| array_flow.rb:792:22:792:22 | x : | array_flow.rb:793:14:793:14 | x | -| array_flow.rb:792:22:792:22 | x : | array_flow.rb:793:14:793:14 | x | -| array_flow.rb:799:5:799:5 | c [element] : | array_flow.rb:803:10:803:10 | c [element] : | -| array_flow.rb:799:5:799:5 | c [element] : | array_flow.rb:803:10:803:10 | c [element] : | -| array_flow.rb:799:9:799:9 | a [element 2] : | array_flow.rb:799:9:802:7 | call to min_by [element] : | -| array_flow.rb:799:9:799:9 | a [element 2] : | array_flow.rb:799:9:802:7 | call to min_by [element] : | -| array_flow.rb:799:9:799:9 | a [element 2] : | array_flow.rb:799:25:799:25 | x : | -| array_flow.rb:799:9:799:9 | a [element 2] : | array_flow.rb:799:25:799:25 | x : | -| array_flow.rb:799:9:802:7 | call to min_by [element] : | array_flow.rb:799:5:799:5 | c [element] : | -| array_flow.rb:799:9:802:7 | call to min_by [element] : | array_flow.rb:799:5:799:5 | c [element] : | -| array_flow.rb:799:25:799:25 | x : | array_flow.rb:800:14:800:14 | x | -| array_flow.rb:799:25:799:25 | x : | array_flow.rb:800:14:800:14 | x | -| array_flow.rb:803:10:803:10 | c [element] : | array_flow.rb:803:10:803:13 | ...[...] | -| array_flow.rb:803:10:803:10 | c [element] : | array_flow.rb:803:10:803:13 | ...[...] | -| array_flow.rb:807:5:807:5 | a [element 2] : | array_flow.rb:809:9:809:9 | a [element 2] : | -| array_flow.rb:807:5:807:5 | a [element 2] : | array_flow.rb:809:9:809:9 | a [element 2] : | -| array_flow.rb:807:5:807:5 | a [element 2] : | array_flow.rb:813:9:813:9 | a [element 2] : | -| array_flow.rb:807:5:807:5 | a [element 2] : | array_flow.rb:813:9:813:9 | a [element 2] : | -| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:807:5:807:5 | a [element 2] : | -| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:807:5:807:5 | a [element 2] : | -| array_flow.rb:809:5:809:5 | b [element] : | array_flow.rb:810:10:810:10 | b [element] : | -| array_flow.rb:809:5:809:5 | b [element] : | array_flow.rb:810:10:810:10 | b [element] : | -| array_flow.rb:809:5:809:5 | b [element] : | array_flow.rb:811:10:811:10 | b [element] : | -| array_flow.rb:809:5:809:5 | b [element] : | array_flow.rb:811:10:811:10 | b [element] : | -| array_flow.rb:809:9:809:9 | a [element 2] : | array_flow.rb:809:9:809:16 | call to minmax [element] : | -| array_flow.rb:809:9:809:9 | a [element 2] : | array_flow.rb:809:9:809:16 | call to minmax [element] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:809:5:809:5 | b [element] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:809:5:809:5 | b [element] : | -| array_flow.rb:810:10:810:10 | b [element] : | array_flow.rb:810:10:810:13 | ...[...] | -| array_flow.rb:810:10:810:10 | b [element] : | array_flow.rb:810:10:810:13 | ...[...] | -| array_flow.rb:811:10:811:10 | b [element] : | array_flow.rb:811:10:811:13 | ...[...] | -| array_flow.rb:811:10:811:10 | b [element] : | array_flow.rb:811:10:811:13 | ...[...] | -| array_flow.rb:813:5:813:5 | c [element] : | array_flow.rb:818:10:818:10 | c [element] : | -| array_flow.rb:813:5:813:5 | c [element] : | array_flow.rb:818:10:818:10 | c [element] : | -| array_flow.rb:813:5:813:5 | c [element] : | array_flow.rb:819:10:819:10 | c [element] : | -| array_flow.rb:813:5:813:5 | c [element] : | array_flow.rb:819:10:819:10 | c [element] : | -| array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:9:817:7 | call to minmax [element] : | -| array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:9:817:7 | call to minmax [element] : | -| array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:22:813:22 | x : | -| array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:22:813:22 | x : | -| array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:25:813:25 | y : | -| array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:25:813:25 | y : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:813:5:813:5 | c [element] : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:813:5:813:5 | c [element] : | -| array_flow.rb:813:22:813:22 | x : | array_flow.rb:814:14:814:14 | x | -| array_flow.rb:813:22:813:22 | x : | array_flow.rb:814:14:814:14 | x | -| array_flow.rb:813:25:813:25 | y : | array_flow.rb:815:14:815:14 | y | -| array_flow.rb:813:25:813:25 | y : | array_flow.rb:815:14:815:14 | y | -| array_flow.rb:818:10:818:10 | c [element] : | array_flow.rb:818:10:818:13 | ...[...] | -| array_flow.rb:818:10:818:10 | c [element] : | array_flow.rb:818:10:818:13 | ...[...] | -| array_flow.rb:819:10:819:10 | c [element] : | array_flow.rb:819:10:819:13 | ...[...] | -| array_flow.rb:819:10:819:10 | c [element] : | array_flow.rb:819:10:819:13 | ...[...] | -| array_flow.rb:823:5:823:5 | a [element 2] : | array_flow.rb:824:9:824:9 | a [element 2] : | -| array_flow.rb:823:5:823:5 | a [element 2] : | array_flow.rb:824:9:824:9 | a [element 2] : | -| array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:823:5:823:5 | a [element 2] : | -| array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:823:5:823:5 | a [element 2] : | -| array_flow.rb:824:5:824:5 | b [element] : | array_flow.rb:828:10:828:10 | b [element] : | -| array_flow.rb:824:5:824:5 | b [element] : | array_flow.rb:828:10:828:10 | b [element] : | -| array_flow.rb:824:5:824:5 | b [element] : | array_flow.rb:829:10:829:10 | b [element] : | -| array_flow.rb:824:5:824:5 | b [element] : | array_flow.rb:829:10:829:10 | b [element] : | -| array_flow.rb:824:9:824:9 | a [element 2] : | array_flow.rb:824:9:827:7 | call to minmax_by [element] : | -| array_flow.rb:824:9:824:9 | a [element 2] : | array_flow.rb:824:9:827:7 | call to minmax_by [element] : | -| array_flow.rb:824:9:824:9 | a [element 2] : | array_flow.rb:824:25:824:25 | x : | -| array_flow.rb:824:9:824:9 | a [element 2] : | array_flow.rb:824:25:824:25 | x : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:824:5:824:5 | b [element] : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:824:5:824:5 | b [element] : | -| array_flow.rb:824:25:824:25 | x : | array_flow.rb:825:14:825:14 | x | -| array_flow.rb:824:25:824:25 | x : | array_flow.rb:825:14:825:14 | x | -| array_flow.rb:828:10:828:10 | b [element] : | array_flow.rb:828:10:828:13 | ...[...] | -| array_flow.rb:828:10:828:10 | b [element] : | array_flow.rb:828:10:828:13 | ...[...] | -| array_flow.rb:829:10:829:10 | b [element] : | array_flow.rb:829:10:829:13 | ...[...] | -| array_flow.rb:829:10:829:10 | b [element] : | array_flow.rb:829:10:829:13 | ...[...] | -| array_flow.rb:833:5:833:5 | a [element 2] : | array_flow.rb:834:5:834:5 | a [element 2] : | -| array_flow.rb:833:5:833:5 | a [element 2] : | array_flow.rb:834:5:834:5 | a [element 2] : | -| array_flow.rb:833:16:833:25 | call to source : | array_flow.rb:833:5:833:5 | a [element 2] : | -| array_flow.rb:833:16:833:25 | call to source : | array_flow.rb:833:5:833:5 | a [element 2] : | -| array_flow.rb:834:5:834:5 | a [element 2] : | array_flow.rb:834:17:834:17 | x : | -| array_flow.rb:834:5:834:5 | a [element 2] : | array_flow.rb:834:17:834:17 | x : | -| array_flow.rb:834:17:834:17 | x : | array_flow.rb:835:14:835:14 | x | -| array_flow.rb:834:17:834:17 | x : | array_flow.rb:835:14:835:14 | x | -| array_flow.rb:842:5:842:5 | a [element 2] : | array_flow.rb:843:5:843:5 | a [element 2] : | -| array_flow.rb:842:5:842:5 | a [element 2] : | array_flow.rb:843:5:843:5 | a [element 2] : | -| array_flow.rb:842:16:842:25 | call to source : | array_flow.rb:842:5:842:5 | a [element 2] : | -| array_flow.rb:842:16:842:25 | call to source : | array_flow.rb:842:5:842:5 | a [element 2] : | -| array_flow.rb:843:5:843:5 | a [element 2] : | array_flow.rb:843:16:843:16 | x : | -| array_flow.rb:843:5:843:5 | a [element 2] : | array_flow.rb:843:16:843:16 | x : | -| array_flow.rb:843:16:843:16 | x : | array_flow.rb:844:14:844:14 | x | -| array_flow.rb:843:16:843:16 | x : | array_flow.rb:844:14:844:14 | x | -| array_flow.rb:849:5:849:5 | a [element 2] : | array_flow.rb:850:9:850:9 | a [element 2] : | -| array_flow.rb:849:16:849:25 | call to source : | array_flow.rb:849:5:849:5 | a [element 2] : | -| array_flow.rb:850:5:850:5 | b : | array_flow.rb:851:10:851:10 | b | -| array_flow.rb:850:9:850:9 | a [element 2] : | array_flow.rb:850:9:850:20 | call to pack : | -| array_flow.rb:850:9:850:20 | call to pack : | array_flow.rb:850:5:850:5 | b : | -| array_flow.rb:855:5:855:5 | a [element 2] : | array_flow.rb:856:9:856:9 | a [element 2] : | -| array_flow.rb:855:5:855:5 | a [element 2] : | array_flow.rb:856:9:856:9 | a [element 2] : | -| array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:855:5:855:5 | a [element 2] : | -| array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:855:5:855:5 | a [element 2] : | -| array_flow.rb:856:5:856:5 | b [element, element] : | array_flow.rb:860:10:860:10 | b [element, element] : | -| array_flow.rb:856:5:856:5 | b [element, element] : | array_flow.rb:860:10:860:10 | b [element, element] : | -| array_flow.rb:856:5:856:5 | b [element, element] : | array_flow.rb:861:10:861:10 | b [element, element] : | -| array_flow.rb:856:5:856:5 | b [element, element] : | array_flow.rb:861:10:861:10 | b [element, element] : | -| array_flow.rb:856:9:856:9 | a [element 2] : | array_flow.rb:856:9:859:7 | call to partition [element, element] : | -| array_flow.rb:856:9:856:9 | a [element 2] : | array_flow.rb:856:9:859:7 | call to partition [element, element] : | -| array_flow.rb:856:9:856:9 | a [element 2] : | array_flow.rb:856:25:856:25 | x : | -| array_flow.rb:856:9:856:9 | a [element 2] : | array_flow.rb:856:25:856:25 | x : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:856:5:856:5 | b [element, element] : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:856:5:856:5 | b [element, element] : | -| array_flow.rb:856:25:856:25 | x : | array_flow.rb:857:14:857:14 | x | -| array_flow.rb:856:25:856:25 | x : | array_flow.rb:857:14:857:14 | x | -| array_flow.rb:860:10:860:10 | b [element, element] : | array_flow.rb:860:10:860:13 | ...[...] [element] : | -| array_flow.rb:860:10:860:10 | b [element, element] : | array_flow.rb:860:10:860:13 | ...[...] [element] : | -| array_flow.rb:860:10:860:13 | ...[...] [element] : | array_flow.rb:860:10:860:16 | ...[...] | -| array_flow.rb:860:10:860:13 | ...[...] [element] : | array_flow.rb:860:10:860:16 | ...[...] | -| array_flow.rb:861:10:861:10 | b [element, element] : | array_flow.rb:861:10:861:13 | ...[...] [element] : | -| array_flow.rb:861:10:861:10 | b [element, element] : | array_flow.rb:861:10:861:13 | ...[...] [element] : | -| array_flow.rb:861:10:861:13 | ...[...] [element] : | array_flow.rb:861:10:861:16 | ...[...] | -| array_flow.rb:861:10:861:13 | ...[...] [element] : | array_flow.rb:861:10:861:16 | ...[...] | -| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:867:9:867:9 | a [element 2] : | -| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:867:9:867:9 | a [element 2] : | -| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:875:9:875:9 | a [element 2] : | -| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:875:9:875:9 | a [element 2] : | -| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:882:9:882:9 | a [element 2] : | -| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:882:9:882:9 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:865:5:865:5 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:865:5:865:5 | a [element 2] : | -| array_flow.rb:867:5:867:5 | b [element 2] : | array_flow.rb:873:10:873:10 | b [element 2] : | -| array_flow.rb:867:5:867:5 | b [element 2] : | array_flow.rb:873:10:873:10 | b [element 2] : | -| array_flow.rb:867:9:867:9 | a [element 2] : | array_flow.rb:867:9:871:7 | call to permutation [element 2] : | -| array_flow.rb:867:9:867:9 | a [element 2] : | array_flow.rb:867:9:871:7 | call to permutation [element 2] : | -| array_flow.rb:867:9:867:9 | a [element 2] : | array_flow.rb:867:27:867:27 | x [element] : | -| array_flow.rb:867:9:867:9 | a [element 2] : | array_flow.rb:867:27:867:27 | x [element] : | -| array_flow.rb:867:9:871:7 | call to permutation [element 2] : | array_flow.rb:867:5:867:5 | b [element 2] : | -| array_flow.rb:867:9:871:7 | call to permutation [element 2] : | array_flow.rb:867:5:867:5 | b [element 2] : | -| array_flow.rb:867:27:867:27 | x [element] : | array_flow.rb:868:14:868:14 | x [element] : | -| array_flow.rb:867:27:867:27 | x [element] : | array_flow.rb:868:14:868:14 | x [element] : | -| array_flow.rb:867:27:867:27 | x [element] : | array_flow.rb:869:14:869:14 | x [element] : | -| array_flow.rb:867:27:867:27 | x [element] : | array_flow.rb:869:14:869:14 | x [element] : | -| array_flow.rb:867:27:867:27 | x [element] : | array_flow.rb:870:14:870:14 | x [element] : | -| array_flow.rb:867:27:867:27 | x [element] : | array_flow.rb:870:14:870:14 | x [element] : | -| array_flow.rb:868:14:868:14 | x [element] : | array_flow.rb:868:14:868:17 | ...[...] | -| array_flow.rb:868:14:868:14 | x [element] : | array_flow.rb:868:14:868:17 | ...[...] | -| array_flow.rb:869:14:869:14 | x [element] : | array_flow.rb:869:14:869:17 | ...[...] | -| array_flow.rb:869:14:869:14 | x [element] : | array_flow.rb:869:14:869:17 | ...[...] | -| array_flow.rb:870:14:870:14 | x [element] : | array_flow.rb:870:14:870:17 | ...[...] | -| array_flow.rb:870:14:870:14 | x [element] : | array_flow.rb:870:14:870:17 | ...[...] | -| array_flow.rb:873:10:873:10 | b [element 2] : | array_flow.rb:873:10:873:13 | ...[...] | -| array_flow.rb:873:10:873:10 | b [element 2] : | array_flow.rb:873:10:873:13 | ...[...] | -| array_flow.rb:875:5:875:5 | c [element 2] : | array_flow.rb:880:10:880:10 | c [element 2] : | -| array_flow.rb:875:5:875:5 | c [element 2] : | array_flow.rb:880:10:880:10 | c [element 2] : | -| array_flow.rb:875:5:875:5 | c [element 2] : | array_flow.rb:887:10:887:10 | c [element 2] : | -| array_flow.rb:875:5:875:5 | c [element 2] : | array_flow.rb:887:10:887:10 | c [element 2] : | -| array_flow.rb:875:9:875:9 | a [element 2] : | array_flow.rb:875:9:878:7 | call to permutation [element 2] : | -| array_flow.rb:875:9:875:9 | a [element 2] : | array_flow.rb:875:9:878:7 | call to permutation [element 2] : | -| array_flow.rb:875:9:875:9 | a [element 2] : | array_flow.rb:875:30:875:30 | x [element] : | -| array_flow.rb:875:9:875:9 | a [element 2] : | array_flow.rb:875:30:875:30 | x [element] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:875:5:875:5 | c [element 2] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:875:5:875:5 | c [element 2] : | -| array_flow.rb:875:30:875:30 | x [element] : | array_flow.rb:876:14:876:14 | x [element] : | -| array_flow.rb:875:30:875:30 | x [element] : | array_flow.rb:876:14:876:14 | x [element] : | -| array_flow.rb:875:30:875:30 | x [element] : | array_flow.rb:877:14:877:14 | x [element] : | -| array_flow.rb:875:30:875:30 | x [element] : | array_flow.rb:877:14:877:14 | x [element] : | -| array_flow.rb:876:14:876:14 | x [element] : | array_flow.rb:876:14:876:17 | ...[...] | -| array_flow.rb:876:14:876:14 | x [element] : | array_flow.rb:876:14:876:17 | ...[...] | -| array_flow.rb:877:14:877:14 | x [element] : | array_flow.rb:877:14:877:17 | ...[...] | -| array_flow.rb:877:14:877:14 | x [element] : | array_flow.rb:877:14:877:17 | ...[...] | -| array_flow.rb:880:10:880:10 | c [element 2] : | array_flow.rb:880:10:880:13 | ...[...] | -| array_flow.rb:880:10:880:10 | c [element 2] : | array_flow.rb:880:10:880:13 | ...[...] | -| array_flow.rb:882:9:882:9 | a [element 2] : | array_flow.rb:882:30:882:30 | x [element] : | -| array_flow.rb:882:9:882:9 | a [element 2] : | array_flow.rb:882:30:882:30 | x [element] : | -| array_flow.rb:882:30:882:30 | x [element] : | array_flow.rb:883:14:883:14 | x [element] : | -| array_flow.rb:882:30:882:30 | x [element] : | array_flow.rb:883:14:883:14 | x [element] : | -| array_flow.rb:882:30:882:30 | x [element] : | array_flow.rb:884:14:884:14 | x [element] : | -| array_flow.rb:882:30:882:30 | x [element] : | array_flow.rb:884:14:884:14 | x [element] : | -| array_flow.rb:883:14:883:14 | x [element] : | array_flow.rb:883:14:883:17 | ...[...] | -| array_flow.rb:883:14:883:14 | x [element] : | array_flow.rb:883:14:883:17 | ...[...] | -| array_flow.rb:884:14:884:14 | x [element] : | array_flow.rb:884:14:884:17 | ...[...] | -| array_flow.rb:884:14:884:14 | x [element] : | array_flow.rb:884:14:884:17 | ...[...] | -| array_flow.rb:887:10:887:10 | c [element 2] : | array_flow.rb:887:10:887:13 | ...[...] | -| array_flow.rb:887:10:887:10 | c [element 2] : | array_flow.rb:887:10:887:13 | ...[...] | -| array_flow.rb:894:5:894:5 | a [element 1] : | array_flow.rb:895:9:895:9 | a [element 1] : | -| array_flow.rb:894:5:894:5 | a [element 1] : | array_flow.rb:895:9:895:9 | a [element 1] : | -| array_flow.rb:894:5:894:5 | a [element 1] : | array_flow.rb:898:10:898:10 | a [element 1] : | -| array_flow.rb:894:5:894:5 | a [element 1] : | array_flow.rb:898:10:898:10 | a [element 1] : | -| array_flow.rb:894:5:894:5 | a [element 3] : | array_flow.rb:895:9:895:9 | a [element 3] : | -| array_flow.rb:894:5:894:5 | a [element 3] : | array_flow.rb:895:9:895:9 | a [element 3] : | -| array_flow.rb:894:5:894:5 | a [element 3] : | array_flow.rb:900:10:900:10 | a [element 3] : | -| array_flow.rb:894:5:894:5 | a [element 3] : | array_flow.rb:900:10:900:10 | a [element 3] : | -| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:894:5:894:5 | a [element 1] : | -| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:894:5:894:5 | a [element 1] : | -| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:894:5:894:5 | a [element 3] : | -| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:894:5:894:5 | a [element 3] : | -| array_flow.rb:895:5:895:5 | b : | array_flow.rb:896:10:896:10 | b | -| array_flow.rb:895:5:895:5 | b : | array_flow.rb:896:10:896:10 | b | -| array_flow.rb:895:9:895:9 | a [element 1] : | array_flow.rb:895:9:895:13 | call to pop : | -| array_flow.rb:895:9:895:9 | a [element 1] : | array_flow.rb:895:9:895:13 | call to pop : | -| array_flow.rb:895:9:895:9 | a [element 3] : | array_flow.rb:895:9:895:13 | call to pop : | -| array_flow.rb:895:9:895:9 | a [element 3] : | array_flow.rb:895:9:895:13 | call to pop : | -| array_flow.rb:895:9:895:13 | call to pop : | array_flow.rb:895:5:895:5 | b : | -| array_flow.rb:895:9:895:13 | call to pop : | array_flow.rb:895:5:895:5 | b : | -| array_flow.rb:898:10:898:10 | a [element 1] : | array_flow.rb:898:10:898:13 | ...[...] | -| array_flow.rb:898:10:898:10 | a [element 1] : | array_flow.rb:898:10:898:13 | ...[...] | -| array_flow.rb:900:10:900:10 | a [element 3] : | array_flow.rb:900:10:900:13 | ...[...] | -| array_flow.rb:900:10:900:10 | a [element 3] : | array_flow.rb:900:10:900:13 | ...[...] | -| array_flow.rb:902:5:902:5 | a [element 1] : | array_flow.rb:903:9:903:9 | a [element 1] : | -| array_flow.rb:902:5:902:5 | a [element 1] : | array_flow.rb:903:9:903:9 | a [element 1] : | -| array_flow.rb:902:5:902:5 | a [element 1] : | array_flow.rb:907:10:907:10 | a [element 1] : | -| array_flow.rb:902:5:902:5 | a [element 1] : | array_flow.rb:907:10:907:10 | a [element 1] : | -| array_flow.rb:902:5:902:5 | a [element 3] : | array_flow.rb:903:9:903:9 | a [element 3] : | -| array_flow.rb:902:5:902:5 | a [element 3] : | array_flow.rb:903:9:903:9 | a [element 3] : | -| array_flow.rb:902:5:902:5 | a [element 3] : | array_flow.rb:909:10:909:10 | a [element 3] : | -| array_flow.rb:902:5:902:5 | a [element 3] : | array_flow.rb:909:10:909:10 | a [element 3] : | -| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:902:5:902:5 | a [element 1] : | -| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:902:5:902:5 | a [element 1] : | -| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:902:5:902:5 | a [element 3] : | -| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:902:5:902:5 | a [element 3] : | -| array_flow.rb:903:5:903:5 | b [element] : | array_flow.rb:904:10:904:10 | b [element] : | -| array_flow.rb:903:5:903:5 | b [element] : | array_flow.rb:904:10:904:10 | b [element] : | -| array_flow.rb:903:5:903:5 | b [element] : | array_flow.rb:905:10:905:10 | b [element] : | -| array_flow.rb:903:5:903:5 | b [element] : | array_flow.rb:905:10:905:10 | b [element] : | -| array_flow.rb:903:9:903:9 | a [element 1] : | array_flow.rb:903:9:903:16 | call to pop [element] : | -| array_flow.rb:903:9:903:9 | a [element 1] : | array_flow.rb:903:9:903:16 | call to pop [element] : | -| array_flow.rb:903:9:903:9 | a [element 3] : | array_flow.rb:903:9:903:16 | call to pop [element] : | -| array_flow.rb:903:9:903:9 | a [element 3] : | array_flow.rb:903:9:903:16 | call to pop [element] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:903:5:903:5 | b [element] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:903:5:903:5 | b [element] : | -| array_flow.rb:904:10:904:10 | b [element] : | array_flow.rb:904:10:904:13 | ...[...] | -| array_flow.rb:904:10:904:10 | b [element] : | array_flow.rb:904:10:904:13 | ...[...] | -| array_flow.rb:905:10:905:10 | b [element] : | array_flow.rb:905:10:905:13 | ...[...] | -| array_flow.rb:905:10:905:10 | b [element] : | array_flow.rb:905:10:905:13 | ...[...] | -| array_flow.rb:907:10:907:10 | a [element 1] : | array_flow.rb:907:10:907:13 | ...[...] | -| array_flow.rb:907:10:907:10 | a [element 1] : | array_flow.rb:907:10:907:13 | ...[...] | -| array_flow.rb:909:10:909:10 | a [element 3] : | array_flow.rb:909:10:909:13 | ...[...] | -| array_flow.rb:909:10:909:10 | a [element 3] : | array_flow.rb:909:10:909:13 | ...[...] | -| array_flow.rb:913:5:913:5 | a [element 2] : | array_flow.rb:914:5:914:5 | a [element 2] : | -| array_flow.rb:913:5:913:5 | a [element 2] : | array_flow.rb:914:5:914:5 | a [element 2] : | -| array_flow.rb:913:16:913:27 | call to source : | array_flow.rb:913:5:913:5 | a [element 2] : | -| array_flow.rb:913:16:913:27 | call to source : | array_flow.rb:913:5:913:5 | a [element 2] : | -| array_flow.rb:914:5:914:5 | [post] a [element 2] : | array_flow.rb:917:10:917:10 | a [element 2] : | -| array_flow.rb:914:5:914:5 | [post] a [element 2] : | array_flow.rb:917:10:917:10 | a [element 2] : | -| array_flow.rb:914:5:914:5 | [post] a [element 5] : | array_flow.rb:920:10:920:10 | a [element 5] : | -| array_flow.rb:914:5:914:5 | [post] a [element 5] : | array_flow.rb:920:10:920:10 | a [element 5] : | -| array_flow.rb:914:5:914:5 | a [element 2] : | array_flow.rb:914:5:914:5 | [post] a [element 5] : | -| array_flow.rb:914:5:914:5 | a [element 2] : | array_flow.rb:914:5:914:5 | [post] a [element 5] : | -| array_flow.rb:914:21:914:32 | call to source : | array_flow.rb:914:5:914:5 | [post] a [element 2] : | -| array_flow.rb:914:21:914:32 | call to source : | array_flow.rb:914:5:914:5 | [post] a [element 2] : | -| array_flow.rb:917:10:917:10 | a [element 2] : | array_flow.rb:917:10:917:13 | ...[...] | -| array_flow.rb:917:10:917:10 | a [element 2] : | array_flow.rb:917:10:917:13 | ...[...] | -| array_flow.rb:920:10:920:10 | a [element 5] : | array_flow.rb:920:10:920:13 | ...[...] | -| array_flow.rb:920:10:920:10 | a [element 5] : | array_flow.rb:920:10:920:13 | ...[...] | -| array_flow.rb:924:5:924:5 | a [element 2] : | array_flow.rb:927:9:927:9 | a [element 2] : | -| array_flow.rb:924:5:924:5 | a [element 2] : | array_flow.rb:927:9:927:9 | a [element 2] : | -| array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:924:5:924:5 | a [element 2] : | -| array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:924:5:924:5 | a [element 2] : | -| array_flow.rb:925:5:925:5 | b [element 1] : | array_flow.rb:927:19:927:19 | b [element 1] : | -| array_flow.rb:925:5:925:5 | b [element 1] : | array_flow.rb:927:19:927:19 | b [element 1] : | -| array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:925:5:925:5 | b [element 1] : | -| array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:925:5:925:5 | b [element 1] : | -| array_flow.rb:926:5:926:5 | c [element 0] : | array_flow.rb:927:22:927:22 | c [element 0] : | -| array_flow.rb:926:5:926:5 | c [element 0] : | array_flow.rb:927:22:927:22 | c [element 0] : | -| array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:926:5:926:5 | c [element 0] : | -| array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:926:5:926:5 | c [element 0] : | -| array_flow.rb:927:5:927:5 | d [element, element] : | array_flow.rb:928:10:928:10 | d [element, element] : | -| array_flow.rb:927:5:927:5 | d [element, element] : | array_flow.rb:928:10:928:10 | d [element, element] : | -| array_flow.rb:927:5:927:5 | d [element, element] : | array_flow.rb:929:10:929:10 | d [element, element] : | -| array_flow.rb:927:5:927:5 | d [element, element] : | array_flow.rb:929:10:929:10 | d [element, element] : | -| array_flow.rb:927:9:927:9 | a [element 2] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | -| array_flow.rb:927:9:927:9 | a [element 2] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | -| array_flow.rb:927:9:927:22 | call to product [element, element] : | array_flow.rb:927:5:927:5 | d [element, element] : | -| array_flow.rb:927:9:927:22 | call to product [element, element] : | array_flow.rb:927:5:927:5 | d [element, element] : | -| array_flow.rb:927:19:927:19 | b [element 1] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | -| array_flow.rb:927:19:927:19 | b [element 1] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | -| array_flow.rb:927:22:927:22 | c [element 0] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | -| array_flow.rb:927:22:927:22 | c [element 0] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | -| array_flow.rb:928:10:928:10 | d [element, element] : | array_flow.rb:928:10:928:13 | ...[...] [element] : | -| array_flow.rb:928:10:928:10 | d [element, element] : | array_flow.rb:928:10:928:13 | ...[...] [element] : | -| array_flow.rb:928:10:928:13 | ...[...] [element] : | array_flow.rb:928:10:928:16 | ...[...] | -| array_flow.rb:928:10:928:13 | ...[...] [element] : | array_flow.rb:928:10:928:16 | ...[...] | -| array_flow.rb:929:10:929:10 | d [element, element] : | array_flow.rb:929:10:929:13 | ...[...] [element] : | -| array_flow.rb:929:10:929:10 | d [element, element] : | array_flow.rb:929:10:929:13 | ...[...] [element] : | -| array_flow.rb:929:10:929:13 | ...[...] [element] : | array_flow.rb:929:10:929:16 | ...[...] | -| array_flow.rb:929:10:929:13 | ...[...] [element] : | array_flow.rb:929:10:929:16 | ...[...] | -| array_flow.rb:933:5:933:5 | a [element 0] : | array_flow.rb:934:9:934:9 | a [element 0] : | -| array_flow.rb:933:5:933:5 | a [element 0] : | array_flow.rb:934:9:934:9 | a [element 0] : | -| array_flow.rb:933:5:933:5 | a [element 0] : | array_flow.rb:935:10:935:10 | a [element 0] : | -| array_flow.rb:933:5:933:5 | a [element 0] : | array_flow.rb:935:10:935:10 | a [element 0] : | -| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:933:5:933:5 | a [element 0] : | -| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:933:5:933:5 | a [element 0] : | -| array_flow.rb:934:5:934:5 | b [element 0] : | array_flow.rb:937:10:937:10 | b [element 0] : | -| array_flow.rb:934:5:934:5 | b [element 0] : | array_flow.rb:937:10:937:10 | b [element 0] : | -| array_flow.rb:934:5:934:5 | b [element] : | array_flow.rb:937:10:937:10 | b [element] : | -| array_flow.rb:934:5:934:5 | b [element] : | array_flow.rb:937:10:937:10 | b [element] : | -| array_flow.rb:934:5:934:5 | b [element] : | array_flow.rb:938:10:938:10 | b [element] : | -| array_flow.rb:934:5:934:5 | b [element] : | array_flow.rb:938:10:938:10 | b [element] : | -| array_flow.rb:934:9:934:9 | [post] a [element] : | array_flow.rb:935:10:935:10 | a [element] : | -| array_flow.rb:934:9:934:9 | [post] a [element] : | array_flow.rb:935:10:935:10 | a [element] : | -| array_flow.rb:934:9:934:9 | [post] a [element] : | array_flow.rb:936:10:936:10 | a [element] : | -| array_flow.rb:934:9:934:9 | [post] a [element] : | array_flow.rb:936:10:936:10 | a [element] : | -| array_flow.rb:934:9:934:9 | a [element 0] : | array_flow.rb:934:9:934:44 | call to append [element 0] : | -| array_flow.rb:934:9:934:9 | a [element 0] : | array_flow.rb:934:9:934:44 | call to append [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element 0] : | array_flow.rb:934:5:934:5 | b [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element 0] : | array_flow.rb:934:5:934:5 | b [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:934:5:934:5 | b [element] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:934:5:934:5 | b [element] : | -| array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:9 | [post] a [element] : | -| array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:9 | [post] a [element] : | -| array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:44 | call to append [element] : | -| array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:44 | call to append [element] : | -| array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:934:9:934:9 | [post] a [element] : | -| array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:934:9:934:9 | [post] a [element] : | -| array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:934:9:934:44 | call to append [element] : | -| array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:934:9:934:44 | call to append [element] : | -| array_flow.rb:935:10:935:10 | a [element 0] : | array_flow.rb:935:10:935:13 | ...[...] | -| array_flow.rb:935:10:935:10 | a [element 0] : | array_flow.rb:935:10:935:13 | ...[...] | -| array_flow.rb:935:10:935:10 | a [element] : | array_flow.rb:935:10:935:13 | ...[...] | -| array_flow.rb:935:10:935:10 | a [element] : | array_flow.rb:935:10:935:13 | ...[...] | -| array_flow.rb:936:10:936:10 | a [element] : | array_flow.rb:936:10:936:13 | ...[...] | -| array_flow.rb:936:10:936:10 | a [element] : | array_flow.rb:936:10:936:13 | ...[...] | -| array_flow.rb:937:10:937:10 | b [element 0] : | array_flow.rb:937:10:937:13 | ...[...] | -| array_flow.rb:937:10:937:10 | b [element 0] : | array_flow.rb:937:10:937:13 | ...[...] | -| array_flow.rb:937:10:937:10 | b [element] : | array_flow.rb:937:10:937:13 | ...[...] | -| array_flow.rb:937:10:937:10 | b [element] : | array_flow.rb:937:10:937:13 | ...[...] | -| array_flow.rb:938:10:938:10 | b [element] : | array_flow.rb:938:10:938:13 | ...[...] | -| array_flow.rb:938:10:938:10 | b [element] : | array_flow.rb:938:10:938:13 | ...[...] | -| array_flow.rb:944:5:944:5 | c [element 0] : | array_flow.rb:945:16:945:16 | c [element 0] : | -| array_flow.rb:944:5:944:5 | c [element 0] : | array_flow.rb:945:16:945:16 | c [element 0] : | -| array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:944:5:944:5 | c [element 0] : | -| array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:944:5:944:5 | c [element 0] : | -| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | -| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | -| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | array_flow.rb:947:10:947:10 | d [element 2, element 0] : | -| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | array_flow.rb:947:10:947:10 | d [element 2, element 0] : | -| array_flow.rb:945:16:945:16 | c [element 0] : | array_flow.rb:945:5:945:5 | d [element 2, element 0] : | -| array_flow.rb:945:16:945:16 | c [element 0] : | array_flow.rb:945:5:945:5 | d [element 2, element 0] : | -| array_flow.rb:946:10:946:10 | d [element 2, element 0] : | array_flow.rb:946:10:946:22 | call to rassoc [element 0] : | -| array_flow.rb:946:10:946:10 | d [element 2, element 0] : | array_flow.rb:946:10:946:22 | call to rassoc [element 0] : | -| array_flow.rb:946:10:946:22 | call to rassoc [element 0] : | array_flow.rb:946:10:946:25 | ...[...] | -| array_flow.rb:946:10:946:22 | call to rassoc [element 0] : | array_flow.rb:946:10:946:25 | ...[...] | -| array_flow.rb:947:10:947:10 | d [element 2, element 0] : | array_flow.rb:947:10:947:22 | call to rassoc [element 0] : | -| array_flow.rb:947:10:947:10 | d [element 2, element 0] : | array_flow.rb:947:10:947:22 | call to rassoc [element 0] : | -| array_flow.rb:947:10:947:22 | call to rassoc [element 0] : | array_flow.rb:947:10:947:25 | ...[...] | -| array_flow.rb:947:10:947:22 | call to rassoc [element 0] : | array_flow.rb:947:10:947:25 | ...[...] | -| array_flow.rb:951:5:951:5 | a [element 0] : | array_flow.rb:952:9:952:9 | a [element 0] : | -| array_flow.rb:951:5:951:5 | a [element 0] : | array_flow.rb:952:9:952:9 | a [element 0] : | -| array_flow.rb:951:5:951:5 | a [element 0] : | array_flow.rb:957:9:957:9 | a [element 0] : | -| array_flow.rb:951:5:951:5 | a [element 0] : | array_flow.rb:957:9:957:9 | a [element 0] : | -| array_flow.rb:951:5:951:5 | a [element 2] : | array_flow.rb:952:9:952:9 | a [element 2] : | -| array_flow.rb:951:5:951:5 | a [element 2] : | array_flow.rb:952:9:952:9 | a [element 2] : | -| array_flow.rb:951:5:951:5 | a [element 2] : | array_flow.rb:957:9:957:9 | a [element 2] : | -| array_flow.rb:951:5:951:5 | a [element 2] : | array_flow.rb:957:9:957:9 | a [element 2] : | -| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:951:5:951:5 | a [element 0] : | -| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:951:5:951:5 | a [element 0] : | -| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:951:5:951:5 | a [element 2] : | -| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:951:5:951:5 | a [element 2] : | -| array_flow.rb:952:9:952:9 | a [element 0] : | array_flow.rb:952:22:952:22 | x : | -| array_flow.rb:952:9:952:9 | a [element 0] : | array_flow.rb:952:22:952:22 | x : | -| array_flow.rb:952:9:952:9 | a [element 2] : | array_flow.rb:952:25:952:25 | y : | -| array_flow.rb:952:9:952:9 | a [element 2] : | array_flow.rb:952:25:952:25 | y : | -| array_flow.rb:952:22:952:22 | x : | array_flow.rb:953:14:953:14 | x | -| array_flow.rb:952:22:952:22 | x : | array_flow.rb:953:14:953:14 | x | -| array_flow.rb:952:25:952:25 | y : | array_flow.rb:954:14:954:14 | y | -| array_flow.rb:952:25:952:25 | y : | array_flow.rb:954:14:954:14 | y | -| array_flow.rb:957:9:957:9 | a [element 0] : | array_flow.rb:957:28:957:28 | y : | -| array_flow.rb:957:9:957:9 | a [element 0] : | array_flow.rb:957:28:957:28 | y : | -| array_flow.rb:957:9:957:9 | a [element 2] : | array_flow.rb:957:28:957:28 | y : | -| array_flow.rb:957:9:957:9 | a [element 2] : | array_flow.rb:957:28:957:28 | y : | -| array_flow.rb:957:28:957:28 | y : | array_flow.rb:959:14:959:14 | y | -| array_flow.rb:957:28:957:28 | y : | array_flow.rb:959:14:959:14 | y | -| array_flow.rb:965:5:965:5 | a [element 2] : | array_flow.rb:966:9:966:9 | a [element 2] : | -| array_flow.rb:965:5:965:5 | a [element 2] : | array_flow.rb:966:9:966:9 | a [element 2] : | -| array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:965:5:965:5 | a [element 2] : | -| array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:965:5:965:5 | a [element 2] : | -| array_flow.rb:966:5:966:5 | b [element] : | array_flow.rb:970:10:970:10 | b [element] : | -| array_flow.rb:966:5:966:5 | b [element] : | array_flow.rb:970:10:970:10 | b [element] : | -| array_flow.rb:966:9:966:9 | a [element 2] : | array_flow.rb:966:9:969:7 | call to reject [element] : | -| array_flow.rb:966:9:966:9 | a [element 2] : | array_flow.rb:966:9:969:7 | call to reject [element] : | -| array_flow.rb:966:9:966:9 | a [element 2] : | array_flow.rb:966:22:966:22 | x : | -| array_flow.rb:966:9:966:9 | a [element 2] : | array_flow.rb:966:22:966:22 | x : | -| array_flow.rb:966:9:969:7 | call to reject [element] : | array_flow.rb:966:5:966:5 | b [element] : | -| array_flow.rb:966:9:969:7 | call to reject [element] : | array_flow.rb:966:5:966:5 | b [element] : | -| array_flow.rb:966:22:966:22 | x : | array_flow.rb:967:14:967:14 | x | -| array_flow.rb:966:22:966:22 | x : | array_flow.rb:967:14:967:14 | x | -| array_flow.rb:970:10:970:10 | b [element] : | array_flow.rb:970:10:970:13 | ...[...] | -| array_flow.rb:970:10:970:10 | b [element] : | array_flow.rb:970:10:970:13 | ...[...] | -| array_flow.rb:974:5:974:5 | a [element 2] : | array_flow.rb:975:9:975:9 | a [element 2] : | -| array_flow.rb:974:5:974:5 | a [element 2] : | array_flow.rb:975:9:975:9 | a [element 2] : | -| array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:974:5:974:5 | a [element 2] : | -| array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:974:5:974:5 | a [element 2] : | -| array_flow.rb:975:5:975:5 | b [element] : | array_flow.rb:980:10:980:10 | b [element] : | -| array_flow.rb:975:5:975:5 | b [element] : | array_flow.rb:980:10:980:10 | b [element] : | -| array_flow.rb:975:9:975:9 | [post] a [element] : | array_flow.rb:979:10:979:10 | a [element] : | -| array_flow.rb:975:9:975:9 | [post] a [element] : | array_flow.rb:979:10:979:10 | a [element] : | -| array_flow.rb:975:9:975:9 | a [element 2] : | array_flow.rb:975:9:975:9 | [post] a [element] : | -| array_flow.rb:975:9:975:9 | a [element 2] : | array_flow.rb:975:9:975:9 | [post] a [element] : | -| array_flow.rb:975:9:975:9 | a [element 2] : | array_flow.rb:975:9:978:7 | call to reject! [element] : | -| array_flow.rb:975:9:975:9 | a [element 2] : | array_flow.rb:975:9:978:7 | call to reject! [element] : | -| array_flow.rb:975:9:975:9 | a [element 2] : | array_flow.rb:975:23:975:23 | x : | -| array_flow.rb:975:9:975:9 | a [element 2] : | array_flow.rb:975:23:975:23 | x : | -| array_flow.rb:975:9:978:7 | call to reject! [element] : | array_flow.rb:975:5:975:5 | b [element] : | -| array_flow.rb:975:9:978:7 | call to reject! [element] : | array_flow.rb:975:5:975:5 | b [element] : | -| array_flow.rb:975:23:975:23 | x : | array_flow.rb:976:14:976:14 | x | -| array_flow.rb:975:23:975:23 | x : | array_flow.rb:976:14:976:14 | x | -| array_flow.rb:979:10:979:10 | a [element] : | array_flow.rb:979:10:979:13 | ...[...] | -| array_flow.rb:979:10:979:10 | a [element] : | array_flow.rb:979:10:979:13 | ...[...] | -| array_flow.rb:980:10:980:10 | b [element] : | array_flow.rb:980:10:980:13 | ...[...] | -| array_flow.rb:980:10:980:10 | b [element] : | array_flow.rb:980:10:980:13 | ...[...] | -| array_flow.rb:984:5:984:5 | a [element 2] : | array_flow.rb:985:9:985:9 | a [element 2] : | -| array_flow.rb:984:5:984:5 | a [element 2] : | array_flow.rb:985:9:985:9 | a [element 2] : | -| array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:984:5:984:5 | a [element 2] : | -| array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:984:5:984:5 | a [element 2] : | -| array_flow.rb:985:5:985:5 | b [element 2] : | array_flow.rb:990:10:990:10 | b [element 2] : | -| array_flow.rb:985:5:985:5 | b [element 2] : | array_flow.rb:990:10:990:10 | b [element 2] : | -| array_flow.rb:985:9:985:9 | a [element 2] : | array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | -| array_flow.rb:985:9:985:9 | a [element 2] : | array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | -| array_flow.rb:985:9:985:9 | a [element 2] : | array_flow.rb:985:39:985:39 | x [element] : | -| array_flow.rb:985:9:985:9 | a [element 2] : | array_flow.rb:985:39:985:39 | x [element] : | -| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | array_flow.rb:985:5:985:5 | b [element 2] : | -| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | array_flow.rb:985:5:985:5 | b [element 2] : | -| array_flow.rb:985:39:985:39 | x [element] : | array_flow.rb:986:14:986:14 | x [element] : | -| array_flow.rb:985:39:985:39 | x [element] : | array_flow.rb:986:14:986:14 | x [element] : | -| array_flow.rb:985:39:985:39 | x [element] : | array_flow.rb:987:14:987:14 | x [element] : | -| array_flow.rb:985:39:985:39 | x [element] : | array_flow.rb:987:14:987:14 | x [element] : | -| array_flow.rb:986:14:986:14 | x [element] : | array_flow.rb:986:14:986:17 | ...[...] | -| array_flow.rb:986:14:986:14 | x [element] : | array_flow.rb:986:14:986:17 | ...[...] | -| array_flow.rb:987:14:987:14 | x [element] : | array_flow.rb:987:14:987:17 | ...[...] | -| array_flow.rb:987:14:987:14 | x [element] : | array_flow.rb:987:14:987:17 | ...[...] | -| array_flow.rb:990:10:990:10 | b [element 2] : | array_flow.rb:990:10:990:13 | ...[...] | -| array_flow.rb:990:10:990:10 | b [element 2] : | array_flow.rb:990:10:990:13 | ...[...] | -| array_flow.rb:994:5:994:5 | a [element 2] : | array_flow.rb:995:9:995:9 | a [element 2] : | -| array_flow.rb:994:5:994:5 | a [element 2] : | array_flow.rb:995:9:995:9 | a [element 2] : | -| array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:994:5:994:5 | a [element 2] : | -| array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:994:5:994:5 | a [element 2] : | -| array_flow.rb:995:5:995:5 | b [element 2] : | array_flow.rb:1000:10:1000:10 | b [element 2] : | -| array_flow.rb:995:5:995:5 | b [element 2] : | array_flow.rb:1000:10:1000:10 | b [element 2] : | -| array_flow.rb:995:9:995:9 | a [element 2] : | array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | -| array_flow.rb:995:9:995:9 | a [element 2] : | array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | -| array_flow.rb:995:9:995:9 | a [element 2] : | array_flow.rb:995:39:995:39 | x [element] : | -| array_flow.rb:995:9:995:9 | a [element 2] : | array_flow.rb:995:39:995:39 | x [element] : | -| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | array_flow.rb:995:5:995:5 | b [element 2] : | -| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | array_flow.rb:995:5:995:5 | b [element 2] : | -| array_flow.rb:995:39:995:39 | x [element] : | array_flow.rb:996:14:996:14 | x [element] : | -| array_flow.rb:995:39:995:39 | x [element] : | array_flow.rb:996:14:996:14 | x [element] : | -| array_flow.rb:995:39:995:39 | x [element] : | array_flow.rb:997:14:997:14 | x [element] : | -| array_flow.rb:995:39:995:39 | x [element] : | array_flow.rb:997:14:997:14 | x [element] : | -| array_flow.rb:996:14:996:14 | x [element] : | array_flow.rb:996:14:996:17 | ...[...] | -| array_flow.rb:996:14:996:14 | x [element] : | array_flow.rb:996:14:996:17 | ...[...] | -| array_flow.rb:997:14:997:14 | x [element] : | array_flow.rb:997:14:997:17 | ...[...] | -| array_flow.rb:997:14:997:14 | x [element] : | array_flow.rb:997:14:997:17 | ...[...] | -| array_flow.rb:1000:10:1000:10 | b [element 2] : | array_flow.rb:1000:10:1000:13 | ...[...] | -| array_flow.rb:1000:10:1000:10 | b [element 2] : | array_flow.rb:1000:10:1000:13 | ...[...] | -| array_flow.rb:1006:5:1006:5 | b [element 0] : | array_flow.rb:1008:10:1008:10 | b [element 0] : | -| array_flow.rb:1006:5:1006:5 | b [element 0] : | array_flow.rb:1008:10:1008:10 | b [element 0] : | -| array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | array_flow.rb:1007:10:1007:10 | a [element 0] : | -| array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | array_flow.rb:1007:10:1007:10 | a [element 0] : | -| array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | array_flow.rb:1006:5:1006:5 | b [element 0] : | -| array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | array_flow.rb:1006:5:1006:5 | b [element 0] : | -| array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | -| array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | -| array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | -| array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | -| array_flow.rb:1007:10:1007:10 | a [element 0] : | array_flow.rb:1007:10:1007:13 | ...[...] | -| array_flow.rb:1007:10:1007:10 | a [element 0] : | array_flow.rb:1007:10:1007:13 | ...[...] | -| array_flow.rb:1008:10:1008:10 | b [element 0] : | array_flow.rb:1008:10:1008:13 | ...[...] | -| array_flow.rb:1008:10:1008:10 | b [element 0] : | array_flow.rb:1008:10:1008:13 | ...[...] | -| array_flow.rb:1012:5:1012:5 | a [element 2] : | array_flow.rb:1013:9:1013:9 | a [element 2] : | -| array_flow.rb:1012:5:1012:5 | a [element 2] : | array_flow.rb:1013:9:1013:9 | a [element 2] : | -| array_flow.rb:1012:5:1012:5 | a [element 2] : | array_flow.rb:1018:10:1018:10 | a [element 2] : | -| array_flow.rb:1012:5:1012:5 | a [element 2] : | array_flow.rb:1018:10:1018:10 | a [element 2] : | -| array_flow.rb:1012:5:1012:5 | a [element 3] : | array_flow.rb:1013:9:1013:9 | a [element 3] : | -| array_flow.rb:1012:5:1012:5 | a [element 3] : | array_flow.rb:1013:9:1013:9 | a [element 3] : | -| array_flow.rb:1012:5:1012:5 | a [element 3] : | array_flow.rb:1019:10:1019:10 | a [element 3] : | -| array_flow.rb:1012:5:1012:5 | a [element 3] : | array_flow.rb:1019:10:1019:10 | a [element 3] : | -| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1012:5:1012:5 | a [element 2] : | -| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1012:5:1012:5 | a [element 2] : | -| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1012:5:1012:5 | a [element 3] : | -| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1012:5:1012:5 | a [element 3] : | -| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1014:10:1014:10 | b [element] : | -| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1014:10:1014:10 | b [element] : | -| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1015:10:1015:10 | b [element] : | -| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1015:10:1015:10 | b [element] : | -| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1016:10:1016:10 | b [element] : | -| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1016:10:1016:10 | b [element] : | -| array_flow.rb:1013:9:1013:9 | a [element 2] : | array_flow.rb:1013:9:1013:17 | call to reverse [element] : | -| array_flow.rb:1013:9:1013:9 | a [element 2] : | array_flow.rb:1013:9:1013:17 | call to reverse [element] : | -| array_flow.rb:1013:9:1013:9 | a [element 3] : | array_flow.rb:1013:9:1013:17 | call to reverse [element] : | -| array_flow.rb:1013:9:1013:9 | a [element 3] : | array_flow.rb:1013:9:1013:17 | call to reverse [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1013:5:1013:5 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1013:5:1013:5 | b [element] : | -| array_flow.rb:1014:10:1014:10 | b [element] : | array_flow.rb:1014:10:1014:13 | ...[...] | -| array_flow.rb:1014:10:1014:10 | b [element] : | array_flow.rb:1014:10:1014:13 | ...[...] | -| array_flow.rb:1015:10:1015:10 | b [element] : | array_flow.rb:1015:10:1015:13 | ...[...] | -| array_flow.rb:1015:10:1015:10 | b [element] : | array_flow.rb:1015:10:1015:13 | ...[...] | -| array_flow.rb:1016:10:1016:10 | b [element] : | array_flow.rb:1016:10:1016:13 | ...[...] | -| array_flow.rb:1016:10:1016:10 | b [element] : | array_flow.rb:1016:10:1016:13 | ...[...] | -| array_flow.rb:1018:10:1018:10 | a [element 2] : | array_flow.rb:1018:10:1018:13 | ...[...] | -| array_flow.rb:1018:10:1018:10 | a [element 2] : | array_flow.rb:1018:10:1018:13 | ...[...] | -| array_flow.rb:1019:10:1019:10 | a [element 3] : | array_flow.rb:1019:10:1019:13 | ...[...] | -| array_flow.rb:1019:10:1019:10 | a [element 3] : | array_flow.rb:1019:10:1019:13 | ...[...] | -| array_flow.rb:1023:5:1023:5 | a [element 2] : | array_flow.rb:1024:9:1024:9 | a [element 2] : | -| array_flow.rb:1023:5:1023:5 | a [element 2] : | array_flow.rb:1024:9:1024:9 | a [element 2] : | -| array_flow.rb:1023:5:1023:5 | a [element 2] : | array_flow.rb:1029:10:1029:10 | a [element 2] : | -| array_flow.rb:1023:5:1023:5 | a [element 2] : | array_flow.rb:1029:10:1029:10 | a [element 2] : | -| array_flow.rb:1023:5:1023:5 | a [element 3] : | array_flow.rb:1024:9:1024:9 | a [element 3] : | -| array_flow.rb:1023:5:1023:5 | a [element 3] : | array_flow.rb:1024:9:1024:9 | a [element 3] : | -| array_flow.rb:1023:5:1023:5 | a [element 3] : | array_flow.rb:1030:10:1030:10 | a [element 3] : | -| array_flow.rb:1023:5:1023:5 | a [element 3] : | array_flow.rb:1030:10:1030:10 | a [element 3] : | -| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1023:5:1023:5 | a [element 2] : | -| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1023:5:1023:5 | a [element 2] : | -| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1023:5:1023:5 | a [element 3] : | -| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1023:5:1023:5 | a [element 3] : | -| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1025:10:1025:10 | b [element] : | -| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1025:10:1025:10 | b [element] : | -| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1026:10:1026:10 | b [element] : | -| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1026:10:1026:10 | b [element] : | -| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1027:10:1027:10 | b [element] : | -| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1027:10:1027:10 | b [element] : | -| array_flow.rb:1024:9:1024:9 | [post] a [element] : | array_flow.rb:1028:10:1028:10 | a [element] : | -| array_flow.rb:1024:9:1024:9 | [post] a [element] : | array_flow.rb:1028:10:1028:10 | a [element] : | -| array_flow.rb:1024:9:1024:9 | [post] a [element] : | array_flow.rb:1029:10:1029:10 | a [element] : | -| array_flow.rb:1024:9:1024:9 | [post] a [element] : | array_flow.rb:1029:10:1029:10 | a [element] : | -| array_flow.rb:1024:9:1024:9 | [post] a [element] : | array_flow.rb:1030:10:1030:10 | a [element] : | -| array_flow.rb:1024:9:1024:9 | [post] a [element] : | array_flow.rb:1030:10:1030:10 | a [element] : | -| array_flow.rb:1024:9:1024:9 | a [element 2] : | array_flow.rb:1024:9:1024:9 | [post] a [element] : | -| array_flow.rb:1024:9:1024:9 | a [element 2] : | array_flow.rb:1024:9:1024:9 | [post] a [element] : | -| array_flow.rb:1024:9:1024:9 | a [element 2] : | array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | -| array_flow.rb:1024:9:1024:9 | a [element 2] : | array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | -| array_flow.rb:1024:9:1024:9 | a [element 3] : | array_flow.rb:1024:9:1024:9 | [post] a [element] : | -| array_flow.rb:1024:9:1024:9 | a [element 3] : | array_flow.rb:1024:9:1024:9 | [post] a [element] : | -| array_flow.rb:1024:9:1024:9 | a [element 3] : | array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | -| array_flow.rb:1024:9:1024:9 | a [element 3] : | array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1024:5:1024:5 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1024:5:1024:5 | b [element] : | -| array_flow.rb:1025:10:1025:10 | b [element] : | array_flow.rb:1025:10:1025:13 | ...[...] | -| array_flow.rb:1025:10:1025:10 | b [element] : | array_flow.rb:1025:10:1025:13 | ...[...] | -| array_flow.rb:1026:10:1026:10 | b [element] : | array_flow.rb:1026:10:1026:13 | ...[...] | -| array_flow.rb:1026:10:1026:10 | b [element] : | array_flow.rb:1026:10:1026:13 | ...[...] | -| array_flow.rb:1027:10:1027:10 | b [element] : | array_flow.rb:1027:10:1027:13 | ...[...] | -| array_flow.rb:1027:10:1027:10 | b [element] : | array_flow.rb:1027:10:1027:13 | ...[...] | -| array_flow.rb:1028:10:1028:10 | a [element] : | array_flow.rb:1028:10:1028:13 | ...[...] | -| array_flow.rb:1028:10:1028:10 | a [element] : | array_flow.rb:1028:10:1028:13 | ...[...] | -| array_flow.rb:1029:10:1029:10 | a [element 2] : | array_flow.rb:1029:10:1029:13 | ...[...] | -| array_flow.rb:1029:10:1029:10 | a [element 2] : | array_flow.rb:1029:10:1029:13 | ...[...] | -| array_flow.rb:1029:10:1029:10 | a [element] : | array_flow.rb:1029:10:1029:13 | ...[...] | -| array_flow.rb:1029:10:1029:10 | a [element] : | array_flow.rb:1029:10:1029:13 | ...[...] | -| array_flow.rb:1030:10:1030:10 | a [element 3] : | array_flow.rb:1030:10:1030:13 | ...[...] | -| array_flow.rb:1030:10:1030:10 | a [element 3] : | array_flow.rb:1030:10:1030:13 | ...[...] | -| array_flow.rb:1030:10:1030:10 | a [element] : | array_flow.rb:1030:10:1030:13 | ...[...] | -| array_flow.rb:1030:10:1030:10 | a [element] : | array_flow.rb:1030:10:1030:13 | ...[...] | -| array_flow.rb:1034:5:1034:5 | a [element 2] : | array_flow.rb:1035:9:1035:9 | a [element 2] : | -| array_flow.rb:1034:5:1034:5 | a [element 2] : | array_flow.rb:1035:9:1035:9 | a [element 2] : | -| array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1034:5:1034:5 | a [element 2] : | -| array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1034:5:1034:5 | a [element 2] : | -| array_flow.rb:1035:5:1035:5 | b [element 2] : | array_flow.rb:1038:10:1038:10 | b [element 2] : | -| array_flow.rb:1035:5:1035:5 | b [element 2] : | array_flow.rb:1038:10:1038:10 | b [element 2] : | -| array_flow.rb:1035:9:1035:9 | a [element 2] : | array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | -| array_flow.rb:1035:9:1035:9 | a [element 2] : | array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | -| array_flow.rb:1035:9:1035:9 | a [element 2] : | array_flow.rb:1035:28:1035:28 | x : | -| array_flow.rb:1035:9:1035:9 | a [element 2] : | array_flow.rb:1035:28:1035:28 | x : | -| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | array_flow.rb:1035:5:1035:5 | b [element 2] : | -| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | array_flow.rb:1035:5:1035:5 | b [element 2] : | -| array_flow.rb:1035:28:1035:28 | x : | array_flow.rb:1036:14:1036:14 | x | -| array_flow.rb:1035:28:1035:28 | x : | array_flow.rb:1036:14:1036:14 | x | -| array_flow.rb:1038:10:1038:10 | b [element 2] : | array_flow.rb:1038:10:1038:13 | ...[...] | -| array_flow.rb:1038:10:1038:10 | b [element 2] : | array_flow.rb:1038:10:1038:13 | ...[...] | -| array_flow.rb:1042:5:1042:5 | a [element 2] : | array_flow.rb:1043:5:1043:5 | a [element 2] : | -| array_flow.rb:1042:5:1042:5 | a [element 2] : | array_flow.rb:1043:5:1043:5 | a [element 2] : | -| array_flow.rb:1042:16:1042:26 | call to source : | array_flow.rb:1042:5:1042:5 | a [element 2] : | -| array_flow.rb:1042:16:1042:26 | call to source : | array_flow.rb:1042:5:1042:5 | a [element 2] : | -| array_flow.rb:1043:5:1043:5 | a [element 2] : | array_flow.rb:1043:18:1043:18 | x : | -| array_flow.rb:1043:5:1043:5 | a [element 2] : | array_flow.rb:1043:18:1043:18 | x : | -| array_flow.rb:1043:18:1043:18 | x : | array_flow.rb:1044:14:1044:14 | x | -| array_flow.rb:1043:18:1043:18 | x : | array_flow.rb:1044:14:1044:14 | x | -| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1054:9:1054:9 | a [element 0] : | -| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1054:9:1054:9 | a [element 0] : | -| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1060:9:1060:9 | a [element 0] : | -| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1060:9:1060:9 | a [element 0] : | -| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1066:9:1066:9 | a [element 0] : | -| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1066:9:1066:9 | a [element 0] : | -| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1072:9:1072:9 | a [element 0] : | -| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1072:9:1072:9 | a [element 0] : | -| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1054:9:1054:9 | a [element 2] : | -| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1054:9:1054:9 | a [element 2] : | -| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1060:9:1060:9 | a [element 2] : | -| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1060:9:1060:9 | a [element 2] : | -| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1066:9:1066:9 | a [element 2] : | -| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1066:9:1066:9 | a [element 2] : | -| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1072:9:1072:9 | a [element 2] : | -| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1072:9:1072:9 | a [element 2] : | -| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1054:9:1054:9 | a [element 3] : | -| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1054:9:1054:9 | a [element 3] : | -| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1060:9:1060:9 | a [element 3] : | -| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1060:9:1060:9 | a [element 3] : | -| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1066:9:1066:9 | a [element 3] : | -| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1066:9:1066:9 | a [element 3] : | -| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1072:9:1072:9 | a [element 3] : | -| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1072:9:1072:9 | a [element 3] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 0] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 2] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 3] : | -| array_flow.rb:1054:5:1054:5 | b [element 1] : | array_flow.rb:1056:10:1056:10 | b [element 1] : | -| array_flow.rb:1054:5:1054:5 | b [element 1] : | array_flow.rb:1056:10:1056:10 | b [element 1] : | -| array_flow.rb:1054:5:1054:5 | b [element 2] : | array_flow.rb:1057:10:1057:10 | b [element 2] : | -| array_flow.rb:1054:5:1054:5 | b [element 2] : | array_flow.rb:1057:10:1057:10 | b [element 2] : | -| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1055:10:1055:10 | b [element] : | -| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1055:10:1055:10 | b [element] : | -| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1056:10:1056:10 | b [element] : | -| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1056:10:1056:10 | b [element] : | -| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1057:10:1057:10 | b [element] : | -| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1057:10:1057:10 | b [element] : | -| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1058:10:1058:10 | b [element] : | -| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1058:10:1058:10 | b [element] : | -| array_flow.rb:1054:9:1054:9 | a [element 0] : | array_flow.rb:1054:9:1054:16 | call to rotate [element] : | -| array_flow.rb:1054:9:1054:9 | a [element 0] : | array_flow.rb:1054:9:1054:16 | call to rotate [element] : | -| array_flow.rb:1054:9:1054:9 | a [element 2] : | array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | -| array_flow.rb:1054:9:1054:9 | a [element 2] : | array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | -| array_flow.rb:1054:9:1054:9 | a [element 3] : | array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | -| array_flow.rb:1054:9:1054:9 | a [element 3] : | array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | array_flow.rb:1054:5:1054:5 | b [element 1] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | array_flow.rb:1054:5:1054:5 | b [element 1] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | array_flow.rb:1054:5:1054:5 | b [element 2] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | array_flow.rb:1054:5:1054:5 | b [element 2] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1054:5:1054:5 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1054:5:1054:5 | b [element] : | -| array_flow.rb:1055:10:1055:10 | b [element] : | array_flow.rb:1055:10:1055:13 | ...[...] | -| array_flow.rb:1055:10:1055:10 | b [element] : | array_flow.rb:1055:10:1055:13 | ...[...] | -| array_flow.rb:1056:10:1056:10 | b [element 1] : | array_flow.rb:1056:10:1056:13 | ...[...] | -| array_flow.rb:1056:10:1056:10 | b [element 1] : | array_flow.rb:1056:10:1056:13 | ...[...] | -| array_flow.rb:1056:10:1056:10 | b [element] : | array_flow.rb:1056:10:1056:13 | ...[...] | -| array_flow.rb:1056:10:1056:10 | b [element] : | array_flow.rb:1056:10:1056:13 | ...[...] | -| array_flow.rb:1057:10:1057:10 | b [element 2] : | array_flow.rb:1057:10:1057:13 | ...[...] | -| array_flow.rb:1057:10:1057:10 | b [element 2] : | array_flow.rb:1057:10:1057:13 | ...[...] | -| array_flow.rb:1057:10:1057:10 | b [element] : | array_flow.rb:1057:10:1057:13 | ...[...] | -| array_flow.rb:1057:10:1057:10 | b [element] : | array_flow.rb:1057:10:1057:13 | ...[...] | -| array_flow.rb:1058:10:1058:10 | b [element] : | array_flow.rb:1058:10:1058:13 | ...[...] | -| array_flow.rb:1058:10:1058:10 | b [element] : | array_flow.rb:1058:10:1058:13 | ...[...] | -| array_flow.rb:1060:5:1060:5 | b [element 0] : | array_flow.rb:1061:10:1061:10 | b [element 0] : | -| array_flow.rb:1060:5:1060:5 | b [element 0] : | array_flow.rb:1061:10:1061:10 | b [element 0] : | -| array_flow.rb:1060:5:1060:5 | b [element 1] : | array_flow.rb:1062:10:1062:10 | b [element 1] : | -| array_flow.rb:1060:5:1060:5 | b [element 1] : | array_flow.rb:1062:10:1062:10 | b [element 1] : | -| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1061:10:1061:10 | b [element] : | -| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1061:10:1061:10 | b [element] : | -| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1062:10:1062:10 | b [element] : | -| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1062:10:1062:10 | b [element] : | -| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1063:10:1063:10 | b [element] : | -| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1063:10:1063:10 | b [element] : | -| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1064:10:1064:10 | b [element] : | -| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1064:10:1064:10 | b [element] : | -| array_flow.rb:1060:9:1060:9 | a [element 0] : | array_flow.rb:1060:9:1060:19 | call to rotate [element] : | -| array_flow.rb:1060:9:1060:9 | a [element 0] : | array_flow.rb:1060:9:1060:19 | call to rotate [element] : | -| array_flow.rb:1060:9:1060:9 | a [element 2] : | array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | -| array_flow.rb:1060:9:1060:9 | a [element 2] : | array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | -| array_flow.rb:1060:9:1060:9 | a [element 3] : | array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | -| array_flow.rb:1060:9:1060:9 | a [element 3] : | array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | array_flow.rb:1060:5:1060:5 | b [element 0] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | array_flow.rb:1060:5:1060:5 | b [element 0] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | array_flow.rb:1060:5:1060:5 | b [element 1] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | array_flow.rb:1060:5:1060:5 | b [element 1] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1060:5:1060:5 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1060:5:1060:5 | b [element] : | -| array_flow.rb:1061:10:1061:10 | b [element 0] : | array_flow.rb:1061:10:1061:13 | ...[...] | -| array_flow.rb:1061:10:1061:10 | b [element 0] : | array_flow.rb:1061:10:1061:13 | ...[...] | -| array_flow.rb:1061:10:1061:10 | b [element] : | array_flow.rb:1061:10:1061:13 | ...[...] | -| array_flow.rb:1061:10:1061:10 | b [element] : | array_flow.rb:1061:10:1061:13 | ...[...] | -| array_flow.rb:1062:10:1062:10 | b [element 1] : | array_flow.rb:1062:10:1062:13 | ...[...] | -| array_flow.rb:1062:10:1062:10 | b [element 1] : | array_flow.rb:1062:10:1062:13 | ...[...] | -| array_flow.rb:1062:10:1062:10 | b [element] : | array_flow.rb:1062:10:1062:13 | ...[...] | -| array_flow.rb:1062:10:1062:10 | b [element] : | array_flow.rb:1062:10:1062:13 | ...[...] | -| array_flow.rb:1063:10:1063:10 | b [element] : | array_flow.rb:1063:10:1063:13 | ...[...] | -| array_flow.rb:1063:10:1063:10 | b [element] : | array_flow.rb:1063:10:1063:13 | ...[...] | -| array_flow.rb:1064:10:1064:10 | b [element] : | array_flow.rb:1064:10:1064:13 | ...[...] | -| array_flow.rb:1064:10:1064:10 | b [element] : | array_flow.rb:1064:10:1064:13 | ...[...] | -| array_flow.rb:1066:5:1066:5 | b [element 0] : | array_flow.rb:1067:10:1067:10 | b [element 0] : | -| array_flow.rb:1066:5:1066:5 | b [element 0] : | array_flow.rb:1067:10:1067:10 | b [element 0] : | -| array_flow.rb:1066:5:1066:5 | b [element 2] : | array_flow.rb:1069:10:1069:10 | b [element 2] : | -| array_flow.rb:1066:5:1066:5 | b [element 2] : | array_flow.rb:1069:10:1069:10 | b [element 2] : | -| array_flow.rb:1066:5:1066:5 | b [element 3] : | array_flow.rb:1070:10:1070:10 | b [element 3] : | -| array_flow.rb:1066:5:1066:5 | b [element 3] : | array_flow.rb:1070:10:1070:10 | b [element 3] : | -| array_flow.rb:1066:9:1066:9 | a [element 0] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | -| array_flow.rb:1066:9:1066:9 | a [element 0] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | -| array_flow.rb:1066:9:1066:9 | a [element 2] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | -| array_flow.rb:1066:9:1066:9 | a [element 2] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | -| array_flow.rb:1066:9:1066:9 | a [element 3] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | -| array_flow.rb:1066:9:1066:9 | a [element 3] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | array_flow.rb:1066:5:1066:5 | b [element 0] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | array_flow.rb:1066:5:1066:5 | b [element 0] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | array_flow.rb:1066:5:1066:5 | b [element 2] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | array_flow.rb:1066:5:1066:5 | b [element 2] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | array_flow.rb:1066:5:1066:5 | b [element 3] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | array_flow.rb:1066:5:1066:5 | b [element 3] : | -| array_flow.rb:1067:10:1067:10 | b [element 0] : | array_flow.rb:1067:10:1067:13 | ...[...] | -| array_flow.rb:1067:10:1067:10 | b [element 0] : | array_flow.rb:1067:10:1067:13 | ...[...] | -| array_flow.rb:1069:10:1069:10 | b [element 2] : | array_flow.rb:1069:10:1069:13 | ...[...] | -| array_flow.rb:1069:10:1069:10 | b [element 2] : | array_flow.rb:1069:10:1069:13 | ...[...] | -| array_flow.rb:1070:10:1070:10 | b [element 3] : | array_flow.rb:1070:10:1070:13 | ...[...] | -| array_flow.rb:1070:10:1070:10 | b [element 3] : | array_flow.rb:1070:10:1070:13 | ...[...] | -| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1073:10:1073:10 | b [element] : | -| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1073:10:1073:10 | b [element] : | -| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1074:10:1074:10 | b [element] : | -| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1074:10:1074:10 | b [element] : | -| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1075:10:1075:10 | b [element] : | -| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1075:10:1075:10 | b [element] : | -| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1076:10:1076:10 | b [element] : | -| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1076:10:1076:10 | b [element] : | -| array_flow.rb:1072:9:1072:9 | a [element 0] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | -| array_flow.rb:1072:9:1072:9 | a [element 0] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | -| array_flow.rb:1072:9:1072:9 | a [element 2] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | -| array_flow.rb:1072:9:1072:9 | a [element 2] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | -| array_flow.rb:1072:9:1072:9 | a [element 3] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | -| array_flow.rb:1072:9:1072:9 | a [element 3] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1072:5:1072:5 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1072:5:1072:5 | b [element] : | -| array_flow.rb:1073:10:1073:10 | b [element] : | array_flow.rb:1073:10:1073:13 | ...[...] | -| array_flow.rb:1073:10:1073:10 | b [element] : | array_flow.rb:1073:10:1073:13 | ...[...] | -| array_flow.rb:1074:10:1074:10 | b [element] : | array_flow.rb:1074:10:1074:13 | ...[...] | -| array_flow.rb:1074:10:1074:10 | b [element] : | array_flow.rb:1074:10:1074:13 | ...[...] | -| array_flow.rb:1075:10:1075:10 | b [element] : | array_flow.rb:1075:10:1075:13 | ...[...] | -| array_flow.rb:1075:10:1075:10 | b [element] : | array_flow.rb:1075:10:1075:13 | ...[...] | -| array_flow.rb:1076:10:1076:10 | b [element] : | array_flow.rb:1076:10:1076:13 | ...[...] | -| array_flow.rb:1076:10:1076:10 | b [element] : | array_flow.rb:1076:10:1076:13 | ...[...] | -| array_flow.rb:1084:5:1084:5 | a [element 0] : | array_flow.rb:1085:9:1085:9 | a [element 0] : | -| array_flow.rb:1084:5:1084:5 | a [element 0] : | array_flow.rb:1085:9:1085:9 | a [element 0] : | -| array_flow.rb:1084:5:1084:5 | a [element 2] : | array_flow.rb:1085:9:1085:9 | a [element 2] : | -| array_flow.rb:1084:5:1084:5 | a [element 2] : | array_flow.rb:1085:9:1085:9 | a [element 2] : | -| array_flow.rb:1084:5:1084:5 | a [element 3] : | array_flow.rb:1085:9:1085:9 | a [element 3] : | -| array_flow.rb:1084:5:1084:5 | a [element 3] : | array_flow.rb:1085:9:1085:9 | a [element 3] : | -| array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 0] : | -| array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 0] : | -| array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 2] : | -| array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 2] : | -| array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 3] : | -| array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 3] : | -| array_flow.rb:1085:5:1085:5 | b [element 1] : | array_flow.rb:1091:10:1091:10 | b [element 1] : | -| array_flow.rb:1085:5:1085:5 | b [element 1] : | array_flow.rb:1091:10:1091:10 | b [element 1] : | -| array_flow.rb:1085:5:1085:5 | b [element 2] : | array_flow.rb:1092:10:1092:10 | b [element 2] : | -| array_flow.rb:1085:5:1085:5 | b [element 2] : | array_flow.rb:1092:10:1092:10 | b [element 2] : | -| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1090:10:1090:10 | b [element] : | -| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1090:10:1090:10 | b [element] : | -| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1091:10:1091:10 | b [element] : | -| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1091:10:1091:10 | b [element] : | -| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1092:10:1092:10 | b [element] : | -| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1092:10:1092:10 | b [element] : | -| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1093:10:1093:10 | b [element] : | -| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1093:10:1093:10 | b [element] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element 1] : | array_flow.rb:1087:10:1087:10 | a [element 1] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element 1] : | array_flow.rb:1087:10:1087:10 | a [element 1] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element 2] : | array_flow.rb:1088:10:1088:10 | a [element 2] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element 2] : | array_flow.rb:1088:10:1088:10 | a [element 2] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element] : | array_flow.rb:1086:10:1086:10 | a [element] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element] : | array_flow.rb:1086:10:1086:10 | a [element] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element] : | array_flow.rb:1087:10:1087:10 | a [element] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element] : | array_flow.rb:1087:10:1087:10 | a [element] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element] : | array_flow.rb:1088:10:1088:10 | a [element] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element] : | array_flow.rb:1088:10:1088:10 | a [element] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element] : | array_flow.rb:1089:10:1089:10 | a [element] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element] : | array_flow.rb:1089:10:1089:10 | a [element] : | -| array_flow.rb:1085:9:1085:9 | a [element 0] : | array_flow.rb:1085:9:1085:9 | [post] a [element] : | -| array_flow.rb:1085:9:1085:9 | a [element 0] : | array_flow.rb:1085:9:1085:9 | [post] a [element] : | -| array_flow.rb:1085:9:1085:9 | a [element 0] : | array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | -| array_flow.rb:1085:9:1085:9 | a [element 0] : | array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | -| array_flow.rb:1085:9:1085:9 | a [element 2] : | array_flow.rb:1085:9:1085:9 | [post] a [element 1] : | -| array_flow.rb:1085:9:1085:9 | a [element 2] : | array_flow.rb:1085:9:1085:9 | [post] a [element 1] : | -| array_flow.rb:1085:9:1085:9 | a [element 2] : | array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | -| array_flow.rb:1085:9:1085:9 | a [element 2] : | array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | -| array_flow.rb:1085:9:1085:9 | a [element 3] : | array_flow.rb:1085:9:1085:9 | [post] a [element 2] : | -| array_flow.rb:1085:9:1085:9 | a [element 3] : | array_flow.rb:1085:9:1085:9 | [post] a [element 2] : | -| array_flow.rb:1085:9:1085:9 | a [element 3] : | array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | -| array_flow.rb:1085:9:1085:9 | a [element 3] : | array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | array_flow.rb:1085:5:1085:5 | b [element 1] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | array_flow.rb:1085:5:1085:5 | b [element 1] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | array_flow.rb:1085:5:1085:5 | b [element 2] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | array_flow.rb:1085:5:1085:5 | b [element 2] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1085:5:1085:5 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1085:5:1085:5 | b [element] : | -| array_flow.rb:1086:10:1086:10 | a [element] : | array_flow.rb:1086:10:1086:13 | ...[...] | -| array_flow.rb:1086:10:1086:10 | a [element] : | array_flow.rb:1086:10:1086:13 | ...[...] | -| array_flow.rb:1087:10:1087:10 | a [element 1] : | array_flow.rb:1087:10:1087:13 | ...[...] | -| array_flow.rb:1087:10:1087:10 | a [element 1] : | array_flow.rb:1087:10:1087:13 | ...[...] | -| array_flow.rb:1087:10:1087:10 | a [element] : | array_flow.rb:1087:10:1087:13 | ...[...] | -| array_flow.rb:1087:10:1087:10 | a [element] : | array_flow.rb:1087:10:1087:13 | ...[...] | -| array_flow.rb:1088:10:1088:10 | a [element 2] : | array_flow.rb:1088:10:1088:13 | ...[...] | -| array_flow.rb:1088:10:1088:10 | a [element 2] : | array_flow.rb:1088:10:1088:13 | ...[...] | -| array_flow.rb:1088:10:1088:10 | a [element] : | array_flow.rb:1088:10:1088:13 | ...[...] | -| array_flow.rb:1088:10:1088:10 | a [element] : | array_flow.rb:1088:10:1088:13 | ...[...] | -| array_flow.rb:1089:10:1089:10 | a [element] : | array_flow.rb:1089:10:1089:13 | ...[...] | -| array_flow.rb:1089:10:1089:10 | a [element] : | array_flow.rb:1089:10:1089:13 | ...[...] | -| array_flow.rb:1090:10:1090:10 | b [element] : | array_flow.rb:1090:10:1090:13 | ...[...] | -| array_flow.rb:1090:10:1090:10 | b [element] : | array_flow.rb:1090:10:1090:13 | ...[...] | -| array_flow.rb:1091:10:1091:10 | b [element 1] : | array_flow.rb:1091:10:1091:13 | ...[...] | -| array_flow.rb:1091:10:1091:10 | b [element 1] : | array_flow.rb:1091:10:1091:13 | ...[...] | -| array_flow.rb:1091:10:1091:10 | b [element] : | array_flow.rb:1091:10:1091:13 | ...[...] | -| array_flow.rb:1091:10:1091:10 | b [element] : | array_flow.rb:1091:10:1091:13 | ...[...] | -| array_flow.rb:1092:10:1092:10 | b [element 2] : | array_flow.rb:1092:10:1092:13 | ...[...] | -| array_flow.rb:1092:10:1092:10 | b [element 2] : | array_flow.rb:1092:10:1092:13 | ...[...] | -| array_flow.rb:1092:10:1092:10 | b [element] : | array_flow.rb:1092:10:1092:13 | ...[...] | -| array_flow.rb:1092:10:1092:10 | b [element] : | array_flow.rb:1092:10:1092:13 | ...[...] | -| array_flow.rb:1093:10:1093:10 | b [element] : | array_flow.rb:1093:10:1093:13 | ...[...] | -| array_flow.rb:1093:10:1093:10 | b [element] : | array_flow.rb:1093:10:1093:13 | ...[...] | -| array_flow.rb:1095:5:1095:5 | a [element 0] : | array_flow.rb:1096:9:1096:9 | a [element 0] : | -| array_flow.rb:1095:5:1095:5 | a [element 0] : | array_flow.rb:1096:9:1096:9 | a [element 0] : | -| array_flow.rb:1095:5:1095:5 | a [element 2] : | array_flow.rb:1096:9:1096:9 | a [element 2] : | -| array_flow.rb:1095:5:1095:5 | a [element 2] : | array_flow.rb:1096:9:1096:9 | a [element 2] : | -| array_flow.rb:1095:5:1095:5 | a [element 3] : | array_flow.rb:1096:9:1096:9 | a [element 3] : | -| array_flow.rb:1095:5:1095:5 | a [element 3] : | array_flow.rb:1096:9:1096:9 | a [element 3] : | -| array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 0] : | -| array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 0] : | -| array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 2] : | -| array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 2] : | -| array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 3] : | -| array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 3] : | -| array_flow.rb:1096:5:1096:5 | b [element 0] : | array_flow.rb:1101:10:1101:10 | b [element 0] : | -| array_flow.rb:1096:5:1096:5 | b [element 0] : | array_flow.rb:1101:10:1101:10 | b [element 0] : | -| array_flow.rb:1096:5:1096:5 | b [element 1] : | array_flow.rb:1102:10:1102:10 | b [element 1] : | -| array_flow.rb:1096:5:1096:5 | b [element 1] : | array_flow.rb:1102:10:1102:10 | b [element 1] : | -| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1101:10:1101:10 | b [element] : | -| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1101:10:1101:10 | b [element] : | -| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1102:10:1102:10 | b [element] : | -| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1102:10:1102:10 | b [element] : | -| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1103:10:1103:10 | b [element] : | -| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1103:10:1103:10 | b [element] : | -| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1104:10:1104:10 | b [element] : | -| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1104:10:1104:10 | b [element] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element 0] : | array_flow.rb:1097:10:1097:10 | a [element 0] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element 0] : | array_flow.rb:1097:10:1097:10 | a [element 0] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element 1] : | array_flow.rb:1098:10:1098:10 | a [element 1] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element 1] : | array_flow.rb:1098:10:1098:10 | a [element 1] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element] : | array_flow.rb:1097:10:1097:10 | a [element] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element] : | array_flow.rb:1097:10:1097:10 | a [element] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element] : | array_flow.rb:1098:10:1098:10 | a [element] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element] : | array_flow.rb:1098:10:1098:10 | a [element] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element] : | array_flow.rb:1099:10:1099:10 | a [element] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element] : | array_flow.rb:1099:10:1099:10 | a [element] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element] : | array_flow.rb:1100:10:1100:10 | a [element] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element] : | array_flow.rb:1100:10:1100:10 | a [element] : | -| array_flow.rb:1096:9:1096:9 | a [element 0] : | array_flow.rb:1096:9:1096:9 | [post] a [element] : | -| array_flow.rb:1096:9:1096:9 | a [element 0] : | array_flow.rb:1096:9:1096:9 | [post] a [element] : | -| array_flow.rb:1096:9:1096:9 | a [element 0] : | array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | -| array_flow.rb:1096:9:1096:9 | a [element 0] : | array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | -| array_flow.rb:1096:9:1096:9 | a [element 2] : | array_flow.rb:1096:9:1096:9 | [post] a [element 0] : | -| array_flow.rb:1096:9:1096:9 | a [element 2] : | array_flow.rb:1096:9:1096:9 | [post] a [element 0] : | -| array_flow.rb:1096:9:1096:9 | a [element 2] : | array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | -| array_flow.rb:1096:9:1096:9 | a [element 2] : | array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | -| array_flow.rb:1096:9:1096:9 | a [element 3] : | array_flow.rb:1096:9:1096:9 | [post] a [element 1] : | -| array_flow.rb:1096:9:1096:9 | a [element 3] : | array_flow.rb:1096:9:1096:9 | [post] a [element 1] : | -| array_flow.rb:1096:9:1096:9 | a [element 3] : | array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | -| array_flow.rb:1096:9:1096:9 | a [element 3] : | array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | array_flow.rb:1096:5:1096:5 | b [element 0] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | array_flow.rb:1096:5:1096:5 | b [element 0] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | array_flow.rb:1096:5:1096:5 | b [element 1] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | array_flow.rb:1096:5:1096:5 | b [element 1] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1096:5:1096:5 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1096:5:1096:5 | b [element] : | -| array_flow.rb:1097:10:1097:10 | a [element 0] : | array_flow.rb:1097:10:1097:13 | ...[...] | -| array_flow.rb:1097:10:1097:10 | a [element 0] : | array_flow.rb:1097:10:1097:13 | ...[...] | -| array_flow.rb:1097:10:1097:10 | a [element] : | array_flow.rb:1097:10:1097:13 | ...[...] | -| array_flow.rb:1097:10:1097:10 | a [element] : | array_flow.rb:1097:10:1097:13 | ...[...] | -| array_flow.rb:1098:10:1098:10 | a [element 1] : | array_flow.rb:1098:10:1098:13 | ...[...] | -| array_flow.rb:1098:10:1098:10 | a [element 1] : | array_flow.rb:1098:10:1098:13 | ...[...] | -| array_flow.rb:1098:10:1098:10 | a [element] : | array_flow.rb:1098:10:1098:13 | ...[...] | -| array_flow.rb:1098:10:1098:10 | a [element] : | array_flow.rb:1098:10:1098:13 | ...[...] | -| array_flow.rb:1099:10:1099:10 | a [element] : | array_flow.rb:1099:10:1099:13 | ...[...] | -| array_flow.rb:1099:10:1099:10 | a [element] : | array_flow.rb:1099:10:1099:13 | ...[...] | -| array_flow.rb:1100:10:1100:10 | a [element] : | array_flow.rb:1100:10:1100:13 | ...[...] | -| array_flow.rb:1100:10:1100:10 | a [element] : | array_flow.rb:1100:10:1100:13 | ...[...] | -| array_flow.rb:1101:10:1101:10 | b [element 0] : | array_flow.rb:1101:10:1101:13 | ...[...] | -| array_flow.rb:1101:10:1101:10 | b [element 0] : | array_flow.rb:1101:10:1101:13 | ...[...] | -| array_flow.rb:1101:10:1101:10 | b [element] : | array_flow.rb:1101:10:1101:13 | ...[...] | -| array_flow.rb:1101:10:1101:10 | b [element] : | array_flow.rb:1101:10:1101:13 | ...[...] | -| array_flow.rb:1102:10:1102:10 | b [element 1] : | array_flow.rb:1102:10:1102:13 | ...[...] | -| array_flow.rb:1102:10:1102:10 | b [element 1] : | array_flow.rb:1102:10:1102:13 | ...[...] | -| array_flow.rb:1102:10:1102:10 | b [element] : | array_flow.rb:1102:10:1102:13 | ...[...] | -| array_flow.rb:1102:10:1102:10 | b [element] : | array_flow.rb:1102:10:1102:13 | ...[...] | -| array_flow.rb:1103:10:1103:10 | b [element] : | array_flow.rb:1103:10:1103:13 | ...[...] | -| array_flow.rb:1103:10:1103:10 | b [element] : | array_flow.rb:1103:10:1103:13 | ...[...] | -| array_flow.rb:1104:10:1104:10 | b [element] : | array_flow.rb:1104:10:1104:13 | ...[...] | -| array_flow.rb:1104:10:1104:10 | b [element] : | array_flow.rb:1104:10:1104:13 | ...[...] | -| array_flow.rb:1106:5:1106:5 | a [element 0] : | array_flow.rb:1107:9:1107:9 | a [element 0] : | -| array_flow.rb:1106:5:1106:5 | a [element 0] : | array_flow.rb:1107:9:1107:9 | a [element 0] : | -| array_flow.rb:1106:5:1106:5 | a [element 2] : | array_flow.rb:1107:9:1107:9 | a [element 2] : | -| array_flow.rb:1106:5:1106:5 | a [element 2] : | array_flow.rb:1107:9:1107:9 | a [element 2] : | -| array_flow.rb:1106:5:1106:5 | a [element 3] : | array_flow.rb:1107:9:1107:9 | a [element 3] : | -| array_flow.rb:1106:5:1106:5 | a [element 3] : | array_flow.rb:1107:9:1107:9 | a [element 3] : | -| array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 0] : | -| array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 0] : | -| array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 2] : | -| array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 2] : | -| array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 3] : | -| array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 3] : | -| array_flow.rb:1107:5:1107:5 | b [element 0] : | array_flow.rb:1112:10:1112:10 | b [element 0] : | -| array_flow.rb:1107:5:1107:5 | b [element 0] : | array_flow.rb:1112:10:1112:10 | b [element 0] : | -| array_flow.rb:1107:5:1107:5 | b [element 2] : | array_flow.rb:1114:10:1114:10 | b [element 2] : | -| array_flow.rb:1107:5:1107:5 | b [element 2] : | array_flow.rb:1114:10:1114:10 | b [element 2] : | -| array_flow.rb:1107:5:1107:5 | b [element 3] : | array_flow.rb:1115:10:1115:10 | b [element 3] : | -| array_flow.rb:1107:5:1107:5 | b [element 3] : | array_flow.rb:1115:10:1115:10 | b [element 3] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 0] : | array_flow.rb:1108:10:1108:10 | a [element 0] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 0] : | array_flow.rb:1108:10:1108:10 | a [element 0] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 2] : | array_flow.rb:1110:10:1110:10 | a [element 2] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 2] : | array_flow.rb:1110:10:1110:10 | a [element 2] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 3] : | array_flow.rb:1111:10:1111:10 | a [element 3] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 3] : | array_flow.rb:1111:10:1111:10 | a [element 3] : | -| array_flow.rb:1107:9:1107:9 | a [element 0] : | array_flow.rb:1107:9:1107:9 | [post] a [element 0] : | -| array_flow.rb:1107:9:1107:9 | a [element 0] : | array_flow.rb:1107:9:1107:9 | [post] a [element 0] : | -| array_flow.rb:1107:9:1107:9 | a [element 0] : | array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | -| array_flow.rb:1107:9:1107:9 | a [element 0] : | array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | -| array_flow.rb:1107:9:1107:9 | a [element 2] : | array_flow.rb:1107:9:1107:9 | [post] a [element 2] : | -| array_flow.rb:1107:9:1107:9 | a [element 2] : | array_flow.rb:1107:9:1107:9 | [post] a [element 2] : | -| array_flow.rb:1107:9:1107:9 | a [element 2] : | array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | -| array_flow.rb:1107:9:1107:9 | a [element 2] : | array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | -| array_flow.rb:1107:9:1107:9 | a [element 3] : | array_flow.rb:1107:9:1107:9 | [post] a [element 3] : | -| array_flow.rb:1107:9:1107:9 | a [element 3] : | array_flow.rb:1107:9:1107:9 | [post] a [element 3] : | -| array_flow.rb:1107:9:1107:9 | a [element 3] : | array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | -| array_flow.rb:1107:9:1107:9 | a [element 3] : | array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | array_flow.rb:1107:5:1107:5 | b [element 0] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | array_flow.rb:1107:5:1107:5 | b [element 0] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | array_flow.rb:1107:5:1107:5 | b [element 2] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | array_flow.rb:1107:5:1107:5 | b [element 2] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | array_flow.rb:1107:5:1107:5 | b [element 3] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | array_flow.rb:1107:5:1107:5 | b [element 3] : | -| array_flow.rb:1108:10:1108:10 | a [element 0] : | array_flow.rb:1108:10:1108:13 | ...[...] | -| array_flow.rb:1108:10:1108:10 | a [element 0] : | array_flow.rb:1108:10:1108:13 | ...[...] | -| array_flow.rb:1110:10:1110:10 | a [element 2] : | array_flow.rb:1110:10:1110:13 | ...[...] | -| array_flow.rb:1110:10:1110:10 | a [element 2] : | array_flow.rb:1110:10:1110:13 | ...[...] | -| array_flow.rb:1111:10:1111:10 | a [element 3] : | array_flow.rb:1111:10:1111:13 | ...[...] | -| array_flow.rb:1111:10:1111:10 | a [element 3] : | array_flow.rb:1111:10:1111:13 | ...[...] | -| array_flow.rb:1112:10:1112:10 | b [element 0] : | array_flow.rb:1112:10:1112:13 | ...[...] | -| array_flow.rb:1112:10:1112:10 | b [element 0] : | array_flow.rb:1112:10:1112:13 | ...[...] | -| array_flow.rb:1114:10:1114:10 | b [element 2] : | array_flow.rb:1114:10:1114:13 | ...[...] | -| array_flow.rb:1114:10:1114:10 | b [element 2] : | array_flow.rb:1114:10:1114:13 | ...[...] | -| array_flow.rb:1115:10:1115:10 | b [element 3] : | array_flow.rb:1115:10:1115:13 | ...[...] | -| array_flow.rb:1115:10:1115:10 | b [element 3] : | array_flow.rb:1115:10:1115:13 | ...[...] | -| array_flow.rb:1117:5:1117:5 | a [element 0] : | array_flow.rb:1118:9:1118:9 | a [element 0] : | -| array_flow.rb:1117:5:1117:5 | a [element 0] : | array_flow.rb:1118:9:1118:9 | a [element 0] : | -| array_flow.rb:1117:5:1117:5 | a [element 2] : | array_flow.rb:1118:9:1118:9 | a [element 2] : | -| array_flow.rb:1117:5:1117:5 | a [element 2] : | array_flow.rb:1118:9:1118:9 | a [element 2] : | -| array_flow.rb:1117:5:1117:5 | a [element 3] : | array_flow.rb:1118:9:1118:9 | a [element 3] : | -| array_flow.rb:1117:5:1117:5 | a [element 3] : | array_flow.rb:1118:9:1118:9 | a [element 3] : | -| array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 0] : | -| array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 0] : | -| array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 2] : | -| array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 2] : | -| array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 3] : | -| array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 3] : | -| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1123:10:1123:10 | b [element] : | -| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1123:10:1123:10 | b [element] : | -| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1124:10:1124:10 | b [element] : | -| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1124:10:1124:10 | b [element] : | -| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1125:10:1125:10 | b [element] : | -| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1125:10:1125:10 | b [element] : | -| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1126:10:1126:10 | b [element] : | -| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1126:10:1126:10 | b [element] : | -| array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1119:10:1119:10 | a [element] : | -| array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1119:10:1119:10 | a [element] : | -| array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1120:10:1120:10 | a [element] : | -| array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1120:10:1120:10 | a [element] : | -| array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1121:10:1121:10 | a [element] : | -| array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1121:10:1121:10 | a [element] : | -| array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1122:10:1122:10 | a [element] : | -| array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1122:10:1122:10 | a [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 0] : | array_flow.rb:1118:9:1118:9 | [post] a [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 0] : | array_flow.rb:1118:9:1118:9 | [post] a [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 0] : | array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 0] : | array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 2] : | array_flow.rb:1118:9:1118:9 | [post] a [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 2] : | array_flow.rb:1118:9:1118:9 | [post] a [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 2] : | array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 2] : | array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 3] : | array_flow.rb:1118:9:1118:9 | [post] a [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 3] : | array_flow.rb:1118:9:1118:9 | [post] a [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 3] : | array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 3] : | array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1118:5:1118:5 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1118:5:1118:5 | b [element] : | -| array_flow.rb:1119:10:1119:10 | a [element] : | array_flow.rb:1119:10:1119:13 | ...[...] | -| array_flow.rb:1119:10:1119:10 | a [element] : | array_flow.rb:1119:10:1119:13 | ...[...] | -| array_flow.rb:1120:10:1120:10 | a [element] : | array_flow.rb:1120:10:1120:13 | ...[...] | -| array_flow.rb:1120:10:1120:10 | a [element] : | array_flow.rb:1120:10:1120:13 | ...[...] | -| array_flow.rb:1121:10:1121:10 | a [element] : | array_flow.rb:1121:10:1121:13 | ...[...] | -| array_flow.rb:1121:10:1121:10 | a [element] : | array_flow.rb:1121:10:1121:13 | ...[...] | -| array_flow.rb:1122:10:1122:10 | a [element] : | array_flow.rb:1122:10:1122:13 | ...[...] | -| array_flow.rb:1122:10:1122:10 | a [element] : | array_flow.rb:1122:10:1122:13 | ...[...] | -| array_flow.rb:1123:10:1123:10 | b [element] : | array_flow.rb:1123:10:1123:13 | ...[...] | -| array_flow.rb:1123:10:1123:10 | b [element] : | array_flow.rb:1123:10:1123:13 | ...[...] | -| array_flow.rb:1124:10:1124:10 | b [element] : | array_flow.rb:1124:10:1124:13 | ...[...] | -| array_flow.rb:1124:10:1124:10 | b [element] : | array_flow.rb:1124:10:1124:13 | ...[...] | -| array_flow.rb:1125:10:1125:10 | b [element] : | array_flow.rb:1125:10:1125:13 | ...[...] | -| array_flow.rb:1125:10:1125:10 | b [element] : | array_flow.rb:1125:10:1125:13 | ...[...] | -| array_flow.rb:1126:10:1126:10 | b [element] : | array_flow.rb:1126:10:1126:13 | ...[...] | -| array_flow.rb:1126:10:1126:10 | b [element] : | array_flow.rb:1126:10:1126:13 | ...[...] | -| array_flow.rb:1130:5:1130:5 | a [element 3] : | array_flow.rb:1131:9:1131:9 | a [element 3] : | -| array_flow.rb:1130:5:1130:5 | a [element 3] : | array_flow.rb:1131:9:1131:9 | a [element 3] : | -| array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1130:5:1130:5 | a [element 3] : | -| array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1130:5:1130:5 | a [element 3] : | -| array_flow.rb:1131:5:1131:5 | b [element] : | array_flow.rb:1134:10:1134:10 | b [element] : | -| array_flow.rb:1131:5:1131:5 | b [element] : | array_flow.rb:1134:10:1134:10 | b [element] : | -| array_flow.rb:1131:9:1131:9 | a [element 3] : | array_flow.rb:1131:9:1133:7 | call to select [element] : | -| array_flow.rb:1131:9:1131:9 | a [element 3] : | array_flow.rb:1131:9:1133:7 | call to select [element] : | -| array_flow.rb:1131:9:1131:9 | a [element 3] : | array_flow.rb:1131:22:1131:22 | x : | -| array_flow.rb:1131:9:1131:9 | a [element 3] : | array_flow.rb:1131:22:1131:22 | x : | -| array_flow.rb:1131:9:1133:7 | call to select [element] : | array_flow.rb:1131:5:1131:5 | b [element] : | -| array_flow.rb:1131:9:1133:7 | call to select [element] : | array_flow.rb:1131:5:1131:5 | b [element] : | -| array_flow.rb:1131:22:1131:22 | x : | array_flow.rb:1132:14:1132:14 | x | -| array_flow.rb:1131:22:1131:22 | x : | array_flow.rb:1132:14:1132:14 | x | -| array_flow.rb:1134:10:1134:10 | b [element] : | array_flow.rb:1134:10:1134:13 | ...[...] | -| array_flow.rb:1134:10:1134:10 | b [element] : | array_flow.rb:1134:10:1134:13 | ...[...] | -| array_flow.rb:1138:5:1138:5 | a [element 2] : | array_flow.rb:1139:9:1139:9 | a [element 2] : | -| array_flow.rb:1138:5:1138:5 | a [element 2] : | array_flow.rb:1139:9:1139:9 | a [element 2] : | -| array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1138:5:1138:5 | a [element 2] : | -| array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1138:5:1138:5 | a [element 2] : | -| array_flow.rb:1139:5:1139:5 | b [element] : | array_flow.rb:1144:10:1144:10 | b [element] : | -| array_flow.rb:1139:5:1139:5 | b [element] : | array_flow.rb:1144:10:1144:10 | b [element] : | -| array_flow.rb:1139:9:1139:9 | [post] a [element] : | array_flow.rb:1143:10:1143:10 | a [element] : | -| array_flow.rb:1139:9:1139:9 | [post] a [element] : | array_flow.rb:1143:10:1143:10 | a [element] : | -| array_flow.rb:1139:9:1139:9 | a [element 2] : | array_flow.rb:1139:9:1139:9 | [post] a [element] : | -| array_flow.rb:1139:9:1139:9 | a [element 2] : | array_flow.rb:1139:9:1139:9 | [post] a [element] : | -| array_flow.rb:1139:9:1139:9 | a [element 2] : | array_flow.rb:1139:9:1142:7 | call to select! [element] : | -| array_flow.rb:1139:9:1139:9 | a [element 2] : | array_flow.rb:1139:9:1142:7 | call to select! [element] : | -| array_flow.rb:1139:9:1139:9 | a [element 2] : | array_flow.rb:1139:23:1139:23 | x : | -| array_flow.rb:1139:9:1139:9 | a [element 2] : | array_flow.rb:1139:23:1139:23 | x : | -| array_flow.rb:1139:9:1142:7 | call to select! [element] : | array_flow.rb:1139:5:1139:5 | b [element] : | -| array_flow.rb:1139:9:1142:7 | call to select! [element] : | array_flow.rb:1139:5:1139:5 | b [element] : | -| array_flow.rb:1139:23:1139:23 | x : | array_flow.rb:1140:14:1140:14 | x | -| array_flow.rb:1139:23:1139:23 | x : | array_flow.rb:1140:14:1140:14 | x | -| array_flow.rb:1143:10:1143:10 | a [element] : | array_flow.rb:1143:10:1143:13 | ...[...] | -| array_flow.rb:1143:10:1143:10 | a [element] : | array_flow.rb:1143:10:1143:13 | ...[...] | -| array_flow.rb:1144:10:1144:10 | b [element] : | array_flow.rb:1144:10:1144:13 | ...[...] | -| array_flow.rb:1144:10:1144:10 | b [element] : | array_flow.rb:1144:10:1144:13 | ...[...] | -| array_flow.rb:1148:5:1148:5 | a [element 0] : | array_flow.rb:1149:9:1149:9 | a [element 0] : | -| array_flow.rb:1148:5:1148:5 | a [element 0] : | array_flow.rb:1149:9:1149:9 | a [element 0] : | -| array_flow.rb:1148:5:1148:5 | a [element 2] : | array_flow.rb:1149:9:1149:9 | a [element 2] : | -| array_flow.rb:1148:5:1148:5 | a [element 2] : | array_flow.rb:1149:9:1149:9 | a [element 2] : | -| array_flow.rb:1148:10:1148:22 | call to source : | array_flow.rb:1148:5:1148:5 | a [element 0] : | -| array_flow.rb:1148:10:1148:22 | call to source : | array_flow.rb:1148:5:1148:5 | a [element 0] : | -| array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1148:5:1148:5 | a [element 2] : | -| array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1148:5:1148:5 | a [element 2] : | -| array_flow.rb:1149:5:1149:5 | b : | array_flow.rb:1150:10:1150:10 | b | -| array_flow.rb:1149:5:1149:5 | b : | array_flow.rb:1150:10:1150:10 | b | -| array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | array_flow.rb:1152:10:1152:10 | a [element 1] : | -| array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | array_flow.rb:1152:10:1152:10 | a [element 1] : | -| array_flow.rb:1149:9:1149:9 | a [element 0] : | array_flow.rb:1149:9:1149:15 | call to shift : | -| array_flow.rb:1149:9:1149:9 | a [element 0] : | array_flow.rb:1149:9:1149:15 | call to shift : | -| array_flow.rb:1149:9:1149:9 | a [element 2] : | array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | -| array_flow.rb:1149:9:1149:9 | a [element 2] : | array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | -| array_flow.rb:1149:9:1149:15 | call to shift : | array_flow.rb:1149:5:1149:5 | b : | -| array_flow.rb:1149:9:1149:15 | call to shift : | array_flow.rb:1149:5:1149:5 | b : | -| array_flow.rb:1152:10:1152:10 | a [element 1] : | array_flow.rb:1152:10:1152:13 | ...[...] | -| array_flow.rb:1152:10:1152:10 | a [element 1] : | array_flow.rb:1152:10:1152:13 | ...[...] | -| array_flow.rb:1155:5:1155:5 | a [element 0] : | array_flow.rb:1156:9:1156:9 | a [element 0] : | -| array_flow.rb:1155:5:1155:5 | a [element 0] : | array_flow.rb:1156:9:1156:9 | a [element 0] : | -| array_flow.rb:1155:5:1155:5 | a [element 2] : | array_flow.rb:1156:9:1156:9 | a [element 2] : | -| array_flow.rb:1155:5:1155:5 | a [element 2] : | array_flow.rb:1156:9:1156:9 | a [element 2] : | -| array_flow.rb:1155:10:1155:22 | call to source : | array_flow.rb:1155:5:1155:5 | a [element 0] : | -| array_flow.rb:1155:10:1155:22 | call to source : | array_flow.rb:1155:5:1155:5 | a [element 0] : | -| array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1155:5:1155:5 | a [element 2] : | -| array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1155:5:1155:5 | a [element 2] : | -| array_flow.rb:1156:5:1156:5 | b [element 0] : | array_flow.rb:1157:10:1157:10 | b [element 0] : | -| array_flow.rb:1156:5:1156:5 | b [element 0] : | array_flow.rb:1157:10:1157:10 | b [element 0] : | -| array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | array_flow.rb:1159:10:1159:10 | a [element 0] : | -| array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | array_flow.rb:1159:10:1159:10 | a [element 0] : | -| array_flow.rb:1156:9:1156:9 | a [element 0] : | array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | -| array_flow.rb:1156:9:1156:9 | a [element 0] : | array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | -| array_flow.rb:1156:9:1156:9 | a [element 2] : | array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | -| array_flow.rb:1156:9:1156:9 | a [element 2] : | array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | -| array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | array_flow.rb:1156:5:1156:5 | b [element 0] : | -| array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | array_flow.rb:1156:5:1156:5 | b [element 0] : | -| array_flow.rb:1157:10:1157:10 | b [element 0] : | array_flow.rb:1157:10:1157:13 | ...[...] | -| array_flow.rb:1157:10:1157:10 | b [element 0] : | array_flow.rb:1157:10:1157:13 | ...[...] | -| array_flow.rb:1159:10:1159:10 | a [element 0] : | array_flow.rb:1159:10:1159:13 | ...[...] | -| array_flow.rb:1159:10:1159:10 | a [element 0] : | array_flow.rb:1159:10:1159:13 | ...[...] | -| array_flow.rb:1163:5:1163:5 | a [element 0] : | array_flow.rb:1164:9:1164:9 | a [element 0] : | -| array_flow.rb:1163:5:1163:5 | a [element 0] : | array_flow.rb:1164:9:1164:9 | a [element 0] : | -| array_flow.rb:1163:5:1163:5 | a [element 0] : | array_flow.rb:1167:10:1167:10 | a [element 0] : | -| array_flow.rb:1163:5:1163:5 | a [element 0] : | array_flow.rb:1167:10:1167:10 | a [element 0] : | -| array_flow.rb:1163:5:1163:5 | a [element 2] : | array_flow.rb:1164:9:1164:9 | a [element 2] : | -| array_flow.rb:1163:5:1163:5 | a [element 2] : | array_flow.rb:1164:9:1164:9 | a [element 2] : | -| array_flow.rb:1163:5:1163:5 | a [element 2] : | array_flow.rb:1169:10:1169:10 | a [element 2] : | -| array_flow.rb:1163:5:1163:5 | a [element 2] : | array_flow.rb:1169:10:1169:10 | a [element 2] : | -| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1163:5:1163:5 | a [element 0] : | -| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1163:5:1163:5 | a [element 0] : | -| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1163:5:1163:5 | a [element 2] : | -| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1163:5:1163:5 | a [element 2] : | -| array_flow.rb:1164:5:1164:5 | b [element] : | array_flow.rb:1165:10:1165:10 | b [element] : | -| array_flow.rb:1164:5:1164:5 | b [element] : | array_flow.rb:1165:10:1165:10 | b [element] : | -| array_flow.rb:1164:5:1164:5 | b [element] : | array_flow.rb:1166:10:1166:10 | b [element] : | -| array_flow.rb:1164:5:1164:5 | b [element] : | array_flow.rb:1166:10:1166:10 | b [element] : | -| array_flow.rb:1164:9:1164:9 | [post] a [element] : | array_flow.rb:1167:10:1167:10 | a [element] : | -| array_flow.rb:1164:9:1164:9 | [post] a [element] : | array_flow.rb:1167:10:1167:10 | a [element] : | -| array_flow.rb:1164:9:1164:9 | [post] a [element] : | array_flow.rb:1168:10:1168:10 | a [element] : | -| array_flow.rb:1164:9:1164:9 | [post] a [element] : | array_flow.rb:1168:10:1168:10 | a [element] : | -| array_flow.rb:1164:9:1164:9 | [post] a [element] : | array_flow.rb:1169:10:1169:10 | a [element] : | -| array_flow.rb:1164:9:1164:9 | [post] a [element] : | array_flow.rb:1169:10:1169:10 | a [element] : | -| array_flow.rb:1164:9:1164:9 | a [element 0] : | array_flow.rb:1164:9:1164:9 | [post] a [element] : | -| array_flow.rb:1164:9:1164:9 | a [element 0] : | array_flow.rb:1164:9:1164:9 | [post] a [element] : | -| array_flow.rb:1164:9:1164:9 | a [element 0] : | array_flow.rb:1164:9:1164:18 | call to shift [element] : | -| array_flow.rb:1164:9:1164:9 | a [element 0] : | array_flow.rb:1164:9:1164:18 | call to shift [element] : | -| array_flow.rb:1164:9:1164:9 | a [element 2] : | array_flow.rb:1164:9:1164:9 | [post] a [element] : | -| array_flow.rb:1164:9:1164:9 | a [element 2] : | array_flow.rb:1164:9:1164:9 | [post] a [element] : | -| array_flow.rb:1164:9:1164:9 | a [element 2] : | array_flow.rb:1164:9:1164:18 | call to shift [element] : | -| array_flow.rb:1164:9:1164:9 | a [element 2] : | array_flow.rb:1164:9:1164:18 | call to shift [element] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1164:5:1164:5 | b [element] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1164:5:1164:5 | b [element] : | -| array_flow.rb:1165:10:1165:10 | b [element] : | array_flow.rb:1165:10:1165:13 | ...[...] | -| array_flow.rb:1165:10:1165:10 | b [element] : | array_flow.rb:1165:10:1165:13 | ...[...] | -| array_flow.rb:1166:10:1166:10 | b [element] : | array_flow.rb:1166:10:1166:13 | ...[...] | -| array_flow.rb:1166:10:1166:10 | b [element] : | array_flow.rb:1166:10:1166:13 | ...[...] | -| array_flow.rb:1167:10:1167:10 | a [element 0] : | array_flow.rb:1167:10:1167:13 | ...[...] | -| array_flow.rb:1167:10:1167:10 | a [element 0] : | array_flow.rb:1167:10:1167:13 | ...[...] | -| array_flow.rb:1167:10:1167:10 | a [element] : | array_flow.rb:1167:10:1167:13 | ...[...] | -| array_flow.rb:1167:10:1167:10 | a [element] : | array_flow.rb:1167:10:1167:13 | ...[...] | -| array_flow.rb:1168:10:1168:10 | a [element] : | array_flow.rb:1168:10:1168:13 | ...[...] | -| array_flow.rb:1168:10:1168:10 | a [element] : | array_flow.rb:1168:10:1168:13 | ...[...] | -| array_flow.rb:1169:10:1169:10 | a [element 2] : | array_flow.rb:1169:10:1169:13 | ...[...] | -| array_flow.rb:1169:10:1169:10 | a [element 2] : | array_flow.rb:1169:10:1169:13 | ...[...] | -| array_flow.rb:1169:10:1169:10 | a [element] : | array_flow.rb:1169:10:1169:13 | ...[...] | -| array_flow.rb:1169:10:1169:10 | a [element] : | array_flow.rb:1169:10:1169:13 | ...[...] | -| array_flow.rb:1173:5:1173:5 | a [element 2] : | array_flow.rb:1174:9:1174:9 | a [element 2] : | -| array_flow.rb:1173:5:1173:5 | a [element 2] : | array_flow.rb:1174:9:1174:9 | a [element 2] : | -| array_flow.rb:1173:5:1173:5 | a [element 2] : | array_flow.rb:1177:10:1177:10 | a [element 2] : | -| array_flow.rb:1173:5:1173:5 | a [element 2] : | array_flow.rb:1177:10:1177:10 | a [element 2] : | -| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1173:5:1173:5 | a [element 2] : | -| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1173:5:1173:5 | a [element 2] : | -| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1178:10:1178:10 | b [element] : | -| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1178:10:1178:10 | b [element] : | -| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1179:10:1179:10 | b [element] : | -| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1179:10:1179:10 | b [element] : | -| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1180:10:1180:10 | b [element] : | -| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1180:10:1180:10 | b [element] : | -| array_flow.rb:1174:9:1174:9 | a [element 2] : | array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | -| array_flow.rb:1174:9:1174:9 | a [element 2] : | array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1174:5:1174:5 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1174:5:1174:5 | b [element] : | -| array_flow.rb:1177:10:1177:10 | a [element 2] : | array_flow.rb:1177:10:1177:13 | ...[...] | -| array_flow.rb:1177:10:1177:10 | a [element 2] : | array_flow.rb:1177:10:1177:13 | ...[...] | -| array_flow.rb:1178:10:1178:10 | b [element] : | array_flow.rb:1178:10:1178:13 | ...[...] | -| array_flow.rb:1178:10:1178:10 | b [element] : | array_flow.rb:1178:10:1178:13 | ...[...] | -| array_flow.rb:1179:10:1179:10 | b [element] : | array_flow.rb:1179:10:1179:13 | ...[...] | -| array_flow.rb:1179:10:1179:10 | b [element] : | array_flow.rb:1179:10:1179:13 | ...[...] | -| array_flow.rb:1180:10:1180:10 | b [element] : | array_flow.rb:1180:10:1180:13 | ...[...] | -| array_flow.rb:1180:10:1180:10 | b [element] : | array_flow.rb:1180:10:1180:13 | ...[...] | -| array_flow.rb:1184:5:1184:5 | a [element 2] : | array_flow.rb:1185:9:1185:9 | a [element 2] : | -| array_flow.rb:1184:5:1184:5 | a [element 2] : | array_flow.rb:1185:9:1185:9 | a [element 2] : | -| array_flow.rb:1184:5:1184:5 | a [element 2] : | array_flow.rb:1188:10:1188:10 | a [element 2] : | -| array_flow.rb:1184:5:1184:5 | a [element 2] : | array_flow.rb:1188:10:1188:10 | a [element 2] : | -| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1184:5:1184:5 | a [element 2] : | -| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1184:5:1184:5 | a [element 2] : | -| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1189:10:1189:10 | b [element] : | -| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1189:10:1189:10 | b [element] : | -| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1190:10:1190:10 | b [element] : | -| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1190:10:1190:10 | b [element] : | -| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1191:10:1191:10 | b [element] : | -| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1191:10:1191:10 | b [element] : | -| array_flow.rb:1185:9:1185:9 | [post] a [element] : | array_flow.rb:1186:10:1186:10 | a [element] : | -| array_flow.rb:1185:9:1185:9 | [post] a [element] : | array_flow.rb:1186:10:1186:10 | a [element] : | -| array_flow.rb:1185:9:1185:9 | [post] a [element] : | array_flow.rb:1187:10:1187:10 | a [element] : | -| array_flow.rb:1185:9:1185:9 | [post] a [element] : | array_flow.rb:1187:10:1187:10 | a [element] : | -| array_flow.rb:1185:9:1185:9 | [post] a [element] : | array_flow.rb:1188:10:1188:10 | a [element] : | -| array_flow.rb:1185:9:1185:9 | [post] a [element] : | array_flow.rb:1188:10:1188:10 | a [element] : | -| array_flow.rb:1185:9:1185:9 | a [element 2] : | array_flow.rb:1185:9:1185:9 | [post] a [element] : | -| array_flow.rb:1185:9:1185:9 | a [element 2] : | array_flow.rb:1185:9:1185:9 | [post] a [element] : | -| array_flow.rb:1185:9:1185:9 | a [element 2] : | array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | -| array_flow.rb:1185:9:1185:9 | a [element 2] : | array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1185:5:1185:5 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1185:5:1185:5 | b [element] : | -| array_flow.rb:1186:10:1186:10 | a [element] : | array_flow.rb:1186:10:1186:13 | ...[...] | -| array_flow.rb:1186:10:1186:10 | a [element] : | array_flow.rb:1186:10:1186:13 | ...[...] | -| array_flow.rb:1187:10:1187:10 | a [element] : | array_flow.rb:1187:10:1187:13 | ...[...] | -| array_flow.rb:1187:10:1187:10 | a [element] : | array_flow.rb:1187:10:1187:13 | ...[...] | -| array_flow.rb:1188:10:1188:10 | a [element 2] : | array_flow.rb:1188:10:1188:13 | ...[...] | -| array_flow.rb:1188:10:1188:10 | a [element 2] : | array_flow.rb:1188:10:1188:13 | ...[...] | -| array_flow.rb:1188:10:1188:10 | a [element] : | array_flow.rb:1188:10:1188:13 | ...[...] | -| array_flow.rb:1188:10:1188:10 | a [element] : | array_flow.rb:1188:10:1188:13 | ...[...] | -| array_flow.rb:1189:10:1189:10 | b [element] : | array_flow.rb:1189:10:1189:13 | ...[...] | -| array_flow.rb:1189:10:1189:10 | b [element] : | array_flow.rb:1189:10:1189:13 | ...[...] | -| array_flow.rb:1190:10:1190:10 | b [element] : | array_flow.rb:1190:10:1190:13 | ...[...] | -| array_flow.rb:1190:10:1190:10 | b [element] : | array_flow.rb:1190:10:1190:13 | ...[...] | -| array_flow.rb:1191:10:1191:10 | b [element] : | array_flow.rb:1191:10:1191:13 | ...[...] | -| array_flow.rb:1191:10:1191:10 | b [element] : | array_flow.rb:1191:10:1191:13 | ...[...] | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1200:9:1200:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1200:9:1200:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1203:9:1203:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1203:9:1203:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1209:9:1209:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1209:9:1209:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1214:9:1214:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1214:9:1214:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1218:9:1218:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1218:9:1218:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1223:9:1223:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1223:9:1223:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1228:9:1228:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1228:9:1228:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1232:9:1232:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1232:9:1232:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1236:9:1236:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1236:9:1236:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1241:9:1241:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1241:9:1241:9 | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1197:9:1197:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1197:9:1197:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1200:9:1200:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1200:9:1200:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1203:9:1203:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1203:9:1203:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1209:9:1209:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1209:9:1209:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1214:9:1214:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1214:9:1214:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1228:9:1228:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1228:9:1228:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1232:9:1232:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1232:9:1232:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1241:9:1241:9 | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1241:9:1241:9 | a [element 4] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1195:5:1195:5 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1195:5:1195:5 | a [element 2] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1195:5:1195:5 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1195:5:1195:5 | a [element 4] : | -| array_flow.rb:1197:5:1197:5 | b : | array_flow.rb:1198:10:1198:10 | b | -| array_flow.rb:1197:5:1197:5 | b : | array_flow.rb:1198:10:1198:10 | b | -| array_flow.rb:1197:9:1197:9 | a [element 4] : | array_flow.rb:1197:9:1197:17 | call to slice : | -| array_flow.rb:1197:9:1197:9 | a [element 4] : | array_flow.rb:1197:9:1197:17 | call to slice : | -| array_flow.rb:1197:9:1197:17 | call to slice : | array_flow.rb:1197:5:1197:5 | b : | -| array_flow.rb:1197:9:1197:17 | call to slice : | array_flow.rb:1197:5:1197:5 | b : | -| array_flow.rb:1200:5:1200:5 | b : | array_flow.rb:1201:10:1201:10 | b | -| array_flow.rb:1200:5:1200:5 | b : | array_flow.rb:1201:10:1201:10 | b | -| array_flow.rb:1200:9:1200:9 | a [element 2] : | array_flow.rb:1200:9:1200:19 | call to slice : | -| array_flow.rb:1200:9:1200:9 | a [element 2] : | array_flow.rb:1200:9:1200:19 | call to slice : | -| array_flow.rb:1200:9:1200:9 | a [element 4] : | array_flow.rb:1200:9:1200:19 | call to slice : | -| array_flow.rb:1200:9:1200:9 | a [element 4] : | array_flow.rb:1200:9:1200:19 | call to slice : | -| array_flow.rb:1200:9:1200:19 | call to slice : | array_flow.rb:1200:5:1200:5 | b : | -| array_flow.rb:1200:9:1200:19 | call to slice : | array_flow.rb:1200:5:1200:5 | b : | -| array_flow.rb:1203:5:1203:5 | b : | array_flow.rb:1205:10:1205:10 | b | -| array_flow.rb:1203:5:1203:5 | b : | array_flow.rb:1205:10:1205:10 | b | -| array_flow.rb:1203:5:1203:5 | b : | array_flow.rb:1207:10:1207:10 | b : | -| array_flow.rb:1203:5:1203:5 | b [element] : | array_flow.rb:1207:10:1207:10 | b [element] : | -| array_flow.rb:1203:5:1203:5 | b [element] : | array_flow.rb:1207:10:1207:10 | b [element] : | -| array_flow.rb:1203:9:1203:9 | a [element 2] : | array_flow.rb:1203:9:1203:17 | call to slice : | -| array_flow.rb:1203:9:1203:9 | a [element 2] : | array_flow.rb:1203:9:1203:17 | call to slice : | -| array_flow.rb:1203:9:1203:9 | a [element 2] : | array_flow.rb:1203:9:1203:17 | call to slice [element] : | -| array_flow.rb:1203:9:1203:9 | a [element 2] : | array_flow.rb:1203:9:1203:17 | call to slice [element] : | -| array_flow.rb:1203:9:1203:9 | a [element 4] : | array_flow.rb:1203:9:1203:17 | call to slice : | -| array_flow.rb:1203:9:1203:9 | a [element 4] : | array_flow.rb:1203:9:1203:17 | call to slice : | -| array_flow.rb:1203:9:1203:9 | a [element 4] : | array_flow.rb:1203:9:1203:17 | call to slice [element] : | -| array_flow.rb:1203:9:1203:9 | a [element 4] : | array_flow.rb:1203:9:1203:17 | call to slice [element] : | -| array_flow.rb:1203:9:1203:17 | call to slice : | array_flow.rb:1203:5:1203:5 | b : | -| array_flow.rb:1203:9:1203:17 | call to slice : | array_flow.rb:1203:5:1203:5 | b : | -| array_flow.rb:1203:9:1203:17 | call to slice [element] : | array_flow.rb:1203:5:1203:5 | b [element] : | -| array_flow.rb:1203:9:1203:17 | call to slice [element] : | array_flow.rb:1203:5:1203:5 | b [element] : | -| array_flow.rb:1207:10:1207:10 | b : | array_flow.rb:1207:10:1207:13 | ...[...] | -| array_flow.rb:1207:10:1207:10 | b [element] : | array_flow.rb:1207:10:1207:13 | ...[...] | -| array_flow.rb:1207:10:1207:10 | b [element] : | array_flow.rb:1207:10:1207:13 | ...[...] | -| array_flow.rb:1209:5:1209:5 | b [element 0] : | array_flow.rb:1210:10:1210:10 | b [element 0] : | -| array_flow.rb:1209:5:1209:5 | b [element 0] : | array_flow.rb:1210:10:1210:10 | b [element 0] : | -| array_flow.rb:1209:5:1209:5 | b [element 2] : | array_flow.rb:1212:10:1212:10 | b [element 2] : | -| array_flow.rb:1209:5:1209:5 | b [element 2] : | array_flow.rb:1212:10:1212:10 | b [element 2] : | -| array_flow.rb:1209:9:1209:9 | a [element 2] : | array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | -| array_flow.rb:1209:9:1209:9 | a [element 2] : | array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | -| array_flow.rb:1209:9:1209:9 | a [element 4] : | array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | -| array_flow.rb:1209:9:1209:9 | a [element 4] : | array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | array_flow.rb:1209:5:1209:5 | b [element 0] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | array_flow.rb:1209:5:1209:5 | b [element 0] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | array_flow.rb:1209:5:1209:5 | b [element 2] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | array_flow.rb:1209:5:1209:5 | b [element 2] : | -| array_flow.rb:1210:10:1210:10 | b [element 0] : | array_flow.rb:1210:10:1210:13 | ...[...] | -| array_flow.rb:1210:10:1210:10 | b [element 0] : | array_flow.rb:1210:10:1210:13 | ...[...] | -| array_flow.rb:1212:10:1212:10 | b [element 2] : | array_flow.rb:1212:10:1212:13 | ...[...] | -| array_flow.rb:1212:10:1212:10 | b [element 2] : | array_flow.rb:1212:10:1212:13 | ...[...] | -| array_flow.rb:1214:5:1214:5 | b [element] : | array_flow.rb:1215:10:1215:10 | b [element] : | -| array_flow.rb:1214:5:1214:5 | b [element] : | array_flow.rb:1215:10:1215:10 | b [element] : | -| array_flow.rb:1214:5:1214:5 | b [element] : | array_flow.rb:1216:10:1216:10 | b [element] : | -| array_flow.rb:1214:5:1214:5 | b [element] : | array_flow.rb:1216:10:1216:10 | b [element] : | -| array_flow.rb:1214:9:1214:9 | a [element 2] : | array_flow.rb:1214:9:1214:21 | call to slice [element] : | -| array_flow.rb:1214:9:1214:9 | a [element 2] : | array_flow.rb:1214:9:1214:21 | call to slice [element] : | -| array_flow.rb:1214:9:1214:9 | a [element 4] : | array_flow.rb:1214:9:1214:21 | call to slice [element] : | -| array_flow.rb:1214:9:1214:9 | a [element 4] : | array_flow.rb:1214:9:1214:21 | call to slice [element] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1214:5:1214:5 | b [element] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1214:5:1214:5 | b [element] : | -| array_flow.rb:1215:10:1215:10 | b [element] : | array_flow.rb:1215:10:1215:13 | ...[...] | -| array_flow.rb:1215:10:1215:10 | b [element] : | array_flow.rb:1215:10:1215:13 | ...[...] | -| array_flow.rb:1216:10:1216:10 | b [element] : | array_flow.rb:1216:10:1216:13 | ...[...] | -| array_flow.rb:1216:10:1216:10 | b [element] : | array_flow.rb:1216:10:1216:13 | ...[...] | -| array_flow.rb:1218:5:1218:5 | b [element 0] : | array_flow.rb:1219:10:1219:10 | b [element 0] : | -| array_flow.rb:1218:5:1218:5 | b [element 0] : | array_flow.rb:1219:10:1219:10 | b [element 0] : | -| array_flow.rb:1218:9:1218:9 | a [element 2] : | array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | -| array_flow.rb:1218:9:1218:9 | a [element 2] : | array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | -| array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | array_flow.rb:1218:5:1218:5 | b [element 0] : | -| array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | array_flow.rb:1218:5:1218:5 | b [element 0] : | -| array_flow.rb:1219:10:1219:10 | b [element 0] : | array_flow.rb:1219:10:1219:13 | ...[...] | -| array_flow.rb:1219:10:1219:10 | b [element 0] : | array_flow.rb:1219:10:1219:13 | ...[...] | -| array_flow.rb:1223:5:1223:5 | b [element 0] : | array_flow.rb:1224:10:1224:10 | b [element 0] : | -| array_flow.rb:1223:5:1223:5 | b [element 0] : | array_flow.rb:1224:10:1224:10 | b [element 0] : | -| array_flow.rb:1223:9:1223:9 | a [element 2] : | array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | -| array_flow.rb:1223:9:1223:9 | a [element 2] : | array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | -| array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | array_flow.rb:1223:5:1223:5 | b [element 0] : | -| array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | array_flow.rb:1223:5:1223:5 | b [element 0] : | -| array_flow.rb:1224:10:1224:10 | b [element 0] : | array_flow.rb:1224:10:1224:13 | ...[...] | -| array_flow.rb:1224:10:1224:10 | b [element 0] : | array_flow.rb:1224:10:1224:13 | ...[...] | -| array_flow.rb:1228:5:1228:5 | b [element] : | array_flow.rb:1229:10:1229:10 | b [element] : | -| array_flow.rb:1228:5:1228:5 | b [element] : | array_flow.rb:1229:10:1229:10 | b [element] : | -| array_flow.rb:1228:5:1228:5 | b [element] : | array_flow.rb:1230:10:1230:10 | b [element] : | -| array_flow.rb:1228:5:1228:5 | b [element] : | array_flow.rb:1230:10:1230:10 | b [element] : | -| array_flow.rb:1228:9:1228:9 | a [element 2] : | array_flow.rb:1228:9:1228:21 | call to slice [element] : | -| array_flow.rb:1228:9:1228:9 | a [element 2] : | array_flow.rb:1228:9:1228:21 | call to slice [element] : | -| array_flow.rb:1228:9:1228:9 | a [element 4] : | array_flow.rb:1228:9:1228:21 | call to slice [element] : | -| array_flow.rb:1228:9:1228:9 | a [element 4] : | array_flow.rb:1228:9:1228:21 | call to slice [element] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1228:5:1228:5 | b [element] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1228:5:1228:5 | b [element] : | -| array_flow.rb:1229:10:1229:10 | b [element] : | array_flow.rb:1229:10:1229:13 | ...[...] | -| array_flow.rb:1229:10:1229:10 | b [element] : | array_flow.rb:1229:10:1229:13 | ...[...] | -| array_flow.rb:1230:10:1230:10 | b [element] : | array_flow.rb:1230:10:1230:13 | ...[...] | -| array_flow.rb:1230:10:1230:10 | b [element] : | array_flow.rb:1230:10:1230:13 | ...[...] | -| array_flow.rb:1232:5:1232:5 | b [element] : | array_flow.rb:1233:10:1233:10 | b [element] : | -| array_flow.rb:1232:5:1232:5 | b [element] : | array_flow.rb:1233:10:1233:10 | b [element] : | -| array_flow.rb:1232:5:1232:5 | b [element] : | array_flow.rb:1234:10:1234:10 | b [element] : | -| array_flow.rb:1232:5:1232:5 | b [element] : | array_flow.rb:1234:10:1234:10 | b [element] : | -| array_flow.rb:1232:9:1232:9 | a [element 2] : | array_flow.rb:1232:9:1232:24 | call to slice [element] : | -| array_flow.rb:1232:9:1232:9 | a [element 2] : | array_flow.rb:1232:9:1232:24 | call to slice [element] : | -| array_flow.rb:1232:9:1232:9 | a [element 4] : | array_flow.rb:1232:9:1232:24 | call to slice [element] : | -| array_flow.rb:1232:9:1232:9 | a [element 4] : | array_flow.rb:1232:9:1232:24 | call to slice [element] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1232:5:1232:5 | b [element] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1232:5:1232:5 | b [element] : | -| array_flow.rb:1233:10:1233:10 | b [element] : | array_flow.rb:1233:10:1233:13 | ...[...] | -| array_flow.rb:1233:10:1233:10 | b [element] : | array_flow.rb:1233:10:1233:13 | ...[...] | -| array_flow.rb:1234:10:1234:10 | b [element] : | array_flow.rb:1234:10:1234:13 | ...[...] | -| array_flow.rb:1234:10:1234:10 | b [element] : | array_flow.rb:1234:10:1234:13 | ...[...] | -| array_flow.rb:1236:5:1236:5 | b [element 2] : | array_flow.rb:1239:10:1239:10 | b [element 2] : | -| array_flow.rb:1236:5:1236:5 | b [element 2] : | array_flow.rb:1239:10:1239:10 | b [element 2] : | -| array_flow.rb:1236:9:1236:9 | a [element 2] : | array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | -| array_flow.rb:1236:9:1236:9 | a [element 2] : | array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | -| array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | array_flow.rb:1236:5:1236:5 | b [element 2] : | -| array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | array_flow.rb:1236:5:1236:5 | b [element 2] : | -| array_flow.rb:1239:10:1239:10 | b [element 2] : | array_flow.rb:1239:10:1239:13 | ...[...] | -| array_flow.rb:1239:10:1239:10 | b [element 2] : | array_flow.rb:1239:10:1239:13 | ...[...] | -| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1242:10:1242:10 | b [element] : | -| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1242:10:1242:10 | b [element] : | -| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1243:10:1243:10 | b [element] : | -| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1243:10:1243:10 | b [element] : | -| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1244:10:1244:10 | b [element] : | -| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1244:10:1244:10 | b [element] : | -| array_flow.rb:1241:9:1241:9 | a [element 2] : | array_flow.rb:1241:9:1241:20 | call to slice [element] : | -| array_flow.rb:1241:9:1241:9 | a [element 2] : | array_flow.rb:1241:9:1241:20 | call to slice [element] : | -| array_flow.rb:1241:9:1241:9 | a [element 4] : | array_flow.rb:1241:9:1241:20 | call to slice [element] : | -| array_flow.rb:1241:9:1241:9 | a [element 4] : | array_flow.rb:1241:9:1241:20 | call to slice [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1241:5:1241:5 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1241:5:1241:5 | b [element] : | -| array_flow.rb:1242:10:1242:10 | b [element] : | array_flow.rb:1242:10:1242:13 | ...[...] | -| array_flow.rb:1242:10:1242:10 | b [element] : | array_flow.rb:1242:10:1242:13 | ...[...] | -| array_flow.rb:1243:10:1243:10 | b [element] : | array_flow.rb:1243:10:1243:13 | ...[...] | -| array_flow.rb:1243:10:1243:10 | b [element] : | array_flow.rb:1243:10:1243:13 | ...[...] | -| array_flow.rb:1244:10:1244:10 | b [element] : | array_flow.rb:1244:10:1244:13 | ...[...] | -| array_flow.rb:1244:10:1244:10 | b [element] : | array_flow.rb:1244:10:1244:13 | ...[...] | -| array_flow.rb:1248:5:1248:5 | a [element 2] : | array_flow.rb:1249:9:1249:9 | a [element 2] : | -| array_flow.rb:1248:5:1248:5 | a [element 2] : | array_flow.rb:1249:9:1249:9 | a [element 2] : | -| array_flow.rb:1248:5:1248:5 | a [element 4] : | array_flow.rb:1249:9:1249:9 | a [element 4] : | -| array_flow.rb:1248:5:1248:5 | a [element 4] : | array_flow.rb:1249:9:1249:9 | a [element 4] : | -| array_flow.rb:1248:16:1248:28 | call to source : | array_flow.rb:1248:5:1248:5 | a [element 2] : | -| array_flow.rb:1248:16:1248:28 | call to source : | array_flow.rb:1248:5:1248:5 | a [element 2] : | -| array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1248:5:1248:5 | a [element 4] : | -| array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1248:5:1248:5 | a [element 4] : | -| array_flow.rb:1249:5:1249:5 | b : | array_flow.rb:1250:10:1250:10 | b | -| array_flow.rb:1249:5:1249:5 | b : | array_flow.rb:1250:10:1250:10 | b | -| array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | array_flow.rb:1254:10:1254:10 | a [element 3] : | -| array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | array_flow.rb:1254:10:1254:10 | a [element 3] : | -| array_flow.rb:1249:9:1249:9 | a [element 2] : | array_flow.rb:1249:9:1249:19 | call to slice! : | -| array_flow.rb:1249:9:1249:9 | a [element 2] : | array_flow.rb:1249:9:1249:19 | call to slice! : | -| array_flow.rb:1249:9:1249:9 | a [element 4] : | array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | -| array_flow.rb:1249:9:1249:9 | a [element 4] : | array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | -| array_flow.rb:1249:9:1249:19 | call to slice! : | array_flow.rb:1249:5:1249:5 | b : | -| array_flow.rb:1249:9:1249:19 | call to slice! : | array_flow.rb:1249:5:1249:5 | b : | -| array_flow.rb:1254:10:1254:10 | a [element 3] : | array_flow.rb:1254:10:1254:13 | ...[...] | -| array_flow.rb:1254:10:1254:10 | a [element 3] : | array_flow.rb:1254:10:1254:13 | ...[...] | -| array_flow.rb:1256:5:1256:5 | a [element 2] : | array_flow.rb:1257:9:1257:9 | a [element 2] : | -| array_flow.rb:1256:5:1256:5 | a [element 2] : | array_flow.rb:1257:9:1257:9 | a [element 2] : | -| array_flow.rb:1256:5:1256:5 | a [element 4] : | array_flow.rb:1257:9:1257:9 | a [element 4] : | -| array_flow.rb:1256:5:1256:5 | a [element 4] : | array_flow.rb:1257:9:1257:9 | a [element 4] : | -| array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1256:5:1256:5 | a [element 2] : | -| array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1256:5:1256:5 | a [element 2] : | -| array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1256:5:1256:5 | a [element 4] : | -| array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1256:5:1256:5 | a [element 4] : | -| array_flow.rb:1257:5:1257:5 | b : | array_flow.rb:1263:10:1263:10 | b | -| array_flow.rb:1257:5:1257:5 | b : | array_flow.rb:1263:10:1263:10 | b | -| array_flow.rb:1257:5:1257:5 | b : | array_flow.rb:1265:10:1265:10 | b : | -| array_flow.rb:1257:5:1257:5 | b [element] : | array_flow.rb:1265:10:1265:10 | b [element] : | -| array_flow.rb:1257:5:1257:5 | b [element] : | array_flow.rb:1265:10:1265:10 | b [element] : | -| array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1258:10:1258:10 | a [element] : | -| array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1258:10:1258:10 | a [element] : | -| array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1259:10:1259:10 | a [element] : | -| array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1259:10:1259:10 | a [element] : | -| array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1260:10:1260:10 | a [element] : | -| array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1260:10:1260:10 | a [element] : | -| array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1261:10:1261:10 | a [element] : | -| array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1261:10:1261:10 | a [element] : | -| array_flow.rb:1257:9:1257:9 | a [element 2] : | array_flow.rb:1257:9:1257:9 | [post] a [element] : | -| array_flow.rb:1257:9:1257:9 | a [element 2] : | array_flow.rb:1257:9:1257:9 | [post] a [element] : | -| array_flow.rb:1257:9:1257:9 | a [element 2] : | array_flow.rb:1257:9:1257:19 | call to slice! : | -| array_flow.rb:1257:9:1257:9 | a [element 2] : | array_flow.rb:1257:9:1257:19 | call to slice! : | -| array_flow.rb:1257:9:1257:9 | a [element 2] : | array_flow.rb:1257:9:1257:19 | call to slice! [element] : | -| array_flow.rb:1257:9:1257:9 | a [element 2] : | array_flow.rb:1257:9:1257:19 | call to slice! [element] : | -| array_flow.rb:1257:9:1257:9 | a [element 4] : | array_flow.rb:1257:9:1257:9 | [post] a [element] : | -| array_flow.rb:1257:9:1257:9 | a [element 4] : | array_flow.rb:1257:9:1257:9 | [post] a [element] : | -| array_flow.rb:1257:9:1257:9 | a [element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! : | -| array_flow.rb:1257:9:1257:9 | a [element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! : | -| array_flow.rb:1257:9:1257:9 | a [element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! [element] : | -| array_flow.rb:1257:9:1257:9 | a [element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! [element] : | -| array_flow.rb:1257:9:1257:19 | call to slice! : | array_flow.rb:1257:5:1257:5 | b : | -| array_flow.rb:1257:9:1257:19 | call to slice! : | array_flow.rb:1257:5:1257:5 | b : | -| array_flow.rb:1257:9:1257:19 | call to slice! [element] : | array_flow.rb:1257:5:1257:5 | b [element] : | -| array_flow.rb:1257:9:1257:19 | call to slice! [element] : | array_flow.rb:1257:5:1257:5 | b [element] : | -| array_flow.rb:1258:10:1258:10 | a [element] : | array_flow.rb:1258:10:1258:13 | ...[...] | -| array_flow.rb:1258:10:1258:10 | a [element] : | array_flow.rb:1258:10:1258:13 | ...[...] | -| array_flow.rb:1259:10:1259:10 | a [element] : | array_flow.rb:1259:10:1259:13 | ...[...] | -| array_flow.rb:1259:10:1259:10 | a [element] : | array_flow.rb:1259:10:1259:13 | ...[...] | -| array_flow.rb:1260:10:1260:10 | a [element] : | array_flow.rb:1260:10:1260:13 | ...[...] | -| array_flow.rb:1260:10:1260:10 | a [element] : | array_flow.rb:1260:10:1260:13 | ...[...] | -| array_flow.rb:1261:10:1261:10 | a [element] : | array_flow.rb:1261:10:1261:13 | ...[...] | -| array_flow.rb:1261:10:1261:10 | a [element] : | array_flow.rb:1261:10:1261:13 | ...[...] | -| array_flow.rb:1265:10:1265:10 | b : | array_flow.rb:1265:10:1265:13 | ...[...] | -| array_flow.rb:1265:10:1265:10 | b [element] : | array_flow.rb:1265:10:1265:13 | ...[...] | -| array_flow.rb:1265:10:1265:10 | b [element] : | array_flow.rb:1265:10:1265:13 | ...[...] | -| array_flow.rb:1267:5:1267:5 | a [element 2] : | array_flow.rb:1268:9:1268:9 | a [element 2] : | -| array_flow.rb:1267:5:1267:5 | a [element 2] : | array_flow.rb:1268:9:1268:9 | a [element 2] : | -| array_flow.rb:1267:5:1267:5 | a [element 4] : | array_flow.rb:1268:9:1268:9 | a [element 4] : | -| array_flow.rb:1267:5:1267:5 | a [element 4] : | array_flow.rb:1268:9:1268:9 | a [element 4] : | -| array_flow.rb:1267:16:1267:28 | call to source : | array_flow.rb:1267:5:1267:5 | a [element 2] : | -| array_flow.rb:1267:16:1267:28 | call to source : | array_flow.rb:1267:5:1267:5 | a [element 2] : | -| array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1267:5:1267:5 | a [element 4] : | -| array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1267:5:1267:5 | a [element 4] : | -| array_flow.rb:1268:5:1268:5 | b [element 0] : | array_flow.rb:1269:10:1269:10 | b [element 0] : | -| array_flow.rb:1268:5:1268:5 | b [element 0] : | array_flow.rb:1269:10:1269:10 | b [element 0] : | -| array_flow.rb:1268:5:1268:5 | b [element 2] : | array_flow.rb:1271:10:1271:10 | b [element 2] : | -| array_flow.rb:1268:5:1268:5 | b [element 2] : | array_flow.rb:1271:10:1271:10 | b [element 2] : | -| array_flow.rb:1268:9:1268:9 | a [element 2] : | array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | -| array_flow.rb:1268:9:1268:9 | a [element 2] : | array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | -| array_flow.rb:1268:9:1268:9 | a [element 4] : | array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | -| array_flow.rb:1268:9:1268:9 | a [element 4] : | array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | array_flow.rb:1268:5:1268:5 | b [element 0] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | array_flow.rb:1268:5:1268:5 | b [element 0] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | array_flow.rb:1268:5:1268:5 | b [element 2] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | array_flow.rb:1268:5:1268:5 | b [element 2] : | -| array_flow.rb:1269:10:1269:10 | b [element 0] : | array_flow.rb:1269:10:1269:13 | ...[...] | -| array_flow.rb:1269:10:1269:10 | b [element 0] : | array_flow.rb:1269:10:1269:13 | ...[...] | -| array_flow.rb:1271:10:1271:10 | b [element 2] : | array_flow.rb:1271:10:1271:13 | ...[...] | -| array_flow.rb:1271:10:1271:10 | b [element 2] : | array_flow.rb:1271:10:1271:13 | ...[...] | -| array_flow.rb:1278:5:1278:5 | a [element 2] : | array_flow.rb:1279:9:1279:9 | a [element 2] : | -| array_flow.rb:1278:5:1278:5 | a [element 2] : | array_flow.rb:1279:9:1279:9 | a [element 2] : | -| array_flow.rb:1278:5:1278:5 | a [element 4] : | array_flow.rb:1279:9:1279:9 | a [element 4] : | -| array_flow.rb:1278:5:1278:5 | a [element 4] : | array_flow.rb:1279:9:1279:9 | a [element 4] : | -| array_flow.rb:1278:16:1278:28 | call to source : | array_flow.rb:1278:5:1278:5 | a [element 2] : | -| array_flow.rb:1278:16:1278:28 | call to source : | array_flow.rb:1278:5:1278:5 | a [element 2] : | -| array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1278:5:1278:5 | a [element 4] : | -| array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1278:5:1278:5 | a [element 4] : | -| array_flow.rb:1279:5:1279:5 | b [element 0] : | array_flow.rb:1280:10:1280:10 | b [element 0] : | -| array_flow.rb:1279:5:1279:5 | b [element 0] : | array_flow.rb:1280:10:1280:10 | b [element 0] : | -| array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | array_flow.rb:1285:10:1285:10 | a [element 2] : | -| array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | array_flow.rb:1285:10:1285:10 | a [element 2] : | -| array_flow.rb:1279:9:1279:9 | a [element 2] : | array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | -| array_flow.rb:1279:9:1279:9 | a [element 2] : | array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | -| array_flow.rb:1279:9:1279:9 | a [element 4] : | array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | -| array_flow.rb:1279:9:1279:9 | a [element 4] : | array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | array_flow.rb:1279:5:1279:5 | b [element 0] : | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | array_flow.rb:1279:5:1279:5 | b [element 0] : | -| array_flow.rb:1280:10:1280:10 | b [element 0] : | array_flow.rb:1280:10:1280:13 | ...[...] | -| array_flow.rb:1280:10:1280:10 | b [element 0] : | array_flow.rb:1280:10:1280:13 | ...[...] | -| array_flow.rb:1285:10:1285:10 | a [element 2] : | array_flow.rb:1285:10:1285:13 | ...[...] | -| array_flow.rb:1285:10:1285:10 | a [element 2] : | array_flow.rb:1285:10:1285:13 | ...[...] | -| array_flow.rb:1289:5:1289:5 | a [element 2] : | array_flow.rb:1290:9:1290:9 | a [element 2] : | -| array_flow.rb:1289:5:1289:5 | a [element 2] : | array_flow.rb:1290:9:1290:9 | a [element 2] : | -| array_flow.rb:1289:5:1289:5 | a [element 4] : | array_flow.rb:1290:9:1290:9 | a [element 4] : | -| array_flow.rb:1289:5:1289:5 | a [element 4] : | array_flow.rb:1290:9:1290:9 | a [element 4] : | -| array_flow.rb:1289:16:1289:28 | call to source : | array_flow.rb:1289:5:1289:5 | a [element 2] : | -| array_flow.rb:1289:16:1289:28 | call to source : | array_flow.rb:1289:5:1289:5 | a [element 2] : | -| array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1289:5:1289:5 | a [element 4] : | -| array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1289:5:1289:5 | a [element 4] : | -| array_flow.rb:1290:5:1290:5 | b [element 0] : | array_flow.rb:1291:10:1291:10 | b [element 0] : | -| array_flow.rb:1290:5:1290:5 | b [element 0] : | array_flow.rb:1291:10:1291:10 | b [element 0] : | -| array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | array_flow.rb:1296:10:1296:10 | a [element 2] : | -| array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | array_flow.rb:1296:10:1296:10 | a [element 2] : | -| array_flow.rb:1290:9:1290:9 | a [element 2] : | array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | -| array_flow.rb:1290:9:1290:9 | a [element 2] : | array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | -| array_flow.rb:1290:9:1290:9 | a [element 4] : | array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | -| array_flow.rb:1290:9:1290:9 | a [element 4] : | array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | -| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | array_flow.rb:1290:5:1290:5 | b [element 0] : | -| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | array_flow.rb:1290:5:1290:5 | b [element 0] : | -| array_flow.rb:1291:10:1291:10 | b [element 0] : | array_flow.rb:1291:10:1291:13 | ...[...] | -| array_flow.rb:1291:10:1291:10 | b [element 0] : | array_flow.rb:1291:10:1291:13 | ...[...] | -| array_flow.rb:1296:10:1296:10 | a [element 2] : | array_flow.rb:1296:10:1296:13 | ...[...] | -| array_flow.rb:1296:10:1296:10 | a [element 2] : | array_flow.rb:1296:10:1296:13 | ...[...] | -| array_flow.rb:1300:5:1300:5 | a [element 2] : | array_flow.rb:1301:9:1301:9 | a [element 2] : | -| array_flow.rb:1300:5:1300:5 | a [element 2] : | array_flow.rb:1301:9:1301:9 | a [element 2] : | -| array_flow.rb:1300:5:1300:5 | a [element 4] : | array_flow.rb:1301:9:1301:9 | a [element 4] : | -| array_flow.rb:1300:5:1300:5 | a [element 4] : | array_flow.rb:1301:9:1301:9 | a [element 4] : | -| array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1300:5:1300:5 | a [element 2] : | -| array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1300:5:1300:5 | a [element 2] : | -| array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1300:5:1300:5 | a [element 4] : | -| array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1300:5:1300:5 | a [element 4] : | -| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1302:10:1302:10 | b [element] : | -| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1302:10:1302:10 | b [element] : | -| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1303:10:1303:10 | b [element] : | -| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1303:10:1303:10 | b [element] : | -| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1304:10:1304:10 | b [element] : | -| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1304:10:1304:10 | b [element] : | -| array_flow.rb:1301:9:1301:9 | [post] a [element] : | array_flow.rb:1305:10:1305:10 | a [element] : | -| array_flow.rb:1301:9:1301:9 | [post] a [element] : | array_flow.rb:1305:10:1305:10 | a [element] : | -| array_flow.rb:1301:9:1301:9 | [post] a [element] : | array_flow.rb:1306:10:1306:10 | a [element] : | -| array_flow.rb:1301:9:1301:9 | [post] a [element] : | array_flow.rb:1306:10:1306:10 | a [element] : | -| array_flow.rb:1301:9:1301:9 | [post] a [element] : | array_flow.rb:1307:10:1307:10 | a [element] : | -| array_flow.rb:1301:9:1301:9 | [post] a [element] : | array_flow.rb:1307:10:1307:10 | a [element] : | -| array_flow.rb:1301:9:1301:9 | a [element 2] : | array_flow.rb:1301:9:1301:9 | [post] a [element] : | -| array_flow.rb:1301:9:1301:9 | a [element 2] : | array_flow.rb:1301:9:1301:9 | [post] a [element] : | -| array_flow.rb:1301:9:1301:9 | a [element 2] : | array_flow.rb:1301:9:1301:22 | call to slice! [element] : | -| array_flow.rb:1301:9:1301:9 | a [element 2] : | array_flow.rb:1301:9:1301:22 | call to slice! [element] : | -| array_flow.rb:1301:9:1301:9 | a [element 4] : | array_flow.rb:1301:9:1301:9 | [post] a [element] : | -| array_flow.rb:1301:9:1301:9 | a [element 4] : | array_flow.rb:1301:9:1301:9 | [post] a [element] : | -| array_flow.rb:1301:9:1301:9 | a [element 4] : | array_flow.rb:1301:9:1301:22 | call to slice! [element] : | -| array_flow.rb:1301:9:1301:9 | a [element 4] : | array_flow.rb:1301:9:1301:22 | call to slice! [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1301:5:1301:5 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1301:5:1301:5 | b [element] : | -| array_flow.rb:1302:10:1302:10 | b [element] : | array_flow.rb:1302:10:1302:13 | ...[...] | -| array_flow.rb:1302:10:1302:10 | b [element] : | array_flow.rb:1302:10:1302:13 | ...[...] | -| array_flow.rb:1303:10:1303:10 | b [element] : | array_flow.rb:1303:10:1303:13 | ...[...] | -| array_flow.rb:1303:10:1303:10 | b [element] : | array_flow.rb:1303:10:1303:13 | ...[...] | -| array_flow.rb:1304:10:1304:10 | b [element] : | array_flow.rb:1304:10:1304:13 | ...[...] | -| array_flow.rb:1304:10:1304:10 | b [element] : | array_flow.rb:1304:10:1304:13 | ...[...] | -| array_flow.rb:1305:10:1305:10 | a [element] : | array_flow.rb:1305:10:1305:13 | ...[...] | -| array_flow.rb:1305:10:1305:10 | a [element] : | array_flow.rb:1305:10:1305:13 | ...[...] | -| array_flow.rb:1306:10:1306:10 | a [element] : | array_flow.rb:1306:10:1306:13 | ...[...] | -| array_flow.rb:1306:10:1306:10 | a [element] : | array_flow.rb:1306:10:1306:13 | ...[...] | -| array_flow.rb:1307:10:1307:10 | a [element] : | array_flow.rb:1307:10:1307:13 | ...[...] | -| array_flow.rb:1307:10:1307:10 | a [element] : | array_flow.rb:1307:10:1307:13 | ...[...] | -| array_flow.rb:1309:5:1309:5 | a [element 2] : | array_flow.rb:1310:9:1310:9 | a [element 2] : | -| array_flow.rb:1309:5:1309:5 | a [element 2] : | array_flow.rb:1310:9:1310:9 | a [element 2] : | -| array_flow.rb:1309:5:1309:5 | a [element 4] : | array_flow.rb:1310:9:1310:9 | a [element 4] : | -| array_flow.rb:1309:5:1309:5 | a [element 4] : | array_flow.rb:1310:9:1310:9 | a [element 4] : | -| array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1309:5:1309:5 | a [element 2] : | -| array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1309:5:1309:5 | a [element 2] : | -| array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1309:5:1309:5 | a [element 4] : | -| array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1309:5:1309:5 | a [element 4] : | -| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1311:10:1311:10 | b [element] : | -| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1311:10:1311:10 | b [element] : | -| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1312:10:1312:10 | b [element] : | -| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1312:10:1312:10 | b [element] : | -| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1313:10:1313:10 | b [element] : | -| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1313:10:1313:10 | b [element] : | -| array_flow.rb:1310:9:1310:9 | [post] a [element] : | array_flow.rb:1314:10:1314:10 | a [element] : | -| array_flow.rb:1310:9:1310:9 | [post] a [element] : | array_flow.rb:1314:10:1314:10 | a [element] : | -| array_flow.rb:1310:9:1310:9 | [post] a [element] : | array_flow.rb:1315:10:1315:10 | a [element] : | -| array_flow.rb:1310:9:1310:9 | [post] a [element] : | array_flow.rb:1315:10:1315:10 | a [element] : | -| array_flow.rb:1310:9:1310:9 | [post] a [element] : | array_flow.rb:1316:10:1316:10 | a [element] : | -| array_flow.rb:1310:9:1310:9 | [post] a [element] : | array_flow.rb:1316:10:1316:10 | a [element] : | -| array_flow.rb:1310:9:1310:9 | a [element 2] : | array_flow.rb:1310:9:1310:9 | [post] a [element] : | -| array_flow.rb:1310:9:1310:9 | a [element 2] : | array_flow.rb:1310:9:1310:9 | [post] a [element] : | -| array_flow.rb:1310:9:1310:9 | a [element 2] : | array_flow.rb:1310:9:1310:22 | call to slice! [element] : | -| array_flow.rb:1310:9:1310:9 | a [element 2] : | array_flow.rb:1310:9:1310:22 | call to slice! [element] : | -| array_flow.rb:1310:9:1310:9 | a [element 4] : | array_flow.rb:1310:9:1310:9 | [post] a [element] : | -| array_flow.rb:1310:9:1310:9 | a [element 4] : | array_flow.rb:1310:9:1310:9 | [post] a [element] : | -| array_flow.rb:1310:9:1310:9 | a [element 4] : | array_flow.rb:1310:9:1310:22 | call to slice! [element] : | -| array_flow.rb:1310:9:1310:9 | a [element 4] : | array_flow.rb:1310:9:1310:22 | call to slice! [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1310:5:1310:5 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1310:5:1310:5 | b [element] : | -| array_flow.rb:1311:10:1311:10 | b [element] : | array_flow.rb:1311:10:1311:13 | ...[...] | -| array_flow.rb:1311:10:1311:10 | b [element] : | array_flow.rb:1311:10:1311:13 | ...[...] | -| array_flow.rb:1312:10:1312:10 | b [element] : | array_flow.rb:1312:10:1312:13 | ...[...] | -| array_flow.rb:1312:10:1312:10 | b [element] : | array_flow.rb:1312:10:1312:13 | ...[...] | -| array_flow.rb:1313:10:1313:10 | b [element] : | array_flow.rb:1313:10:1313:13 | ...[...] | -| array_flow.rb:1313:10:1313:10 | b [element] : | array_flow.rb:1313:10:1313:13 | ...[...] | -| array_flow.rb:1314:10:1314:10 | a [element] : | array_flow.rb:1314:10:1314:13 | ...[...] | -| array_flow.rb:1314:10:1314:10 | a [element] : | array_flow.rb:1314:10:1314:13 | ...[...] | -| array_flow.rb:1315:10:1315:10 | a [element] : | array_flow.rb:1315:10:1315:13 | ...[...] | -| array_flow.rb:1315:10:1315:10 | a [element] : | array_flow.rb:1315:10:1315:13 | ...[...] | -| array_flow.rb:1316:10:1316:10 | a [element] : | array_flow.rb:1316:10:1316:13 | ...[...] | -| array_flow.rb:1316:10:1316:10 | a [element] : | array_flow.rb:1316:10:1316:13 | ...[...] | -| array_flow.rb:1318:5:1318:5 | a [element 2] : | array_flow.rb:1319:9:1319:9 | a [element 2] : | -| array_flow.rb:1318:5:1318:5 | a [element 2] : | array_flow.rb:1319:9:1319:9 | a [element 2] : | -| array_flow.rb:1318:5:1318:5 | a [element 4] : | array_flow.rb:1319:9:1319:9 | a [element 4] : | -| array_flow.rb:1318:5:1318:5 | a [element 4] : | array_flow.rb:1319:9:1319:9 | a [element 4] : | -| array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1318:5:1318:5 | a [element 2] : | -| array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1318:5:1318:5 | a [element 2] : | -| array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1318:5:1318:5 | a [element 4] : | -| array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1318:5:1318:5 | a [element 4] : | -| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1320:10:1320:10 | b [element] : | -| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1320:10:1320:10 | b [element] : | -| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1321:10:1321:10 | b [element] : | -| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1321:10:1321:10 | b [element] : | -| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1322:10:1322:10 | b [element] : | -| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1322:10:1322:10 | b [element] : | -| array_flow.rb:1319:9:1319:9 | [post] a [element] : | array_flow.rb:1323:10:1323:10 | a [element] : | -| array_flow.rb:1319:9:1319:9 | [post] a [element] : | array_flow.rb:1323:10:1323:10 | a [element] : | -| array_flow.rb:1319:9:1319:9 | [post] a [element] : | array_flow.rb:1324:10:1324:10 | a [element] : | -| array_flow.rb:1319:9:1319:9 | [post] a [element] : | array_flow.rb:1324:10:1324:10 | a [element] : | -| array_flow.rb:1319:9:1319:9 | [post] a [element] : | array_flow.rb:1325:10:1325:10 | a [element] : | -| array_flow.rb:1319:9:1319:9 | [post] a [element] : | array_flow.rb:1325:10:1325:10 | a [element] : | -| array_flow.rb:1319:9:1319:9 | a [element 2] : | array_flow.rb:1319:9:1319:9 | [post] a [element] : | -| array_flow.rb:1319:9:1319:9 | a [element 2] : | array_flow.rb:1319:9:1319:9 | [post] a [element] : | -| array_flow.rb:1319:9:1319:9 | a [element 2] : | array_flow.rb:1319:9:1319:25 | call to slice! [element] : | -| array_flow.rb:1319:9:1319:9 | a [element 2] : | array_flow.rb:1319:9:1319:25 | call to slice! [element] : | -| array_flow.rb:1319:9:1319:9 | a [element 4] : | array_flow.rb:1319:9:1319:9 | [post] a [element] : | -| array_flow.rb:1319:9:1319:9 | a [element 4] : | array_flow.rb:1319:9:1319:9 | [post] a [element] : | -| array_flow.rb:1319:9:1319:9 | a [element 4] : | array_flow.rb:1319:9:1319:25 | call to slice! [element] : | -| array_flow.rb:1319:9:1319:9 | a [element 4] : | array_flow.rb:1319:9:1319:25 | call to slice! [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1319:5:1319:5 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1319:5:1319:5 | b [element] : | -| array_flow.rb:1320:10:1320:10 | b [element] : | array_flow.rb:1320:10:1320:13 | ...[...] | -| array_flow.rb:1320:10:1320:10 | b [element] : | array_flow.rb:1320:10:1320:13 | ...[...] | -| array_flow.rb:1321:10:1321:10 | b [element] : | array_flow.rb:1321:10:1321:13 | ...[...] | -| array_flow.rb:1321:10:1321:10 | b [element] : | array_flow.rb:1321:10:1321:13 | ...[...] | -| array_flow.rb:1322:10:1322:10 | b [element] : | array_flow.rb:1322:10:1322:13 | ...[...] | -| array_flow.rb:1322:10:1322:10 | b [element] : | array_flow.rb:1322:10:1322:13 | ...[...] | -| array_flow.rb:1323:10:1323:10 | a [element] : | array_flow.rb:1323:10:1323:13 | ...[...] | -| array_flow.rb:1323:10:1323:10 | a [element] : | array_flow.rb:1323:10:1323:13 | ...[...] | -| array_flow.rb:1324:10:1324:10 | a [element] : | array_flow.rb:1324:10:1324:13 | ...[...] | -| array_flow.rb:1324:10:1324:10 | a [element] : | array_flow.rb:1324:10:1324:13 | ...[...] | -| array_flow.rb:1325:10:1325:10 | a [element] : | array_flow.rb:1325:10:1325:13 | ...[...] | -| array_flow.rb:1325:10:1325:10 | a [element] : | array_flow.rb:1325:10:1325:13 | ...[...] | -| array_flow.rb:1327:5:1327:5 | a [element 2] : | array_flow.rb:1328:9:1328:9 | a [element 2] : | -| array_flow.rb:1327:5:1327:5 | a [element 2] : | array_flow.rb:1328:9:1328:9 | a [element 2] : | -| array_flow.rb:1327:5:1327:5 | a [element 4] : | array_flow.rb:1328:9:1328:9 | a [element 4] : | -| array_flow.rb:1327:5:1327:5 | a [element 4] : | array_flow.rb:1328:9:1328:9 | a [element 4] : | -| array_flow.rb:1327:16:1327:28 | call to source : | array_flow.rb:1327:5:1327:5 | a [element 2] : | -| array_flow.rb:1327:16:1327:28 | call to source : | array_flow.rb:1327:5:1327:5 | a [element 2] : | -| array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1327:5:1327:5 | a [element 4] : | -| array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1327:5:1327:5 | a [element 4] : | -| array_flow.rb:1328:5:1328:5 | b [element 2] : | array_flow.rb:1331:10:1331:10 | b [element 2] : | -| array_flow.rb:1328:5:1328:5 | b [element 2] : | array_flow.rb:1331:10:1331:10 | b [element 2] : | -| array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | array_flow.rb:1333:10:1333:10 | a [element 1] : | -| array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | array_flow.rb:1333:10:1333:10 | a [element 1] : | -| array_flow.rb:1328:9:1328:9 | a [element 2] : | array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | -| array_flow.rb:1328:9:1328:9 | a [element 2] : | array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | -| array_flow.rb:1328:9:1328:9 | a [element 4] : | array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | -| array_flow.rb:1328:9:1328:9 | a [element 4] : | array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | -| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | array_flow.rb:1328:5:1328:5 | b [element 2] : | -| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | array_flow.rb:1328:5:1328:5 | b [element 2] : | -| array_flow.rb:1331:10:1331:10 | b [element 2] : | array_flow.rb:1331:10:1331:13 | ...[...] | -| array_flow.rb:1331:10:1331:10 | b [element 2] : | array_flow.rb:1331:10:1331:13 | ...[...] | -| array_flow.rb:1333:10:1333:10 | a [element 1] : | array_flow.rb:1333:10:1333:13 | ...[...] | -| array_flow.rb:1333:10:1333:10 | a [element 1] : | array_flow.rb:1333:10:1333:13 | ...[...] | -| array_flow.rb:1336:5:1336:5 | a [element 2] : | array_flow.rb:1337:9:1337:9 | a [element 2] : | -| array_flow.rb:1336:5:1336:5 | a [element 2] : | array_flow.rb:1337:9:1337:9 | a [element 2] : | -| array_flow.rb:1336:5:1336:5 | a [element 4] : | array_flow.rb:1337:9:1337:9 | a [element 4] : | -| array_flow.rb:1336:5:1336:5 | a [element 4] : | array_flow.rb:1337:9:1337:9 | a [element 4] : | -| array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1336:5:1336:5 | a [element 2] : | -| array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1336:5:1336:5 | a [element 2] : | -| array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1336:5:1336:5 | a [element 4] : | -| array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1336:5:1336:5 | a [element 4] : | -| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1338:10:1338:10 | b [element] : | -| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1338:10:1338:10 | b [element] : | -| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1339:10:1339:10 | b [element] : | -| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1339:10:1339:10 | b [element] : | -| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1340:10:1340:10 | b [element] : | -| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1340:10:1340:10 | b [element] : | -| array_flow.rb:1337:9:1337:9 | [post] a [element] : | array_flow.rb:1341:10:1341:10 | a [element] : | -| array_flow.rb:1337:9:1337:9 | [post] a [element] : | array_flow.rb:1341:10:1341:10 | a [element] : | -| array_flow.rb:1337:9:1337:9 | [post] a [element] : | array_flow.rb:1342:10:1342:10 | a [element] : | -| array_flow.rb:1337:9:1337:9 | [post] a [element] : | array_flow.rb:1342:10:1342:10 | a [element] : | -| array_flow.rb:1337:9:1337:9 | [post] a [element] : | array_flow.rb:1343:10:1343:10 | a [element] : | -| array_flow.rb:1337:9:1337:9 | [post] a [element] : | array_flow.rb:1343:10:1343:10 | a [element] : | -| array_flow.rb:1337:9:1337:9 | a [element 2] : | array_flow.rb:1337:9:1337:9 | [post] a [element] : | -| array_flow.rb:1337:9:1337:9 | a [element 2] : | array_flow.rb:1337:9:1337:9 | [post] a [element] : | -| array_flow.rb:1337:9:1337:9 | a [element 2] : | array_flow.rb:1337:9:1337:21 | call to slice! [element] : | -| array_flow.rb:1337:9:1337:9 | a [element 2] : | array_flow.rb:1337:9:1337:21 | call to slice! [element] : | -| array_flow.rb:1337:9:1337:9 | a [element 4] : | array_flow.rb:1337:9:1337:9 | [post] a [element] : | -| array_flow.rb:1337:9:1337:9 | a [element 4] : | array_flow.rb:1337:9:1337:9 | [post] a [element] : | -| array_flow.rb:1337:9:1337:9 | a [element 4] : | array_flow.rb:1337:9:1337:21 | call to slice! [element] : | -| array_flow.rb:1337:9:1337:9 | a [element 4] : | array_flow.rb:1337:9:1337:21 | call to slice! [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1337:5:1337:5 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1337:5:1337:5 | b [element] : | -| array_flow.rb:1338:10:1338:10 | b [element] : | array_flow.rb:1338:10:1338:13 | ...[...] | -| array_flow.rb:1338:10:1338:10 | b [element] : | array_flow.rb:1338:10:1338:13 | ...[...] | -| array_flow.rb:1339:10:1339:10 | b [element] : | array_flow.rb:1339:10:1339:13 | ...[...] | -| array_flow.rb:1339:10:1339:10 | b [element] : | array_flow.rb:1339:10:1339:13 | ...[...] | -| array_flow.rb:1340:10:1340:10 | b [element] : | array_flow.rb:1340:10:1340:13 | ...[...] | -| array_flow.rb:1340:10:1340:10 | b [element] : | array_flow.rb:1340:10:1340:13 | ...[...] | -| array_flow.rb:1341:10:1341:10 | a [element] : | array_flow.rb:1341:10:1341:13 | ...[...] | -| array_flow.rb:1341:10:1341:10 | a [element] : | array_flow.rb:1341:10:1341:13 | ...[...] | -| array_flow.rb:1342:10:1342:10 | a [element] : | array_flow.rb:1342:10:1342:13 | ...[...] | -| array_flow.rb:1342:10:1342:10 | a [element] : | array_flow.rb:1342:10:1342:13 | ...[...] | -| array_flow.rb:1343:10:1343:10 | a [element] : | array_flow.rb:1343:10:1343:13 | ...[...] | -| array_flow.rb:1343:10:1343:10 | a [element] : | array_flow.rb:1343:10:1343:13 | ...[...] | -| array_flow.rb:1347:5:1347:5 | a [element 2] : | array_flow.rb:1348:9:1348:9 | a [element 2] : | -| array_flow.rb:1347:5:1347:5 | a [element 2] : | array_flow.rb:1348:9:1348:9 | a [element 2] : | -| array_flow.rb:1347:16:1347:26 | call to source : | array_flow.rb:1347:5:1347:5 | a [element 2] : | -| array_flow.rb:1347:16:1347:26 | call to source : | array_flow.rb:1347:5:1347:5 | a [element 2] : | -| array_flow.rb:1348:9:1348:9 | a [element 2] : | array_flow.rb:1348:27:1348:27 | x : | -| array_flow.rb:1348:9:1348:9 | a [element 2] : | array_flow.rb:1348:27:1348:27 | x : | -| array_flow.rb:1348:27:1348:27 | x : | array_flow.rb:1349:14:1349:14 | x | -| array_flow.rb:1348:27:1348:27 | x : | array_flow.rb:1349:14:1349:14 | x | -| array_flow.rb:1355:5:1355:5 | a [element 2] : | array_flow.rb:1356:9:1356:9 | a [element 2] : | -| array_flow.rb:1355:5:1355:5 | a [element 2] : | array_flow.rb:1356:9:1356:9 | a [element 2] : | -| array_flow.rb:1355:16:1355:26 | call to source : | array_flow.rb:1355:5:1355:5 | a [element 2] : | -| array_flow.rb:1355:16:1355:26 | call to source : | array_flow.rb:1355:5:1355:5 | a [element 2] : | -| array_flow.rb:1356:9:1356:9 | a [element 2] : | array_flow.rb:1356:28:1356:28 | x : | -| array_flow.rb:1356:9:1356:9 | a [element 2] : | array_flow.rb:1356:28:1356:28 | x : | -| array_flow.rb:1356:28:1356:28 | x : | array_flow.rb:1357:14:1357:14 | x | -| array_flow.rb:1356:28:1356:28 | x : | array_flow.rb:1357:14:1357:14 | x | -| array_flow.rb:1363:5:1363:5 | a [element 2] : | array_flow.rb:1364:9:1364:9 | a [element 2] : | -| array_flow.rb:1363:5:1363:5 | a [element 2] : | array_flow.rb:1364:9:1364:9 | a [element 2] : | -| array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1363:5:1363:5 | a [element 2] : | -| array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1363:5:1363:5 | a [element 2] : | -| array_flow.rb:1364:9:1364:9 | a [element 2] : | array_flow.rb:1364:26:1364:26 | x : | -| array_flow.rb:1364:9:1364:9 | a [element 2] : | array_flow.rb:1364:26:1364:26 | x : | -| array_flow.rb:1364:9:1364:9 | a [element 2] : | array_flow.rb:1364:29:1364:29 | y : | -| array_flow.rb:1364:9:1364:9 | a [element 2] : | array_flow.rb:1364:29:1364:29 | y : | -| array_flow.rb:1364:26:1364:26 | x : | array_flow.rb:1365:14:1365:14 | x | -| array_flow.rb:1364:26:1364:26 | x : | array_flow.rb:1365:14:1365:14 | x | -| array_flow.rb:1364:29:1364:29 | y : | array_flow.rb:1366:14:1366:14 | y | -| array_flow.rb:1364:29:1364:29 | y : | array_flow.rb:1366:14:1366:14 | y | -| array_flow.rb:1371:5:1371:5 | a [element 2] : | array_flow.rb:1372:9:1372:9 | a [element 2] : | -| array_flow.rb:1371:5:1371:5 | a [element 2] : | array_flow.rb:1372:9:1372:9 | a [element 2] : | -| array_flow.rb:1371:5:1371:5 | a [element 2] : | array_flow.rb:1375:9:1375:9 | a [element 2] : | -| array_flow.rb:1371:5:1371:5 | a [element 2] : | array_flow.rb:1375:9:1375:9 | a [element 2] : | -| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1371:5:1371:5 | a [element 2] : | -| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1371:5:1371:5 | a [element 2] : | -| array_flow.rb:1372:5:1372:5 | b [element] : | array_flow.rb:1373:10:1373:10 | b [element] : | -| array_flow.rb:1372:5:1372:5 | b [element] : | array_flow.rb:1373:10:1373:10 | b [element] : | -| array_flow.rb:1372:5:1372:5 | b [element] : | array_flow.rb:1374:10:1374:10 | b [element] : | -| array_flow.rb:1372:5:1372:5 | b [element] : | array_flow.rb:1374:10:1374:10 | b [element] : | -| array_flow.rb:1372:9:1372:9 | a [element 2] : | array_flow.rb:1372:9:1372:14 | call to sort [element] : | -| array_flow.rb:1372:9:1372:9 | a [element 2] : | array_flow.rb:1372:9:1372:14 | call to sort [element] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1372:5:1372:5 | b [element] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1372:5:1372:5 | b [element] : | -| array_flow.rb:1373:10:1373:10 | b [element] : | array_flow.rb:1373:10:1373:13 | ...[...] | -| array_flow.rb:1373:10:1373:10 | b [element] : | array_flow.rb:1373:10:1373:13 | ...[...] | -| array_flow.rb:1374:10:1374:10 | b [element] : | array_flow.rb:1374:10:1374:13 | ...[...] | -| array_flow.rb:1374:10:1374:10 | b [element] : | array_flow.rb:1374:10:1374:13 | ...[...] | -| array_flow.rb:1375:5:1375:5 | c [element] : | array_flow.rb:1380:10:1380:10 | c [element] : | -| array_flow.rb:1375:5:1375:5 | c [element] : | array_flow.rb:1380:10:1380:10 | c [element] : | -| array_flow.rb:1375:5:1375:5 | c [element] : | array_flow.rb:1381:10:1381:10 | c [element] : | -| array_flow.rb:1375:5:1375:5 | c [element] : | array_flow.rb:1381:10:1381:10 | c [element] : | -| array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:9:1379:7 | call to sort [element] : | -| array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:9:1379:7 | call to sort [element] : | -| array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:20:1375:20 | x : | -| array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:20:1375:20 | x : | -| array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:23:1375:23 | y : | -| array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:23:1375:23 | y : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1375:5:1375:5 | c [element] : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1375:5:1375:5 | c [element] : | -| array_flow.rb:1375:20:1375:20 | x : | array_flow.rb:1376:14:1376:14 | x | -| array_flow.rb:1375:20:1375:20 | x : | array_flow.rb:1376:14:1376:14 | x | -| array_flow.rb:1375:23:1375:23 | y : | array_flow.rb:1377:14:1377:14 | y | -| array_flow.rb:1375:23:1375:23 | y : | array_flow.rb:1377:14:1377:14 | y | -| array_flow.rb:1380:10:1380:10 | c [element] : | array_flow.rb:1380:10:1380:13 | ...[...] | -| array_flow.rb:1380:10:1380:10 | c [element] : | array_flow.rb:1380:10:1380:13 | ...[...] | -| array_flow.rb:1381:10:1381:10 | c [element] : | array_flow.rb:1381:10:1381:13 | ...[...] | -| array_flow.rb:1381:10:1381:10 | c [element] : | array_flow.rb:1381:10:1381:13 | ...[...] | -| array_flow.rb:1385:5:1385:5 | a [element 2] : | array_flow.rb:1386:9:1386:9 | a [element 2] : | -| array_flow.rb:1385:5:1385:5 | a [element 2] : | array_flow.rb:1386:9:1386:9 | a [element 2] : | -| array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1385:5:1385:5 | a [element 2] : | -| array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1385:5:1385:5 | a [element 2] : | -| array_flow.rb:1386:5:1386:5 | b [element] : | array_flow.rb:1387:10:1387:10 | b [element] : | -| array_flow.rb:1386:5:1386:5 | b [element] : | array_flow.rb:1387:10:1387:10 | b [element] : | -| array_flow.rb:1386:5:1386:5 | b [element] : | array_flow.rb:1388:10:1388:10 | b [element] : | -| array_flow.rb:1386:5:1386:5 | b [element] : | array_flow.rb:1388:10:1388:10 | b [element] : | -| array_flow.rb:1386:9:1386:9 | [post] a [element] : | array_flow.rb:1389:10:1389:10 | a [element] : | -| array_flow.rb:1386:9:1386:9 | [post] a [element] : | array_flow.rb:1389:10:1389:10 | a [element] : | -| array_flow.rb:1386:9:1386:9 | [post] a [element] : | array_flow.rb:1390:10:1390:10 | a [element] : | -| array_flow.rb:1386:9:1386:9 | [post] a [element] : | array_flow.rb:1390:10:1390:10 | a [element] : | -| array_flow.rb:1386:9:1386:9 | a [element 2] : | array_flow.rb:1386:9:1386:9 | [post] a [element] : | -| array_flow.rb:1386:9:1386:9 | a [element 2] : | array_flow.rb:1386:9:1386:9 | [post] a [element] : | -| array_flow.rb:1386:9:1386:9 | a [element 2] : | array_flow.rb:1386:9:1386:15 | call to sort! [element] : | -| array_flow.rb:1386:9:1386:9 | a [element 2] : | array_flow.rb:1386:9:1386:15 | call to sort! [element] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1386:5:1386:5 | b [element] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1386:5:1386:5 | b [element] : | -| array_flow.rb:1387:10:1387:10 | b [element] : | array_flow.rb:1387:10:1387:13 | ...[...] | -| array_flow.rb:1387:10:1387:10 | b [element] : | array_flow.rb:1387:10:1387:13 | ...[...] | -| array_flow.rb:1388:10:1388:10 | b [element] : | array_flow.rb:1388:10:1388:13 | ...[...] | -| array_flow.rb:1388:10:1388:10 | b [element] : | array_flow.rb:1388:10:1388:13 | ...[...] | -| array_flow.rb:1389:10:1389:10 | a [element] : | array_flow.rb:1389:10:1389:13 | ...[...] | -| array_flow.rb:1389:10:1389:10 | a [element] : | array_flow.rb:1389:10:1389:13 | ...[...] | -| array_flow.rb:1390:10:1390:10 | a [element] : | array_flow.rb:1390:10:1390:13 | ...[...] | -| array_flow.rb:1390:10:1390:10 | a [element] : | array_flow.rb:1390:10:1390:13 | ...[...] | -| array_flow.rb:1392:5:1392:5 | a [element 2] : | array_flow.rb:1393:9:1393:9 | a [element 2] : | -| array_flow.rb:1392:5:1392:5 | a [element 2] : | array_flow.rb:1393:9:1393:9 | a [element 2] : | -| array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1392:5:1392:5 | a [element 2] : | -| array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1392:5:1392:5 | a [element 2] : | -| array_flow.rb:1393:5:1393:5 | b [element] : | array_flow.rb:1398:10:1398:10 | b [element] : | -| array_flow.rb:1393:5:1393:5 | b [element] : | array_flow.rb:1398:10:1398:10 | b [element] : | -| array_flow.rb:1393:5:1393:5 | b [element] : | array_flow.rb:1399:10:1399:10 | b [element] : | -| array_flow.rb:1393:5:1393:5 | b [element] : | array_flow.rb:1399:10:1399:10 | b [element] : | -| array_flow.rb:1393:9:1393:9 | [post] a [element] : | array_flow.rb:1400:10:1400:10 | a [element] : | -| array_flow.rb:1393:9:1393:9 | [post] a [element] : | array_flow.rb:1400:10:1400:10 | a [element] : | -| array_flow.rb:1393:9:1393:9 | [post] a [element] : | array_flow.rb:1401:10:1401:10 | a [element] : | -| array_flow.rb:1393:9:1393:9 | [post] a [element] : | array_flow.rb:1401:10:1401:10 | a [element] : | -| array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:9:1393:9 | [post] a [element] : | -| array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:9:1393:9 | [post] a [element] : | -| array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:9:1397:7 | call to sort! [element] : | -| array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:9:1397:7 | call to sort! [element] : | -| array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:21:1393:21 | x : | -| array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:21:1393:21 | x : | -| array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:24:1393:24 | y : | -| array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:24:1393:24 | y : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1393:5:1393:5 | b [element] : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1393:5:1393:5 | b [element] : | -| array_flow.rb:1393:21:1393:21 | x : | array_flow.rb:1394:14:1394:14 | x | -| array_flow.rb:1393:21:1393:21 | x : | array_flow.rb:1394:14:1394:14 | x | -| array_flow.rb:1393:24:1393:24 | y : | array_flow.rb:1395:14:1395:14 | y | -| array_flow.rb:1393:24:1393:24 | y : | array_flow.rb:1395:14:1395:14 | y | -| array_flow.rb:1398:10:1398:10 | b [element] : | array_flow.rb:1398:10:1398:13 | ...[...] | -| array_flow.rb:1398:10:1398:10 | b [element] : | array_flow.rb:1398:10:1398:13 | ...[...] | -| array_flow.rb:1399:10:1399:10 | b [element] : | array_flow.rb:1399:10:1399:13 | ...[...] | -| array_flow.rb:1399:10:1399:10 | b [element] : | array_flow.rb:1399:10:1399:13 | ...[...] | -| array_flow.rb:1400:10:1400:10 | a [element] : | array_flow.rb:1400:10:1400:13 | ...[...] | -| array_flow.rb:1400:10:1400:10 | a [element] : | array_flow.rb:1400:10:1400:13 | ...[...] | -| array_flow.rb:1401:10:1401:10 | a [element] : | array_flow.rb:1401:10:1401:13 | ...[...] | -| array_flow.rb:1401:10:1401:10 | a [element] : | array_flow.rb:1401:10:1401:13 | ...[...] | -| array_flow.rb:1405:5:1405:5 | a [element 2] : | array_flow.rb:1406:9:1406:9 | a [element 2] : | -| array_flow.rb:1405:5:1405:5 | a [element 2] : | array_flow.rb:1406:9:1406:9 | a [element 2] : | -| array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1405:5:1405:5 | a [element 2] : | -| array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1405:5:1405:5 | a [element 2] : | -| array_flow.rb:1406:5:1406:5 | b [element] : | array_flow.rb:1410:10:1410:10 | b [element] : | -| array_flow.rb:1406:5:1406:5 | b [element] : | array_flow.rb:1410:10:1410:10 | b [element] : | -| array_flow.rb:1406:5:1406:5 | b [element] : | array_flow.rb:1411:10:1411:10 | b [element] : | -| array_flow.rb:1406:5:1406:5 | b [element] : | array_flow.rb:1411:10:1411:10 | b [element] : | -| array_flow.rb:1406:9:1406:9 | a [element 2] : | array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | -| array_flow.rb:1406:9:1406:9 | a [element 2] : | array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | -| array_flow.rb:1406:9:1406:9 | a [element 2] : | array_flow.rb:1406:23:1406:23 | x : | -| array_flow.rb:1406:9:1406:9 | a [element 2] : | array_flow.rb:1406:23:1406:23 | x : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1406:5:1406:5 | b [element] : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1406:5:1406:5 | b [element] : | -| array_flow.rb:1406:23:1406:23 | x : | array_flow.rb:1407:14:1407:14 | x | -| array_flow.rb:1406:23:1406:23 | x : | array_flow.rb:1407:14:1407:14 | x | -| array_flow.rb:1410:10:1410:10 | b [element] : | array_flow.rb:1410:10:1410:13 | ...[...] | -| array_flow.rb:1410:10:1410:10 | b [element] : | array_flow.rb:1410:10:1410:13 | ...[...] | -| array_flow.rb:1411:10:1411:10 | b [element] : | array_flow.rb:1411:10:1411:13 | ...[...] | -| array_flow.rb:1411:10:1411:10 | b [element] : | array_flow.rb:1411:10:1411:13 | ...[...] | -| array_flow.rb:1415:5:1415:5 | a [element 2] : | array_flow.rb:1416:9:1416:9 | a [element 2] : | -| array_flow.rb:1415:5:1415:5 | a [element 2] : | array_flow.rb:1416:9:1416:9 | a [element 2] : | -| array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1415:5:1415:5 | a [element 2] : | -| array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1415:5:1415:5 | a [element 2] : | -| array_flow.rb:1416:5:1416:5 | b [element] : | array_flow.rb:1422:10:1422:10 | b [element] : | -| array_flow.rb:1416:5:1416:5 | b [element] : | array_flow.rb:1422:10:1422:10 | b [element] : | -| array_flow.rb:1416:5:1416:5 | b [element] : | array_flow.rb:1423:10:1423:10 | b [element] : | -| array_flow.rb:1416:5:1416:5 | b [element] : | array_flow.rb:1423:10:1423:10 | b [element] : | -| array_flow.rb:1416:9:1416:9 | [post] a [element] : | array_flow.rb:1420:10:1420:10 | a [element] : | -| array_flow.rb:1416:9:1416:9 | [post] a [element] : | array_flow.rb:1420:10:1420:10 | a [element] : | -| array_flow.rb:1416:9:1416:9 | [post] a [element] : | array_flow.rb:1421:10:1421:10 | a [element] : | -| array_flow.rb:1416:9:1416:9 | [post] a [element] : | array_flow.rb:1421:10:1421:10 | a [element] : | -| array_flow.rb:1416:9:1416:9 | a [element 2] : | array_flow.rb:1416:9:1416:9 | [post] a [element] : | -| array_flow.rb:1416:9:1416:9 | a [element 2] : | array_flow.rb:1416:9:1416:9 | [post] a [element] : | -| array_flow.rb:1416:9:1416:9 | a [element 2] : | array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | -| array_flow.rb:1416:9:1416:9 | a [element 2] : | array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | -| array_flow.rb:1416:9:1416:9 | a [element 2] : | array_flow.rb:1416:24:1416:24 | x : | -| array_flow.rb:1416:9:1416:9 | a [element 2] : | array_flow.rb:1416:24:1416:24 | x : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1416:5:1416:5 | b [element] : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1416:5:1416:5 | b [element] : | -| array_flow.rb:1416:24:1416:24 | x : | array_flow.rb:1417:14:1417:14 | x | -| array_flow.rb:1416:24:1416:24 | x : | array_flow.rb:1417:14:1417:14 | x | -| array_flow.rb:1420:10:1420:10 | a [element] : | array_flow.rb:1420:10:1420:13 | ...[...] | -| array_flow.rb:1420:10:1420:10 | a [element] : | array_flow.rb:1420:10:1420:13 | ...[...] | -| array_flow.rb:1421:10:1421:10 | a [element] : | array_flow.rb:1421:10:1421:13 | ...[...] | -| array_flow.rb:1421:10:1421:10 | a [element] : | array_flow.rb:1421:10:1421:13 | ...[...] | -| array_flow.rb:1422:10:1422:10 | b [element] : | array_flow.rb:1422:10:1422:13 | ...[...] | -| array_flow.rb:1422:10:1422:10 | b [element] : | array_flow.rb:1422:10:1422:13 | ...[...] | -| array_flow.rb:1423:10:1423:10 | b [element] : | array_flow.rb:1423:10:1423:13 | ...[...] | -| array_flow.rb:1423:10:1423:10 | b [element] : | array_flow.rb:1423:10:1423:13 | ...[...] | -| array_flow.rb:1427:5:1427:5 | a [element 2] : | array_flow.rb:1428:9:1428:9 | a [element 2] : | -| array_flow.rb:1427:5:1427:5 | a [element 2] : | array_flow.rb:1428:9:1428:9 | a [element 2] : | -| array_flow.rb:1427:16:1427:26 | call to source : | array_flow.rb:1427:5:1427:5 | a [element 2] : | -| array_flow.rb:1427:16:1427:26 | call to source : | array_flow.rb:1427:5:1427:5 | a [element 2] : | -| array_flow.rb:1428:9:1428:9 | a [element 2] : | array_flow.rb:1428:19:1428:19 | x : | -| array_flow.rb:1428:9:1428:9 | a [element 2] : | array_flow.rb:1428:19:1428:19 | x : | -| array_flow.rb:1428:19:1428:19 | x : | array_flow.rb:1429:14:1429:14 | x | -| array_flow.rb:1428:19:1428:19 | x : | array_flow.rb:1429:14:1429:14 | x | -| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1436:9:1436:9 | a [element 2] : | -| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1436:9:1436:9 | a [element 2] : | -| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1441:9:1441:9 | a [element 2] : | -| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1441:9:1441:9 | a [element 2] : | -| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1447:9:1447:9 | a [element 2] : | -| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1447:9:1447:9 | a [element 2] : | -| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1454:9:1454:9 | a [element 2] : | -| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1454:9:1454:9 | a [element 2] : | -| array_flow.rb:1435:5:1435:5 | a [element 3] : | array_flow.rb:1436:9:1436:9 | a [element 3] : | -| array_flow.rb:1435:5:1435:5 | a [element 3] : | array_flow.rb:1436:9:1436:9 | a [element 3] : | -| array_flow.rb:1435:5:1435:5 | a [element 3] : | array_flow.rb:1447:9:1447:9 | a [element 3] : | -| array_flow.rb:1435:5:1435:5 | a [element 3] : | array_flow.rb:1447:9:1447:9 | a [element 3] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1435:5:1435:5 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1435:5:1435:5 | a [element 2] : | -| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1435:5:1435:5 | a [element 3] : | -| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1435:5:1435:5 | a [element 3] : | -| array_flow.rb:1436:5:1436:5 | b [element 2] : | array_flow.rb:1439:10:1439:10 | b [element 2] : | -| array_flow.rb:1436:5:1436:5 | b [element 2] : | array_flow.rb:1439:10:1439:10 | b [element 2] : | -| array_flow.rb:1436:5:1436:5 | b [element 3] : | array_flow.rb:1440:10:1440:10 | b [element 3] : | -| array_flow.rb:1436:5:1436:5 | b [element 3] : | array_flow.rb:1440:10:1440:10 | b [element 3] : | -| array_flow.rb:1436:9:1436:9 | a [element 2] : | array_flow.rb:1436:9:1436:17 | call to take [element 2] : | -| array_flow.rb:1436:9:1436:9 | a [element 2] : | array_flow.rb:1436:9:1436:17 | call to take [element 2] : | -| array_flow.rb:1436:9:1436:9 | a [element 3] : | array_flow.rb:1436:9:1436:17 | call to take [element 3] : | -| array_flow.rb:1436:9:1436:9 | a [element 3] : | array_flow.rb:1436:9:1436:17 | call to take [element 3] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 2] : | array_flow.rb:1436:5:1436:5 | b [element 2] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 2] : | array_flow.rb:1436:5:1436:5 | b [element 2] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 3] : | array_flow.rb:1436:5:1436:5 | b [element 3] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 3] : | array_flow.rb:1436:5:1436:5 | b [element 3] : | -| array_flow.rb:1439:10:1439:10 | b [element 2] : | array_flow.rb:1439:10:1439:13 | ...[...] | -| array_flow.rb:1439:10:1439:10 | b [element 2] : | array_flow.rb:1439:10:1439:13 | ...[...] | -| array_flow.rb:1440:10:1440:10 | b [element 3] : | array_flow.rb:1440:10:1440:13 | ...[...] | -| array_flow.rb:1440:10:1440:10 | b [element 3] : | array_flow.rb:1440:10:1440:13 | ...[...] | -| array_flow.rb:1441:5:1441:5 | b [element 2] : | array_flow.rb:1444:10:1444:10 | b [element 2] : | -| array_flow.rb:1441:5:1441:5 | b [element 2] : | array_flow.rb:1444:10:1444:10 | b [element 2] : | -| array_flow.rb:1441:5:1441:5 | b [element 2] : | array_flow.rb:1446:10:1446:10 | b [element 2] : | -| array_flow.rb:1441:5:1441:5 | b [element 2] : | array_flow.rb:1446:10:1446:10 | b [element 2] : | -| array_flow.rb:1441:9:1441:9 | a [element 2] : | array_flow.rb:1441:9:1441:17 | call to take [element 2] : | -| array_flow.rb:1441:9:1441:9 | a [element 2] : | array_flow.rb:1441:9:1441:17 | call to take [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1441:5:1441:5 | b [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1441:5:1441:5 | b [element 2] : | -| array_flow.rb:1444:10:1444:10 | b [element 2] : | array_flow.rb:1444:10:1444:13 | ...[...] | -| array_flow.rb:1444:10:1444:10 | b [element 2] : | array_flow.rb:1444:10:1444:13 | ...[...] | -| array_flow.rb:1446:10:1446:10 | b [element 2] : | array_flow.rb:1446:10:1446:13 | ...[...] | -| array_flow.rb:1446:10:1446:10 | b [element 2] : | array_flow.rb:1446:10:1446:13 | ...[...] | -| array_flow.rb:1447:5:1447:5 | b [element 2] : | array_flow.rb:1450:10:1450:10 | b [element 2] : | -| array_flow.rb:1447:5:1447:5 | b [element 2] : | array_flow.rb:1450:10:1450:10 | b [element 2] : | -| array_flow.rb:1447:5:1447:5 | b [element 2] : | array_flow.rb:1452:10:1452:10 | b [element 2] : | -| array_flow.rb:1447:5:1447:5 | b [element 2] : | array_flow.rb:1452:10:1452:10 | b [element 2] : | -| array_flow.rb:1447:5:1447:5 | b [element 3] : | array_flow.rb:1451:10:1451:10 | b [element 3] : | -| array_flow.rb:1447:5:1447:5 | b [element 3] : | array_flow.rb:1451:10:1451:10 | b [element 3] : | -| array_flow.rb:1447:5:1447:5 | b [element 3] : | array_flow.rb:1452:10:1452:10 | b [element 3] : | -| array_flow.rb:1447:5:1447:5 | b [element 3] : | array_flow.rb:1452:10:1452:10 | b [element 3] : | -| array_flow.rb:1447:9:1447:9 | a [element 2] : | array_flow.rb:1447:9:1447:19 | call to take [element 2] : | -| array_flow.rb:1447:9:1447:9 | a [element 2] : | array_flow.rb:1447:9:1447:19 | call to take [element 2] : | -| array_flow.rb:1447:9:1447:9 | a [element 3] : | array_flow.rb:1447:9:1447:19 | call to take [element 3] : | -| array_flow.rb:1447:9:1447:9 | a [element 3] : | array_flow.rb:1447:9:1447:19 | call to take [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1447:5:1447:5 | b [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1447:5:1447:5 | b [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1447:5:1447:5 | b [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1447:5:1447:5 | b [element 3] : | -| array_flow.rb:1450:10:1450:10 | b [element 2] : | array_flow.rb:1450:10:1450:13 | ...[...] | -| array_flow.rb:1450:10:1450:10 | b [element 2] : | array_flow.rb:1450:10:1450:13 | ...[...] | -| array_flow.rb:1451:10:1451:10 | b [element 3] : | array_flow.rb:1451:10:1451:13 | ...[...] | -| array_flow.rb:1451:10:1451:10 | b [element 3] : | array_flow.rb:1451:10:1451:13 | ...[...] | -| array_flow.rb:1452:10:1452:10 | b [element 2] : | array_flow.rb:1452:10:1452:13 | ...[...] | -| array_flow.rb:1452:10:1452:10 | b [element 2] : | array_flow.rb:1452:10:1452:13 | ...[...] | -| array_flow.rb:1452:10:1452:10 | b [element 3] : | array_flow.rb:1452:10:1452:13 | ...[...] | -| array_flow.rb:1452:10:1452:10 | b [element 3] : | array_flow.rb:1452:10:1452:13 | ...[...] | -| array_flow.rb:1453:5:1453:5 | [post] a [element] : | array_flow.rb:1454:9:1454:9 | a [element] : | -| array_flow.rb:1453:5:1453:5 | [post] a [element] : | array_flow.rb:1454:9:1454:9 | a [element] : | -| array_flow.rb:1453:12:1453:24 | call to source : | array_flow.rb:1453:5:1453:5 | [post] a [element] : | -| array_flow.rb:1453:12:1453:24 | call to source : | array_flow.rb:1453:5:1453:5 | [post] a [element] : | -| array_flow.rb:1454:5:1454:5 | b [element 2] : | array_flow.rb:1455:10:1455:10 | b [element 2] : | -| array_flow.rb:1454:5:1454:5 | b [element 2] : | array_flow.rb:1455:10:1455:10 | b [element 2] : | -| array_flow.rb:1454:5:1454:5 | b [element] : | array_flow.rb:1455:10:1455:10 | b [element] : | -| array_flow.rb:1454:5:1454:5 | b [element] : | array_flow.rb:1455:10:1455:10 | b [element] : | -| array_flow.rb:1454:9:1454:9 | a [element 2] : | array_flow.rb:1454:9:1454:17 | call to take [element 2] : | -| array_flow.rb:1454:9:1454:9 | a [element 2] : | array_flow.rb:1454:9:1454:17 | call to take [element 2] : | -| array_flow.rb:1454:9:1454:9 | a [element] : | array_flow.rb:1454:9:1454:17 | call to take [element] : | -| array_flow.rb:1454:9:1454:9 | a [element] : | array_flow.rb:1454:9:1454:17 | call to take [element] : | -| array_flow.rb:1454:9:1454:17 | call to take [element 2] : | array_flow.rb:1454:5:1454:5 | b [element 2] : | -| array_flow.rb:1454:9:1454:17 | call to take [element 2] : | array_flow.rb:1454:5:1454:5 | b [element 2] : | -| array_flow.rb:1454:9:1454:17 | call to take [element] : | array_flow.rb:1454:5:1454:5 | b [element] : | -| array_flow.rb:1454:9:1454:17 | call to take [element] : | array_flow.rb:1454:5:1454:5 | b [element] : | -| array_flow.rb:1455:10:1455:10 | b [element 2] : | array_flow.rb:1455:10:1455:13 | ...[...] | -| array_flow.rb:1455:10:1455:10 | b [element 2] : | array_flow.rb:1455:10:1455:13 | ...[...] | -| array_flow.rb:1455:10:1455:10 | b [element] : | array_flow.rb:1455:10:1455:13 | ...[...] | -| array_flow.rb:1455:10:1455:10 | b [element] : | array_flow.rb:1455:10:1455:13 | ...[...] | -| array_flow.rb:1459:5:1459:5 | a [element 2] : | array_flow.rb:1460:9:1460:9 | a [element 2] : | -| array_flow.rb:1459:5:1459:5 | a [element 2] : | array_flow.rb:1460:9:1460:9 | a [element 2] : | -| array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1459:5:1459:5 | a [element 2] : | -| array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1459:5:1459:5 | a [element 2] : | -| array_flow.rb:1460:5:1460:5 | b [element 2] : | array_flow.rb:1466:10:1466:10 | b [element 2] : | -| array_flow.rb:1460:5:1460:5 | b [element 2] : | array_flow.rb:1466:10:1466:10 | b [element 2] : | -| array_flow.rb:1460:9:1460:9 | a [element 2] : | array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | -| array_flow.rb:1460:9:1460:9 | a [element 2] : | array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | -| array_flow.rb:1460:9:1460:9 | a [element 2] : | array_flow.rb:1460:26:1460:26 | x : | -| array_flow.rb:1460:9:1460:9 | a [element 2] : | array_flow.rb:1460:26:1460:26 | x : | -| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | array_flow.rb:1460:5:1460:5 | b [element 2] : | -| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | array_flow.rb:1460:5:1460:5 | b [element 2] : | -| array_flow.rb:1460:26:1460:26 | x : | array_flow.rb:1461:14:1461:14 | x | -| array_flow.rb:1460:26:1460:26 | x : | array_flow.rb:1461:14:1461:14 | x | -| array_flow.rb:1466:10:1466:10 | b [element 2] : | array_flow.rb:1466:10:1466:13 | ...[...] | -| array_flow.rb:1466:10:1466:10 | b [element 2] : | array_flow.rb:1466:10:1466:13 | ...[...] | -| array_flow.rb:1472:5:1472:5 | a [element 3] : | array_flow.rb:1473:9:1473:9 | a [element 3] : | -| array_flow.rb:1472:5:1472:5 | a [element 3] : | array_flow.rb:1473:9:1473:9 | a [element 3] : | -| array_flow.rb:1472:19:1472:29 | call to source : | array_flow.rb:1472:5:1472:5 | a [element 3] : | -| array_flow.rb:1472:19:1472:29 | call to source : | array_flow.rb:1472:5:1472:5 | a [element 3] : | -| array_flow.rb:1473:5:1473:5 | b [element 3] : | array_flow.rb:1474:10:1474:10 | b [element 3] : | -| array_flow.rb:1473:5:1473:5 | b [element 3] : | array_flow.rb:1474:10:1474:10 | b [element 3] : | -| array_flow.rb:1473:9:1473:9 | a [element 3] : | array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | -| array_flow.rb:1473:9:1473:9 | a [element 3] : | array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | -| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | array_flow.rb:1473:5:1473:5 | b [element 3] : | -| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | array_flow.rb:1473:5:1473:5 | b [element 3] : | -| array_flow.rb:1474:10:1474:10 | b [element 3] : | array_flow.rb:1474:10:1474:13 | ...[...] | -| array_flow.rb:1474:10:1474:10 | b [element 3] : | array_flow.rb:1474:10:1474:13 | ...[...] | -| array_flow.rb:1478:5:1478:5 | a [element 2] : | array_flow.rb:1479:9:1479:9 | a [element 2] : | -| array_flow.rb:1478:5:1478:5 | a [element 2] : | array_flow.rb:1479:9:1479:9 | a [element 2] : | -| array_flow.rb:1478:16:1478:26 | call to source : | array_flow.rb:1478:5:1478:5 | a [element 2] : | -| array_flow.rb:1478:16:1478:26 | call to source : | array_flow.rb:1478:5:1478:5 | a [element 2] : | -| array_flow.rb:1479:5:1479:5 | b [element 2] : | array_flow.rb:1482:10:1482:10 | b [element 2] : | -| array_flow.rb:1479:5:1479:5 | b [element 2] : | array_flow.rb:1482:10:1482:10 | b [element 2] : | -| array_flow.rb:1479:9:1479:9 | a [element 2] : | array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | -| array_flow.rb:1479:9:1479:9 | a [element 2] : | array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | -| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | array_flow.rb:1479:5:1479:5 | b [element 2] : | -| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | array_flow.rb:1479:5:1479:5 | b [element 2] : | -| array_flow.rb:1482:10:1482:10 | b [element 2] : | array_flow.rb:1482:10:1482:13 | ...[...] | -| array_flow.rb:1482:10:1482:10 | b [element 2] : | array_flow.rb:1482:10:1482:13 | ...[...] | -| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | -| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | -| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | -| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | -| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | -| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | -| array_flow.rb:1495:14:1495:26 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | -| array_flow.rb:1495:14:1495:26 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | -| array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | -| array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | -| array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | -| array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | -| array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | -| array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | -| array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | -| array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | -| array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | -| array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | -| array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | array_flow.rb:1500:10:1500:13 | ...[...] [element 0] : | -| array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | array_flow.rb:1500:10:1500:13 | ...[...] [element 0] : | -| array_flow.rb:1500:10:1500:13 | ...[...] [element 0] : | array_flow.rb:1500:10:1500:16 | ...[...] | -| array_flow.rb:1500:10:1500:13 | ...[...] [element 0] : | array_flow.rb:1500:10:1500:16 | ...[...] | -| array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | array_flow.rb:1501:10:1501:13 | ...[...] [element 1] : | -| array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | array_flow.rb:1501:10:1501:13 | ...[...] [element 1] : | -| array_flow.rb:1501:10:1501:13 | ...[...] [element 1] : | array_flow.rb:1501:10:1501:16 | ...[...] | -| array_flow.rb:1501:10:1501:13 | ...[...] [element 1] : | array_flow.rb:1501:10:1501:16 | ...[...] | -| array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | array_flow.rb:1502:10:1502:13 | ...[...] [element 2] : | -| array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | array_flow.rb:1502:10:1502:13 | ...[...] [element 2] : | -| array_flow.rb:1502:10:1502:13 | ...[...] [element 2] : | array_flow.rb:1502:10:1502:16 | ...[...] | -| array_flow.rb:1502:10:1502:13 | ...[...] [element 2] : | array_flow.rb:1502:10:1502:16 | ...[...] | -| array_flow.rb:1506:5:1506:5 | a [element 2] : | array_flow.rb:1509:9:1509:9 | a [element 2] : | -| array_flow.rb:1506:5:1506:5 | a [element 2] : | array_flow.rb:1509:9:1509:9 | a [element 2] : | -| array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1506:5:1506:5 | a [element 2] : | -| array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1506:5:1506:5 | a [element 2] : | -| array_flow.rb:1507:5:1507:5 | b [element 1] : | array_flow.rb:1509:17:1509:17 | b [element 1] : | -| array_flow.rb:1507:5:1507:5 | b [element 1] : | array_flow.rb:1509:17:1509:17 | b [element 1] : | -| array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1507:5:1507:5 | b [element 1] : | -| array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1507:5:1507:5 | b [element 1] : | -| array_flow.rb:1508:5:1508:5 | c [element 1] : | array_flow.rb:1509:20:1509:20 | c [element 1] : | -| array_flow.rb:1508:5:1508:5 | c [element 1] : | array_flow.rb:1509:20:1509:20 | c [element 1] : | -| array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1508:5:1508:5 | c [element 1] : | -| array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1508:5:1508:5 | c [element 1] : | -| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1510:10:1510:10 | d [element] : | -| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1510:10:1510:10 | d [element] : | -| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1511:10:1511:10 | d [element] : | -| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1511:10:1511:10 | d [element] : | -| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1512:10:1512:10 | d [element] : | -| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1512:10:1512:10 | d [element] : | -| array_flow.rb:1509:9:1509:9 | a [element 2] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | -| array_flow.rb:1509:9:1509:9 | a [element 2] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1509:5:1509:5 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1509:5:1509:5 | d [element] : | -| array_flow.rb:1509:17:1509:17 | b [element 1] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | -| array_flow.rb:1509:17:1509:17 | b [element 1] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | -| array_flow.rb:1509:20:1509:20 | c [element 1] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | -| array_flow.rb:1509:20:1509:20 | c [element 1] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | -| array_flow.rb:1510:10:1510:10 | d [element] : | array_flow.rb:1510:10:1510:13 | ...[...] | -| array_flow.rb:1510:10:1510:10 | d [element] : | array_flow.rb:1510:10:1510:13 | ...[...] | -| array_flow.rb:1511:10:1511:10 | d [element] : | array_flow.rb:1511:10:1511:13 | ...[...] | -| array_flow.rb:1511:10:1511:10 | d [element] : | array_flow.rb:1511:10:1511:13 | ...[...] | -| array_flow.rb:1512:10:1512:10 | d [element] : | array_flow.rb:1512:10:1512:13 | ...[...] | -| array_flow.rb:1512:10:1512:10 | d [element] : | array_flow.rb:1512:10:1512:13 | ...[...] | -| array_flow.rb:1516:5:1516:5 | a [element 3] : | array_flow.rb:1518:9:1518:9 | a [element 3] : | -| array_flow.rb:1516:5:1516:5 | a [element 3] : | array_flow.rb:1518:9:1518:9 | a [element 3] : | -| array_flow.rb:1516:5:1516:5 | a [element 3] : | array_flow.rb:1522:9:1522:9 | a [element 3] : | -| array_flow.rb:1516:5:1516:5 | a [element 3] : | array_flow.rb:1522:9:1522:9 | a [element 3] : | -| array_flow.rb:1516:5:1516:5 | a [element 4] : | array_flow.rb:1518:9:1518:9 | a [element 4] : | -| array_flow.rb:1516:5:1516:5 | a [element 4] : | array_flow.rb:1518:9:1518:9 | a [element 4] : | -| array_flow.rb:1516:5:1516:5 | a [element 4] : | array_flow.rb:1522:9:1522:9 | a [element 4] : | -| array_flow.rb:1516:5:1516:5 | a [element 4] : | array_flow.rb:1522:9:1522:9 | a [element 4] : | -| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1516:5:1516:5 | a [element 3] : | -| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1516:5:1516:5 | a [element 3] : | -| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1516:5:1516:5 | a [element 4] : | -| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1516:5:1516:5 | a [element 4] : | -| array_flow.rb:1518:5:1518:5 | b [element] : | array_flow.rb:1519:10:1519:10 | b [element] : | -| array_flow.rb:1518:5:1518:5 | b [element] : | array_flow.rb:1519:10:1519:10 | b [element] : | -| array_flow.rb:1518:5:1518:5 | b [element] : | array_flow.rb:1520:10:1520:10 | b [element] : | -| array_flow.rb:1518:5:1518:5 | b [element] : | array_flow.rb:1520:10:1520:10 | b [element] : | -| array_flow.rb:1518:9:1518:9 | a [element 3] : | array_flow.rb:1518:9:1518:14 | call to uniq [element] : | -| array_flow.rb:1518:9:1518:9 | a [element 3] : | array_flow.rb:1518:9:1518:14 | call to uniq [element] : | -| array_flow.rb:1518:9:1518:9 | a [element 4] : | array_flow.rb:1518:9:1518:14 | call to uniq [element] : | -| array_flow.rb:1518:9:1518:9 | a [element 4] : | array_flow.rb:1518:9:1518:14 | call to uniq [element] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1518:5:1518:5 | b [element] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1518:5:1518:5 | b [element] : | -| array_flow.rb:1519:10:1519:10 | b [element] : | array_flow.rb:1519:10:1519:13 | ...[...] | -| array_flow.rb:1519:10:1519:10 | b [element] : | array_flow.rb:1519:10:1519:13 | ...[...] | -| array_flow.rb:1520:10:1520:10 | b [element] : | array_flow.rb:1520:10:1520:13 | ...[...] | -| array_flow.rb:1520:10:1520:10 | b [element] : | array_flow.rb:1520:10:1520:13 | ...[...] | -| array_flow.rb:1522:5:1522:5 | c [element] : | array_flow.rb:1526:10:1526:10 | c [element] : | -| array_flow.rb:1522:5:1522:5 | c [element] : | array_flow.rb:1526:10:1526:10 | c [element] : | -| array_flow.rb:1522:9:1522:9 | a [element 3] : | array_flow.rb:1522:9:1525:7 | call to uniq [element] : | -| array_flow.rb:1522:9:1522:9 | a [element 3] : | array_flow.rb:1522:9:1525:7 | call to uniq [element] : | -| array_flow.rb:1522:9:1522:9 | a [element 3] : | array_flow.rb:1522:20:1522:20 | x : | -| array_flow.rb:1522:9:1522:9 | a [element 3] : | array_flow.rb:1522:20:1522:20 | x : | -| array_flow.rb:1522:9:1522:9 | a [element 4] : | array_flow.rb:1522:9:1525:7 | call to uniq [element] : | -| array_flow.rb:1522:9:1522:9 | a [element 4] : | array_flow.rb:1522:9:1525:7 | call to uniq [element] : | -| array_flow.rb:1522:9:1522:9 | a [element 4] : | array_flow.rb:1522:20:1522:20 | x : | -| array_flow.rb:1522:9:1522:9 | a [element 4] : | array_flow.rb:1522:20:1522:20 | x : | -| array_flow.rb:1522:9:1525:7 | call to uniq [element] : | array_flow.rb:1522:5:1522:5 | c [element] : | -| array_flow.rb:1522:9:1525:7 | call to uniq [element] : | array_flow.rb:1522:5:1522:5 | c [element] : | -| array_flow.rb:1522:20:1522:20 | x : | array_flow.rb:1523:14:1523:14 | x | -| array_flow.rb:1522:20:1522:20 | x : | array_flow.rb:1523:14:1523:14 | x | -| array_flow.rb:1526:10:1526:10 | c [element] : | array_flow.rb:1526:10:1526:13 | ...[...] | -| array_flow.rb:1526:10:1526:10 | c [element] : | array_flow.rb:1526:10:1526:13 | ...[...] | -| array_flow.rb:1530:5:1530:5 | a [element 2] : | array_flow.rb:1531:9:1531:9 | a [element 2] : | -| array_flow.rb:1530:5:1530:5 | a [element 2] : | array_flow.rb:1531:9:1531:9 | a [element 2] : | -| array_flow.rb:1530:5:1530:5 | a [element 3] : | array_flow.rb:1531:9:1531:9 | a [element 3] : | -| array_flow.rb:1530:5:1530:5 | a [element 3] : | array_flow.rb:1531:9:1531:9 | a [element 3] : | -| array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1530:5:1530:5 | a [element 2] : | -| array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1530:5:1530:5 | a [element 2] : | -| array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1530:5:1530:5 | a [element 3] : | -| array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1530:5:1530:5 | a [element 3] : | -| array_flow.rb:1531:5:1531:5 | b [element] : | array_flow.rb:1532:10:1532:10 | b [element] : | -| array_flow.rb:1531:5:1531:5 | b [element] : | array_flow.rb:1532:10:1532:10 | b [element] : | -| array_flow.rb:1531:5:1531:5 | b [element] : | array_flow.rb:1533:10:1533:10 | b [element] : | -| array_flow.rb:1531:5:1531:5 | b [element] : | array_flow.rb:1533:10:1533:10 | b [element] : | -| array_flow.rb:1531:9:1531:9 | [post] a [element] : | array_flow.rb:1534:10:1534:10 | a [element] : | -| array_flow.rb:1531:9:1531:9 | [post] a [element] : | array_flow.rb:1534:10:1534:10 | a [element] : | -| array_flow.rb:1531:9:1531:9 | [post] a [element] : | array_flow.rb:1535:10:1535:10 | a [element] : | -| array_flow.rb:1531:9:1531:9 | [post] a [element] : | array_flow.rb:1535:10:1535:10 | a [element] : | -| array_flow.rb:1531:9:1531:9 | a [element 2] : | array_flow.rb:1531:9:1531:9 | [post] a [element] : | -| array_flow.rb:1531:9:1531:9 | a [element 2] : | array_flow.rb:1531:9:1531:9 | [post] a [element] : | -| array_flow.rb:1531:9:1531:9 | a [element 2] : | array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | -| array_flow.rb:1531:9:1531:9 | a [element 2] : | array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | -| array_flow.rb:1531:9:1531:9 | a [element 3] : | array_flow.rb:1531:9:1531:9 | [post] a [element] : | -| array_flow.rb:1531:9:1531:9 | a [element 3] : | array_flow.rb:1531:9:1531:9 | [post] a [element] : | -| array_flow.rb:1531:9:1531:9 | a [element 3] : | array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | -| array_flow.rb:1531:9:1531:9 | a [element 3] : | array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1531:5:1531:5 | b [element] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1531:5:1531:5 | b [element] : | -| array_flow.rb:1532:10:1532:10 | b [element] : | array_flow.rb:1532:10:1532:13 | ...[...] | -| array_flow.rb:1532:10:1532:10 | b [element] : | array_flow.rb:1532:10:1532:13 | ...[...] | -| array_flow.rb:1533:10:1533:10 | b [element] : | array_flow.rb:1533:10:1533:13 | ...[...] | -| array_flow.rb:1533:10:1533:10 | b [element] : | array_flow.rb:1533:10:1533:13 | ...[...] | -| array_flow.rb:1534:10:1534:10 | a [element] : | array_flow.rb:1534:10:1534:13 | ...[...] | -| array_flow.rb:1534:10:1534:10 | a [element] : | array_flow.rb:1534:10:1534:13 | ...[...] | -| array_flow.rb:1535:10:1535:10 | a [element] : | array_flow.rb:1535:10:1535:13 | ...[...] | -| array_flow.rb:1535:10:1535:10 | a [element] : | array_flow.rb:1535:10:1535:13 | ...[...] | -| array_flow.rb:1537:5:1537:5 | a [element 2] : | array_flow.rb:1538:9:1538:9 | a [element 2] : | -| array_flow.rb:1537:5:1537:5 | a [element 2] : | array_flow.rb:1538:9:1538:9 | a [element 2] : | -| array_flow.rb:1537:5:1537:5 | a [element 3] : | array_flow.rb:1538:9:1538:9 | a [element 3] : | -| array_flow.rb:1537:5:1537:5 | a [element 3] : | array_flow.rb:1538:9:1538:9 | a [element 3] : | -| array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1537:5:1537:5 | a [element 2] : | -| array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1537:5:1537:5 | a [element 2] : | -| array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1537:5:1537:5 | a [element 3] : | -| array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1537:5:1537:5 | a [element 3] : | -| array_flow.rb:1538:5:1538:5 | b [element] : | array_flow.rb:1542:10:1542:10 | b [element] : | -| array_flow.rb:1538:5:1538:5 | b [element] : | array_flow.rb:1542:10:1542:10 | b [element] : | -| array_flow.rb:1538:5:1538:5 | b [element] : | array_flow.rb:1543:10:1543:10 | b [element] : | -| array_flow.rb:1538:5:1538:5 | b [element] : | array_flow.rb:1543:10:1543:10 | b [element] : | -| array_flow.rb:1538:9:1538:9 | [post] a [element] : | array_flow.rb:1544:10:1544:10 | a [element] : | -| array_flow.rb:1538:9:1538:9 | [post] a [element] : | array_flow.rb:1544:10:1544:10 | a [element] : | -| array_flow.rb:1538:9:1538:9 | [post] a [element] : | array_flow.rb:1545:10:1545:10 | a [element] : | -| array_flow.rb:1538:9:1538:9 | [post] a [element] : | array_flow.rb:1545:10:1545:10 | a [element] : | -| array_flow.rb:1538:9:1538:9 | a [element 2] : | array_flow.rb:1538:9:1538:9 | [post] a [element] : | -| array_flow.rb:1538:9:1538:9 | a [element 2] : | array_flow.rb:1538:9:1538:9 | [post] a [element] : | -| array_flow.rb:1538:9:1538:9 | a [element 2] : | array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | -| array_flow.rb:1538:9:1538:9 | a [element 2] : | array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | -| array_flow.rb:1538:9:1538:9 | a [element 2] : | array_flow.rb:1538:21:1538:21 | x : | -| array_flow.rb:1538:9:1538:9 | a [element 2] : | array_flow.rb:1538:21:1538:21 | x : | -| array_flow.rb:1538:9:1538:9 | a [element 3] : | array_flow.rb:1538:9:1538:9 | [post] a [element] : | -| array_flow.rb:1538:9:1538:9 | a [element 3] : | array_flow.rb:1538:9:1538:9 | [post] a [element] : | -| array_flow.rb:1538:9:1538:9 | a [element 3] : | array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | -| array_flow.rb:1538:9:1538:9 | a [element 3] : | array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | -| array_flow.rb:1538:9:1538:9 | a [element 3] : | array_flow.rb:1538:21:1538:21 | x : | -| array_flow.rb:1538:9:1538:9 | a [element 3] : | array_flow.rb:1538:21:1538:21 | x : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1538:5:1538:5 | b [element] : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1538:5:1538:5 | b [element] : | -| array_flow.rb:1538:21:1538:21 | x : | array_flow.rb:1539:14:1539:14 | x | -| array_flow.rb:1538:21:1538:21 | x : | array_flow.rb:1539:14:1539:14 | x | -| array_flow.rb:1542:10:1542:10 | b [element] : | array_flow.rb:1542:10:1542:13 | ...[...] | -| array_flow.rb:1542:10:1542:10 | b [element] : | array_flow.rb:1542:10:1542:13 | ...[...] | -| array_flow.rb:1543:10:1543:10 | b [element] : | array_flow.rb:1543:10:1543:13 | ...[...] | -| array_flow.rb:1543:10:1543:10 | b [element] : | array_flow.rb:1543:10:1543:13 | ...[...] | -| array_flow.rb:1544:10:1544:10 | a [element] : | array_flow.rb:1544:10:1544:13 | ...[...] | -| array_flow.rb:1544:10:1544:10 | a [element] : | array_flow.rb:1544:10:1544:13 | ...[...] | -| array_flow.rb:1545:10:1545:10 | a [element] : | array_flow.rb:1545:10:1545:13 | ...[...] | -| array_flow.rb:1545:10:1545:10 | a [element] : | array_flow.rb:1545:10:1545:13 | ...[...] | -| array_flow.rb:1549:5:1549:5 | a [element 2] : | array_flow.rb:1550:5:1550:5 | a [element 2] : | -| array_flow.rb:1549:5:1549:5 | a [element 2] : | array_flow.rb:1550:5:1550:5 | a [element 2] : | -| array_flow.rb:1549:16:1549:28 | call to source : | array_flow.rb:1549:5:1549:5 | a [element 2] : | -| array_flow.rb:1549:16:1549:28 | call to source : | array_flow.rb:1549:5:1549:5 | a [element 2] : | -| array_flow.rb:1550:5:1550:5 | [post] a [element 2] : | array_flow.rb:1553:10:1553:10 | a [element 2] : | -| array_flow.rb:1550:5:1550:5 | [post] a [element 2] : | array_flow.rb:1553:10:1553:10 | a [element 2] : | -| array_flow.rb:1550:5:1550:5 | [post] a [element 5] : | array_flow.rb:1556:10:1556:10 | a [element 5] : | -| array_flow.rb:1550:5:1550:5 | [post] a [element 5] : | array_flow.rb:1556:10:1556:10 | a [element 5] : | -| array_flow.rb:1550:5:1550:5 | a [element 2] : | array_flow.rb:1550:5:1550:5 | [post] a [element 5] : | -| array_flow.rb:1550:5:1550:5 | a [element 2] : | array_flow.rb:1550:5:1550:5 | [post] a [element 5] : | -| array_flow.rb:1550:21:1550:33 | call to source : | array_flow.rb:1550:5:1550:5 | [post] a [element 2] : | -| array_flow.rb:1550:21:1550:33 | call to source : | array_flow.rb:1550:5:1550:5 | [post] a [element 2] : | -| array_flow.rb:1553:10:1553:10 | a [element 2] : | array_flow.rb:1553:10:1553:13 | ...[...] | -| array_flow.rb:1553:10:1553:10 | a [element 2] : | array_flow.rb:1553:10:1553:13 | ...[...] | -| array_flow.rb:1556:10:1556:10 | a [element 5] : | array_flow.rb:1556:10:1556:13 | ...[...] | -| array_flow.rb:1556:10:1556:10 | a [element 5] : | array_flow.rb:1556:10:1556:13 | ...[...] | -| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1562:9:1562:9 | a [element 1] : | -| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1562:9:1562:9 | a [element 1] : | -| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1568:9:1568:9 | a [element 1] : | -| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1568:9:1568:9 | a [element 1] : | -| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1572:9:1572:9 | a [element 1] : | -| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1572:9:1572:9 | a [element 1] : | -| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1576:9:1576:9 | a [element 1] : | -| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1576:9:1576:9 | a [element 1] : | -| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1568:9:1568:9 | a [element 3] : | -| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1568:9:1568:9 | a [element 3] : | -| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1572:9:1572:9 | a [element 3] : | -| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1572:9:1572:9 | a [element 3] : | -| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1576:9:1576:9 | a [element 3] : | -| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1576:9:1576:9 | a [element 3] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1560:5:1560:5 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1560:5:1560:5 | a [element 1] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1560:5:1560:5 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1560:5:1560:5 | a [element 3] : | -| array_flow.rb:1562:5:1562:5 | b [element 1] : | array_flow.rb:1564:10:1564:10 | b [element 1] : | -| array_flow.rb:1562:5:1562:5 | b [element 1] : | array_flow.rb:1564:10:1564:10 | b [element 1] : | -| array_flow.rb:1562:5:1562:5 | b [element 3] : | array_flow.rb:1566:10:1566:10 | b [element 3] : | -| array_flow.rb:1562:5:1562:5 | b [element 3] : | array_flow.rb:1566:10:1566:10 | b [element 3] : | -| array_flow.rb:1562:9:1562:9 | a [element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | -| array_flow.rb:1562:9:1562:9 | a [element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | -| array_flow.rb:1562:9:1562:9 | a [element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | -| array_flow.rb:1562:9:1562:9 | a [element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | array_flow.rb:1562:5:1562:5 | b [element 1] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | array_flow.rb:1562:5:1562:5 | b [element 1] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | array_flow.rb:1562:5:1562:5 | b [element 3] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | array_flow.rb:1562:5:1562:5 | b [element 3] : | -| array_flow.rb:1564:10:1564:10 | b [element 1] : | array_flow.rb:1564:10:1564:13 | ...[...] | -| array_flow.rb:1564:10:1564:10 | b [element 1] : | array_flow.rb:1564:10:1564:13 | ...[...] | -| array_flow.rb:1566:10:1566:10 | b [element 3] : | array_flow.rb:1566:10:1566:13 | ...[...] | -| array_flow.rb:1566:10:1566:10 | b [element 3] : | array_flow.rb:1566:10:1566:13 | ...[...] | -| array_flow.rb:1568:5:1568:5 | b [element] : | array_flow.rb:1569:10:1569:10 | b [element] : | -| array_flow.rb:1568:5:1568:5 | b [element] : | array_flow.rb:1569:10:1569:10 | b [element] : | -| array_flow.rb:1568:5:1568:5 | b [element] : | array_flow.rb:1570:10:1570:10 | b [element] : | -| array_flow.rb:1568:5:1568:5 | b [element] : | array_flow.rb:1570:10:1570:10 | b [element] : | -| array_flow.rb:1568:9:1568:9 | a [element 1] : | array_flow.rb:1568:9:1568:25 | call to values_at [element] : | -| array_flow.rb:1568:9:1568:9 | a [element 1] : | array_flow.rb:1568:9:1568:25 | call to values_at [element] : | -| array_flow.rb:1568:9:1568:9 | a [element 3] : | array_flow.rb:1568:9:1568:25 | call to values_at [element] : | -| array_flow.rb:1568:9:1568:9 | a [element 3] : | array_flow.rb:1568:9:1568:25 | call to values_at [element] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1568:5:1568:5 | b [element] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1568:5:1568:5 | b [element] : | -| array_flow.rb:1569:10:1569:10 | b [element] : | array_flow.rb:1569:10:1569:13 | ...[...] | -| array_flow.rb:1569:10:1569:10 | b [element] : | array_flow.rb:1569:10:1569:13 | ...[...] | -| array_flow.rb:1570:10:1570:10 | b [element] : | array_flow.rb:1570:10:1570:13 | ...[...] | -| array_flow.rb:1570:10:1570:10 | b [element] : | array_flow.rb:1570:10:1570:13 | ...[...] | -| array_flow.rb:1572:5:1572:5 | b [element] : | array_flow.rb:1573:10:1573:10 | b [element] : | -| array_flow.rb:1572:5:1572:5 | b [element] : | array_flow.rb:1573:10:1573:10 | b [element] : | -| array_flow.rb:1572:5:1572:5 | b [element] : | array_flow.rb:1574:10:1574:10 | b [element] : | -| array_flow.rb:1572:5:1572:5 | b [element] : | array_flow.rb:1574:10:1574:10 | b [element] : | -| array_flow.rb:1572:9:1572:9 | a [element 1] : | array_flow.rb:1572:9:1572:26 | call to values_at [element] : | -| array_flow.rb:1572:9:1572:9 | a [element 1] : | array_flow.rb:1572:9:1572:26 | call to values_at [element] : | -| array_flow.rb:1572:9:1572:9 | a [element 3] : | array_flow.rb:1572:9:1572:26 | call to values_at [element] : | -| array_flow.rb:1572:9:1572:9 | a [element 3] : | array_flow.rb:1572:9:1572:26 | call to values_at [element] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1572:5:1572:5 | b [element] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1572:5:1572:5 | b [element] : | -| array_flow.rb:1573:10:1573:10 | b [element] : | array_flow.rb:1573:10:1573:13 | ...[...] | -| array_flow.rb:1573:10:1573:10 | b [element] : | array_flow.rb:1573:10:1573:13 | ...[...] | -| array_flow.rb:1574:10:1574:10 | b [element] : | array_flow.rb:1574:10:1574:13 | ...[...] | -| array_flow.rb:1574:10:1574:10 | b [element] : | array_flow.rb:1574:10:1574:13 | ...[...] | -| array_flow.rb:1576:5:1576:5 | b [element 1] : | array_flow.rb:1578:10:1578:10 | b [element 1] : | -| array_flow.rb:1576:5:1576:5 | b [element 1] : | array_flow.rb:1578:10:1578:10 | b [element 1] : | -| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1577:10:1577:10 | b [element] : | -| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1577:10:1577:10 | b [element] : | -| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1578:10:1578:10 | b [element] : | -| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1578:10:1578:10 | b [element] : | -| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1579:10:1579:10 | b [element] : | -| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1579:10:1579:10 | b [element] : | -| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1580:10:1580:10 | b [element] : | -| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1580:10:1580:10 | b [element] : | -| array_flow.rb:1576:9:1576:9 | a [element 1] : | array_flow.rb:1576:9:1576:28 | call to values_at [element] : | -| array_flow.rb:1576:9:1576:9 | a [element 1] : | array_flow.rb:1576:9:1576:28 | call to values_at [element] : | -| array_flow.rb:1576:9:1576:9 | a [element 3] : | array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | -| array_flow.rb:1576:9:1576:9 | a [element 3] : | array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | -| array_flow.rb:1576:9:1576:9 | a [element 3] : | array_flow.rb:1576:9:1576:28 | call to values_at [element] : | -| array_flow.rb:1576:9:1576:9 | a [element 3] : | array_flow.rb:1576:9:1576:28 | call to values_at [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | array_flow.rb:1576:5:1576:5 | b [element 1] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | array_flow.rb:1576:5:1576:5 | b [element 1] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1576:5:1576:5 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1576:5:1576:5 | b [element] : | -| array_flow.rb:1577:10:1577:10 | b [element] : | array_flow.rb:1577:10:1577:13 | ...[...] | -| array_flow.rb:1577:10:1577:10 | b [element] : | array_flow.rb:1577:10:1577:13 | ...[...] | -| array_flow.rb:1578:10:1578:10 | b [element 1] : | array_flow.rb:1578:10:1578:13 | ...[...] | -| array_flow.rb:1578:10:1578:10 | b [element 1] : | array_flow.rb:1578:10:1578:13 | ...[...] | -| array_flow.rb:1578:10:1578:10 | b [element] : | array_flow.rb:1578:10:1578:13 | ...[...] | -| array_flow.rb:1578:10:1578:10 | b [element] : | array_flow.rb:1578:10:1578:13 | ...[...] | -| array_flow.rb:1579:10:1579:10 | b [element] : | array_flow.rb:1579:10:1579:13 | ...[...] | -| array_flow.rb:1579:10:1579:10 | b [element] : | array_flow.rb:1579:10:1579:13 | ...[...] | -| array_flow.rb:1580:10:1580:10 | b [element] : | array_flow.rb:1580:10:1580:13 | ...[...] | -| array_flow.rb:1580:10:1580:10 | b [element] : | array_flow.rb:1580:10:1580:13 | ...[...] | -| array_flow.rb:1584:5:1584:5 | a [element 2] : | array_flow.rb:1587:9:1587:9 | a [element 2] : | -| array_flow.rb:1584:5:1584:5 | a [element 2] : | array_flow.rb:1587:9:1587:9 | a [element 2] : | -| array_flow.rb:1584:5:1584:5 | a [element 2] : | array_flow.rb:1592:5:1592:5 | a [element 2] : | -| array_flow.rb:1584:5:1584:5 | a [element 2] : | array_flow.rb:1592:5:1592:5 | a [element 2] : | -| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1584:5:1584:5 | a [element 2] : | -| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1584:5:1584:5 | a [element 2] : | -| array_flow.rb:1585:5:1585:5 | b [element 1] : | array_flow.rb:1587:15:1587:15 | b [element 1] : | -| array_flow.rb:1585:5:1585:5 | b [element 1] : | array_flow.rb:1587:15:1587:15 | b [element 1] : | -| array_flow.rb:1585:5:1585:5 | b [element 1] : | array_flow.rb:1592:11:1592:11 | b [element 1] : | -| array_flow.rb:1585:5:1585:5 | b [element 1] : | array_flow.rb:1592:11:1592:11 | b [element 1] : | -| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1585:5:1585:5 | b [element 1] : | -| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1585:5:1585:5 | b [element 1] : | -| array_flow.rb:1586:5:1586:5 | c [element 0] : | array_flow.rb:1587:18:1587:18 | c [element 0] : | -| array_flow.rb:1586:5:1586:5 | c [element 0] : | array_flow.rb:1587:18:1587:18 | c [element 0] : | -| array_flow.rb:1586:5:1586:5 | c [element 0] : | array_flow.rb:1592:14:1592:14 | c [element 0] : | -| array_flow.rb:1586:5:1586:5 | c [element 0] : | array_flow.rb:1592:14:1592:14 | c [element 0] : | -| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1586:5:1586:5 | c [element 0] : | -| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1586:5:1586:5 | c [element 0] : | -| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | array_flow.rb:1589:10:1589:10 | d [element 0, element 2] : | -| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | array_flow.rb:1589:10:1589:10 | d [element 0, element 2] : | -| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | -| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | -| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | -| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | -| array_flow.rb:1587:9:1587:9 | a [element 2] : | array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | -| array_flow.rb:1587:9:1587:9 | a [element 2] : | array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | -| array_flow.rb:1587:15:1587:15 | b [element 1] : | array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | -| array_flow.rb:1587:15:1587:15 | b [element 1] : | array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | -| array_flow.rb:1587:18:1587:18 | c [element 0] : | array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | -| array_flow.rb:1587:18:1587:18 | c [element 0] : | array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | -| array_flow.rb:1589:10:1589:10 | d [element 0, element 2] : | array_flow.rb:1589:10:1589:13 | ...[...] [element 2] : | -| array_flow.rb:1589:10:1589:10 | d [element 0, element 2] : | array_flow.rb:1589:10:1589:13 | ...[...] [element 2] : | -| array_flow.rb:1589:10:1589:13 | ...[...] [element 2] : | array_flow.rb:1589:10:1589:16 | ...[...] | -| array_flow.rb:1589:10:1589:13 | ...[...] [element 2] : | array_flow.rb:1589:10:1589:16 | ...[...] | -| array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | array_flow.rb:1590:10:1590:13 | ...[...] [element 1] : | -| array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | array_flow.rb:1590:10:1590:13 | ...[...] [element 1] : | -| array_flow.rb:1590:10:1590:13 | ...[...] [element 1] : | array_flow.rb:1590:10:1590:16 | ...[...] | -| array_flow.rb:1590:10:1590:13 | ...[...] [element 1] : | array_flow.rb:1590:10:1590:16 | ...[...] | -| array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | array_flow.rb:1591:10:1591:13 | ...[...] [element 0] : | -| array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | array_flow.rb:1591:10:1591:13 | ...[...] [element 0] : | -| array_flow.rb:1591:10:1591:13 | ...[...] [element 0] : | array_flow.rb:1591:10:1591:16 | ...[...] | -| array_flow.rb:1591:10:1591:13 | ...[...] [element 0] : | array_flow.rb:1591:10:1591:16 | ...[...] | -| array_flow.rb:1592:5:1592:5 | a [element 2] : | array_flow.rb:1592:21:1592:21 | x [element 0] : | -| array_flow.rb:1592:5:1592:5 | a [element 2] : | array_flow.rb:1592:21:1592:21 | x [element 0] : | -| array_flow.rb:1592:11:1592:11 | b [element 1] : | array_flow.rb:1592:21:1592:21 | x [element 1] : | -| array_flow.rb:1592:11:1592:11 | b [element 1] : | array_flow.rb:1592:21:1592:21 | x [element 1] : | -| array_flow.rb:1592:14:1592:14 | c [element 0] : | array_flow.rb:1592:21:1592:21 | x [element 2] : | -| array_flow.rb:1592:14:1592:14 | c [element 0] : | array_flow.rb:1592:21:1592:21 | x [element 2] : | -| array_flow.rb:1592:21:1592:21 | x [element 0] : | array_flow.rb:1593:14:1593:14 | x [element 0] : | -| array_flow.rb:1592:21:1592:21 | x [element 0] : | array_flow.rb:1593:14:1593:14 | x [element 0] : | -| array_flow.rb:1592:21:1592:21 | x [element 1] : | array_flow.rb:1594:14:1594:14 | x [element 1] : | -| array_flow.rb:1592:21:1592:21 | x [element 1] : | array_flow.rb:1594:14:1594:14 | x [element 1] : | -| array_flow.rb:1592:21:1592:21 | x [element 2] : | array_flow.rb:1595:14:1595:14 | x [element 2] : | -| array_flow.rb:1592:21:1592:21 | x [element 2] : | array_flow.rb:1595:14:1595:14 | x [element 2] : | -| array_flow.rb:1593:14:1593:14 | x [element 0] : | array_flow.rb:1593:14:1593:17 | ...[...] | -| array_flow.rb:1593:14:1593:14 | x [element 0] : | array_flow.rb:1593:14:1593:17 | ...[...] | -| array_flow.rb:1594:14:1594:14 | x [element 1] : | array_flow.rb:1594:14:1594:17 | ...[...] | -| array_flow.rb:1594:14:1594:14 | x [element 1] : | array_flow.rb:1594:14:1594:17 | ...[...] | -| array_flow.rb:1595:14:1595:14 | x [element 2] : | array_flow.rb:1595:14:1595:17 | ...[...] | -| array_flow.rb:1595:14:1595:14 | x [element 2] : | array_flow.rb:1595:14:1595:17 | ...[...] | -| array_flow.rb:1600:5:1600:5 | a [element 2] : | array_flow.rb:1602:9:1602:9 | a [element 2] : | -| array_flow.rb:1600:5:1600:5 | a [element 2] : | array_flow.rb:1602:9:1602:9 | a [element 2] : | -| array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1600:5:1600:5 | a [element 2] : | -| array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1600:5:1600:5 | a [element 2] : | -| array_flow.rb:1601:5:1601:5 | b [element 1] : | array_flow.rb:1602:13:1602:13 | b [element 1] : | -| array_flow.rb:1601:5:1601:5 | b [element 1] : | array_flow.rb:1602:13:1602:13 | b [element 1] : | -| array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1601:5:1601:5 | b [element 1] : | -| array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1601:5:1601:5 | b [element 1] : | -| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1603:10:1603:10 | c [element] : | -| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1603:10:1603:10 | c [element] : | -| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1604:10:1604:10 | c [element] : | -| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1604:10:1604:10 | c [element] : | -| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1605:10:1605:10 | c [element] : | -| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1605:10:1605:10 | c [element] : | -| array_flow.rb:1602:9:1602:9 | a [element 2] : | array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | -| array_flow.rb:1602:9:1602:9 | a [element 2] : | array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1602:5:1602:5 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1602:5:1602:5 | c [element] : | -| array_flow.rb:1602:13:1602:13 | b [element 1] : | array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | -| array_flow.rb:1602:13:1602:13 | b [element 1] : | array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | -| array_flow.rb:1603:10:1603:10 | c [element] : | array_flow.rb:1603:10:1603:13 | ...[...] | -| array_flow.rb:1603:10:1603:10 | c [element] : | array_flow.rb:1603:10:1603:13 | ...[...] | -| array_flow.rb:1604:10:1604:10 | c [element] : | array_flow.rb:1604:10:1604:13 | ...[...] | -| array_flow.rb:1604:10:1604:10 | c [element] : | array_flow.rb:1604:10:1604:13 | ...[...] | -| array_flow.rb:1605:10:1605:10 | c [element] : | array_flow.rb:1605:10:1605:13 | ...[...] | -| array_flow.rb:1605:10:1605:10 | c [element] : | array_flow.rb:1605:10:1605:13 | ...[...] | -| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] : | array_flow.rb:1611:10:1611:10 | a [element, element 0] : | -| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] : | array_flow.rb:1611:10:1611:10 | a [element, element 0] : | -| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] : | array_flow.rb:1614:10:1614:10 | a [element, element 0] : | -| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] : | array_flow.rb:1614:10:1614:10 | a [element, element 0] : | -| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] : | array_flow.rb:1615:10:1615:10 | a [element, element 0] : | -| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] : | array_flow.rb:1615:10:1615:10 | a [element, element 0] : | -| array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] : | array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] : | -| array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] : | array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] : | -| array_flow.rb:1610:15:1610:27 | call to source : | array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] : | -| array_flow.rb:1610:15:1610:27 | call to source : | array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] : | -| array_flow.rb:1611:10:1611:10 | a [element, element 0] : | array_flow.rb:1611:10:1611:13 | ...[...] [element 0] : | -| array_flow.rb:1611:10:1611:10 | a [element, element 0] : | array_flow.rb:1611:10:1611:13 | ...[...] [element 0] : | -| array_flow.rb:1611:10:1611:13 | ...[...] [element 0] : | array_flow.rb:1611:10:1611:16 | ...[...] | -| array_flow.rb:1611:10:1611:13 | ...[...] [element 0] : | array_flow.rb:1611:10:1611:16 | ...[...] | -| array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] : | array_flow.rb:1614:10:1614:10 | a [element 1, element 0] : | -| array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] : | array_flow.rb:1614:10:1614:10 | a [element 1, element 0] : | -| array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] : | array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] : | -| array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] : | array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] : | -| array_flow.rb:1613:15:1613:27 | call to source : | array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] : | -| array_flow.rb:1613:15:1613:27 | call to source : | array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] : | -| array_flow.rb:1614:10:1614:10 | a [element 1, element 0] : | array_flow.rb:1614:10:1614:13 | ...[...] [element 0] : | -| array_flow.rb:1614:10:1614:10 | a [element 1, element 0] : | array_flow.rb:1614:10:1614:13 | ...[...] [element 0] : | -| array_flow.rb:1614:10:1614:10 | a [element, element 0] : | array_flow.rb:1614:10:1614:13 | ...[...] [element 0] : | -| array_flow.rb:1614:10:1614:10 | a [element, element 0] : | array_flow.rb:1614:10:1614:13 | ...[...] [element 0] : | -| array_flow.rb:1614:10:1614:13 | ...[...] [element 0] : | array_flow.rb:1614:10:1614:16 | ...[...] | -| array_flow.rb:1614:10:1614:13 | ...[...] [element 0] : | array_flow.rb:1614:10:1614:16 | ...[...] | -| array_flow.rb:1615:10:1615:10 | a [element, element 0] : | array_flow.rb:1615:10:1615:13 | ...[...] [element 0] : | -| array_flow.rb:1615:10:1615:10 | a [element, element 0] : | array_flow.rb:1615:10:1615:13 | ...[...] [element 0] : | -| array_flow.rb:1615:10:1615:13 | ...[...] [element 0] : | array_flow.rb:1615:10:1615:16 | ...[...] | -| array_flow.rb:1615:10:1615:13 | ...[...] [element 0] : | array_flow.rb:1615:10:1615:16 | ...[...] | -| array_flow.rb:1620:5:1620:5 | [post] a [element 0] : | array_flow.rb:1629:10:1629:10 | a [element 0] : | -| array_flow.rb:1620:5:1620:5 | [post] a [element 0] : | array_flow.rb:1629:10:1629:10 | a [element 0] : | -| array_flow.rb:1620:5:1620:5 | [post] a [element 0] : | array_flow.rb:1631:10:1631:10 | a [element 0] : | -| array_flow.rb:1620:5:1620:5 | [post] a [element 0] : | array_flow.rb:1631:10:1631:10 | a [element 0] : | -| array_flow.rb:1620:12:1620:24 | call to source : | array_flow.rb:1620:5:1620:5 | [post] a [element 0] : | -| array_flow.rb:1620:12:1620:24 | call to source : | array_flow.rb:1620:5:1620:5 | [post] a [element 0] : | -| array_flow.rb:1622:5:1622:5 | [post] a [element] : | array_flow.rb:1627:10:1627:10 | a [element] : | -| array_flow.rb:1622:5:1622:5 | [post] a [element] : | array_flow.rb:1627:10:1627:10 | a [element] : | -| array_flow.rb:1622:5:1622:5 | [post] a [element] : | array_flow.rb:1629:10:1629:10 | a [element] : | -| array_flow.rb:1622:5:1622:5 | [post] a [element] : | array_flow.rb:1629:10:1629:10 | a [element] : | -| array_flow.rb:1622:5:1622:5 | [post] a [element] : | array_flow.rb:1631:10:1631:10 | a [element] : | -| array_flow.rb:1622:5:1622:5 | [post] a [element] : | array_flow.rb:1631:10:1631:10 | a [element] : | -| array_flow.rb:1622:16:1622:28 | call to source : | array_flow.rb:1622:5:1622:5 | [post] a [element] : | -| array_flow.rb:1622:16:1622:28 | call to source : | array_flow.rb:1622:5:1622:5 | [post] a [element] : | -| array_flow.rb:1624:5:1624:5 | [post] a [element] : | array_flow.rb:1627:10:1627:10 | a [element] : | -| array_flow.rb:1624:5:1624:5 | [post] a [element] : | array_flow.rb:1627:10:1627:10 | a [element] : | -| array_flow.rb:1624:5:1624:5 | [post] a [element] : | array_flow.rb:1629:10:1629:10 | a [element] : | -| array_flow.rb:1624:5:1624:5 | [post] a [element] : | array_flow.rb:1629:10:1629:10 | a [element] : | -| array_flow.rb:1624:5:1624:5 | [post] a [element] : | array_flow.rb:1631:10:1631:10 | a [element] : | -| array_flow.rb:1624:5:1624:5 | [post] a [element] : | array_flow.rb:1631:10:1631:10 | a [element] : | -| array_flow.rb:1624:14:1624:26 | call to source : | array_flow.rb:1624:5:1624:5 | [post] a [element] : | -| array_flow.rb:1624:14:1624:26 | call to source : | array_flow.rb:1624:5:1624:5 | [post] a [element] : | -| array_flow.rb:1626:5:1626:5 | [post] a [element] : | array_flow.rb:1627:10:1627:10 | a [element] : | -| array_flow.rb:1626:5:1626:5 | [post] a [element] : | array_flow.rb:1627:10:1627:10 | a [element] : | -| array_flow.rb:1626:5:1626:5 | [post] a [element] : | array_flow.rb:1629:10:1629:10 | a [element] : | -| array_flow.rb:1626:5:1626:5 | [post] a [element] : | array_flow.rb:1629:10:1629:10 | a [element] : | -| array_flow.rb:1626:5:1626:5 | [post] a [element] : | array_flow.rb:1631:10:1631:10 | a [element] : | -| array_flow.rb:1626:5:1626:5 | [post] a [element] : | array_flow.rb:1631:10:1631:10 | a [element] : | -| array_flow.rb:1626:16:1626:28 | call to source : | array_flow.rb:1626:5:1626:5 | [post] a [element] : | -| array_flow.rb:1626:16:1626:28 | call to source : | array_flow.rb:1626:5:1626:5 | [post] a [element] : | -| array_flow.rb:1627:10:1627:10 | a [element] : | array_flow.rb:1627:10:1627:13 | ...[...] | -| array_flow.rb:1627:10:1627:10 | a [element] : | array_flow.rb:1627:10:1627:13 | ...[...] | -| array_flow.rb:1629:10:1629:10 | a [element 0] : | array_flow.rb:1629:10:1629:17 | ...[...] | -| array_flow.rb:1629:10:1629:10 | a [element 0] : | array_flow.rb:1629:10:1629:17 | ...[...] | -| array_flow.rb:1629:10:1629:10 | a [element] : | array_flow.rb:1629:10:1629:17 | ...[...] | -| array_flow.rb:1629:10:1629:10 | a [element] : | array_flow.rb:1629:10:1629:17 | ...[...] | -| array_flow.rb:1631:10:1631:10 | a [element 0] : | array_flow.rb:1631:10:1631:15 | ...[...] | -| array_flow.rb:1631:10:1631:10 | a [element 0] : | array_flow.rb:1631:10:1631:15 | ...[...] | -| array_flow.rb:1631:10:1631:10 | a [element] : | array_flow.rb:1631:10:1631:15 | ...[...] | -| array_flow.rb:1631:10:1631:10 | a [element] : | array_flow.rb:1631:10:1631:15 | ...[...] | +| array_flow.rb:2:5:2:5 | a [element 0] | array_flow.rb:3:10:3:10 | a [element 0] | +| array_flow.rb:2:5:2:5 | a [element 0] | array_flow.rb:3:10:3:10 | a [element 0] | +| array_flow.rb:2:5:2:5 | a [element 0] | array_flow.rb:5:10:5:10 | a [element 0] | +| array_flow.rb:2:5:2:5 | a [element 0] | array_flow.rb:5:10:5:10 | a [element 0] | +| array_flow.rb:2:9:2:20 | * ... [element 0] | array_flow.rb:2:5:2:5 | a [element 0] | +| array_flow.rb:2:9:2:20 | * ... [element 0] | array_flow.rb:2:5:2:5 | a [element 0] | +| array_flow.rb:2:10:2:20 | call to source | array_flow.rb:2:9:2:20 | * ... [element 0] | +| array_flow.rb:2:10:2:20 | call to source | array_flow.rb:2:9:2:20 | * ... [element 0] | +| array_flow.rb:3:10:3:10 | a [element 0] | array_flow.rb:3:10:3:13 | ...[...] | +| array_flow.rb:3:10:3:10 | a [element 0] | array_flow.rb:3:10:3:13 | ...[...] | +| array_flow.rb:5:10:5:10 | a [element 0] | array_flow.rb:5:10:5:13 | ...[...] | +| array_flow.rb:5:10:5:10 | a [element 0] | array_flow.rb:5:10:5:13 | ...[...] | +| array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:11:10:11:10 | a [element 1] | +| array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:11:10:11:10 | a [element 1] | +| array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:13:10:13:10 | a [element 1] | +| array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:13:10:13:10 | a [element 1] | +| array_flow.rb:9:13:9:21 | call to source | array_flow.rb:9:5:9:5 | a [element 1] | +| array_flow.rb:9:13:9:21 | call to source | array_flow.rb:9:5:9:5 | a [element 1] | +| array_flow.rb:11:10:11:10 | a [element 1] | array_flow.rb:11:10:11:13 | ...[...] | +| array_flow.rb:11:10:11:10 | a [element 1] | array_flow.rb:11:10:11:13 | ...[...] | +| array_flow.rb:13:10:13:10 | a [element 1] | array_flow.rb:13:10:13:13 | ...[...] | +| array_flow.rb:13:10:13:10 | a [element 1] | array_flow.rb:13:10:13:13 | ...[...] | +| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:18:10:18:10 | a [element] | +| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:18:10:18:10 | a [element] | +| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:19:10:19:10 | a [element] | +| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:19:10:19:10 | a [element] | +| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:21:19:21:19 | a [element] | +| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:21:19:21:19 | a [element] | +| array_flow.rb:17:9:17:33 | call to new [element] | array_flow.rb:17:5:17:5 | a [element] | +| array_flow.rb:17:9:17:33 | call to new [element] | array_flow.rb:17:5:17:5 | a [element] | +| array_flow.rb:17:22:17:32 | call to source | array_flow.rb:17:9:17:33 | call to new [element] | +| array_flow.rb:17:22:17:32 | call to source | array_flow.rb:17:9:17:33 | call to new [element] | +| array_flow.rb:18:10:18:10 | a [element] | array_flow.rb:18:10:18:13 | ...[...] | +| array_flow.rb:18:10:18:10 | a [element] | array_flow.rb:18:10:18:13 | ...[...] | +| array_flow.rb:19:10:19:10 | a [element] | array_flow.rb:19:10:19:13 | ...[...] | +| array_flow.rb:19:10:19:10 | a [element] | array_flow.rb:19:10:19:13 | ...[...] | +| array_flow.rb:21:5:21:5 | b [element] | array_flow.rb:22:10:22:10 | b [element] | +| array_flow.rb:21:5:21:5 | b [element] | array_flow.rb:22:10:22:10 | b [element] | +| array_flow.rb:21:5:21:5 | b [element] | array_flow.rb:23:10:23:10 | b [element] | +| array_flow.rb:21:5:21:5 | b [element] | array_flow.rb:23:10:23:10 | b [element] | +| array_flow.rb:21:9:21:20 | call to new [element] | array_flow.rb:21:5:21:5 | b [element] | +| array_flow.rb:21:9:21:20 | call to new [element] | array_flow.rb:21:5:21:5 | b [element] | +| array_flow.rb:21:19:21:19 | a [element] | array_flow.rb:21:9:21:20 | call to new [element] | +| array_flow.rb:21:19:21:19 | a [element] | array_flow.rb:21:9:21:20 | call to new [element] | +| array_flow.rb:22:10:22:10 | b [element] | array_flow.rb:22:10:22:13 | ...[...] | +| array_flow.rb:22:10:22:10 | b [element] | array_flow.rb:22:10:22:13 | ...[...] | +| array_flow.rb:23:10:23:10 | b [element] | array_flow.rb:23:10:23:13 | ...[...] | +| array_flow.rb:23:10:23:10 | b [element] | array_flow.rb:23:10:23:13 | ...[...] | +| array_flow.rb:25:5:25:5 | c [element] | array_flow.rb:28:10:28:10 | c [element] | +| array_flow.rb:25:5:25:5 | c [element] | array_flow.rb:28:10:28:10 | c [element] | +| array_flow.rb:25:5:25:5 | c [element] | array_flow.rb:29:10:29:10 | c [element] | +| array_flow.rb:25:5:25:5 | c [element] | array_flow.rb:29:10:29:10 | c [element] | +| array_flow.rb:25:9:27:7 | call to new [element] | array_flow.rb:25:5:25:5 | c [element] | +| array_flow.rb:25:9:27:7 | call to new [element] | array_flow.rb:25:5:25:5 | c [element] | +| array_flow.rb:26:9:26:19 | call to source | array_flow.rb:25:9:27:7 | call to new [element] | +| array_flow.rb:26:9:26:19 | call to source | array_flow.rb:25:9:27:7 | call to new [element] | +| array_flow.rb:28:10:28:10 | c [element] | array_flow.rb:28:10:28:13 | ...[...] | +| array_flow.rb:28:10:28:10 | c [element] | array_flow.rb:28:10:28:13 | ...[...] | +| array_flow.rb:29:10:29:10 | c [element] | array_flow.rb:29:10:29:13 | ...[...] | +| array_flow.rb:29:10:29:10 | c [element] | array_flow.rb:29:10:29:13 | ...[...] | +| array_flow.rb:33:5:33:5 | a [element 0] | array_flow.rb:34:27:34:27 | a [element 0] | +| array_flow.rb:33:5:33:5 | a [element 0] | array_flow.rb:34:27:34:27 | a [element 0] | +| array_flow.rb:33:10:33:18 | call to source | array_flow.rb:33:5:33:5 | a [element 0] | +| array_flow.rb:33:10:33:18 | call to source | array_flow.rb:33:5:33:5 | a [element 0] | +| array_flow.rb:34:5:34:5 | b [element 0] | array_flow.rb:35:10:35:10 | b [element 0] | +| array_flow.rb:34:5:34:5 | b [element 0] | array_flow.rb:35:10:35:10 | b [element 0] | +| array_flow.rb:34:9:34:28 | call to try_convert [element 0] | array_flow.rb:34:5:34:5 | b [element 0] | +| array_flow.rb:34:9:34:28 | call to try_convert [element 0] | array_flow.rb:34:5:34:5 | b [element 0] | +| array_flow.rb:34:27:34:27 | a [element 0] | array_flow.rb:34:9:34:28 | call to try_convert [element 0] | +| array_flow.rb:34:27:34:27 | a [element 0] | array_flow.rb:34:9:34:28 | call to try_convert [element 0] | +| array_flow.rb:35:10:35:10 | b [element 0] | array_flow.rb:35:10:35:13 | ...[...] | +| array_flow.rb:35:10:35:10 | b [element 0] | array_flow.rb:35:10:35:13 | ...[...] | +| array_flow.rb:40:5:40:5 | a [element 0] | array_flow.rb:42:9:42:9 | a [element 0] | +| array_flow.rb:40:5:40:5 | a [element 0] | array_flow.rb:42:9:42:9 | a [element 0] | +| array_flow.rb:40:10:40:20 | call to source | array_flow.rb:40:5:40:5 | a [element 0] | +| array_flow.rb:40:10:40:20 | call to source | array_flow.rb:40:5:40:5 | a [element 0] | +| array_flow.rb:41:5:41:5 | b [element 2] | array_flow.rb:42:13:42:13 | b [element 2] | +| array_flow.rb:41:5:41:5 | b [element 2] | array_flow.rb:42:13:42:13 | b [element 2] | +| array_flow.rb:41:16:41:26 | call to source | array_flow.rb:41:5:41:5 | b [element 2] | +| array_flow.rb:41:16:41:26 | call to source | array_flow.rb:41:5:41:5 | b [element 2] | +| array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:43:10:43:10 | c [element] | +| array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:43:10:43:10 | c [element] | +| array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:44:10:44:10 | c [element] | +| array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:44:10:44:10 | c [element] | +| array_flow.rb:42:9:42:9 | a [element 0] | array_flow.rb:42:9:42:13 | ... & ... [element] | +| array_flow.rb:42:9:42:9 | a [element 0] | array_flow.rb:42:9:42:13 | ... & ... [element] | +| array_flow.rb:42:9:42:13 | ... & ... [element] | array_flow.rb:42:5:42:5 | c [element] | +| array_flow.rb:42:9:42:13 | ... & ... [element] | array_flow.rb:42:5:42:5 | c [element] | +| array_flow.rb:42:13:42:13 | b [element 2] | array_flow.rb:42:9:42:13 | ... & ... [element] | +| array_flow.rb:42:13:42:13 | b [element 2] | array_flow.rb:42:9:42:13 | ... & ... [element] | +| array_flow.rb:43:10:43:10 | c [element] | array_flow.rb:43:10:43:13 | ...[...] | +| array_flow.rb:43:10:43:10 | c [element] | array_flow.rb:43:10:43:13 | ...[...] | +| array_flow.rb:44:10:44:10 | c [element] | array_flow.rb:44:10:44:13 | ...[...] | +| array_flow.rb:44:10:44:10 | c [element] | array_flow.rb:44:10:44:13 | ...[...] | +| array_flow.rb:48:5:48:5 | a [element 0] | array_flow.rb:49:9:49:9 | a [element 0] | +| array_flow.rb:48:5:48:5 | a [element 0] | array_flow.rb:49:9:49:9 | a [element 0] | +| array_flow.rb:48:10:48:18 | call to source | array_flow.rb:48:5:48:5 | a [element 0] | +| array_flow.rb:48:10:48:18 | call to source | array_flow.rb:48:5:48:5 | a [element 0] | +| array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:50:10:50:10 | b [element] | +| array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:50:10:50:10 | b [element] | +| array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:51:10:51:10 | b [element] | +| array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:51:10:51:10 | b [element] | +| array_flow.rb:49:9:49:9 | a [element 0] | array_flow.rb:49:9:49:13 | ... * ... [element] | +| array_flow.rb:49:9:49:9 | a [element 0] | array_flow.rb:49:9:49:13 | ... * ... [element] | +| array_flow.rb:49:9:49:13 | ... * ... [element] | array_flow.rb:49:5:49:5 | b [element] | +| array_flow.rb:49:9:49:13 | ... * ... [element] | array_flow.rb:49:5:49:5 | b [element] | +| array_flow.rb:50:10:50:10 | b [element] | array_flow.rb:50:10:50:13 | ...[...] | +| array_flow.rb:50:10:50:10 | b [element] | array_flow.rb:50:10:50:13 | ...[...] | +| array_flow.rb:51:10:51:10 | b [element] | array_flow.rb:51:10:51:13 | ...[...] | +| array_flow.rb:51:10:51:10 | b [element] | array_flow.rb:51:10:51:13 | ...[...] | +| array_flow.rb:55:5:55:5 | a [element 0] | array_flow.rb:57:9:57:9 | a [element 0] | +| array_flow.rb:55:5:55:5 | a [element 0] | array_flow.rb:57:9:57:9 | a [element 0] | +| array_flow.rb:55:10:55:20 | call to source | array_flow.rb:55:5:55:5 | a [element 0] | +| array_flow.rb:55:10:55:20 | call to source | array_flow.rb:55:5:55:5 | a [element 0] | +| array_flow.rb:56:5:56:5 | b [element 1] | array_flow.rb:57:13:57:13 | b [element 1] | +| array_flow.rb:56:5:56:5 | b [element 1] | array_flow.rb:57:13:57:13 | b [element 1] | +| array_flow.rb:56:13:56:23 | call to source | array_flow.rb:56:5:56:5 | b [element 1] | +| array_flow.rb:56:13:56:23 | call to source | array_flow.rb:56:5:56:5 | b [element 1] | +| array_flow.rb:57:5:57:5 | c [element 0] | array_flow.rb:58:10:58:10 | c [element 0] | +| array_flow.rb:57:5:57:5 | c [element 0] | array_flow.rb:58:10:58:10 | c [element 0] | +| array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:58:10:58:10 | c [element] | +| array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:58:10:58:10 | c [element] | +| array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:59:10:59:10 | c [element] | +| array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:59:10:59:10 | c [element] | +| array_flow.rb:57:9:57:9 | a [element 0] | array_flow.rb:57:9:57:13 | ... + ... [element 0] | +| array_flow.rb:57:9:57:9 | a [element 0] | array_flow.rb:57:9:57:13 | ... + ... [element 0] | +| array_flow.rb:57:9:57:13 | ... + ... [element 0] | array_flow.rb:57:5:57:5 | c [element 0] | +| array_flow.rb:57:9:57:13 | ... + ... [element 0] | array_flow.rb:57:5:57:5 | c [element 0] | +| array_flow.rb:57:9:57:13 | ... + ... [element] | array_flow.rb:57:5:57:5 | c [element] | +| array_flow.rb:57:9:57:13 | ... + ... [element] | array_flow.rb:57:5:57:5 | c [element] | +| array_flow.rb:57:13:57:13 | b [element 1] | array_flow.rb:57:9:57:13 | ... + ... [element] | +| array_flow.rb:57:13:57:13 | b [element 1] | array_flow.rb:57:9:57:13 | ... + ... [element] | +| array_flow.rb:58:10:58:10 | c [element 0] | array_flow.rb:58:10:58:13 | ...[...] | +| array_flow.rb:58:10:58:10 | c [element 0] | array_flow.rb:58:10:58:13 | ...[...] | +| array_flow.rb:58:10:58:10 | c [element] | array_flow.rb:58:10:58:13 | ...[...] | +| array_flow.rb:58:10:58:10 | c [element] | array_flow.rb:58:10:58:13 | ...[...] | +| array_flow.rb:59:10:59:10 | c [element] | array_flow.rb:59:10:59:13 | ...[...] | +| array_flow.rb:59:10:59:10 | c [element] | array_flow.rb:59:10:59:13 | ...[...] | +| array_flow.rb:63:5:63:5 | a [element 0] | array_flow.rb:65:9:65:9 | a [element 0] | +| array_flow.rb:63:5:63:5 | a [element 0] | array_flow.rb:65:9:65:9 | a [element 0] | +| array_flow.rb:63:10:63:20 | call to source | array_flow.rb:63:5:63:5 | a [element 0] | +| array_flow.rb:63:10:63:20 | call to source | array_flow.rb:63:5:63:5 | a [element 0] | +| array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:66:10:66:10 | c [element] | +| array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:66:10:66:10 | c [element] | +| array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:67:10:67:10 | c [element] | +| array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:67:10:67:10 | c [element] | +| array_flow.rb:65:9:65:9 | a [element 0] | array_flow.rb:65:9:65:13 | ... - ... [element] | +| array_flow.rb:65:9:65:9 | a [element 0] | array_flow.rb:65:9:65:13 | ... - ... [element] | +| array_flow.rb:65:9:65:13 | ... - ... [element] | array_flow.rb:65:5:65:5 | c [element] | +| array_flow.rb:65:9:65:13 | ... - ... [element] | array_flow.rb:65:5:65:5 | c [element] | +| array_flow.rb:66:10:66:10 | c [element] | array_flow.rb:66:10:66:13 | ...[...] | +| array_flow.rb:66:10:66:10 | c [element] | array_flow.rb:66:10:66:13 | ...[...] | +| array_flow.rb:67:10:67:10 | c [element] | array_flow.rb:67:10:67:13 | ...[...] | +| array_flow.rb:67:10:67:10 | c [element] | array_flow.rb:67:10:67:13 | ...[...] | +| array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:72:9:72:9 | a [element 0] | +| array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:72:9:72:9 | a [element 0] | +| array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:73:10:73:10 | a [element 0] | +| array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:73:10:73:10 | a [element 0] | +| array_flow.rb:71:10:71:20 | call to source | array_flow.rb:71:5:71:5 | a [element 0] | +| array_flow.rb:71:10:71:20 | call to source | array_flow.rb:71:5:71:5 | a [element 0] | +| array_flow.rb:72:5:72:5 | b | array_flow.rb:75:10:75:10 | b | +| array_flow.rb:72:5:72:5 | b | array_flow.rb:76:10:76:10 | b | +| array_flow.rb:72:5:72:5 | b [element 0] | array_flow.rb:75:10:75:10 | b [element 0] | +| array_flow.rb:72:5:72:5 | b [element 0] | array_flow.rb:75:10:75:10 | b [element 0] | +| array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:75:10:75:10 | b [element] | +| array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:75:10:75:10 | b [element] | +| array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:76:10:76:10 | b [element] | +| array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:76:10:76:10 | b [element] | +| array_flow.rb:72:9:72:9 | [post] a [element] | array_flow.rb:73:10:73:10 | a [element] | +| array_flow.rb:72:9:72:9 | [post] a [element] | array_flow.rb:73:10:73:10 | a [element] | +| array_flow.rb:72:9:72:9 | [post] a [element] | array_flow.rb:74:10:74:10 | a [element] | +| array_flow.rb:72:9:72:9 | [post] a [element] | array_flow.rb:74:10:74:10 | a [element] | +| array_flow.rb:72:9:72:9 | a [element 0] | array_flow.rb:72:9:72:24 | ... << ... [element 0] | +| array_flow.rb:72:9:72:9 | a [element 0] | array_flow.rb:72:9:72:24 | ... << ... [element 0] | +| array_flow.rb:72:9:72:24 | ... << ... [element 0] | array_flow.rb:72:5:72:5 | b [element 0] | +| array_flow.rb:72:9:72:24 | ... << ... [element 0] | array_flow.rb:72:5:72:5 | b [element 0] | +| array_flow.rb:72:9:72:24 | ... << ... [element] | array_flow.rb:72:5:72:5 | b [element] | +| array_flow.rb:72:9:72:24 | ... << ... [element] | array_flow.rb:72:5:72:5 | b [element] | +| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:5:72:5 | b | +| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:9 | [post] a [element] | +| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:9 | [post] a [element] | +| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:24 | ... << ... [element] | +| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:24 | ... << ... [element] | +| array_flow.rb:73:10:73:10 | a [element 0] | array_flow.rb:73:10:73:13 | ...[...] | +| array_flow.rb:73:10:73:10 | a [element 0] | array_flow.rb:73:10:73:13 | ...[...] | +| array_flow.rb:73:10:73:10 | a [element] | array_flow.rb:73:10:73:13 | ...[...] | +| array_flow.rb:73:10:73:10 | a [element] | array_flow.rb:73:10:73:13 | ...[...] | +| array_flow.rb:74:10:74:10 | a [element] | array_flow.rb:74:10:74:13 | ...[...] | +| array_flow.rb:74:10:74:10 | a [element] | array_flow.rb:74:10:74:13 | ...[...] | +| array_flow.rb:75:10:75:10 | b | array_flow.rb:75:10:75:13 | ...[...] | +| array_flow.rb:75:10:75:10 | b [element 0] | array_flow.rb:75:10:75:13 | ...[...] | +| array_flow.rb:75:10:75:10 | b [element 0] | array_flow.rb:75:10:75:13 | ...[...] | +| array_flow.rb:75:10:75:10 | b [element] | array_flow.rb:75:10:75:13 | ...[...] | +| array_flow.rb:75:10:75:10 | b [element] | array_flow.rb:75:10:75:13 | ...[...] | +| array_flow.rb:76:10:76:10 | b | array_flow.rb:76:10:76:13 | ...[...] | +| array_flow.rb:76:10:76:10 | b [element] | array_flow.rb:76:10:76:13 | ...[...] | +| array_flow.rb:76:10:76:10 | b [element] | array_flow.rb:76:10:76:13 | ...[...] | +| array_flow.rb:80:5:80:5 | a [element 1] | array_flow.rb:81:15:81:15 | a [element 1] | +| array_flow.rb:80:5:80:5 | a [element 1] | array_flow.rb:81:15:81:15 | a [element 1] | +| array_flow.rb:80:13:80:21 | call to source | array_flow.rb:80:5:80:5 | a [element 1] | +| array_flow.rb:80:13:80:21 | call to source | array_flow.rb:80:5:80:5 | a [element 1] | +| array_flow.rb:81:8:81:8 | c | array_flow.rb:83:10:83:10 | c | +| array_flow.rb:81:8:81:8 | c | array_flow.rb:83:10:83:10 | c | +| array_flow.rb:81:15:81:15 | __synth__3 [element 1] | array_flow.rb:81:8:81:8 | c | +| array_flow.rb:81:15:81:15 | __synth__3 [element 1] | array_flow.rb:81:8:81:8 | c | +| array_flow.rb:81:15:81:15 | a [element 1] | array_flow.rb:81:15:81:15 | __synth__3 [element 1] | +| array_flow.rb:81:15:81:15 | a [element 1] | array_flow.rb:81:15:81:15 | __synth__3 [element 1] | +| array_flow.rb:88:5:88:5 | a [element 1] | array_flow.rb:89:9:89:9 | a [element 1] | +| array_flow.rb:88:5:88:5 | a [element 1] | array_flow.rb:89:9:89:9 | a [element 1] | +| array_flow.rb:88:13:88:22 | call to source | array_flow.rb:88:5:88:5 | a [element 1] | +| array_flow.rb:88:13:88:22 | call to source | array_flow.rb:88:5:88:5 | a [element 1] | +| array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:91:10:91:10 | b [element 1] | +| array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:91:10:91:10 | b [element 1] | +| array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:92:10:92:10 | b [element 1] | +| array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:92:10:92:10 | b [element 1] | +| array_flow.rb:89:9:89:9 | a [element 1] | array_flow.rb:89:9:89:15 | ...[...] [element 1] | +| array_flow.rb:89:9:89:9 | a [element 1] | array_flow.rb:89:9:89:15 | ...[...] [element 1] | +| array_flow.rb:89:9:89:15 | ...[...] [element 1] | array_flow.rb:89:5:89:5 | b [element 1] | +| array_flow.rb:89:9:89:15 | ...[...] [element 1] | array_flow.rb:89:5:89:5 | b [element 1] | +| array_flow.rb:91:10:91:10 | b [element 1] | array_flow.rb:91:10:91:13 | ...[...] | +| array_flow.rb:91:10:91:10 | b [element 1] | array_flow.rb:91:10:91:13 | ...[...] | +| array_flow.rb:92:10:92:10 | b [element 1] | array_flow.rb:92:10:92:13 | ...[...] | +| array_flow.rb:92:10:92:10 | b [element 1] | array_flow.rb:92:10:92:13 | ...[...] | +| array_flow.rb:96:5:96:5 | a [element 1] | array_flow.rb:97:9:97:9 | a [element 1] | +| array_flow.rb:96:5:96:5 | a [element 1] | array_flow.rb:97:9:97:9 | a [element 1] | +| array_flow.rb:96:13:96:22 | call to source | array_flow.rb:96:5:96:5 | a [element 1] | +| array_flow.rb:96:13:96:22 | call to source | array_flow.rb:96:5:96:5 | a [element 1] | +| array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:99:10:99:10 | b [element 1] | +| array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:99:10:99:10 | b [element 1] | +| array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:101:10:101:10 | b [element 1] | +| array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:101:10:101:10 | b [element 1] | +| array_flow.rb:97:9:97:9 | a [element 1] | array_flow.rb:97:9:97:15 | ...[...] [element 1] | +| array_flow.rb:97:9:97:9 | a [element 1] | array_flow.rb:97:9:97:15 | ...[...] [element 1] | +| array_flow.rb:97:9:97:15 | ...[...] [element 1] | array_flow.rb:97:5:97:5 | b [element 1] | +| array_flow.rb:97:9:97:15 | ...[...] [element 1] | array_flow.rb:97:5:97:5 | b [element 1] | +| array_flow.rb:99:10:99:10 | b [element 1] | array_flow.rb:99:10:99:13 | ...[...] | +| array_flow.rb:99:10:99:10 | b [element 1] | array_flow.rb:99:10:99:13 | ...[...] | +| array_flow.rb:101:10:101:10 | b [element 1] | array_flow.rb:101:10:101:13 | ...[...] | +| array_flow.rb:101:10:101:10 | b [element 1] | array_flow.rb:101:10:101:13 | ...[...] | +| array_flow.rb:103:5:103:5 | a [element 1] | array_flow.rb:104:9:104:9 | a [element 1] | +| array_flow.rb:103:5:103:5 | a [element 1] | array_flow.rb:104:9:104:9 | a [element 1] | +| array_flow.rb:103:13:103:24 | call to source | array_flow.rb:103:5:103:5 | a [element 1] | +| array_flow.rb:103:13:103:24 | call to source | array_flow.rb:103:5:103:5 | a [element 1] | +| array_flow.rb:104:5:104:5 | b [element 1] | array_flow.rb:106:10:106:10 | b [element 1] | +| array_flow.rb:104:5:104:5 | b [element 1] | array_flow.rb:106:10:106:10 | b [element 1] | +| array_flow.rb:104:9:104:9 | a [element 1] | array_flow.rb:104:9:104:16 | ...[...] [element 1] | +| array_flow.rb:104:9:104:9 | a [element 1] | array_flow.rb:104:9:104:16 | ...[...] [element 1] | +| array_flow.rb:104:9:104:16 | ...[...] [element 1] | array_flow.rb:104:5:104:5 | b [element 1] | +| array_flow.rb:104:9:104:16 | ...[...] [element 1] | array_flow.rb:104:5:104:5 | b [element 1] | +| array_flow.rb:106:10:106:10 | b [element 1] | array_flow.rb:106:10:106:13 | ...[...] | +| array_flow.rb:106:10:106:10 | b [element 1] | array_flow.rb:106:10:106:13 | ...[...] | +| array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:110:9:110:9 | a [element 1] | +| array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:110:9:110:9 | a [element 1] | +| array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:114:9:114:9 | a [element 1] | +| array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:114:9:114:9 | a [element 1] | +| array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:110:9:110:9 | a [element 3] | +| array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:110:9:110:9 | a [element 3] | +| array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:114:9:114:9 | a [element 3] | +| array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:114:9:114:9 | a [element 3] | +| array_flow.rb:109:13:109:24 | call to source | array_flow.rb:109:5:109:5 | a [element 1] | +| array_flow.rb:109:13:109:24 | call to source | array_flow.rb:109:5:109:5 | a [element 1] | +| array_flow.rb:109:30:109:41 | call to source | array_flow.rb:109:5:109:5 | a [element 3] | +| array_flow.rb:109:30:109:41 | call to source | array_flow.rb:109:5:109:5 | a [element 3] | +| array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:111:10:111:10 | b [element] | +| array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:111:10:111:10 | b [element] | +| array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:112:10:112:10 | b [element] | +| array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:112:10:112:10 | b [element] | +| array_flow.rb:110:9:110:9 | a [element 1] | array_flow.rb:110:9:110:18 | ...[...] [element] | +| array_flow.rb:110:9:110:9 | a [element 1] | array_flow.rb:110:9:110:18 | ...[...] [element] | +| array_flow.rb:110:9:110:9 | a [element 3] | array_flow.rb:110:9:110:18 | ...[...] [element] | +| array_flow.rb:110:9:110:9 | a [element 3] | array_flow.rb:110:9:110:18 | ...[...] [element] | +| array_flow.rb:110:9:110:18 | ...[...] [element] | array_flow.rb:110:5:110:5 | b [element] | +| array_flow.rb:110:9:110:18 | ...[...] [element] | array_flow.rb:110:5:110:5 | b [element] | +| array_flow.rb:111:10:111:10 | b [element] | array_flow.rb:111:10:111:13 | ...[...] | +| array_flow.rb:111:10:111:10 | b [element] | array_flow.rb:111:10:111:13 | ...[...] | +| array_flow.rb:112:10:112:10 | b [element] | array_flow.rb:112:10:112:13 | ...[...] | +| array_flow.rb:112:10:112:10 | b [element] | array_flow.rb:112:10:112:13 | ...[...] | +| array_flow.rb:114:5:114:5 | b [element] | array_flow.rb:115:10:115:10 | b [element] | +| array_flow.rb:114:5:114:5 | b [element] | array_flow.rb:115:10:115:10 | b [element] | +| array_flow.rb:114:5:114:5 | b [element] | array_flow.rb:116:10:116:10 | b [element] | +| array_flow.rb:114:5:114:5 | b [element] | array_flow.rb:116:10:116:10 | b [element] | +| array_flow.rb:114:9:114:9 | a [element 1] | array_flow.rb:114:9:114:19 | ...[...] [element] | +| array_flow.rb:114:9:114:9 | a [element 1] | array_flow.rb:114:9:114:19 | ...[...] [element] | +| array_flow.rb:114:9:114:9 | a [element 3] | array_flow.rb:114:9:114:19 | ...[...] [element] | +| array_flow.rb:114:9:114:9 | a [element 3] | array_flow.rb:114:9:114:19 | ...[...] [element] | +| array_flow.rb:114:9:114:19 | ...[...] [element] | array_flow.rb:114:5:114:5 | b [element] | +| array_flow.rb:114:9:114:19 | ...[...] [element] | array_flow.rb:114:5:114:5 | b [element] | +| array_flow.rb:115:10:115:10 | b [element] | array_flow.rb:115:10:115:13 | ...[...] | +| array_flow.rb:115:10:115:10 | b [element] | array_flow.rb:115:10:115:13 | ...[...] | +| array_flow.rb:116:10:116:10 | b [element] | array_flow.rb:116:10:116:13 | ...[...] | +| array_flow.rb:116:10:116:10 | b [element] | array_flow.rb:116:10:116:13 | ...[...] | +| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:122:10:122:10 | a [element] | +| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:122:10:122:10 | a [element] | +| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:123:10:123:10 | a [element] | +| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:123:10:123:10 | a [element] | +| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:124:10:124:10 | a [element] | +| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:124:10:124:10 | a [element] | +| array_flow.rb:121:15:121:24 | call to source | array_flow.rb:121:5:121:5 | [post] a [element] | +| array_flow.rb:121:15:121:24 | call to source | array_flow.rb:121:5:121:5 | [post] a [element] | +| array_flow.rb:122:10:122:10 | a [element] | array_flow.rb:122:10:122:13 | ...[...] | +| array_flow.rb:122:10:122:10 | a [element] | array_flow.rb:122:10:122:13 | ...[...] | +| array_flow.rb:123:10:123:10 | a [element] | array_flow.rb:123:10:123:13 | ...[...] | +| array_flow.rb:123:10:123:10 | a [element] | array_flow.rb:123:10:123:13 | ...[...] | +| array_flow.rb:124:10:124:10 | a [element] | array_flow.rb:124:10:124:13 | ...[...] | +| array_flow.rb:124:10:124:10 | a [element] | array_flow.rb:124:10:124:13 | ...[...] | +| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:130:10:130:10 | a [element] | +| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:130:10:130:10 | a [element] | +| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:131:10:131:10 | a [element] | +| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:131:10:131:10 | a [element] | +| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:132:10:132:10 | a [element] | +| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:132:10:132:10 | a [element] | +| array_flow.rb:129:19:129:28 | call to source | array_flow.rb:129:5:129:5 | [post] a [element] | +| array_flow.rb:129:19:129:28 | call to source | array_flow.rb:129:5:129:5 | [post] a [element] | +| array_flow.rb:130:10:130:10 | a [element] | array_flow.rb:130:10:130:13 | ...[...] | +| array_flow.rb:130:10:130:10 | a [element] | array_flow.rb:130:10:130:13 | ...[...] | +| array_flow.rb:131:10:131:10 | a [element] | array_flow.rb:131:10:131:13 | ...[...] | +| array_flow.rb:131:10:131:10 | a [element] | array_flow.rb:131:10:131:13 | ...[...] | +| array_flow.rb:132:10:132:10 | a [element] | array_flow.rb:132:10:132:13 | ...[...] | +| array_flow.rb:132:10:132:10 | a [element] | array_flow.rb:132:10:132:13 | ...[...] | +| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:138:10:138:10 | a [element] | +| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:138:10:138:10 | a [element] | +| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:139:10:139:10 | a [element] | +| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:139:10:139:10 | a [element] | +| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:140:10:140:10 | a [element] | +| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:140:10:140:10 | a [element] | +| array_flow.rb:137:15:137:24 | call to source | array_flow.rb:137:5:137:5 | [post] a [element] | +| array_flow.rb:137:15:137:24 | call to source | array_flow.rb:137:5:137:5 | [post] a [element] | +| array_flow.rb:138:10:138:10 | a [element] | array_flow.rb:138:10:138:13 | ...[...] | +| array_flow.rb:138:10:138:10 | a [element] | array_flow.rb:138:10:138:13 | ...[...] | +| array_flow.rb:139:10:139:10 | a [element] | array_flow.rb:139:10:139:13 | ...[...] | +| array_flow.rb:139:10:139:10 | a [element] | array_flow.rb:139:10:139:13 | ...[...] | +| array_flow.rb:140:10:140:10 | a [element] | array_flow.rb:140:10:140:13 | ...[...] | +| array_flow.rb:140:10:140:10 | a [element] | array_flow.rb:140:10:140:13 | ...[...] | +| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:146:10:146:10 | a [element] | +| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:146:10:146:10 | a [element] | +| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:147:10:147:10 | a [element] | +| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:147:10:147:10 | a [element] | +| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:148:10:148:10 | a [element] | +| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:148:10:148:10 | a [element] | +| array_flow.rb:145:19:145:28 | call to source | array_flow.rb:145:5:145:5 | [post] a [element] | +| array_flow.rb:145:19:145:28 | call to source | array_flow.rb:145:5:145:5 | [post] a [element] | +| array_flow.rb:146:10:146:10 | a [element] | array_flow.rb:146:10:146:13 | ...[...] | +| array_flow.rb:146:10:146:10 | a [element] | array_flow.rb:146:10:146:13 | ...[...] | +| array_flow.rb:147:10:147:10 | a [element] | array_flow.rb:147:10:147:13 | ...[...] | +| array_flow.rb:147:10:147:10 | a [element] | array_flow.rb:147:10:147:13 | ...[...] | +| array_flow.rb:148:10:148:10 | a [element] | array_flow.rb:148:10:148:13 | ...[...] | +| array_flow.rb:148:10:148:10 | a [element] | array_flow.rb:148:10:148:13 | ...[...] | +| array_flow.rb:152:5:152:5 | a [element 2] | array_flow.rb:153:5:153:5 | a [element 2] | +| array_flow.rb:152:5:152:5 | a [element 2] | array_flow.rb:153:5:153:5 | a [element 2] | +| array_flow.rb:152:16:152:25 | call to source | array_flow.rb:152:5:152:5 | a [element 2] | +| array_flow.rb:152:16:152:25 | call to source | array_flow.rb:152:5:152:5 | a [element 2] | +| array_flow.rb:153:5:153:5 | a [element 2] | array_flow.rb:153:16:153:16 | x | +| array_flow.rb:153:5:153:5 | a [element 2] | array_flow.rb:153:16:153:16 | x | +| array_flow.rb:153:16:153:16 | x | array_flow.rb:154:14:154:14 | x | +| array_flow.rb:153:16:153:16 | x | array_flow.rb:154:14:154:14 | x | +| array_flow.rb:159:5:159:5 | a [element 2] | array_flow.rb:160:5:160:5 | a [element 2] | +| array_flow.rb:159:5:159:5 | a [element 2] | array_flow.rb:160:5:160:5 | a [element 2] | +| array_flow.rb:159:16:159:25 | call to source | array_flow.rb:159:5:159:5 | a [element 2] | +| array_flow.rb:159:16:159:25 | call to source | array_flow.rb:159:5:159:5 | a [element 2] | +| array_flow.rb:160:5:160:5 | a [element 2] | array_flow.rb:160:16:160:16 | x | +| array_flow.rb:160:5:160:5 | a [element 2] | array_flow.rb:160:16:160:16 | x | +| array_flow.rb:160:16:160:16 | x | array_flow.rb:161:14:161:14 | x | +| array_flow.rb:160:16:160:16 | x | array_flow.rb:161:14:161:14 | x | +| array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:167:9:167:9 | a [element 0] | +| array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:167:9:167:9 | a [element 0] | +| array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:168:10:168:10 | a [element 0] | +| array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:168:10:168:10 | a [element 0] | +| array_flow.rb:166:10:166:21 | call to source | array_flow.rb:166:5:166:5 | a [element 0] | +| array_flow.rb:166:10:166:21 | call to source | array_flow.rb:166:5:166:5 | a [element 0] | +| array_flow.rb:167:5:167:5 | b [element 0] | array_flow.rb:170:10:170:10 | b [element 0] | +| array_flow.rb:167:5:167:5 | b [element 0] | array_flow.rb:170:10:170:10 | b [element 0] | +| array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:170:10:170:10 | b [element] | +| array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:170:10:170:10 | b [element] | +| array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:171:10:171:10 | b [element] | +| array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:171:10:171:10 | b [element] | +| array_flow.rb:167:9:167:9 | [post] a [element] | array_flow.rb:168:10:168:10 | a [element] | +| array_flow.rb:167:9:167:9 | [post] a [element] | array_flow.rb:168:10:168:10 | a [element] | +| array_flow.rb:167:9:167:9 | [post] a [element] | array_flow.rb:169:10:169:10 | a [element] | +| array_flow.rb:167:9:167:9 | [post] a [element] | array_flow.rb:169:10:169:10 | a [element] | +| array_flow.rb:167:9:167:9 | a [element 0] | array_flow.rb:167:9:167:44 | call to append [element 0] | +| array_flow.rb:167:9:167:9 | a [element 0] | array_flow.rb:167:9:167:44 | call to append [element 0] | +| array_flow.rb:167:9:167:44 | call to append [element 0] | array_flow.rb:167:5:167:5 | b [element 0] | +| array_flow.rb:167:9:167:44 | call to append [element 0] | array_flow.rb:167:5:167:5 | b [element 0] | +| array_flow.rb:167:9:167:44 | call to append [element] | array_flow.rb:167:5:167:5 | b [element] | +| array_flow.rb:167:9:167:44 | call to append [element] | array_flow.rb:167:5:167:5 | b [element] | +| array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:9 | [post] a [element] | +| array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:9 | [post] a [element] | +| array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:44 | call to append [element] | +| array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:44 | call to append [element] | +| array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:9 | [post] a [element] | +| array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:9 | [post] a [element] | +| array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:44 | call to append [element] | +| array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:44 | call to append [element] | +| array_flow.rb:168:10:168:10 | a [element 0] | array_flow.rb:168:10:168:13 | ...[...] | +| array_flow.rb:168:10:168:10 | a [element 0] | array_flow.rb:168:10:168:13 | ...[...] | +| array_flow.rb:168:10:168:10 | a [element] | array_flow.rb:168:10:168:13 | ...[...] | +| array_flow.rb:168:10:168:10 | a [element] | array_flow.rb:168:10:168:13 | ...[...] | +| array_flow.rb:169:10:169:10 | a [element] | array_flow.rb:169:10:169:13 | ...[...] | +| array_flow.rb:169:10:169:10 | a [element] | array_flow.rb:169:10:169:13 | ...[...] | +| array_flow.rb:170:10:170:10 | b [element 0] | array_flow.rb:170:10:170:13 | ...[...] | +| array_flow.rb:170:10:170:10 | b [element 0] | array_flow.rb:170:10:170:13 | ...[...] | +| array_flow.rb:170:10:170:10 | b [element] | array_flow.rb:170:10:170:13 | ...[...] | +| array_flow.rb:170:10:170:10 | b [element] | array_flow.rb:170:10:170:13 | ...[...] | +| array_flow.rb:171:10:171:10 | b [element] | array_flow.rb:171:10:171:13 | ...[...] | +| array_flow.rb:171:10:171:10 | b [element] | array_flow.rb:171:10:171:13 | ...[...] | +| array_flow.rb:177:5:177:5 | c [element 1] | array_flow.rb:178:16:178:16 | c [element 1] | +| array_flow.rb:177:5:177:5 | c [element 1] | array_flow.rb:178:16:178:16 | c [element 1] | +| array_flow.rb:177:15:177:24 | call to source | array_flow.rb:177:5:177:5 | c [element 1] | +| array_flow.rb:177:15:177:24 | call to source | array_flow.rb:177:5:177:5 | c [element 1] | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:179:11:179:11 | d [element 2, element 1] | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:179:11:179:11 | d [element 2, element 1] | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:180:11:180:11 | d [element 2, element 1] | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:180:11:180:11 | d [element 2, element 1] | +| array_flow.rb:178:16:178:16 | c [element 1] | array_flow.rb:178:5:178:5 | d [element 2, element 1] | +| array_flow.rb:178:16:178:16 | c [element 1] | array_flow.rb:178:5:178:5 | d [element 2, element 1] | +| array_flow.rb:179:11:179:11 | d [element 2, element 1] | array_flow.rb:179:11:179:22 | call to assoc [element 1] | +| array_flow.rb:179:11:179:11 | d [element 2, element 1] | array_flow.rb:179:11:179:22 | call to assoc [element 1] | +| array_flow.rb:179:11:179:22 | call to assoc [element 1] | array_flow.rb:179:11:179:25 | ...[...] | +| array_flow.rb:179:11:179:22 | call to assoc [element 1] | array_flow.rb:179:11:179:25 | ...[...] | +| array_flow.rb:179:11:179:25 | ...[...] | array_flow.rb:179:10:179:26 | ( ... ) | +| array_flow.rb:179:11:179:25 | ...[...] | array_flow.rb:179:10:179:26 | ( ... ) | +| array_flow.rb:180:11:180:11 | d [element 2, element 1] | array_flow.rb:180:11:180:22 | call to assoc [element 1] | +| array_flow.rb:180:11:180:11 | d [element 2, element 1] | array_flow.rb:180:11:180:22 | call to assoc [element 1] | +| array_flow.rb:180:11:180:22 | call to assoc [element 1] | array_flow.rb:180:11:180:25 | ...[...] | +| array_flow.rb:180:11:180:22 | call to assoc [element 1] | array_flow.rb:180:11:180:25 | ...[...] | +| array_flow.rb:180:11:180:25 | ...[...] | array_flow.rb:180:10:180:26 | ( ... ) | +| array_flow.rb:180:11:180:25 | ...[...] | array_flow.rb:180:10:180:26 | ( ... ) | +| array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:186:10:186:10 | a [element 1] | +| array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:186:10:186:10 | a [element 1] | +| array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:188:10:188:10 | a [element 1] | +| array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:188:10:188:10 | a [element 1] | +| array_flow.rb:184:13:184:22 | call to source | array_flow.rb:184:5:184:5 | a [element 1] | +| array_flow.rb:184:13:184:22 | call to source | array_flow.rb:184:5:184:5 | a [element 1] | +| array_flow.rb:186:10:186:10 | a [element 1] | array_flow.rb:186:10:186:16 | call to at | +| array_flow.rb:186:10:186:10 | a [element 1] | array_flow.rb:186:10:186:16 | call to at | +| array_flow.rb:188:10:188:10 | a [element 1] | array_flow.rb:188:10:188:16 | call to at | +| array_flow.rb:188:10:188:10 | a [element 1] | array_flow.rb:188:10:188:16 | call to at | +| array_flow.rb:192:5:192:5 | a [element 2] | array_flow.rb:193:9:193:9 | a [element 2] | +| array_flow.rb:192:5:192:5 | a [element 2] | array_flow.rb:193:9:193:9 | a [element 2] | +| array_flow.rb:192:16:192:25 | call to source | array_flow.rb:192:5:192:5 | a [element 2] | +| array_flow.rb:192:16:192:25 | call to source | array_flow.rb:192:5:192:5 | a [element 2] | +| array_flow.rb:193:5:193:5 | b | array_flow.rb:196:10:196:10 | b | +| array_flow.rb:193:5:193:5 | b | array_flow.rb:196:10:196:10 | b | +| array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:9:195:7 | call to bsearch | +| array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:9:195:7 | call to bsearch | +| array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:23:193:23 | x | +| array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:23:193:23 | x | +| array_flow.rb:193:9:195:7 | call to bsearch | array_flow.rb:193:5:193:5 | b | +| array_flow.rb:193:9:195:7 | call to bsearch | array_flow.rb:193:5:193:5 | b | +| array_flow.rb:193:23:193:23 | x | array_flow.rb:194:14:194:14 | x | +| array_flow.rb:193:23:193:23 | x | array_flow.rb:194:14:194:14 | x | +| array_flow.rb:200:5:200:5 | a [element 2] | array_flow.rb:201:9:201:9 | a [element 2] | +| array_flow.rb:200:5:200:5 | a [element 2] | array_flow.rb:201:9:201:9 | a [element 2] | +| array_flow.rb:200:16:200:25 | call to source | array_flow.rb:200:5:200:5 | a [element 2] | +| array_flow.rb:200:16:200:25 | call to source | array_flow.rb:200:5:200:5 | a [element 2] | +| array_flow.rb:201:9:201:9 | a [element 2] | array_flow.rb:201:29:201:29 | x | +| array_flow.rb:201:9:201:9 | a [element 2] | array_flow.rb:201:29:201:29 | x | +| array_flow.rb:201:29:201:29 | x | array_flow.rb:202:14:202:14 | x | +| array_flow.rb:201:29:201:29 | x | array_flow.rb:202:14:202:14 | x | +| array_flow.rb:208:5:208:5 | a [element 2] | array_flow.rb:209:5:209:5 | a [element 2] | +| array_flow.rb:208:5:208:5 | a [element 2] | array_flow.rb:209:5:209:5 | a [element 2] | +| array_flow.rb:208:16:208:25 | call to source | array_flow.rb:208:5:208:5 | a [element 2] | +| array_flow.rb:208:16:208:25 | call to source | array_flow.rb:208:5:208:5 | a [element 2] | +| array_flow.rb:209:5:209:5 | a [element 2] | array_flow.rb:209:17:209:17 | x | +| array_flow.rb:209:5:209:5 | a [element 2] | array_flow.rb:209:17:209:17 | x | +| array_flow.rb:209:17:209:17 | x | array_flow.rb:210:14:210:14 | x | +| array_flow.rb:209:17:209:17 | x | array_flow.rb:210:14:210:14 | x | +| array_flow.rb:215:5:215:5 | a [element 2] | array_flow.rb:216:9:216:9 | a [element 2] | +| array_flow.rb:215:5:215:5 | a [element 2] | array_flow.rb:216:9:216:9 | a [element 2] | +| array_flow.rb:215:5:215:5 | a [element 3] | array_flow.rb:216:9:216:9 | a [element 3] | +| array_flow.rb:215:5:215:5 | a [element 3] | array_flow.rb:216:9:216:9 | a [element 3] | +| array_flow.rb:215:16:215:27 | call to source | array_flow.rb:215:5:215:5 | a [element 2] | +| array_flow.rb:215:16:215:27 | call to source | array_flow.rb:215:5:215:5 | a [element 2] | +| array_flow.rb:215:30:215:41 | call to source | array_flow.rb:215:5:215:5 | a [element 3] | +| array_flow.rb:215:30:215:41 | call to source | array_flow.rb:215:5:215:5 | a [element 3] | +| array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:27:216:27 | x | +| array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:27:216:27 | x | +| array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:30:216:30 | y | +| array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:30:216:30 | y | +| array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:27:216:27 | x | +| array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:27:216:27 | x | +| array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:30:216:30 | y | +| array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:30:216:30 | y | +| array_flow.rb:216:27:216:27 | x | array_flow.rb:217:14:217:14 | x | +| array_flow.rb:216:27:216:27 | x | array_flow.rb:217:14:217:14 | x | +| array_flow.rb:216:30:216:30 | y | array_flow.rb:218:14:218:14 | y | +| array_flow.rb:216:30:216:30 | y | array_flow.rb:218:14:218:14 | y | +| array_flow.rb:231:5:231:5 | a [element 2] | array_flow.rb:232:9:232:9 | a [element 2] | +| array_flow.rb:231:5:231:5 | a [element 2] | array_flow.rb:232:9:232:9 | a [element 2] | +| array_flow.rb:231:16:231:27 | call to source | array_flow.rb:231:5:231:5 | a [element 2] | +| array_flow.rb:231:16:231:27 | call to source | array_flow.rb:231:5:231:5 | a [element 2] | +| array_flow.rb:232:5:232:5 | b [element] | array_flow.rb:236:10:236:10 | b [element] | +| array_flow.rb:232:5:232:5 | b [element] | array_flow.rb:236:10:236:10 | b [element] | +| array_flow.rb:232:9:232:9 | a [element 2] | array_flow.rb:232:23:232:23 | x | +| array_flow.rb:232:9:232:9 | a [element 2] | array_flow.rb:232:23:232:23 | x | +| array_flow.rb:232:9:235:7 | call to collect [element] | array_flow.rb:232:5:232:5 | b [element] | +| array_flow.rb:232:9:235:7 | call to collect [element] | array_flow.rb:232:5:232:5 | b [element] | +| array_flow.rb:232:23:232:23 | x | array_flow.rb:233:14:233:14 | x | +| array_flow.rb:232:23:232:23 | x | array_flow.rb:233:14:233:14 | x | +| array_flow.rb:234:9:234:19 | call to source | array_flow.rb:232:9:235:7 | call to collect [element] | +| array_flow.rb:234:9:234:19 | call to source | array_flow.rb:232:9:235:7 | call to collect [element] | +| array_flow.rb:236:10:236:10 | b [element] | array_flow.rb:236:10:236:13 | ...[...] | +| array_flow.rb:236:10:236:10 | b [element] | array_flow.rb:236:10:236:13 | ...[...] | +| array_flow.rb:240:5:240:5 | a [element 2] | array_flow.rb:241:9:241:9 | a [element 2] | +| array_flow.rb:240:5:240:5 | a [element 2] | array_flow.rb:241:9:241:9 | a [element 2] | +| array_flow.rb:240:16:240:27 | call to source | array_flow.rb:240:5:240:5 | a [element 2] | +| array_flow.rb:240:16:240:27 | call to source | array_flow.rb:240:5:240:5 | a [element 2] | +| array_flow.rb:241:5:241:5 | b [element] | array_flow.rb:246:10:246:10 | b [element] | +| array_flow.rb:241:5:241:5 | b [element] | array_flow.rb:246:10:246:10 | b [element] | +| array_flow.rb:241:9:241:9 | [post] a [element] | array_flow.rb:245:10:245:10 | a [element] | +| array_flow.rb:241:9:241:9 | [post] a [element] | array_flow.rb:245:10:245:10 | a [element] | +| array_flow.rb:241:9:241:9 | a [element 2] | array_flow.rb:241:24:241:24 | x | +| array_flow.rb:241:9:241:9 | a [element 2] | array_flow.rb:241:24:241:24 | x | +| array_flow.rb:241:9:244:7 | call to collect! [element] | array_flow.rb:241:5:241:5 | b [element] | +| array_flow.rb:241:9:244:7 | call to collect! [element] | array_flow.rb:241:5:241:5 | b [element] | +| array_flow.rb:241:24:241:24 | x | array_flow.rb:242:14:242:14 | x | +| array_flow.rb:241:24:241:24 | x | array_flow.rb:242:14:242:14 | x | +| array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:241:9 | [post] a [element] | +| array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:241:9 | [post] a [element] | +| array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:244:7 | call to collect! [element] | +| array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:244:7 | call to collect! [element] | +| array_flow.rb:245:10:245:10 | a [element] | array_flow.rb:245:10:245:13 | ...[...] | +| array_flow.rb:245:10:245:10 | a [element] | array_flow.rb:245:10:245:13 | ...[...] | +| array_flow.rb:246:10:246:10 | b [element] | array_flow.rb:246:10:246:13 | ...[...] | +| array_flow.rb:246:10:246:10 | b [element] | array_flow.rb:246:10:246:13 | ...[...] | +| array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:251:9:251:9 | a [element 2] | +| array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:251:9:251:9 | a [element 2] | +| array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:256:9:256:9 | a [element 2] | +| array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:256:9:256:9 | a [element 2] | +| array_flow.rb:250:16:250:27 | call to source | array_flow.rb:250:5:250:5 | a [element 2] | +| array_flow.rb:250:16:250:27 | call to source | array_flow.rb:250:5:250:5 | a [element 2] | +| array_flow.rb:251:5:251:5 | b [element] | array_flow.rb:255:10:255:10 | b [element] | +| array_flow.rb:251:5:251:5 | b [element] | array_flow.rb:255:10:255:10 | b [element] | +| array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:9:254:7 | call to collect_concat [element] | +| array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:9:254:7 | call to collect_concat [element] | +| array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:30:251:30 | x | +| array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:30:251:30 | x | +| array_flow.rb:251:9:254:7 | call to collect_concat [element] | array_flow.rb:251:5:251:5 | b [element] | +| array_flow.rb:251:9:254:7 | call to collect_concat [element] | array_flow.rb:251:5:251:5 | b [element] | +| array_flow.rb:251:30:251:30 | x | array_flow.rb:252:14:252:14 | x | +| array_flow.rb:251:30:251:30 | x | array_flow.rb:252:14:252:14 | x | +| array_flow.rb:253:13:253:24 | call to source | array_flow.rb:251:9:254:7 | call to collect_concat [element] | +| array_flow.rb:253:13:253:24 | call to source | array_flow.rb:251:9:254:7 | call to collect_concat [element] | +| array_flow.rb:255:10:255:10 | b [element] | array_flow.rb:255:10:255:13 | ...[...] | +| array_flow.rb:255:10:255:10 | b [element] | array_flow.rb:255:10:255:13 | ...[...] | +| array_flow.rb:256:5:256:5 | b [element] | array_flow.rb:260:10:260:10 | b [element] | +| array_flow.rb:256:5:256:5 | b [element] | array_flow.rb:260:10:260:10 | b [element] | +| array_flow.rb:256:9:256:9 | a [element 2] | array_flow.rb:256:30:256:30 | x | +| array_flow.rb:256:9:256:9 | a [element 2] | array_flow.rb:256:30:256:30 | x | +| array_flow.rb:256:9:259:7 | call to collect_concat [element] | array_flow.rb:256:5:256:5 | b [element] | +| array_flow.rb:256:9:259:7 | call to collect_concat [element] | array_flow.rb:256:5:256:5 | b [element] | +| array_flow.rb:256:30:256:30 | x | array_flow.rb:257:14:257:14 | x | +| array_flow.rb:256:30:256:30 | x | array_flow.rb:257:14:257:14 | x | +| array_flow.rb:258:9:258:20 | call to source | array_flow.rb:256:9:259:7 | call to collect_concat [element] | +| array_flow.rb:258:9:258:20 | call to source | array_flow.rb:256:9:259:7 | call to collect_concat [element] | +| array_flow.rb:260:10:260:10 | b [element] | array_flow.rb:260:10:260:13 | ...[...] | +| array_flow.rb:260:10:260:10 | b [element] | array_flow.rb:260:10:260:13 | ...[...] | +| array_flow.rb:264:5:264:5 | a [element 2] | array_flow.rb:265:9:265:9 | a [element 2] | +| array_flow.rb:264:5:264:5 | a [element 2] | array_flow.rb:265:9:265:9 | a [element 2] | +| array_flow.rb:264:16:264:25 | call to source | array_flow.rb:264:5:264:5 | a [element 2] | +| array_flow.rb:264:16:264:25 | call to source | array_flow.rb:264:5:264:5 | a [element 2] | +| array_flow.rb:265:5:265:5 | b [element 2] | array_flow.rb:269:10:269:10 | b [element 2] | +| array_flow.rb:265:5:265:5 | b [element 2] | array_flow.rb:269:10:269:10 | b [element 2] | +| array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:9:267:7 | call to combination [element 2] | +| array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:9:267:7 | call to combination [element 2] | +| array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:30:265:30 | x [element] | +| array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:30:265:30 | x [element] | +| array_flow.rb:265:9:267:7 | call to combination [element 2] | array_flow.rb:265:5:265:5 | b [element 2] | +| array_flow.rb:265:9:267:7 | call to combination [element 2] | array_flow.rb:265:5:265:5 | b [element 2] | +| array_flow.rb:265:30:265:30 | x [element] | array_flow.rb:266:14:266:14 | x [element] | +| array_flow.rb:265:30:265:30 | x [element] | array_flow.rb:266:14:266:14 | x [element] | +| array_flow.rb:266:14:266:14 | x [element] | array_flow.rb:266:14:266:17 | ...[...] | +| array_flow.rb:266:14:266:14 | x [element] | array_flow.rb:266:14:266:17 | ...[...] | +| array_flow.rb:269:10:269:10 | b [element 2] | array_flow.rb:269:10:269:13 | ...[...] | +| array_flow.rb:269:10:269:10 | b [element 2] | array_flow.rb:269:10:269:13 | ...[...] | +| array_flow.rb:273:5:273:5 | a [element 2] | array_flow.rb:274:9:274:9 | a [element 2] | +| array_flow.rb:273:5:273:5 | a [element 2] | array_flow.rb:274:9:274:9 | a [element 2] | +| array_flow.rb:273:16:273:25 | call to source | array_flow.rb:273:5:273:5 | a [element 2] | +| array_flow.rb:273:16:273:25 | call to source | array_flow.rb:273:5:273:5 | a [element 2] | +| array_flow.rb:274:5:274:5 | b [element] | array_flow.rb:275:10:275:10 | b [element] | +| array_flow.rb:274:5:274:5 | b [element] | array_flow.rb:275:10:275:10 | b [element] | +| array_flow.rb:274:9:274:9 | a [element 2] | array_flow.rb:274:9:274:17 | call to compact [element] | +| array_flow.rb:274:9:274:9 | a [element 2] | array_flow.rb:274:9:274:17 | call to compact [element] | +| array_flow.rb:274:9:274:17 | call to compact [element] | array_flow.rb:274:5:274:5 | b [element] | +| array_flow.rb:274:9:274:17 | call to compact [element] | array_flow.rb:274:5:274:5 | b [element] | +| array_flow.rb:275:10:275:10 | b [element] | array_flow.rb:275:10:275:13 | ...[...] | +| array_flow.rb:275:10:275:10 | b [element] | array_flow.rb:275:10:275:13 | ...[...] | +| array_flow.rb:279:5:279:5 | a [element 2] | array_flow.rb:280:9:280:9 | a [element 2] | +| array_flow.rb:279:5:279:5 | a [element 2] | array_flow.rb:280:9:280:9 | a [element 2] | +| array_flow.rb:279:16:279:25 | call to source | array_flow.rb:279:5:279:5 | a [element 2] | +| array_flow.rb:279:16:279:25 | call to source | array_flow.rb:279:5:279:5 | a [element 2] | +| array_flow.rb:280:5:280:5 | b [element] | array_flow.rb:282:10:282:10 | b [element] | +| array_flow.rb:280:5:280:5 | b [element] | array_flow.rb:282:10:282:10 | b [element] | +| array_flow.rb:280:9:280:9 | [post] a [element] | array_flow.rb:281:10:281:10 | a [element] | +| array_flow.rb:280:9:280:9 | [post] a [element] | array_flow.rb:281:10:281:10 | a [element] | +| array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:9 | [post] a [element] | +| array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:9 | [post] a [element] | +| array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:18 | call to compact! [element] | +| array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:18 | call to compact! [element] | +| array_flow.rb:280:9:280:18 | call to compact! [element] | array_flow.rb:280:5:280:5 | b [element] | +| array_flow.rb:280:9:280:18 | call to compact! [element] | array_flow.rb:280:5:280:5 | b [element] | +| array_flow.rb:281:10:281:10 | a [element] | array_flow.rb:281:10:281:13 | ...[...] | +| array_flow.rb:281:10:281:10 | a [element] | array_flow.rb:281:10:281:13 | ...[...] | +| array_flow.rb:282:10:282:10 | b [element] | array_flow.rb:282:10:282:13 | ...[...] | +| array_flow.rb:282:10:282:10 | b [element] | array_flow.rb:282:10:282:13 | ...[...] | +| array_flow.rb:286:5:286:5 | a [element 2] | array_flow.rb:290:10:290:10 | a [element 2] | +| array_flow.rb:286:5:286:5 | a [element 2] | array_flow.rb:290:10:290:10 | a [element 2] | +| array_flow.rb:286:16:286:27 | call to source | array_flow.rb:286:5:286:5 | a [element 2] | +| array_flow.rb:286:16:286:27 | call to source | array_flow.rb:286:5:286:5 | a [element 2] | +| array_flow.rb:287:5:287:5 | b [element 2] | array_flow.rb:288:14:288:14 | b [element 2] | +| array_flow.rb:287:5:287:5 | b [element 2] | array_flow.rb:288:14:288:14 | b [element 2] | +| array_flow.rb:287:16:287:27 | call to source | array_flow.rb:287:5:287:5 | b [element 2] | +| array_flow.rb:287:16:287:27 | call to source | array_flow.rb:287:5:287:5 | b [element 2] | +| array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:289:10:289:10 | a [element] | +| array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:289:10:289:10 | a [element] | +| array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:290:10:290:10 | a [element] | +| array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:290:10:290:10 | a [element] | +| array_flow.rb:288:14:288:14 | b [element 2] | array_flow.rb:288:5:288:5 | [post] a [element] | +| array_flow.rb:288:14:288:14 | b [element 2] | array_flow.rb:288:5:288:5 | [post] a [element] | +| array_flow.rb:289:10:289:10 | a [element] | array_flow.rb:289:10:289:13 | ...[...] | +| array_flow.rb:289:10:289:10 | a [element] | array_flow.rb:289:10:289:13 | ...[...] | +| array_flow.rb:290:10:290:10 | a [element 2] | array_flow.rb:290:10:290:13 | ...[...] | +| array_flow.rb:290:10:290:10 | a [element 2] | array_flow.rb:290:10:290:13 | ...[...] | +| array_flow.rb:290:10:290:10 | a [element] | array_flow.rb:290:10:290:13 | ...[...] | +| array_flow.rb:290:10:290:10 | a [element] | array_flow.rb:290:10:290:13 | ...[...] | +| array_flow.rb:294:5:294:5 | a [element 2] | array_flow.rb:295:5:295:5 | a [element 2] | +| array_flow.rb:294:5:294:5 | a [element 2] | array_flow.rb:295:5:295:5 | a [element 2] | +| array_flow.rb:294:16:294:25 | call to source | array_flow.rb:294:5:294:5 | a [element 2] | +| array_flow.rb:294:16:294:25 | call to source | array_flow.rb:294:5:294:5 | a [element 2] | +| array_flow.rb:295:5:295:5 | a [element 2] | array_flow.rb:295:17:295:17 | x | +| array_flow.rb:295:5:295:5 | a [element 2] | array_flow.rb:295:17:295:17 | x | +| array_flow.rb:295:17:295:17 | x | array_flow.rb:296:14:296:14 | x | +| array_flow.rb:295:17:295:17 | x | array_flow.rb:296:14:296:14 | x | +| array_flow.rb:301:5:301:5 | a [element 2] | array_flow.rb:302:5:302:5 | a [element 2] | +| array_flow.rb:301:5:301:5 | a [element 2] | array_flow.rb:302:5:302:5 | a [element 2] | +| array_flow.rb:301:16:301:25 | call to source | array_flow.rb:301:5:301:5 | a [element 2] | +| array_flow.rb:301:16:301:25 | call to source | array_flow.rb:301:5:301:5 | a [element 2] | +| array_flow.rb:302:5:302:5 | a [element 2] | array_flow.rb:302:20:302:20 | x | +| array_flow.rb:302:5:302:5 | a [element 2] | array_flow.rb:302:20:302:20 | x | +| array_flow.rb:302:20:302:20 | x | array_flow.rb:303:14:303:14 | x | +| array_flow.rb:302:20:302:20 | x | array_flow.rb:303:14:303:14 | x | +| array_flow.rb:308:5:308:5 | a [element 2] | array_flow.rb:309:9:309:9 | a [element 2] | +| array_flow.rb:308:5:308:5 | a [element 2] | array_flow.rb:309:9:309:9 | a [element 2] | +| array_flow.rb:308:16:308:25 | call to source | array_flow.rb:308:5:308:5 | a [element 2] | +| array_flow.rb:308:16:308:25 | call to source | array_flow.rb:308:5:308:5 | a [element 2] | +| array_flow.rb:309:5:309:5 | b [element 2] | array_flow.rb:312:10:312:10 | b [element 2] | +| array_flow.rb:309:5:309:5 | b [element 2] | array_flow.rb:312:10:312:10 | b [element 2] | +| array_flow.rb:309:9:309:9 | a [element 2] | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | +| array_flow.rb:309:9:309:9 | a [element 2] | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | +| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | array_flow.rb:309:5:309:5 | b [element 2] | +| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | array_flow.rb:309:5:309:5 | b [element 2] | +| array_flow.rb:312:10:312:10 | b [element 2] | array_flow.rb:312:10:312:13 | ...[...] | +| array_flow.rb:312:10:312:10 | b [element 2] | array_flow.rb:312:10:312:13 | ...[...] | +| array_flow.rb:316:5:316:5 | a [element 2] | array_flow.rb:317:9:317:9 | a [element 2] | +| array_flow.rb:316:5:316:5 | a [element 2] | array_flow.rb:317:9:317:9 | a [element 2] | +| array_flow.rb:316:16:316:27 | call to source | array_flow.rb:316:5:316:5 | a [element 2] | +| array_flow.rb:316:16:316:27 | call to source | array_flow.rb:316:5:316:5 | a [element 2] | +| array_flow.rb:317:5:317:5 | b | array_flow.rb:318:10:318:10 | b | +| array_flow.rb:317:5:317:5 | b | array_flow.rb:318:10:318:10 | b | +| array_flow.rb:317:9:317:9 | a [element 2] | array_flow.rb:317:9:317:36 | call to delete | +| array_flow.rb:317:9:317:9 | a [element 2] | array_flow.rb:317:9:317:36 | call to delete | +| array_flow.rb:317:9:317:36 | call to delete | array_flow.rb:317:5:317:5 | b | +| array_flow.rb:317:9:317:36 | call to delete | array_flow.rb:317:5:317:5 | b | +| array_flow.rb:317:23:317:34 | call to source | array_flow.rb:317:9:317:36 | call to delete | +| array_flow.rb:317:23:317:34 | call to source | array_flow.rb:317:9:317:36 | call to delete | +| array_flow.rb:325:5:325:5 | a [element 2] | array_flow.rb:326:9:326:9 | a [element 2] | +| array_flow.rb:325:5:325:5 | a [element 2] | array_flow.rb:326:9:326:9 | a [element 2] | +| array_flow.rb:325:5:325:5 | a [element 3] | array_flow.rb:326:9:326:9 | a [element 3] | +| array_flow.rb:325:5:325:5 | a [element 3] | array_flow.rb:326:9:326:9 | a [element 3] | +| array_flow.rb:325:16:325:27 | call to source | array_flow.rb:325:5:325:5 | a [element 2] | +| array_flow.rb:325:16:325:27 | call to source | array_flow.rb:325:5:325:5 | a [element 2] | +| array_flow.rb:325:30:325:41 | call to source | array_flow.rb:325:5:325:5 | a [element 3] | +| array_flow.rb:325:30:325:41 | call to source | array_flow.rb:325:5:325:5 | a [element 3] | +| array_flow.rb:326:5:326:5 | b | array_flow.rb:327:10:327:10 | b | +| array_flow.rb:326:5:326:5 | b | array_flow.rb:327:10:327:10 | b | +| array_flow.rb:326:9:326:9 | [post] a [element 2] | array_flow.rb:328:10:328:10 | a [element 2] | +| array_flow.rb:326:9:326:9 | [post] a [element 2] | array_flow.rb:328:10:328:10 | a [element 2] | +| array_flow.rb:326:9:326:9 | a [element 2] | array_flow.rb:326:9:326:22 | call to delete_at | +| array_flow.rb:326:9:326:9 | a [element 2] | array_flow.rb:326:9:326:22 | call to delete_at | +| array_flow.rb:326:9:326:9 | a [element 3] | array_flow.rb:326:9:326:9 | [post] a [element 2] | +| array_flow.rb:326:9:326:9 | a [element 3] | array_flow.rb:326:9:326:9 | [post] a [element 2] | +| array_flow.rb:326:9:326:22 | call to delete_at | array_flow.rb:326:5:326:5 | b | +| array_flow.rb:326:9:326:22 | call to delete_at | array_flow.rb:326:5:326:5 | b | +| array_flow.rb:328:10:328:10 | a [element 2] | array_flow.rb:328:10:328:13 | ...[...] | +| array_flow.rb:328:10:328:10 | a [element 2] | array_flow.rb:328:10:328:13 | ...[...] | +| array_flow.rb:330:5:330:5 | a [element 2] | array_flow.rb:331:9:331:9 | a [element 2] | +| array_flow.rb:330:5:330:5 | a [element 2] | array_flow.rb:331:9:331:9 | a [element 2] | +| array_flow.rb:330:5:330:5 | a [element 3] | array_flow.rb:331:9:331:9 | a [element 3] | +| array_flow.rb:330:5:330:5 | a [element 3] | array_flow.rb:331:9:331:9 | a [element 3] | +| array_flow.rb:330:16:330:27 | call to source | array_flow.rb:330:5:330:5 | a [element 2] | +| array_flow.rb:330:16:330:27 | call to source | array_flow.rb:330:5:330:5 | a [element 2] | +| array_flow.rb:330:30:330:41 | call to source | array_flow.rb:330:5:330:5 | a [element 3] | +| array_flow.rb:330:30:330:41 | call to source | array_flow.rb:330:5:330:5 | a [element 3] | +| array_flow.rb:331:5:331:5 | b | array_flow.rb:332:10:332:10 | b | +| array_flow.rb:331:5:331:5 | b | array_flow.rb:332:10:332:10 | b | +| array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:333:10:333:10 | a [element] | +| array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:333:10:333:10 | a [element] | +| array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:334:10:334:10 | a [element] | +| array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:334:10:334:10 | a [element] | +| array_flow.rb:331:9:331:9 | a [element 2] | array_flow.rb:331:9:331:9 | [post] a [element] | +| array_flow.rb:331:9:331:9 | a [element 2] | array_flow.rb:331:9:331:9 | [post] a [element] | +| array_flow.rb:331:9:331:9 | a [element 2] | array_flow.rb:331:9:331:22 | call to delete_at | +| array_flow.rb:331:9:331:9 | a [element 2] | array_flow.rb:331:9:331:22 | call to delete_at | +| array_flow.rb:331:9:331:9 | a [element 3] | array_flow.rb:331:9:331:9 | [post] a [element] | +| array_flow.rb:331:9:331:9 | a [element 3] | array_flow.rb:331:9:331:9 | [post] a [element] | +| array_flow.rb:331:9:331:9 | a [element 3] | array_flow.rb:331:9:331:22 | call to delete_at | +| array_flow.rb:331:9:331:9 | a [element 3] | array_flow.rb:331:9:331:22 | call to delete_at | +| array_flow.rb:331:9:331:22 | call to delete_at | array_flow.rb:331:5:331:5 | b | +| array_flow.rb:331:9:331:22 | call to delete_at | array_flow.rb:331:5:331:5 | b | +| array_flow.rb:333:10:333:10 | a [element] | array_flow.rb:333:10:333:13 | ...[...] | +| array_flow.rb:333:10:333:10 | a [element] | array_flow.rb:333:10:333:13 | ...[...] | +| array_flow.rb:334:10:334:10 | a [element] | array_flow.rb:334:10:334:13 | ...[...] | +| array_flow.rb:334:10:334:10 | a [element] | array_flow.rb:334:10:334:13 | ...[...] | +| array_flow.rb:338:5:338:5 | a [element 2] | array_flow.rb:339:9:339:9 | a [element 2] | +| array_flow.rb:338:5:338:5 | a [element 2] | array_flow.rb:339:9:339:9 | a [element 2] | +| array_flow.rb:338:16:338:25 | call to source | array_flow.rb:338:5:338:5 | a [element 2] | +| array_flow.rb:338:16:338:25 | call to source | array_flow.rb:338:5:338:5 | a [element 2] | +| array_flow.rb:339:5:339:5 | b [element] | array_flow.rb:342:10:342:10 | b [element] | +| array_flow.rb:339:5:339:5 | b [element] | array_flow.rb:342:10:342:10 | b [element] | +| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:343:10:343:10 | a [element] | +| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:343:10:343:10 | a [element] | +| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:344:10:344:10 | a [element] | +| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:344:10:344:10 | a [element] | +| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:345:10:345:10 | a [element] | +| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:345:10:345:10 | a [element] | +| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:9:339:9 | [post] a [element] | +| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:9:339:9 | [post] a [element] | +| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:9:341:7 | call to delete_if [element] | +| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:9:341:7 | call to delete_if [element] | +| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:25:339:25 | x | +| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:25:339:25 | x | +| array_flow.rb:339:9:341:7 | call to delete_if [element] | array_flow.rb:339:5:339:5 | b [element] | +| array_flow.rb:339:9:341:7 | call to delete_if [element] | array_flow.rb:339:5:339:5 | b [element] | +| array_flow.rb:339:25:339:25 | x | array_flow.rb:340:14:340:14 | x | +| array_flow.rb:339:25:339:25 | x | array_flow.rb:340:14:340:14 | x | +| array_flow.rb:342:10:342:10 | b [element] | array_flow.rb:342:10:342:13 | ...[...] | +| array_flow.rb:342:10:342:10 | b [element] | array_flow.rb:342:10:342:13 | ...[...] | +| array_flow.rb:343:10:343:10 | a [element] | array_flow.rb:343:10:343:13 | ...[...] | +| array_flow.rb:343:10:343:10 | a [element] | array_flow.rb:343:10:343:13 | ...[...] | +| array_flow.rb:344:10:344:10 | a [element] | array_flow.rb:344:10:344:13 | ...[...] | +| array_flow.rb:344:10:344:10 | a [element] | array_flow.rb:344:10:344:13 | ...[...] | +| array_flow.rb:345:10:345:10 | a [element] | array_flow.rb:345:10:345:13 | ...[...] | +| array_flow.rb:345:10:345:10 | a [element] | array_flow.rb:345:10:345:13 | ...[...] | +| array_flow.rb:349:5:349:5 | a [element 2] | array_flow.rb:350:9:350:9 | a [element 2] | +| array_flow.rb:349:5:349:5 | a [element 2] | array_flow.rb:350:9:350:9 | a [element 2] | +| array_flow.rb:349:16:349:25 | call to source | array_flow.rb:349:5:349:5 | a [element 2] | +| array_flow.rb:349:16:349:25 | call to source | array_flow.rb:349:5:349:5 | a [element 2] | +| array_flow.rb:350:5:350:5 | b [element] | array_flow.rb:351:10:351:10 | b [element] | +| array_flow.rb:350:5:350:5 | b [element] | array_flow.rb:351:10:351:10 | b [element] | +| array_flow.rb:350:9:350:9 | a [element 2] | array_flow.rb:350:9:350:25 | call to difference [element] | +| array_flow.rb:350:9:350:9 | a [element 2] | array_flow.rb:350:9:350:25 | call to difference [element] | +| array_flow.rb:350:9:350:25 | call to difference [element] | array_flow.rb:350:5:350:5 | b [element] | +| array_flow.rb:350:9:350:25 | call to difference [element] | array_flow.rb:350:5:350:5 | b [element] | +| array_flow.rb:351:10:351:10 | b [element] | array_flow.rb:351:10:351:13 | ...[...] | +| array_flow.rb:351:10:351:10 | b [element] | array_flow.rb:351:10:351:13 | ...[...] | +| array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:357:10:357:10 | a [element 2] | +| array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:357:10:357:10 | a [element 2] | +| array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:358:10:358:10 | a [element 2] | +| array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:358:10:358:10 | a [element 2] | +| array_flow.rb:355:5:355:5 | a [element 3, element 1] | array_flow.rb:360:10:360:10 | a [element 3, element 1] | +| array_flow.rb:355:5:355:5 | a [element 3, element 1] | array_flow.rb:360:10:360:10 | a [element 3, element 1] | +| array_flow.rb:355:16:355:27 | call to source | array_flow.rb:355:5:355:5 | a [element 2] | +| array_flow.rb:355:16:355:27 | call to source | array_flow.rb:355:5:355:5 | a [element 2] | +| array_flow.rb:355:34:355:45 | call to source | array_flow.rb:355:5:355:5 | a [element 3, element 1] | +| array_flow.rb:355:34:355:45 | call to source | array_flow.rb:355:5:355:5 | a [element 3, element 1] | +| array_flow.rb:357:10:357:10 | a [element 2] | array_flow.rb:357:10:357:17 | call to dig | +| array_flow.rb:357:10:357:10 | a [element 2] | array_flow.rb:357:10:357:17 | call to dig | +| array_flow.rb:358:10:358:10 | a [element 2] | array_flow.rb:358:10:358:17 | call to dig | +| array_flow.rb:358:10:358:10 | a [element 2] | array_flow.rb:358:10:358:17 | call to dig | +| array_flow.rb:360:10:360:10 | a [element 3, element 1] | array_flow.rb:360:10:360:19 | call to dig | +| array_flow.rb:360:10:360:10 | a [element 3, element 1] | array_flow.rb:360:10:360:19 | call to dig | +| array_flow.rb:364:5:364:5 | a [element 2] | array_flow.rb:365:9:365:9 | a [element 2] | +| array_flow.rb:364:5:364:5 | a [element 2] | array_flow.rb:365:9:365:9 | a [element 2] | +| array_flow.rb:364:16:364:27 | call to source | array_flow.rb:364:5:364:5 | a [element 2] | +| array_flow.rb:364:16:364:27 | call to source | array_flow.rb:364:5:364:5 | a [element 2] | +| array_flow.rb:365:5:365:5 | b | array_flow.rb:368:10:368:10 | b | +| array_flow.rb:365:5:365:5 | b | array_flow.rb:368:10:368:10 | b | +| array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:9:367:7 | call to detect | +| array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:9:367:7 | call to detect | +| array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:43:365:43 | x | +| array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:43:365:43 | x | +| array_flow.rb:365:9:367:7 | call to detect | array_flow.rb:365:5:365:5 | b | +| array_flow.rb:365:9:367:7 | call to detect | array_flow.rb:365:5:365:5 | b | +| array_flow.rb:365:23:365:34 | call to source | array_flow.rb:365:9:367:7 | call to detect | +| array_flow.rb:365:23:365:34 | call to source | array_flow.rb:365:9:367:7 | call to detect | +| array_flow.rb:365:43:365:43 | x | array_flow.rb:366:14:366:14 | x | +| array_flow.rb:365:43:365:43 | x | array_flow.rb:366:14:366:14 | x | +| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:373:9:373:9 | a [element 2] | +| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:373:9:373:9 | a [element 2] | +| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:375:9:375:9 | a [element 2] | +| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:375:9:375:9 | a [element 2] | +| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:380:9:380:9 | a [element 2] | +| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:380:9:380:9 | a [element 2] | +| array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:373:9:373:9 | a [element 3] | +| array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:373:9:373:9 | a [element 3] | +| array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:375:9:375:9 | a [element 3] | +| array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:375:9:375:9 | a [element 3] | +| array_flow.rb:372:16:372:27 | call to source | array_flow.rb:372:5:372:5 | a [element 2] | +| array_flow.rb:372:16:372:27 | call to source | array_flow.rb:372:5:372:5 | a [element 2] | +| array_flow.rb:372:30:372:41 | call to source | array_flow.rb:372:5:372:5 | a [element 3] | +| array_flow.rb:372:30:372:41 | call to source | array_flow.rb:372:5:372:5 | a [element 3] | +| array_flow.rb:373:5:373:5 | b [element] | array_flow.rb:374:10:374:10 | b [element] | +| array_flow.rb:373:5:373:5 | b [element] | array_flow.rb:374:10:374:10 | b [element] | +| array_flow.rb:373:9:373:9 | a [element 2] | array_flow.rb:373:9:373:17 | call to drop [element] | +| array_flow.rb:373:9:373:9 | a [element 2] | array_flow.rb:373:9:373:17 | call to drop [element] | +| array_flow.rb:373:9:373:9 | a [element 3] | array_flow.rb:373:9:373:17 | call to drop [element] | +| array_flow.rb:373:9:373:9 | a [element 3] | array_flow.rb:373:9:373:17 | call to drop [element] | +| array_flow.rb:373:9:373:17 | call to drop [element] | array_flow.rb:373:5:373:5 | b [element] | +| array_flow.rb:373:9:373:17 | call to drop [element] | array_flow.rb:373:5:373:5 | b [element] | +| array_flow.rb:374:10:374:10 | b [element] | array_flow.rb:374:10:374:13 | ...[...] | +| array_flow.rb:374:10:374:10 | b [element] | array_flow.rb:374:10:374:13 | ...[...] | +| array_flow.rb:375:5:375:5 | b [element 1] | array_flow.rb:377:10:377:10 | b [element 1] | +| array_flow.rb:375:5:375:5 | b [element 1] | array_flow.rb:377:10:377:10 | b [element 1] | +| array_flow.rb:375:5:375:5 | b [element 1] | array_flow.rb:378:10:378:10 | b [element 1] | +| array_flow.rb:375:5:375:5 | b [element 1] | array_flow.rb:378:10:378:10 | b [element 1] | +| array_flow.rb:375:5:375:5 | b [element 2] | array_flow.rb:378:10:378:10 | b [element 2] | +| array_flow.rb:375:5:375:5 | b [element 2] | array_flow.rb:378:10:378:10 | b [element 2] | +| array_flow.rb:375:9:375:9 | a [element 2] | array_flow.rb:375:9:375:17 | call to drop [element 1] | +| array_flow.rb:375:9:375:9 | a [element 2] | array_flow.rb:375:9:375:17 | call to drop [element 1] | +| array_flow.rb:375:9:375:9 | a [element 3] | array_flow.rb:375:9:375:17 | call to drop [element 2] | +| array_flow.rb:375:9:375:9 | a [element 3] | array_flow.rb:375:9:375:17 | call to drop [element 2] | +| array_flow.rb:375:9:375:17 | call to drop [element 1] | array_flow.rb:375:5:375:5 | b [element 1] | +| array_flow.rb:375:9:375:17 | call to drop [element 1] | array_flow.rb:375:5:375:5 | b [element 1] | +| array_flow.rb:375:9:375:17 | call to drop [element 2] | array_flow.rb:375:5:375:5 | b [element 2] | +| array_flow.rb:375:9:375:17 | call to drop [element 2] | array_flow.rb:375:5:375:5 | b [element 2] | +| array_flow.rb:377:10:377:10 | b [element 1] | array_flow.rb:377:10:377:13 | ...[...] | +| array_flow.rb:377:10:377:10 | b [element 1] | array_flow.rb:377:10:377:13 | ...[...] | +| array_flow.rb:378:10:378:10 | b [element 1] | array_flow.rb:378:10:378:13 | ...[...] | +| array_flow.rb:378:10:378:10 | b [element 1] | array_flow.rb:378:10:378:13 | ...[...] | +| array_flow.rb:378:10:378:10 | b [element 2] | array_flow.rb:378:10:378:13 | ...[...] | +| array_flow.rb:378:10:378:10 | b [element 2] | array_flow.rb:378:10:378:13 | ...[...] | +| array_flow.rb:379:5:379:5 | [post] a [element] | array_flow.rb:380:9:380:9 | a [element] | +| array_flow.rb:379:5:379:5 | [post] a [element] | array_flow.rb:380:9:380:9 | a [element] | +| array_flow.rb:379:12:379:23 | call to source | array_flow.rb:379:5:379:5 | [post] a [element] | +| array_flow.rb:379:12:379:23 | call to source | array_flow.rb:379:5:379:5 | [post] a [element] | +| array_flow.rb:380:5:380:5 | b [element 1] | array_flow.rb:381:10:381:10 | b [element 1] | +| array_flow.rb:380:5:380:5 | b [element 1] | array_flow.rb:381:10:381:10 | b [element 1] | +| array_flow.rb:380:5:380:5 | b [element] | array_flow.rb:381:10:381:10 | b [element] | +| array_flow.rb:380:5:380:5 | b [element] | array_flow.rb:381:10:381:10 | b [element] | +| array_flow.rb:380:5:380:5 | b [element] | array_flow.rb:382:9:382:9 | b [element] | +| array_flow.rb:380:5:380:5 | b [element] | array_flow.rb:382:9:382:9 | b [element] | +| array_flow.rb:380:9:380:9 | a [element 2] | array_flow.rb:380:9:380:17 | call to drop [element 1] | +| array_flow.rb:380:9:380:9 | a [element 2] | array_flow.rb:380:9:380:17 | call to drop [element 1] | +| array_flow.rb:380:9:380:9 | a [element] | array_flow.rb:380:9:380:17 | call to drop [element] | +| array_flow.rb:380:9:380:9 | a [element] | array_flow.rb:380:9:380:17 | call to drop [element] | +| array_flow.rb:380:9:380:17 | call to drop [element 1] | array_flow.rb:380:5:380:5 | b [element 1] | +| array_flow.rb:380:9:380:17 | call to drop [element 1] | array_flow.rb:380:5:380:5 | b [element 1] | +| array_flow.rb:380:9:380:17 | call to drop [element] | array_flow.rb:380:5:380:5 | b [element] | +| array_flow.rb:380:9:380:17 | call to drop [element] | array_flow.rb:380:5:380:5 | b [element] | +| array_flow.rb:381:10:381:10 | b [element 1] | array_flow.rb:381:10:381:13 | ...[...] | +| array_flow.rb:381:10:381:10 | b [element 1] | array_flow.rb:381:10:381:13 | ...[...] | +| array_flow.rb:381:10:381:10 | b [element] | array_flow.rb:381:10:381:13 | ...[...] | +| array_flow.rb:381:10:381:10 | b [element] | array_flow.rb:381:10:381:13 | ...[...] | +| array_flow.rb:382:5:382:5 | c [element] | array_flow.rb:383:10:383:10 | c [element] | +| array_flow.rb:382:5:382:5 | c [element] | array_flow.rb:383:10:383:10 | c [element] | +| array_flow.rb:382:9:382:9 | b [element] | array_flow.rb:382:9:382:19 | call to drop [element] | +| array_flow.rb:382:9:382:9 | b [element] | array_flow.rb:382:9:382:19 | call to drop [element] | +| array_flow.rb:382:9:382:19 | call to drop [element] | array_flow.rb:382:5:382:5 | c [element] | +| array_flow.rb:382:9:382:19 | call to drop [element] | array_flow.rb:382:5:382:5 | c [element] | +| array_flow.rb:383:10:383:10 | c [element] | array_flow.rb:383:10:383:13 | ...[...] | +| array_flow.rb:383:10:383:10 | c [element] | array_flow.rb:383:10:383:13 | ...[...] | +| array_flow.rb:387:5:387:5 | a [element 2] | array_flow.rb:388:9:388:9 | a [element 2] | +| array_flow.rb:387:5:387:5 | a [element 2] | array_flow.rb:388:9:388:9 | a [element 2] | +| array_flow.rb:387:5:387:5 | a [element 3] | array_flow.rb:388:9:388:9 | a [element 3] | +| array_flow.rb:387:5:387:5 | a [element 3] | array_flow.rb:388:9:388:9 | a [element 3] | +| array_flow.rb:387:16:387:27 | call to source | array_flow.rb:387:5:387:5 | a [element 2] | +| array_flow.rb:387:16:387:27 | call to source | array_flow.rb:387:5:387:5 | a [element 2] | +| array_flow.rb:387:30:387:41 | call to source | array_flow.rb:387:5:387:5 | a [element 3] | +| array_flow.rb:387:30:387:41 | call to source | array_flow.rb:387:5:387:5 | a [element 3] | +| array_flow.rb:388:5:388:5 | b [element] | array_flow.rb:391:10:391:10 | b [element] | +| array_flow.rb:388:5:388:5 | b [element] | array_flow.rb:391:10:391:10 | b [element] | +| array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:9:390:7 | call to drop_while [element] | +| array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:9:390:7 | call to drop_while [element] | +| array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:26:388:26 | x | +| array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:26:388:26 | x | +| array_flow.rb:388:9:388:9 | a [element 3] | array_flow.rb:388:9:390:7 | call to drop_while [element] | +| array_flow.rb:388:9:388:9 | a [element 3] | array_flow.rb:388:9:390:7 | call to drop_while [element] | +| array_flow.rb:388:9:388:9 | a [element 3] | array_flow.rb:388:26:388:26 | x | +| array_flow.rb:388:9:388:9 | a [element 3] | array_flow.rb:388:26:388:26 | x | +| array_flow.rb:388:9:390:7 | call to drop_while [element] | array_flow.rb:388:5:388:5 | b [element] | +| array_flow.rb:388:9:390:7 | call to drop_while [element] | array_flow.rb:388:5:388:5 | b [element] | +| array_flow.rb:388:26:388:26 | x | array_flow.rb:389:14:389:14 | x | +| array_flow.rb:388:26:388:26 | x | array_flow.rb:389:14:389:14 | x | +| array_flow.rb:391:10:391:10 | b [element] | array_flow.rb:391:10:391:13 | ...[...] | +| array_flow.rb:391:10:391:10 | b [element] | array_flow.rb:391:10:391:13 | ...[...] | +| array_flow.rb:395:5:395:5 | a [element 2] | array_flow.rb:396:9:396:9 | a [element 2] | +| array_flow.rb:395:5:395:5 | a [element 2] | array_flow.rb:396:9:396:9 | a [element 2] | +| array_flow.rb:395:16:395:25 | call to source | array_flow.rb:395:5:395:5 | a [element 2] | +| array_flow.rb:395:16:395:25 | call to source | array_flow.rb:395:5:395:5 | a [element 2] | +| array_flow.rb:396:5:396:5 | b [element 2] | array_flow.rb:399:10:399:10 | b [element 2] | +| array_flow.rb:396:5:396:5 | b [element 2] | array_flow.rb:399:10:399:10 | b [element 2] | +| array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:9:398:7 | call to each [element 2] | +| array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:9:398:7 | call to each [element 2] | +| array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:20:396:20 | x | +| array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:20:396:20 | x | +| array_flow.rb:396:9:398:7 | call to each [element 2] | array_flow.rb:396:5:396:5 | b [element 2] | +| array_flow.rb:396:9:398:7 | call to each [element 2] | array_flow.rb:396:5:396:5 | b [element 2] | +| array_flow.rb:396:20:396:20 | x | array_flow.rb:397:14:397:14 | x | +| array_flow.rb:396:20:396:20 | x | array_flow.rb:397:14:397:14 | x | +| array_flow.rb:399:10:399:10 | b [element 2] | array_flow.rb:399:10:399:13 | ...[...] | +| array_flow.rb:399:10:399:10 | b [element 2] | array_flow.rb:399:10:399:13 | ...[...] | +| array_flow.rb:403:5:403:5 | a [element 2] | array_flow.rb:404:18:404:18 | a [element 2] | +| array_flow.rb:403:5:403:5 | a [element 2] | array_flow.rb:404:18:404:18 | a [element 2] | +| array_flow.rb:403:16:403:25 | call to source | array_flow.rb:403:5:403:5 | a [element 2] | +| array_flow.rb:403:16:403:25 | call to source | array_flow.rb:403:5:403:5 | a [element 2] | +| array_flow.rb:404:5:404:5 | b [element 2] | array_flow.rb:408:10:408:10 | b [element 2] | +| array_flow.rb:404:5:404:5 | b [element 2] | array_flow.rb:408:10:408:10 | b [element 2] | +| array_flow.rb:404:9:406:7 | __synth__0__1 | array_flow.rb:404:13:404:13 | x | +| array_flow.rb:404:9:406:7 | __synth__0__1 | array_flow.rb:404:13:404:13 | x | +| array_flow.rb:404:13:404:13 | x | array_flow.rb:405:14:405:14 | x | +| array_flow.rb:404:13:404:13 | x | array_flow.rb:405:14:405:14 | x | +| array_flow.rb:404:13:404:13 | x | array_flow.rb:407:10:407:10 | x | +| array_flow.rb:404:13:404:13 | x | array_flow.rb:407:10:407:10 | x | +| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:5:404:5 | b [element 2] | +| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:5:404:5 | b [element 2] | +| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:9:406:7 | __synth__0__1 | +| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:9:406:7 | __synth__0__1 | +| array_flow.rb:408:10:408:10 | b [element 2] | array_flow.rb:408:10:408:13 | ...[...] | +| array_flow.rb:408:10:408:10 | b [element 2] | array_flow.rb:408:10:408:13 | ...[...] | +| array_flow.rb:412:5:412:5 | a [element 2] | array_flow.rb:413:5:413:5 | a [element 2] | +| array_flow.rb:412:5:412:5 | a [element 2] | array_flow.rb:413:5:413:5 | a [element 2] | +| array_flow.rb:412:16:412:25 | call to source | array_flow.rb:412:5:412:5 | a [element 2] | +| array_flow.rb:412:16:412:25 | call to source | array_flow.rb:412:5:412:5 | a [element 2] | +| array_flow.rb:413:5:413:5 | a [element 2] | array_flow.rb:413:24:413:24 | x [element] | +| array_flow.rb:413:5:413:5 | a [element 2] | array_flow.rb:413:24:413:24 | x [element] | +| array_flow.rb:413:24:413:24 | x [element] | array_flow.rb:414:15:414:15 | x [element] | +| array_flow.rb:413:24:413:24 | x [element] | array_flow.rb:414:15:414:15 | x [element] | +| array_flow.rb:414:15:414:15 | x [element] | array_flow.rb:414:15:414:18 | ...[...] | +| array_flow.rb:414:15:414:15 | x [element] | array_flow.rb:414:15:414:18 | ...[...] | +| array_flow.rb:414:15:414:18 | ...[...] | array_flow.rb:414:14:414:19 | ( ... ) | +| array_flow.rb:414:15:414:18 | ...[...] | array_flow.rb:414:14:414:19 | ( ... ) | +| array_flow.rb:419:5:419:5 | a [element 2] | array_flow.rb:420:9:420:9 | a [element 2] | +| array_flow.rb:419:5:419:5 | a [element 2] | array_flow.rb:420:9:420:9 | a [element 2] | +| array_flow.rb:419:16:419:25 | call to source | array_flow.rb:419:5:419:5 | a [element 2] | +| array_flow.rb:419:16:419:25 | call to source | array_flow.rb:419:5:419:5 | a [element 2] | +| array_flow.rb:420:5:420:5 | b [element 2] | array_flow.rb:423:10:423:10 | b [element 2] | +| array_flow.rb:420:5:420:5 | b [element 2] | array_flow.rb:423:10:423:10 | b [element 2] | +| array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:9:422:7 | call to each_entry [element 2] | +| array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:9:422:7 | call to each_entry [element 2] | +| array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:26:420:26 | x | +| array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:26:420:26 | x | +| array_flow.rb:420:9:422:7 | call to each_entry [element 2] | array_flow.rb:420:5:420:5 | b [element 2] | +| array_flow.rb:420:9:422:7 | call to each_entry [element 2] | array_flow.rb:420:5:420:5 | b [element 2] | +| array_flow.rb:420:26:420:26 | x | array_flow.rb:421:14:421:14 | x | +| array_flow.rb:420:26:420:26 | x | array_flow.rb:421:14:421:14 | x | +| array_flow.rb:423:10:423:10 | b [element 2] | array_flow.rb:423:10:423:13 | ...[...] | +| array_flow.rb:423:10:423:10 | b [element 2] | array_flow.rb:423:10:423:13 | ...[...] | +| array_flow.rb:427:5:427:5 | a [element 2] | array_flow.rb:428:9:428:9 | a [element 2] | +| array_flow.rb:427:5:427:5 | a [element 2] | array_flow.rb:428:9:428:9 | a [element 2] | +| array_flow.rb:427:16:427:25 | call to source | array_flow.rb:427:5:427:5 | a [element 2] | +| array_flow.rb:427:16:427:25 | call to source | array_flow.rb:427:5:427:5 | a [element 2] | +| array_flow.rb:428:5:428:5 | b [element 2] | array_flow.rb:431:10:431:10 | b [element 2] | +| array_flow.rb:428:5:428:5 | b [element 2] | array_flow.rb:431:10:431:10 | b [element 2] | +| array_flow.rb:428:9:428:9 | a [element 2] | array_flow.rb:428:9:430:7 | call to each_index [element 2] | +| array_flow.rb:428:9:428:9 | a [element 2] | array_flow.rb:428:9:430:7 | call to each_index [element 2] | +| array_flow.rb:428:9:430:7 | call to each_index [element 2] | array_flow.rb:428:5:428:5 | b [element 2] | +| array_flow.rb:428:9:430:7 | call to each_index [element 2] | array_flow.rb:428:5:428:5 | b [element 2] | +| array_flow.rb:431:10:431:10 | b [element 2] | array_flow.rb:431:10:431:13 | ...[...] | +| array_flow.rb:431:10:431:10 | b [element 2] | array_flow.rb:431:10:431:13 | ...[...] | +| array_flow.rb:435:5:435:5 | a [element 3] | array_flow.rb:436:5:436:5 | a [element 3] | +| array_flow.rb:435:5:435:5 | a [element 3] | array_flow.rb:436:5:436:5 | a [element 3] | +| array_flow.rb:435:19:435:28 | call to source | array_flow.rb:435:5:435:5 | a [element 3] | +| array_flow.rb:435:19:435:28 | call to source | array_flow.rb:435:5:435:5 | a [element 3] | +| array_flow.rb:436:5:436:5 | a [element 3] | array_flow.rb:436:25:436:25 | x [element] | +| array_flow.rb:436:5:436:5 | a [element 3] | array_flow.rb:436:25:436:25 | x [element] | +| array_flow.rb:436:25:436:25 | x [element] | array_flow.rb:437:14:437:14 | x [element] | +| array_flow.rb:436:25:436:25 | x [element] | array_flow.rb:437:14:437:14 | x [element] | +| array_flow.rb:437:14:437:14 | x [element] | array_flow.rb:437:14:437:17 | ...[...] | +| array_flow.rb:437:14:437:14 | x [element] | array_flow.rb:437:14:437:17 | ...[...] | +| array_flow.rb:442:5:442:5 | a [element 3] | array_flow.rb:443:9:443:9 | a [element 3] | +| array_flow.rb:442:5:442:5 | a [element 3] | array_flow.rb:443:9:443:9 | a [element 3] | +| array_flow.rb:442:19:442:28 | call to source | array_flow.rb:442:5:442:5 | a [element 3] | +| array_flow.rb:442:19:442:28 | call to source | array_flow.rb:442:5:442:5 | a [element 3] | +| array_flow.rb:443:5:443:5 | b [element 3] | array_flow.rb:447:10:447:10 | b [element 3] | +| array_flow.rb:443:5:443:5 | b [element 3] | array_flow.rb:447:10:447:10 | b [element 3] | +| array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | +| array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | +| array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:31:443:31 | x | +| array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:31:443:31 | x | +| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | array_flow.rb:443:5:443:5 | b [element 3] | +| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | array_flow.rb:443:5:443:5 | b [element 3] | +| array_flow.rb:443:31:443:31 | x | array_flow.rb:444:14:444:14 | x | +| array_flow.rb:443:31:443:31 | x | array_flow.rb:444:14:444:14 | x | +| array_flow.rb:447:10:447:10 | b [element 3] | array_flow.rb:447:10:447:13 | ...[...] | +| array_flow.rb:447:10:447:10 | b [element 3] | array_flow.rb:447:10:447:13 | ...[...] | +| array_flow.rb:451:5:451:5 | a [element 3] | array_flow.rb:452:9:452:9 | a [element 3] | +| array_flow.rb:451:5:451:5 | a [element 3] | array_flow.rb:452:9:452:9 | a [element 3] | +| array_flow.rb:451:19:451:30 | call to source | array_flow.rb:451:5:451:5 | a [element 3] | +| array_flow.rb:451:19:451:30 | call to source | array_flow.rb:451:5:451:5 | a [element 3] | +| array_flow.rb:452:5:452:5 | b | array_flow.rb:456:10:456:10 | b | +| array_flow.rb:452:5:452:5 | b | array_flow.rb:456:10:456:10 | b | +| array_flow.rb:452:9:452:9 | a [element 3] | array_flow.rb:452:46:452:46 | x | +| array_flow.rb:452:9:452:9 | a [element 3] | array_flow.rb:452:46:452:46 | x | +| array_flow.rb:452:9:455:7 | call to each_with_object | array_flow.rb:452:5:452:5 | b | +| array_flow.rb:452:9:455:7 | call to each_with_object | array_flow.rb:452:5:452:5 | b | +| array_flow.rb:452:28:452:39 | call to source | array_flow.rb:452:9:455:7 | call to each_with_object | +| array_flow.rb:452:28:452:39 | call to source | array_flow.rb:452:9:455:7 | call to each_with_object | +| array_flow.rb:452:28:452:39 | call to source | array_flow.rb:452:48:452:48 | a | +| array_flow.rb:452:28:452:39 | call to source | array_flow.rb:452:48:452:48 | a | +| array_flow.rb:452:46:452:46 | x | array_flow.rb:453:14:453:14 | x | +| array_flow.rb:452:46:452:46 | x | array_flow.rb:453:14:453:14 | x | +| array_flow.rb:452:48:452:48 | a | array_flow.rb:454:14:454:14 | a | +| array_flow.rb:452:48:452:48 | a | array_flow.rb:454:14:454:14 | a | +| array_flow.rb:460:5:460:5 | a [element 3] | array_flow.rb:461:9:461:9 | a [element 3] | +| array_flow.rb:460:5:460:5 | a [element 3] | array_flow.rb:461:9:461:9 | a [element 3] | +| array_flow.rb:460:19:460:28 | call to source | array_flow.rb:460:5:460:5 | a [element 3] | +| array_flow.rb:460:19:460:28 | call to source | array_flow.rb:460:5:460:5 | a [element 3] | +| array_flow.rb:461:5:461:5 | b [element 3] | array_flow.rb:462:10:462:10 | b [element 3] | +| array_flow.rb:461:5:461:5 | b [element 3] | array_flow.rb:462:10:462:10 | b [element 3] | +| array_flow.rb:461:9:461:9 | a [element 3] | array_flow.rb:461:9:461:17 | call to entries [element 3] | +| array_flow.rb:461:9:461:9 | a [element 3] | array_flow.rb:461:9:461:17 | call to entries [element 3] | +| array_flow.rb:461:9:461:17 | call to entries [element 3] | array_flow.rb:461:5:461:5 | b [element 3] | +| array_flow.rb:461:9:461:17 | call to entries [element 3] | array_flow.rb:461:5:461:5 | b [element 3] | +| array_flow.rb:462:10:462:10 | b [element 3] | array_flow.rb:462:10:462:13 | ...[...] | +| array_flow.rb:462:10:462:10 | b [element 3] | array_flow.rb:462:10:462:13 | ...[...] | +| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:467:9:467:9 | a [element 3] | +| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:467:9:467:9 | a [element 3] | +| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:471:9:471:9 | a [element 3] | +| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:471:9:471:9 | a [element 3] | +| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:473:9:473:9 | a [element 3] | +| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:473:9:473:9 | a [element 3] | +| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:477:9:477:9 | a [element 3] | +| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:477:9:477:9 | a [element 3] | +| array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:467:9:467:9 | a [element 4] | +| array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:467:9:467:9 | a [element 4] | +| array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:477:9:477:9 | a [element 4] | +| array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:477:9:477:9 | a [element 4] | +| array_flow.rb:466:19:466:30 | call to source | array_flow.rb:466:5:466:5 | a [element 3] | +| array_flow.rb:466:19:466:30 | call to source | array_flow.rb:466:5:466:5 | a [element 3] | +| array_flow.rb:466:33:466:44 | call to source | array_flow.rb:466:5:466:5 | a [element 4] | +| array_flow.rb:466:33:466:44 | call to source | array_flow.rb:466:5:466:5 | a [element 4] | +| array_flow.rb:467:5:467:5 | b | array_flow.rb:470:10:470:10 | b | +| array_flow.rb:467:5:467:5 | b | array_flow.rb:470:10:470:10 | b | +| array_flow.rb:467:9:467:9 | a [element 3] | array_flow.rb:467:9:469:7 | call to fetch | +| array_flow.rb:467:9:467:9 | a [element 3] | array_flow.rb:467:9:469:7 | call to fetch | +| array_flow.rb:467:9:467:9 | a [element 4] | array_flow.rb:467:9:469:7 | call to fetch | +| array_flow.rb:467:9:467:9 | a [element 4] | array_flow.rb:467:9:469:7 | call to fetch | +| array_flow.rb:467:9:469:7 | call to fetch | array_flow.rb:467:5:467:5 | b | +| array_flow.rb:467:9:469:7 | call to fetch | array_flow.rb:467:5:467:5 | b | +| array_flow.rb:467:17:467:28 | call to source | array_flow.rb:467:35:467:35 | x | +| array_flow.rb:467:17:467:28 | call to source | array_flow.rb:467:35:467:35 | x | +| array_flow.rb:467:35:467:35 | x | array_flow.rb:468:14:468:14 | x | +| array_flow.rb:467:35:467:35 | x | array_flow.rb:468:14:468:14 | x | +| array_flow.rb:471:5:471:5 | b | array_flow.rb:472:10:472:10 | b | +| array_flow.rb:471:5:471:5 | b | array_flow.rb:472:10:472:10 | b | +| array_flow.rb:471:9:471:9 | a [element 3] | array_flow.rb:471:9:471:18 | call to fetch | +| array_flow.rb:471:9:471:9 | a [element 3] | array_flow.rb:471:9:471:18 | call to fetch | +| array_flow.rb:471:9:471:18 | call to fetch | array_flow.rb:471:5:471:5 | b | +| array_flow.rb:471:9:471:18 | call to fetch | array_flow.rb:471:5:471:5 | b | +| array_flow.rb:473:5:473:5 | b | array_flow.rb:474:10:474:10 | b | +| array_flow.rb:473:5:473:5 | b | array_flow.rb:474:10:474:10 | b | +| array_flow.rb:473:9:473:9 | a [element 3] | array_flow.rb:473:9:473:32 | call to fetch | +| array_flow.rb:473:9:473:9 | a [element 3] | array_flow.rb:473:9:473:32 | call to fetch | +| array_flow.rb:473:9:473:32 | call to fetch | array_flow.rb:473:5:473:5 | b | +| array_flow.rb:473:9:473:32 | call to fetch | array_flow.rb:473:5:473:5 | b | +| array_flow.rb:473:20:473:31 | call to source | array_flow.rb:473:9:473:32 | call to fetch | +| array_flow.rb:473:20:473:31 | call to source | array_flow.rb:473:9:473:32 | call to fetch | +| array_flow.rb:475:5:475:5 | b | array_flow.rb:476:10:476:10 | b | +| array_flow.rb:475:5:475:5 | b | array_flow.rb:476:10:476:10 | b | +| array_flow.rb:475:9:475:34 | call to fetch | array_flow.rb:475:5:475:5 | b | +| array_flow.rb:475:9:475:34 | call to fetch | array_flow.rb:475:5:475:5 | b | +| array_flow.rb:475:22:475:33 | call to source | array_flow.rb:475:9:475:34 | call to fetch | +| array_flow.rb:475:22:475:33 | call to source | array_flow.rb:475:9:475:34 | call to fetch | +| array_flow.rb:477:5:477:5 | b | array_flow.rb:478:10:478:10 | b | +| array_flow.rb:477:5:477:5 | b | array_flow.rb:478:10:478:10 | b | +| array_flow.rb:477:9:477:9 | a [element 3] | array_flow.rb:477:9:477:32 | call to fetch | +| array_flow.rb:477:9:477:9 | a [element 3] | array_flow.rb:477:9:477:32 | call to fetch | +| array_flow.rb:477:9:477:9 | a [element 4] | array_flow.rb:477:9:477:32 | call to fetch | +| array_flow.rb:477:9:477:9 | a [element 4] | array_flow.rb:477:9:477:32 | call to fetch | +| array_flow.rb:477:9:477:32 | call to fetch | array_flow.rb:477:5:477:5 | b | +| array_flow.rb:477:9:477:32 | call to fetch | array_flow.rb:477:5:477:5 | b | +| array_flow.rb:477:20:477:31 | call to source | array_flow.rb:477:9:477:32 | call to fetch | +| array_flow.rb:477:20:477:31 | call to source | array_flow.rb:477:9:477:32 | call to fetch | +| array_flow.rb:482:5:482:5 | a [element 3] | array_flow.rb:484:10:484:10 | a [element 3] | +| array_flow.rb:482:5:482:5 | a [element 3] | array_flow.rb:484:10:484:10 | a [element 3] | +| array_flow.rb:482:19:482:30 | call to source | array_flow.rb:482:5:482:5 | a [element 3] | +| array_flow.rb:482:19:482:30 | call to source | array_flow.rb:482:5:482:5 | a [element 3] | +| array_flow.rb:483:5:483:5 | [post] a [element] | array_flow.rb:484:10:484:10 | a [element] | +| array_flow.rb:483:5:483:5 | [post] a [element] | array_flow.rb:484:10:484:10 | a [element] | +| array_flow.rb:483:12:483:23 | call to source | array_flow.rb:483:5:483:5 | [post] a [element] | +| array_flow.rb:483:12:483:23 | call to source | array_flow.rb:483:5:483:5 | [post] a [element] | +| array_flow.rb:484:10:484:10 | a [element 3] | array_flow.rb:484:10:484:13 | ...[...] | +| array_flow.rb:484:10:484:10 | a [element 3] | array_flow.rb:484:10:484:13 | ...[...] | +| array_flow.rb:484:10:484:10 | a [element] | array_flow.rb:484:10:484:13 | ...[...] | +| array_flow.rb:484:10:484:10 | a [element] | array_flow.rb:484:10:484:13 | ...[...] | +| array_flow.rb:485:5:485:5 | [post] a [element] | array_flow.rb:486:10:486:10 | a [element] | +| array_flow.rb:485:5:485:5 | [post] a [element] | array_flow.rb:486:10:486:10 | a [element] | +| array_flow.rb:485:12:485:23 | call to source | array_flow.rb:485:5:485:5 | [post] a [element] | +| array_flow.rb:485:12:485:23 | call to source | array_flow.rb:485:5:485:5 | [post] a [element] | +| array_flow.rb:486:10:486:10 | a [element] | array_flow.rb:486:10:486:13 | ...[...] | +| array_flow.rb:486:10:486:10 | a [element] | array_flow.rb:486:10:486:13 | ...[...] | +| array_flow.rb:487:5:487:5 | [post] a [element] | array_flow.rb:490:10:490:10 | a [element] | +| array_flow.rb:487:5:487:5 | [post] a [element] | array_flow.rb:490:10:490:10 | a [element] | +| array_flow.rb:487:5:487:5 | [post] a [element] | array_flow.rb:494:10:494:10 | a [element] | +| array_flow.rb:487:5:487:5 | [post] a [element] | array_flow.rb:494:10:494:10 | a [element] | +| array_flow.rb:488:9:488:20 | call to source | array_flow.rb:487:5:487:5 | [post] a [element] | +| array_flow.rb:488:9:488:20 | call to source | array_flow.rb:487:5:487:5 | [post] a [element] | +| array_flow.rb:490:10:490:10 | a [element] | array_flow.rb:490:10:490:13 | ...[...] | +| array_flow.rb:490:10:490:10 | a [element] | array_flow.rb:490:10:490:13 | ...[...] | +| array_flow.rb:491:5:491:5 | [post] a [element] | array_flow.rb:494:10:494:10 | a [element] | +| array_flow.rb:491:5:491:5 | [post] a [element] | array_flow.rb:494:10:494:10 | a [element] | +| array_flow.rb:492:9:492:20 | call to source | array_flow.rb:491:5:491:5 | [post] a [element] | +| array_flow.rb:492:9:492:20 | call to source | array_flow.rb:491:5:491:5 | [post] a [element] | +| array_flow.rb:494:10:494:10 | a [element] | array_flow.rb:494:10:494:13 | ...[...] | +| array_flow.rb:494:10:494:10 | a [element] | array_flow.rb:494:10:494:13 | ...[...] | +| array_flow.rb:498:5:498:5 | a [element 3] | array_flow.rb:499:9:499:9 | a [element 3] | +| array_flow.rb:498:5:498:5 | a [element 3] | array_flow.rb:499:9:499:9 | a [element 3] | +| array_flow.rb:498:19:498:28 | call to source | array_flow.rb:498:5:498:5 | a [element 3] | +| array_flow.rb:498:19:498:28 | call to source | array_flow.rb:498:5:498:5 | a [element 3] | +| array_flow.rb:499:5:499:5 | b [element] | array_flow.rb:502:10:502:10 | b [element] | +| array_flow.rb:499:5:499:5 | b [element] | array_flow.rb:502:10:502:10 | b [element] | +| array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:9:501:7 | call to filter [element] | +| array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:9:501:7 | call to filter [element] | +| array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:22:499:22 | x | +| array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:22:499:22 | x | +| array_flow.rb:499:9:501:7 | call to filter [element] | array_flow.rb:499:5:499:5 | b [element] | +| array_flow.rb:499:9:501:7 | call to filter [element] | array_flow.rb:499:5:499:5 | b [element] | +| array_flow.rb:499:22:499:22 | x | array_flow.rb:500:14:500:14 | x | +| array_flow.rb:499:22:499:22 | x | array_flow.rb:500:14:500:14 | x | +| array_flow.rb:502:10:502:10 | b [element] | array_flow.rb:502:10:502:13 | ...[...] | +| array_flow.rb:502:10:502:10 | b [element] | array_flow.rb:502:10:502:13 | ...[...] | +| array_flow.rb:506:5:506:5 | a [element 3] | array_flow.rb:507:9:507:9 | a [element 3] | +| array_flow.rb:506:5:506:5 | a [element 3] | array_flow.rb:507:9:507:9 | a [element 3] | +| array_flow.rb:506:19:506:28 | call to source | array_flow.rb:506:5:506:5 | a [element 3] | +| array_flow.rb:506:19:506:28 | call to source | array_flow.rb:506:5:506:5 | a [element 3] | +| array_flow.rb:507:5:507:5 | b [element] | array_flow.rb:510:10:510:10 | b [element] | +| array_flow.rb:507:5:507:5 | b [element] | array_flow.rb:510:10:510:10 | b [element] | +| array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:9:509:7 | call to filter_map [element] | +| array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:9:509:7 | call to filter_map [element] | +| array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:26:507:26 | x | +| array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:26:507:26 | x | +| array_flow.rb:507:9:509:7 | call to filter_map [element] | array_flow.rb:507:5:507:5 | b [element] | +| array_flow.rb:507:9:509:7 | call to filter_map [element] | array_flow.rb:507:5:507:5 | b [element] | +| array_flow.rb:507:26:507:26 | x | array_flow.rb:508:14:508:14 | x | +| array_flow.rb:507:26:507:26 | x | array_flow.rb:508:14:508:14 | x | +| array_flow.rb:510:10:510:10 | b [element] | array_flow.rb:510:10:510:13 | ...[...] | +| array_flow.rb:510:10:510:10 | b [element] | array_flow.rb:510:10:510:13 | ...[...] | +| array_flow.rb:514:5:514:5 | a [element 3] | array_flow.rb:515:9:515:9 | a [element 3] | +| array_flow.rb:514:5:514:5 | a [element 3] | array_flow.rb:515:9:515:9 | a [element 3] | +| array_flow.rb:514:19:514:28 | call to source | array_flow.rb:514:5:514:5 | a [element 3] | +| array_flow.rb:514:19:514:28 | call to source | array_flow.rb:514:5:514:5 | a [element 3] | +| array_flow.rb:515:5:515:5 | b [element] | array_flow.rb:520:10:520:10 | b [element] | +| array_flow.rb:515:5:515:5 | b [element] | array_flow.rb:520:10:520:10 | b [element] | +| array_flow.rb:515:9:515:9 | [post] a [element] | array_flow.rb:519:10:519:10 | a [element] | +| array_flow.rb:515:9:515:9 | [post] a [element] | array_flow.rb:519:10:519:10 | a [element] | +| array_flow.rb:515:9:515:9 | a [element 3] | array_flow.rb:515:9:515:9 | [post] a [element] | +| array_flow.rb:515:9:515:9 | a [element 3] | array_flow.rb:515:9:515:9 | [post] a [element] | +| array_flow.rb:515:9:515:9 | a [element 3] | array_flow.rb:515:9:518:7 | call to filter! [element] | +| array_flow.rb:515:9:515:9 | a [element 3] | array_flow.rb:515:9:518:7 | call to filter! [element] | +| array_flow.rb:515:9:515:9 | a [element 3] | array_flow.rb:515:23:515:23 | x | +| array_flow.rb:515:9:515:9 | a [element 3] | array_flow.rb:515:23:515:23 | x | +| array_flow.rb:515:9:518:7 | call to filter! [element] | array_flow.rb:515:5:515:5 | b [element] | +| array_flow.rb:515:9:518:7 | call to filter! [element] | array_flow.rb:515:5:515:5 | b [element] | +| array_flow.rb:515:23:515:23 | x | array_flow.rb:516:14:516:14 | x | +| array_flow.rb:515:23:515:23 | x | array_flow.rb:516:14:516:14 | x | +| array_flow.rb:519:10:519:10 | a [element] | array_flow.rb:519:10:519:13 | ...[...] | +| array_flow.rb:519:10:519:10 | a [element] | array_flow.rb:519:10:519:13 | ...[...] | +| array_flow.rb:520:10:520:10 | b [element] | array_flow.rb:520:10:520:13 | ...[...] | +| array_flow.rb:520:10:520:10 | b [element] | array_flow.rb:520:10:520:13 | ...[...] | +| array_flow.rb:524:5:524:5 | a [element 3] | array_flow.rb:525:9:525:9 | a [element 3] | +| array_flow.rb:524:5:524:5 | a [element 3] | array_flow.rb:525:9:525:9 | a [element 3] | +| array_flow.rb:524:19:524:30 | call to source | array_flow.rb:524:5:524:5 | a [element 3] | +| array_flow.rb:524:19:524:30 | call to source | array_flow.rb:524:5:524:5 | a [element 3] | +| array_flow.rb:525:5:525:5 | b | array_flow.rb:528:10:528:10 | b | +| array_flow.rb:525:5:525:5 | b | array_flow.rb:528:10:528:10 | b | +| array_flow.rb:525:9:525:9 | a [element 3] | array_flow.rb:525:9:527:7 | call to find | +| array_flow.rb:525:9:525:9 | a [element 3] | array_flow.rb:525:9:527:7 | call to find | +| array_flow.rb:525:9:525:9 | a [element 3] | array_flow.rb:525:41:525:41 | x | +| array_flow.rb:525:9:525:9 | a [element 3] | array_flow.rb:525:41:525:41 | x | +| array_flow.rb:525:9:527:7 | call to find | array_flow.rb:525:5:525:5 | b | +| array_flow.rb:525:9:527:7 | call to find | array_flow.rb:525:5:525:5 | b | +| array_flow.rb:525:21:525:32 | call to source | array_flow.rb:525:9:527:7 | call to find | +| array_flow.rb:525:21:525:32 | call to source | array_flow.rb:525:9:527:7 | call to find | +| array_flow.rb:525:41:525:41 | x | array_flow.rb:526:14:526:14 | x | +| array_flow.rb:525:41:525:41 | x | array_flow.rb:526:14:526:14 | x | +| array_flow.rb:532:5:532:5 | a [element 3] | array_flow.rb:533:9:533:9 | a [element 3] | +| array_flow.rb:532:5:532:5 | a [element 3] | array_flow.rb:533:9:533:9 | a [element 3] | +| array_flow.rb:532:19:532:28 | call to source | array_flow.rb:532:5:532:5 | a [element 3] | +| array_flow.rb:532:19:532:28 | call to source | array_flow.rb:532:5:532:5 | a [element 3] | +| array_flow.rb:533:5:533:5 | b [element] | array_flow.rb:536:10:536:10 | b [element] | +| array_flow.rb:533:5:533:5 | b [element] | array_flow.rb:536:10:536:10 | b [element] | +| array_flow.rb:533:9:533:9 | a [element 3] | array_flow.rb:533:9:535:7 | call to find_all [element] | +| array_flow.rb:533:9:533:9 | a [element 3] | array_flow.rb:533:9:535:7 | call to find_all [element] | +| array_flow.rb:533:9:533:9 | a [element 3] | array_flow.rb:533:24:533:24 | x | +| array_flow.rb:533:9:533:9 | a [element 3] | array_flow.rb:533:24:533:24 | x | +| array_flow.rb:533:9:535:7 | call to find_all [element] | array_flow.rb:533:5:533:5 | b [element] | +| array_flow.rb:533:9:535:7 | call to find_all [element] | array_flow.rb:533:5:533:5 | b [element] | +| array_flow.rb:533:24:533:24 | x | array_flow.rb:534:14:534:14 | x | +| array_flow.rb:533:24:533:24 | x | array_flow.rb:534:14:534:14 | x | +| array_flow.rb:536:10:536:10 | b [element] | array_flow.rb:536:10:536:13 | ...[...] | +| array_flow.rb:536:10:536:10 | b [element] | array_flow.rb:536:10:536:13 | ...[...] | +| array_flow.rb:540:5:540:5 | a [element 3] | array_flow.rb:541:5:541:5 | a [element 3] | +| array_flow.rb:540:5:540:5 | a [element 3] | array_flow.rb:541:5:541:5 | a [element 3] | +| array_flow.rb:540:19:540:28 | call to source | array_flow.rb:540:5:540:5 | a [element 3] | +| array_flow.rb:540:19:540:28 | call to source | array_flow.rb:540:5:540:5 | a [element 3] | +| array_flow.rb:541:5:541:5 | a [element 3] | array_flow.rb:541:22:541:22 | x | +| array_flow.rb:541:5:541:5 | a [element 3] | array_flow.rb:541:22:541:22 | x | +| array_flow.rb:541:22:541:22 | x | array_flow.rb:542:14:542:14 | x | +| array_flow.rb:541:22:541:22 | x | array_flow.rb:542:14:542:14 | x | +| array_flow.rb:547:5:547:5 | a [element 0] | array_flow.rb:549:10:549:10 | a [element 0] | +| array_flow.rb:547:5:547:5 | a [element 0] | array_flow.rb:549:10:549:10 | a [element 0] | +| array_flow.rb:547:5:547:5 | a [element 0] | array_flow.rb:550:9:550:9 | a [element 0] | +| array_flow.rb:547:5:547:5 | a [element 0] | array_flow.rb:550:9:550:9 | a [element 0] | +| array_flow.rb:547:5:547:5 | a [element 0] | array_flow.rb:553:9:553:9 | a [element 0] | +| array_flow.rb:547:5:547:5 | a [element 0] | array_flow.rb:553:9:553:9 | a [element 0] | +| array_flow.rb:547:5:547:5 | a [element 3] | array_flow.rb:553:9:553:9 | a [element 3] | +| array_flow.rb:547:5:547:5 | a [element 3] | array_flow.rb:553:9:553:9 | a [element 3] | +| array_flow.rb:547:10:547:21 | call to source | array_flow.rb:547:5:547:5 | a [element 0] | +| array_flow.rb:547:10:547:21 | call to source | array_flow.rb:547:5:547:5 | a [element 0] | +| array_flow.rb:547:30:547:41 | call to source | array_flow.rb:547:5:547:5 | a [element 3] | +| array_flow.rb:547:30:547:41 | call to source | array_flow.rb:547:5:547:5 | a [element 3] | +| array_flow.rb:548:5:548:5 | [post] a [element] | array_flow.rb:549:10:549:10 | a [element] | +| array_flow.rb:548:5:548:5 | [post] a [element] | array_flow.rb:549:10:549:10 | a [element] | +| array_flow.rb:548:5:548:5 | [post] a [element] | array_flow.rb:550:9:550:9 | a [element] | +| array_flow.rb:548:5:548:5 | [post] a [element] | array_flow.rb:550:9:550:9 | a [element] | +| array_flow.rb:548:5:548:5 | [post] a [element] | array_flow.rb:553:9:553:9 | a [element] | +| array_flow.rb:548:5:548:5 | [post] a [element] | array_flow.rb:553:9:553:9 | a [element] | +| array_flow.rb:548:12:548:23 | call to source | array_flow.rb:548:5:548:5 | [post] a [element] | +| array_flow.rb:548:12:548:23 | call to source | array_flow.rb:548:5:548:5 | [post] a [element] | +| array_flow.rb:549:10:549:10 | a [element 0] | array_flow.rb:549:10:549:16 | call to first | +| array_flow.rb:549:10:549:10 | a [element 0] | array_flow.rb:549:10:549:16 | call to first | +| array_flow.rb:549:10:549:10 | a [element] | array_flow.rb:549:10:549:16 | call to first | +| array_flow.rb:549:10:549:10 | a [element] | array_flow.rb:549:10:549:16 | call to first | +| array_flow.rb:550:5:550:5 | b [element 0] | array_flow.rb:551:10:551:10 | b [element 0] | +| array_flow.rb:550:5:550:5 | b [element 0] | array_flow.rb:551:10:551:10 | b [element 0] | +| array_flow.rb:550:5:550:5 | b [element] | array_flow.rb:551:10:551:10 | b [element] | +| array_flow.rb:550:5:550:5 | b [element] | array_flow.rb:551:10:551:10 | b [element] | +| array_flow.rb:550:5:550:5 | b [element] | array_flow.rb:552:10:552:10 | b [element] | +| array_flow.rb:550:5:550:5 | b [element] | array_flow.rb:552:10:552:10 | b [element] | +| array_flow.rb:550:9:550:9 | a [element 0] | array_flow.rb:550:9:550:18 | call to first [element 0] | +| array_flow.rb:550:9:550:9 | a [element 0] | array_flow.rb:550:9:550:18 | call to first [element 0] | +| array_flow.rb:550:9:550:9 | a [element] | array_flow.rb:550:9:550:18 | call to first [element] | +| array_flow.rb:550:9:550:9 | a [element] | array_flow.rb:550:9:550:18 | call to first [element] | +| array_flow.rb:550:9:550:18 | call to first [element 0] | array_flow.rb:550:5:550:5 | b [element 0] | +| array_flow.rb:550:9:550:18 | call to first [element 0] | array_flow.rb:550:5:550:5 | b [element 0] | +| array_flow.rb:550:9:550:18 | call to first [element] | array_flow.rb:550:5:550:5 | b [element] | +| array_flow.rb:550:9:550:18 | call to first [element] | array_flow.rb:550:5:550:5 | b [element] | +| array_flow.rb:551:10:551:10 | b [element 0] | array_flow.rb:551:10:551:13 | ...[...] | +| array_flow.rb:551:10:551:10 | b [element 0] | array_flow.rb:551:10:551:13 | ...[...] | +| array_flow.rb:551:10:551:10 | b [element] | array_flow.rb:551:10:551:13 | ...[...] | +| array_flow.rb:551:10:551:10 | b [element] | array_flow.rb:551:10:551:13 | ...[...] | +| array_flow.rb:552:10:552:10 | b [element] | array_flow.rb:552:10:552:13 | ...[...] | +| array_flow.rb:552:10:552:10 | b [element] | array_flow.rb:552:10:552:13 | ...[...] | +| array_flow.rb:553:5:553:5 | c [element 0] | array_flow.rb:554:10:554:10 | c [element 0] | +| array_flow.rb:553:5:553:5 | c [element 0] | array_flow.rb:554:10:554:10 | c [element 0] | +| array_flow.rb:553:5:553:5 | c [element 3] | array_flow.rb:555:10:555:10 | c [element 3] | +| array_flow.rb:553:5:553:5 | c [element 3] | array_flow.rb:555:10:555:10 | c [element 3] | +| array_flow.rb:553:5:553:5 | c [element] | array_flow.rb:554:10:554:10 | c [element] | +| array_flow.rb:553:5:553:5 | c [element] | array_flow.rb:554:10:554:10 | c [element] | +| array_flow.rb:553:5:553:5 | c [element] | array_flow.rb:555:10:555:10 | c [element] | +| array_flow.rb:553:5:553:5 | c [element] | array_flow.rb:555:10:555:10 | c [element] | +| array_flow.rb:553:9:553:9 | a [element 0] | array_flow.rb:553:9:553:18 | call to first [element 0] | +| array_flow.rb:553:9:553:9 | a [element 0] | array_flow.rb:553:9:553:18 | call to first [element 0] | +| array_flow.rb:553:9:553:9 | a [element 3] | array_flow.rb:553:9:553:18 | call to first [element 3] | +| array_flow.rb:553:9:553:9 | a [element 3] | array_flow.rb:553:9:553:18 | call to first [element 3] | +| array_flow.rb:553:9:553:9 | a [element] | array_flow.rb:553:9:553:18 | call to first [element] | +| array_flow.rb:553:9:553:9 | a [element] | array_flow.rb:553:9:553:18 | call to first [element] | +| array_flow.rb:553:9:553:18 | call to first [element 0] | array_flow.rb:553:5:553:5 | c [element 0] | +| array_flow.rb:553:9:553:18 | call to first [element 0] | array_flow.rb:553:5:553:5 | c [element 0] | +| array_flow.rb:553:9:553:18 | call to first [element 3] | array_flow.rb:553:5:553:5 | c [element 3] | +| array_flow.rb:553:9:553:18 | call to first [element 3] | array_flow.rb:553:5:553:5 | c [element 3] | +| array_flow.rb:553:9:553:18 | call to first [element] | array_flow.rb:553:5:553:5 | c [element] | +| array_flow.rb:553:9:553:18 | call to first [element] | array_flow.rb:553:5:553:5 | c [element] | +| array_flow.rb:554:10:554:10 | c [element 0] | array_flow.rb:554:10:554:13 | ...[...] | +| array_flow.rb:554:10:554:10 | c [element 0] | array_flow.rb:554:10:554:13 | ...[...] | +| array_flow.rb:554:10:554:10 | c [element] | array_flow.rb:554:10:554:13 | ...[...] | +| array_flow.rb:554:10:554:10 | c [element] | array_flow.rb:554:10:554:13 | ...[...] | +| array_flow.rb:555:10:555:10 | c [element 3] | array_flow.rb:555:10:555:13 | ...[...] | +| array_flow.rb:555:10:555:10 | c [element 3] | array_flow.rb:555:10:555:13 | ...[...] | +| array_flow.rb:555:10:555:10 | c [element] | array_flow.rb:555:10:555:13 | ...[...] | +| array_flow.rb:555:10:555:10 | c [element] | array_flow.rb:555:10:555:13 | ...[...] | +| array_flow.rb:559:5:559:5 | a [element 2] | array_flow.rb:560:9:560:9 | a [element 2] | +| array_flow.rb:559:5:559:5 | a [element 2] | array_flow.rb:560:9:560:9 | a [element 2] | +| array_flow.rb:559:5:559:5 | a [element 2] | array_flow.rb:565:9:565:9 | a [element 2] | +| array_flow.rb:559:5:559:5 | a [element 2] | array_flow.rb:565:9:565:9 | a [element 2] | +| array_flow.rb:559:16:559:27 | call to source | array_flow.rb:559:5:559:5 | a [element 2] | +| array_flow.rb:559:16:559:27 | call to source | array_flow.rb:559:5:559:5 | a [element 2] | +| array_flow.rb:560:5:560:5 | b [element] | array_flow.rb:564:10:564:10 | b [element] | +| array_flow.rb:560:5:560:5 | b [element] | array_flow.rb:564:10:564:10 | b [element] | +| array_flow.rb:560:9:560:9 | a [element 2] | array_flow.rb:560:9:563:7 | call to flat_map [element] | +| array_flow.rb:560:9:560:9 | a [element 2] | array_flow.rb:560:9:563:7 | call to flat_map [element] | +| array_flow.rb:560:9:560:9 | a [element 2] | array_flow.rb:560:24:560:24 | x | +| array_flow.rb:560:9:560:9 | a [element 2] | array_flow.rb:560:24:560:24 | x | +| array_flow.rb:560:9:563:7 | call to flat_map [element] | array_flow.rb:560:5:560:5 | b [element] | +| array_flow.rb:560:9:563:7 | call to flat_map [element] | array_flow.rb:560:5:560:5 | b [element] | +| array_flow.rb:560:24:560:24 | x | array_flow.rb:561:14:561:14 | x | +| array_flow.rb:560:24:560:24 | x | array_flow.rb:561:14:561:14 | x | +| array_flow.rb:562:13:562:24 | call to source | array_flow.rb:560:9:563:7 | call to flat_map [element] | +| array_flow.rb:562:13:562:24 | call to source | array_flow.rb:560:9:563:7 | call to flat_map [element] | +| array_flow.rb:564:10:564:10 | b [element] | array_flow.rb:564:10:564:13 | ...[...] | +| array_flow.rb:564:10:564:10 | b [element] | array_flow.rb:564:10:564:13 | ...[...] | +| array_flow.rb:565:5:565:5 | b [element] | array_flow.rb:569:10:569:10 | b [element] | +| array_flow.rb:565:5:565:5 | b [element] | array_flow.rb:569:10:569:10 | b [element] | +| array_flow.rb:565:9:565:9 | a [element 2] | array_flow.rb:565:24:565:24 | x | +| array_flow.rb:565:9:565:9 | a [element 2] | array_flow.rb:565:24:565:24 | x | +| array_flow.rb:565:9:568:7 | call to flat_map [element] | array_flow.rb:565:5:565:5 | b [element] | +| array_flow.rb:565:9:568:7 | call to flat_map [element] | array_flow.rb:565:5:565:5 | b [element] | +| array_flow.rb:565:24:565:24 | x | array_flow.rb:566:14:566:14 | x | +| array_flow.rb:565:24:565:24 | x | array_flow.rb:566:14:566:14 | x | +| array_flow.rb:567:9:567:20 | call to source | array_flow.rb:565:9:568:7 | call to flat_map [element] | +| array_flow.rb:567:9:567:20 | call to source | array_flow.rb:565:9:568:7 | call to flat_map [element] | +| array_flow.rb:569:10:569:10 | b [element] | array_flow.rb:569:10:569:13 | ...[...] | +| array_flow.rb:569:10:569:10 | b [element] | array_flow.rb:569:10:569:13 | ...[...] | +| array_flow.rb:573:5:573:5 | a [element 2, element 1] | array_flow.rb:574:9:574:9 | a [element 2, element 1] | +| array_flow.rb:573:5:573:5 | a [element 2, element 1] | array_flow.rb:574:9:574:9 | a [element 2, element 1] | +| array_flow.rb:573:20:573:29 | call to source | array_flow.rb:573:5:573:5 | a [element 2, element 1] | +| array_flow.rb:573:20:573:29 | call to source | array_flow.rb:573:5:573:5 | a [element 2, element 1] | +| array_flow.rb:574:5:574:5 | b [element] | array_flow.rb:575:10:575:10 | b [element] | +| array_flow.rb:574:5:574:5 | b [element] | array_flow.rb:575:10:575:10 | b [element] | +| array_flow.rb:574:9:574:9 | a [element 2, element 1] | array_flow.rb:574:9:574:17 | call to flatten [element] | +| array_flow.rb:574:9:574:9 | a [element 2, element 1] | array_flow.rb:574:9:574:17 | call to flatten [element] | +| array_flow.rb:574:9:574:17 | call to flatten [element] | array_flow.rb:574:5:574:5 | b [element] | +| array_flow.rb:574:9:574:17 | call to flatten [element] | array_flow.rb:574:5:574:5 | b [element] | +| array_flow.rb:575:10:575:10 | b [element] | array_flow.rb:575:10:575:13 | ...[...] | +| array_flow.rb:575:10:575:10 | b [element] | array_flow.rb:575:10:575:13 | ...[...] | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] | array_flow.rb:580:10:580:10 | a [element 2, element 1] | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] | array_flow.rb:580:10:580:10 | a [element 2, element 1] | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] | array_flow.rb:581:9:581:9 | a [element 2, element 1] | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] | array_flow.rb:581:9:581:9 | a [element 2, element 1] | +| array_flow.rb:579:20:579:29 | call to source | array_flow.rb:579:5:579:5 | a [element 2, element 1] | +| array_flow.rb:579:20:579:29 | call to source | array_flow.rb:579:5:579:5 | a [element 2, element 1] | +| array_flow.rb:580:10:580:10 | a [element 2, element 1] | array_flow.rb:580:10:580:13 | ...[...] [element 1] | +| array_flow.rb:580:10:580:10 | a [element 2, element 1] | array_flow.rb:580:10:580:13 | ...[...] [element 1] | +| array_flow.rb:580:10:580:13 | ...[...] [element 1] | array_flow.rb:580:10:580:16 | ...[...] | +| array_flow.rb:580:10:580:13 | ...[...] [element 1] | array_flow.rb:580:10:580:16 | ...[...] | +| array_flow.rb:581:5:581:5 | b [element, element 1] | array_flow.rb:585:10:585:10 | b [element, element 1] | +| array_flow.rb:581:5:581:5 | b [element, element 1] | array_flow.rb:585:10:585:10 | b [element, element 1] | +| array_flow.rb:581:5:581:5 | b [element] | array_flow.rb:584:10:584:10 | b [element] | +| array_flow.rb:581:5:581:5 | b [element] | array_flow.rb:584:10:584:10 | b [element] | +| array_flow.rb:581:5:581:5 | b [element] | array_flow.rb:585:10:585:10 | b [element] | +| array_flow.rb:581:9:581:9 | [post] a [element, element 1] | array_flow.rb:583:10:583:10 | a [element, element 1] | +| array_flow.rb:581:9:581:9 | [post] a [element, element 1] | array_flow.rb:583:10:583:10 | a [element, element 1] | +| array_flow.rb:581:9:581:9 | [post] a [element] | array_flow.rb:582:10:582:10 | a [element] | +| array_flow.rb:581:9:581:9 | [post] a [element] | array_flow.rb:582:10:582:10 | a [element] | +| array_flow.rb:581:9:581:9 | [post] a [element] | array_flow.rb:583:10:583:10 | a [element] | +| array_flow.rb:581:9:581:9 | a [element 2, element 1] | array_flow.rb:581:9:581:9 | [post] a [element, element 1] | +| array_flow.rb:581:9:581:9 | a [element 2, element 1] | array_flow.rb:581:9:581:9 | [post] a [element, element 1] | +| array_flow.rb:581:9:581:9 | a [element 2, element 1] | array_flow.rb:581:9:581:9 | [post] a [element] | +| array_flow.rb:581:9:581:9 | a [element 2, element 1] | array_flow.rb:581:9:581:9 | [post] a [element] | +| array_flow.rb:581:9:581:9 | a [element 2, element 1] | array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] | +| array_flow.rb:581:9:581:9 | a [element 2, element 1] | array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] | +| array_flow.rb:581:9:581:9 | a [element 2, element 1] | array_flow.rb:581:9:581:18 | call to flatten! [element] | +| array_flow.rb:581:9:581:9 | a [element 2, element 1] | array_flow.rb:581:9:581:18 | call to flatten! [element] | +| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] | array_flow.rb:581:5:581:5 | b [element, element 1] | +| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] | array_flow.rb:581:5:581:5 | b [element, element 1] | +| array_flow.rb:581:9:581:18 | call to flatten! [element] | array_flow.rb:581:5:581:5 | b [element] | +| array_flow.rb:581:9:581:18 | call to flatten! [element] | array_flow.rb:581:5:581:5 | b [element] | +| array_flow.rb:582:10:582:10 | a [element] | array_flow.rb:582:10:582:13 | ...[...] | +| array_flow.rb:582:10:582:10 | a [element] | array_flow.rb:582:10:582:13 | ...[...] | +| array_flow.rb:583:10:583:10 | a [element, element 1] | array_flow.rb:583:10:583:13 | ...[...] [element 1] | +| array_flow.rb:583:10:583:10 | a [element, element 1] | array_flow.rb:583:10:583:13 | ...[...] [element 1] | +| array_flow.rb:583:10:583:10 | a [element] | array_flow.rb:583:10:583:13 | ...[...] | +| array_flow.rb:583:10:583:13 | ...[...] | array_flow.rb:583:10:583:16 | ...[...] | +| array_flow.rb:583:10:583:13 | ...[...] [element 1] | array_flow.rb:583:10:583:16 | ...[...] | +| array_flow.rb:583:10:583:13 | ...[...] [element 1] | array_flow.rb:583:10:583:16 | ...[...] | +| array_flow.rb:584:10:584:10 | b [element] | array_flow.rb:584:10:584:13 | ...[...] | +| array_flow.rb:584:10:584:10 | b [element] | array_flow.rb:584:10:584:13 | ...[...] | +| array_flow.rb:585:10:585:10 | b [element, element 1] | array_flow.rb:585:10:585:13 | ...[...] [element 1] | +| array_flow.rb:585:10:585:10 | b [element, element 1] | array_flow.rb:585:10:585:13 | ...[...] [element 1] | +| array_flow.rb:585:10:585:10 | b [element] | array_flow.rb:585:10:585:13 | ...[...] | +| array_flow.rb:585:10:585:13 | ...[...] | array_flow.rb:585:10:585:16 | ...[...] | +| array_flow.rb:585:10:585:13 | ...[...] [element 1] | array_flow.rb:585:10:585:16 | ...[...] | +| array_flow.rb:585:10:585:13 | ...[...] [element 1] | array_flow.rb:585:10:585:16 | ...[...] | +| array_flow.rb:589:5:589:5 | a [element 3] | array_flow.rb:590:9:590:9 | a [element 3] | +| array_flow.rb:589:5:589:5 | a [element 3] | array_flow.rb:590:9:590:9 | a [element 3] | +| array_flow.rb:589:5:589:5 | a [element 3] | array_flow.rb:592:9:592:9 | a [element 3] | +| array_flow.rb:589:5:589:5 | a [element 3] | array_flow.rb:592:9:592:9 | a [element 3] | +| array_flow.rb:589:19:589:30 | call to source | array_flow.rb:589:5:589:5 | a [element 3] | +| array_flow.rb:589:19:589:30 | call to source | array_flow.rb:589:5:589:5 | a [element 3] | +| array_flow.rb:590:5:590:5 | b [element] | array_flow.rb:591:10:591:10 | b [element] | +| array_flow.rb:590:5:590:5 | b [element] | array_flow.rb:591:10:591:10 | b [element] | +| array_flow.rb:590:9:590:9 | a [element 3] | array_flow.rb:590:9:590:20 | call to grep [element] | +| array_flow.rb:590:9:590:9 | a [element 3] | array_flow.rb:590:9:590:20 | call to grep [element] | +| array_flow.rb:590:9:590:20 | call to grep [element] | array_flow.rb:590:5:590:5 | b [element] | +| array_flow.rb:590:9:590:20 | call to grep [element] | array_flow.rb:590:5:590:5 | b [element] | +| array_flow.rb:591:10:591:10 | b [element] | array_flow.rb:591:10:591:13 | ...[...] | +| array_flow.rb:591:10:591:10 | b [element] | array_flow.rb:591:10:591:13 | ...[...] | +| array_flow.rb:592:5:592:5 | b [element] | array_flow.rb:596:10:596:10 | b [element] | +| array_flow.rb:592:5:592:5 | b [element] | array_flow.rb:596:10:596:10 | b [element] | +| array_flow.rb:592:9:592:9 | a [element 3] | array_flow.rb:592:26:592:26 | x | +| array_flow.rb:592:9:592:9 | a [element 3] | array_flow.rb:592:26:592:26 | x | +| array_flow.rb:592:9:595:7 | call to grep [element] | array_flow.rb:592:5:592:5 | b [element] | +| array_flow.rb:592:9:595:7 | call to grep [element] | array_flow.rb:592:5:592:5 | b [element] | +| array_flow.rb:592:26:592:26 | x | array_flow.rb:593:14:593:14 | x | +| array_flow.rb:592:26:592:26 | x | array_flow.rb:593:14:593:14 | x | +| array_flow.rb:594:9:594:20 | call to source | array_flow.rb:592:9:595:7 | call to grep [element] | +| array_flow.rb:594:9:594:20 | call to source | array_flow.rb:592:9:595:7 | call to grep [element] | +| array_flow.rb:596:10:596:10 | b [element] | array_flow.rb:596:10:596:13 | ...[...] | +| array_flow.rb:596:10:596:10 | b [element] | array_flow.rb:596:10:596:13 | ...[...] | +| array_flow.rb:600:5:600:5 | a [element 3] | array_flow.rb:601:9:601:9 | a [element 3] | +| array_flow.rb:600:5:600:5 | a [element 3] | array_flow.rb:601:9:601:9 | a [element 3] | +| array_flow.rb:600:5:600:5 | a [element 3] | array_flow.rb:603:9:603:9 | a [element 3] | +| array_flow.rb:600:5:600:5 | a [element 3] | array_flow.rb:603:9:603:9 | a [element 3] | +| array_flow.rb:600:19:600:30 | call to source | array_flow.rb:600:5:600:5 | a [element 3] | +| array_flow.rb:600:19:600:30 | call to source | array_flow.rb:600:5:600:5 | a [element 3] | +| array_flow.rb:601:5:601:5 | b [element] | array_flow.rb:602:10:602:10 | b [element] | +| array_flow.rb:601:5:601:5 | b [element] | array_flow.rb:602:10:602:10 | b [element] | +| array_flow.rb:601:9:601:9 | a [element 3] | array_flow.rb:601:9:601:21 | call to grep_v [element] | +| array_flow.rb:601:9:601:9 | a [element 3] | array_flow.rb:601:9:601:21 | call to grep_v [element] | +| array_flow.rb:601:9:601:21 | call to grep_v [element] | array_flow.rb:601:5:601:5 | b [element] | +| array_flow.rb:601:9:601:21 | call to grep_v [element] | array_flow.rb:601:5:601:5 | b [element] | +| array_flow.rb:602:10:602:10 | b [element] | array_flow.rb:602:10:602:13 | ...[...] | +| array_flow.rb:602:10:602:10 | b [element] | array_flow.rb:602:10:602:13 | ...[...] | +| array_flow.rb:603:5:603:5 | b [element] | array_flow.rb:607:10:607:10 | b [element] | +| array_flow.rb:603:5:603:5 | b [element] | array_flow.rb:607:10:607:10 | b [element] | +| array_flow.rb:603:9:603:9 | a [element 3] | array_flow.rb:603:27:603:27 | x | +| array_flow.rb:603:9:603:9 | a [element 3] | array_flow.rb:603:27:603:27 | x | +| array_flow.rb:603:9:606:7 | call to grep_v [element] | array_flow.rb:603:5:603:5 | b [element] | +| array_flow.rb:603:9:606:7 | call to grep_v [element] | array_flow.rb:603:5:603:5 | b [element] | +| array_flow.rb:603:27:603:27 | x | array_flow.rb:604:14:604:14 | x | +| array_flow.rb:603:27:603:27 | x | array_flow.rb:604:14:604:14 | x | +| array_flow.rb:605:9:605:20 | call to source | array_flow.rb:603:9:606:7 | call to grep_v [element] | +| array_flow.rb:605:9:605:20 | call to source | array_flow.rb:603:9:606:7 | call to grep_v [element] | +| array_flow.rb:607:10:607:10 | b [element] | array_flow.rb:607:10:607:13 | ...[...] | +| array_flow.rb:607:10:607:10 | b [element] | array_flow.rb:607:10:607:13 | ...[...] | +| array_flow.rb:611:5:611:5 | a [element 3] | array_flow.rb:612:9:612:9 | a [element 3] | +| array_flow.rb:611:5:611:5 | a [element 3] | array_flow.rb:612:9:612:9 | a [element 3] | +| array_flow.rb:611:19:611:30 | call to source | array_flow.rb:611:5:611:5 | a [element 3] | +| array_flow.rb:611:19:611:30 | call to source | array_flow.rb:611:5:611:5 | a [element 3] | +| array_flow.rb:612:9:612:9 | a [element 3] | array_flow.rb:612:24:612:24 | x | +| array_flow.rb:612:9:612:9 | a [element 3] | array_flow.rb:612:24:612:24 | x | +| array_flow.rb:612:24:612:24 | x | array_flow.rb:613:14:613:14 | x | +| array_flow.rb:612:24:612:24 | x | array_flow.rb:613:14:613:14 | x | +| array_flow.rb:620:5:620:5 | a [element 3] | array_flow.rb:621:5:621:5 | a [element 3] | +| array_flow.rb:620:5:620:5 | a [element 3] | array_flow.rb:621:5:621:5 | a [element 3] | +| array_flow.rb:620:19:620:28 | call to source | array_flow.rb:620:5:620:5 | a [element 3] | +| array_flow.rb:620:19:620:28 | call to source | array_flow.rb:620:5:620:5 | a [element 3] | +| array_flow.rb:621:5:621:5 | a [element 3] | array_flow.rb:621:17:621:17 | x | +| array_flow.rb:621:5:621:5 | a [element 3] | array_flow.rb:621:17:621:17 | x | +| array_flow.rb:621:17:621:17 | x | array_flow.rb:622:14:622:14 | x | +| array_flow.rb:621:17:621:17 | x | array_flow.rb:622:14:622:14 | x | +| array_flow.rb:627:5:627:5 | a [element 0] | array_flow.rb:628:9:628:9 | a [element 0] | +| array_flow.rb:627:5:627:5 | a [element 0] | array_flow.rb:628:9:628:9 | a [element 0] | +| array_flow.rb:627:5:627:5 | a [element 0] | array_flow.rb:634:9:634:9 | a [element 0] | +| array_flow.rb:627:5:627:5 | a [element 0] | array_flow.rb:634:9:634:9 | a [element 0] | +| array_flow.rb:627:5:627:5 | a [element 2] | array_flow.rb:628:9:628:9 | a [element 2] | +| array_flow.rb:627:5:627:5 | a [element 2] | array_flow.rb:628:9:628:9 | a [element 2] | +| array_flow.rb:627:5:627:5 | a [element 2] | array_flow.rb:634:9:634:9 | a [element 2] | +| array_flow.rb:627:5:627:5 | a [element 2] | array_flow.rb:634:9:634:9 | a [element 2] | +| array_flow.rb:627:10:627:21 | call to source | array_flow.rb:627:5:627:5 | a [element 0] | +| array_flow.rb:627:10:627:21 | call to source | array_flow.rb:627:5:627:5 | a [element 0] | +| array_flow.rb:627:27:627:38 | call to source | array_flow.rb:627:5:627:5 | a [element 2] | +| array_flow.rb:627:27:627:38 | call to source | array_flow.rb:627:5:627:5 | a [element 2] | +| array_flow.rb:628:5:628:5 | b | array_flow.rb:633:10:633:10 | b | +| array_flow.rb:628:5:628:5 | b | array_flow.rb:633:10:633:10 | b | +| array_flow.rb:628:9:628:9 | a [element 0] | array_flow.rb:628:22:628:22 | x | +| array_flow.rb:628:9:628:9 | a [element 0] | array_flow.rb:628:22:628:22 | x | +| array_flow.rb:628:9:628:9 | a [element 2] | array_flow.rb:628:25:628:25 | y | +| array_flow.rb:628:9:628:9 | a [element 2] | array_flow.rb:628:25:628:25 | y | +| array_flow.rb:628:9:632:7 | call to inject | array_flow.rb:628:5:628:5 | b | +| array_flow.rb:628:9:632:7 | call to inject | array_flow.rb:628:5:628:5 | b | +| array_flow.rb:628:22:628:22 | x | array_flow.rb:629:14:629:14 | x | +| array_flow.rb:628:22:628:22 | x | array_flow.rb:629:14:629:14 | x | +| array_flow.rb:628:25:628:25 | y | array_flow.rb:630:14:630:14 | y | +| array_flow.rb:628:25:628:25 | y | array_flow.rb:630:14:630:14 | y | +| array_flow.rb:631:9:631:19 | call to source | array_flow.rb:628:9:632:7 | call to inject | +| array_flow.rb:631:9:631:19 | call to source | array_flow.rb:628:9:632:7 | call to inject | +| array_flow.rb:634:5:634:5 | c | array_flow.rb:639:10:639:10 | c | +| array_flow.rb:634:5:634:5 | c | array_flow.rb:639:10:639:10 | c | +| array_flow.rb:634:9:634:9 | a [element 0] | array_flow.rb:634:28:634:28 | y | +| array_flow.rb:634:9:634:9 | a [element 0] | array_flow.rb:634:28:634:28 | y | +| array_flow.rb:634:9:634:9 | a [element 2] | array_flow.rb:634:28:634:28 | y | +| array_flow.rb:634:9:634:9 | a [element 2] | array_flow.rb:634:28:634:28 | y | +| array_flow.rb:634:9:638:7 | call to inject | array_flow.rb:634:5:634:5 | c | +| array_flow.rb:634:9:638:7 | call to inject | array_flow.rb:634:5:634:5 | c | +| array_flow.rb:634:28:634:28 | y | array_flow.rb:636:14:636:14 | y | +| array_flow.rb:634:28:634:28 | y | array_flow.rb:636:14:636:14 | y | +| array_flow.rb:637:9:637:19 | call to source | array_flow.rb:634:9:638:7 | call to inject | +| array_flow.rb:637:9:637:19 | call to source | array_flow.rb:634:9:638:7 | call to inject | +| array_flow.rb:644:5:644:5 | a [element 2] | array_flow.rb:645:9:645:9 | a [element 2] | +| array_flow.rb:644:5:644:5 | a [element 2] | array_flow.rb:645:9:645:9 | a [element 2] | +| array_flow.rb:644:16:644:27 | call to source | array_flow.rb:644:5:644:5 | a [element 2] | +| array_flow.rb:644:16:644:27 | call to source | array_flow.rb:644:5:644:5 | a [element 2] | +| array_flow.rb:645:5:645:5 | b [element 1] | array_flow.rb:652:10:652:10 | b [element 1] | +| array_flow.rb:645:5:645:5 | b [element 1] | array_flow.rb:652:10:652:10 | b [element 1] | +| array_flow.rb:645:5:645:5 | b [element 2] | array_flow.rb:653:10:653:10 | b [element 2] | +| array_flow.rb:645:5:645:5 | b [element 2] | array_flow.rb:653:10:653:10 | b [element 2] | +| array_flow.rb:645:5:645:5 | b [element 4] | array_flow.rb:655:10:655:10 | b [element 4] | +| array_flow.rb:645:5:645:5 | b [element 4] | array_flow.rb:655:10:655:10 | b [element 4] | +| array_flow.rb:645:9:645:9 | [post] a [element 1] | array_flow.rb:647:10:647:10 | a [element 1] | +| array_flow.rb:645:9:645:9 | [post] a [element 1] | array_flow.rb:647:10:647:10 | a [element 1] | +| array_flow.rb:645:9:645:9 | [post] a [element 2] | array_flow.rb:648:10:648:10 | a [element 2] | +| array_flow.rb:645:9:645:9 | [post] a [element 2] | array_flow.rb:648:10:648:10 | a [element 2] | +| array_flow.rb:645:9:645:9 | [post] a [element 4] | array_flow.rb:650:10:650:10 | a [element 4] | +| array_flow.rb:645:9:645:9 | [post] a [element 4] | array_flow.rb:650:10:650:10 | a [element 4] | +| array_flow.rb:645:9:645:9 | a [element 2] | array_flow.rb:645:9:645:9 | [post] a [element 4] | +| array_flow.rb:645:9:645:9 | a [element 2] | array_flow.rb:645:9:645:9 | [post] a [element 4] | +| array_flow.rb:645:9:645:9 | a [element 2] | array_flow.rb:645:9:645:47 | call to insert [element 4] | +| array_flow.rb:645:9:645:9 | a [element 2] | array_flow.rb:645:9:645:47 | call to insert [element 4] | +| array_flow.rb:645:9:645:47 | call to insert [element 1] | array_flow.rb:645:5:645:5 | b [element 1] | +| array_flow.rb:645:9:645:47 | call to insert [element 1] | array_flow.rb:645:5:645:5 | b [element 1] | +| array_flow.rb:645:9:645:47 | call to insert [element 2] | array_flow.rb:645:5:645:5 | b [element 2] | +| array_flow.rb:645:9:645:47 | call to insert [element 2] | array_flow.rb:645:5:645:5 | b [element 2] | +| array_flow.rb:645:9:645:47 | call to insert [element 4] | array_flow.rb:645:5:645:5 | b [element 4] | +| array_flow.rb:645:9:645:47 | call to insert [element 4] | array_flow.rb:645:5:645:5 | b [element 4] | +| array_flow.rb:645:21:645:32 | call to source | array_flow.rb:645:9:645:9 | [post] a [element 1] | +| array_flow.rb:645:21:645:32 | call to source | array_flow.rb:645:9:645:9 | [post] a [element 1] | +| array_flow.rb:645:21:645:32 | call to source | array_flow.rb:645:9:645:47 | call to insert [element 1] | +| array_flow.rb:645:21:645:32 | call to source | array_flow.rb:645:9:645:47 | call to insert [element 1] | +| array_flow.rb:645:35:645:46 | call to source | array_flow.rb:645:9:645:9 | [post] a [element 2] | +| array_flow.rb:645:35:645:46 | call to source | array_flow.rb:645:9:645:9 | [post] a [element 2] | +| array_flow.rb:645:35:645:46 | call to source | array_flow.rb:645:9:645:47 | call to insert [element 2] | +| array_flow.rb:645:35:645:46 | call to source | array_flow.rb:645:9:645:47 | call to insert [element 2] | +| array_flow.rb:647:10:647:10 | a [element 1] | array_flow.rb:647:10:647:13 | ...[...] | +| array_flow.rb:647:10:647:10 | a [element 1] | array_flow.rb:647:10:647:13 | ...[...] | +| array_flow.rb:648:10:648:10 | a [element 2] | array_flow.rb:648:10:648:13 | ...[...] | +| array_flow.rb:648:10:648:10 | a [element 2] | array_flow.rb:648:10:648:13 | ...[...] | +| array_flow.rb:650:10:650:10 | a [element 4] | array_flow.rb:650:10:650:13 | ...[...] | +| array_flow.rb:650:10:650:10 | a [element 4] | array_flow.rb:650:10:650:13 | ...[...] | +| array_flow.rb:652:10:652:10 | b [element 1] | array_flow.rb:652:10:652:13 | ...[...] | +| array_flow.rb:652:10:652:10 | b [element 1] | array_flow.rb:652:10:652:13 | ...[...] | +| array_flow.rb:653:10:653:10 | b [element 2] | array_flow.rb:653:10:653:13 | ...[...] | +| array_flow.rb:653:10:653:10 | b [element 2] | array_flow.rb:653:10:653:13 | ...[...] | +| array_flow.rb:655:10:655:10 | b [element 4] | array_flow.rb:655:10:655:13 | ...[...] | +| array_flow.rb:655:10:655:10 | b [element 4] | array_flow.rb:655:10:655:13 | ...[...] | +| array_flow.rb:658:5:658:5 | c [element 2] | array_flow.rb:659:9:659:9 | c [element 2] | +| array_flow.rb:658:5:658:5 | c [element 2] | array_flow.rb:659:9:659:9 | c [element 2] | +| array_flow.rb:658:16:658:27 | call to source | array_flow.rb:658:5:658:5 | c [element 2] | +| array_flow.rb:658:16:658:27 | call to source | array_flow.rb:658:5:658:5 | c [element 2] | +| array_flow.rb:659:5:659:5 | d [element] | array_flow.rb:661:10:661:10 | d [element] | +| array_flow.rb:659:5:659:5 | d [element] | array_flow.rb:661:10:661:10 | d [element] | +| array_flow.rb:659:9:659:9 | [post] c [element] | array_flow.rb:660:10:660:10 | c [element] | +| array_flow.rb:659:9:659:9 | [post] c [element] | array_flow.rb:660:10:660:10 | c [element] | +| array_flow.rb:659:9:659:9 | c [element 2] | array_flow.rb:659:9:659:9 | [post] c [element] | +| array_flow.rb:659:9:659:9 | c [element 2] | array_flow.rb:659:9:659:9 | [post] c [element] | +| array_flow.rb:659:9:659:9 | c [element 2] | array_flow.rb:659:9:659:47 | call to insert [element] | +| array_flow.rb:659:9:659:9 | c [element 2] | array_flow.rb:659:9:659:47 | call to insert [element] | +| array_flow.rb:659:9:659:47 | call to insert [element] | array_flow.rb:659:5:659:5 | d [element] | +| array_flow.rb:659:9:659:47 | call to insert [element] | array_flow.rb:659:5:659:5 | d [element] | +| array_flow.rb:659:21:659:32 | call to source | array_flow.rb:659:9:659:9 | [post] c [element] | +| array_flow.rb:659:21:659:32 | call to source | array_flow.rb:659:9:659:9 | [post] c [element] | +| array_flow.rb:659:21:659:32 | call to source | array_flow.rb:659:9:659:47 | call to insert [element] | +| array_flow.rb:659:21:659:32 | call to source | array_flow.rb:659:9:659:47 | call to insert [element] | +| array_flow.rb:659:35:659:46 | call to source | array_flow.rb:659:9:659:9 | [post] c [element] | +| array_flow.rb:659:35:659:46 | call to source | array_flow.rb:659:9:659:9 | [post] c [element] | +| array_flow.rb:659:35:659:46 | call to source | array_flow.rb:659:9:659:47 | call to insert [element] | +| array_flow.rb:659:35:659:46 | call to source | array_flow.rb:659:9:659:47 | call to insert [element] | +| array_flow.rb:660:10:660:10 | c [element] | array_flow.rb:660:10:660:13 | ...[...] | +| array_flow.rb:660:10:660:10 | c [element] | array_flow.rb:660:10:660:13 | ...[...] | +| array_flow.rb:661:10:661:10 | d [element] | array_flow.rb:661:10:661:13 | ...[...] | +| array_flow.rb:661:10:661:10 | d [element] | array_flow.rb:661:10:661:13 | ...[...] | +| array_flow.rb:672:5:672:5 | a [element 2] | array_flow.rb:673:9:673:9 | a [element 2] | +| array_flow.rb:672:5:672:5 | a [element 2] | array_flow.rb:673:9:673:9 | a [element 2] | +| array_flow.rb:672:16:672:27 | call to source | array_flow.rb:672:5:672:5 | a [element 2] | +| array_flow.rb:672:16:672:27 | call to source | array_flow.rb:672:5:672:5 | a [element 2] | +| array_flow.rb:673:5:673:5 | b [element] | array_flow.rb:674:10:674:10 | b [element] | +| array_flow.rb:673:5:673:5 | b [element] | array_flow.rb:674:10:674:10 | b [element] | +| array_flow.rb:673:9:673:9 | a [element 2] | array_flow.rb:673:9:673:60 | call to intersection [element] | +| array_flow.rb:673:9:673:9 | a [element 2] | array_flow.rb:673:9:673:60 | call to intersection [element] | +| array_flow.rb:673:9:673:60 | call to intersection [element] | array_flow.rb:673:5:673:5 | b [element] | +| array_flow.rb:673:9:673:60 | call to intersection [element] | array_flow.rb:673:5:673:5 | b [element] | +| array_flow.rb:673:31:673:42 | call to source | array_flow.rb:673:9:673:60 | call to intersection [element] | +| array_flow.rb:673:31:673:42 | call to source | array_flow.rb:673:9:673:60 | call to intersection [element] | +| array_flow.rb:673:47:673:58 | call to source | array_flow.rb:673:9:673:60 | call to intersection [element] | +| array_flow.rb:673:47:673:58 | call to source | array_flow.rb:673:9:673:60 | call to intersection [element] | +| array_flow.rb:674:10:674:10 | b [element] | array_flow.rb:674:10:674:13 | ...[...] | +| array_flow.rb:674:10:674:10 | b [element] | array_flow.rb:674:10:674:13 | ...[...] | +| array_flow.rb:678:5:678:5 | a [element 2] | array_flow.rb:679:9:679:9 | a [element 2] | +| array_flow.rb:678:5:678:5 | a [element 2] | array_flow.rb:679:9:679:9 | a [element 2] | +| array_flow.rb:678:16:678:25 | call to source | array_flow.rb:678:5:678:5 | a [element 2] | +| array_flow.rb:678:16:678:25 | call to source | array_flow.rb:678:5:678:5 | a [element 2] | +| array_flow.rb:679:5:679:5 | b [element] | array_flow.rb:684:10:684:10 | b [element] | +| array_flow.rb:679:5:679:5 | b [element] | array_flow.rb:684:10:684:10 | b [element] | +| array_flow.rb:679:9:679:9 | [post] a [element] | array_flow.rb:683:10:683:10 | a [element] | +| array_flow.rb:679:9:679:9 | [post] a [element] | array_flow.rb:683:10:683:10 | a [element] | +| array_flow.rb:679:9:679:9 | a [element 2] | array_flow.rb:679:9:679:9 | [post] a [element] | +| array_flow.rb:679:9:679:9 | a [element 2] | array_flow.rb:679:9:679:9 | [post] a [element] | +| array_flow.rb:679:9:679:9 | a [element 2] | array_flow.rb:679:9:682:7 | call to keep_if [element] | +| array_flow.rb:679:9:679:9 | a [element 2] | array_flow.rb:679:9:682:7 | call to keep_if [element] | +| array_flow.rb:679:9:679:9 | a [element 2] | array_flow.rb:679:23:679:23 | x | +| array_flow.rb:679:9:679:9 | a [element 2] | array_flow.rb:679:23:679:23 | x | +| array_flow.rb:679:9:682:7 | call to keep_if [element] | array_flow.rb:679:5:679:5 | b [element] | +| array_flow.rb:679:9:682:7 | call to keep_if [element] | array_flow.rb:679:5:679:5 | b [element] | +| array_flow.rb:679:23:679:23 | x | array_flow.rb:680:14:680:14 | x | +| array_flow.rb:679:23:679:23 | x | array_flow.rb:680:14:680:14 | x | +| array_flow.rb:683:10:683:10 | a [element] | array_flow.rb:683:10:683:13 | ...[...] | +| array_flow.rb:683:10:683:10 | a [element] | array_flow.rb:683:10:683:13 | ...[...] | +| array_flow.rb:684:10:684:10 | b [element] | array_flow.rb:684:10:684:13 | ...[...] | +| array_flow.rb:684:10:684:10 | b [element] | array_flow.rb:684:10:684:13 | ...[...] | +| array_flow.rb:688:5:688:5 | a [element 2] | array_flow.rb:690:10:690:10 | a [element 2] | +| array_flow.rb:688:5:688:5 | a [element 2] | array_flow.rb:690:10:690:10 | a [element 2] | +| array_flow.rb:688:5:688:5 | a [element 2] | array_flow.rb:691:9:691:9 | a [element 2] | +| array_flow.rb:688:5:688:5 | a [element 2] | array_flow.rb:691:9:691:9 | a [element 2] | +| array_flow.rb:688:16:688:27 | call to source | array_flow.rb:688:5:688:5 | a [element 2] | +| array_flow.rb:688:16:688:27 | call to source | array_flow.rb:688:5:688:5 | a [element 2] | +| array_flow.rb:689:5:689:5 | [post] a [element] | array_flow.rb:690:10:690:10 | a [element] | +| array_flow.rb:689:5:689:5 | [post] a [element] | array_flow.rb:690:10:690:10 | a [element] | +| array_flow.rb:689:5:689:5 | [post] a [element] | array_flow.rb:691:9:691:9 | a [element] | +| array_flow.rb:689:5:689:5 | [post] a [element] | array_flow.rb:691:9:691:9 | a [element] | +| array_flow.rb:689:12:689:23 | call to source | array_flow.rb:689:5:689:5 | [post] a [element] | +| array_flow.rb:689:12:689:23 | call to source | array_flow.rb:689:5:689:5 | [post] a [element] | +| array_flow.rb:690:10:690:10 | a [element 2] | array_flow.rb:690:10:690:15 | call to last | +| array_flow.rb:690:10:690:10 | a [element 2] | array_flow.rb:690:10:690:15 | call to last | +| array_flow.rb:690:10:690:10 | a [element] | array_flow.rb:690:10:690:15 | call to last | +| array_flow.rb:690:10:690:10 | a [element] | array_flow.rb:690:10:690:15 | call to last | +| array_flow.rb:691:5:691:5 | b [element] | array_flow.rb:692:10:692:10 | b [element] | +| array_flow.rb:691:5:691:5 | b [element] | array_flow.rb:692:10:692:10 | b [element] | +| array_flow.rb:691:5:691:5 | b [element] | array_flow.rb:693:10:693:10 | b [element] | +| array_flow.rb:691:5:691:5 | b [element] | array_flow.rb:693:10:693:10 | b [element] | +| array_flow.rb:691:9:691:9 | a [element 2] | array_flow.rb:691:9:691:17 | call to last [element] | +| array_flow.rb:691:9:691:9 | a [element 2] | array_flow.rb:691:9:691:17 | call to last [element] | +| array_flow.rb:691:9:691:9 | a [element] | array_flow.rb:691:9:691:17 | call to last [element] | +| array_flow.rb:691:9:691:9 | a [element] | array_flow.rb:691:9:691:17 | call to last [element] | +| array_flow.rb:691:9:691:17 | call to last [element] | array_flow.rb:691:5:691:5 | b [element] | +| array_flow.rb:691:9:691:17 | call to last [element] | array_flow.rb:691:5:691:5 | b [element] | +| array_flow.rb:692:10:692:10 | b [element] | array_flow.rb:692:10:692:13 | ...[...] | +| array_flow.rb:692:10:692:10 | b [element] | array_flow.rb:692:10:692:13 | ...[...] | +| array_flow.rb:693:10:693:10 | b [element] | array_flow.rb:693:10:693:13 | ...[...] | +| array_flow.rb:693:10:693:10 | b [element] | array_flow.rb:693:10:693:13 | ...[...] | +| array_flow.rb:697:5:697:5 | a [element 2] | array_flow.rb:698:9:698:9 | a [element 2] | +| array_flow.rb:697:5:697:5 | a [element 2] | array_flow.rb:698:9:698:9 | a [element 2] | +| array_flow.rb:697:16:697:27 | call to source | array_flow.rb:697:5:697:5 | a [element 2] | +| array_flow.rb:697:16:697:27 | call to source | array_flow.rb:697:5:697:5 | a [element 2] | +| array_flow.rb:698:5:698:5 | b [element] | array_flow.rb:702:10:702:10 | b [element] | +| array_flow.rb:698:5:698:5 | b [element] | array_flow.rb:702:10:702:10 | b [element] | +| array_flow.rb:698:9:698:9 | a [element 2] | array_flow.rb:698:19:698:19 | x | +| array_flow.rb:698:9:698:9 | a [element 2] | array_flow.rb:698:19:698:19 | x | +| array_flow.rb:698:9:701:7 | call to map [element] | array_flow.rb:698:5:698:5 | b [element] | +| array_flow.rb:698:9:701:7 | call to map [element] | array_flow.rb:698:5:698:5 | b [element] | +| array_flow.rb:698:19:698:19 | x | array_flow.rb:699:14:699:14 | x | +| array_flow.rb:698:19:698:19 | x | array_flow.rb:699:14:699:14 | x | +| array_flow.rb:700:9:700:19 | call to source | array_flow.rb:698:9:701:7 | call to map [element] | +| array_flow.rb:700:9:700:19 | call to source | array_flow.rb:698:9:701:7 | call to map [element] | +| array_flow.rb:702:10:702:10 | b [element] | array_flow.rb:702:10:702:13 | ...[...] | +| array_flow.rb:702:10:702:10 | b [element] | array_flow.rb:702:10:702:13 | ...[...] | +| array_flow.rb:706:5:706:5 | a [element 2] | array_flow.rb:707:9:707:9 | a [element 2] | +| array_flow.rb:706:5:706:5 | a [element 2] | array_flow.rb:707:9:707:9 | a [element 2] | +| array_flow.rb:706:16:706:27 | call to source | array_flow.rb:706:5:706:5 | a [element 2] | +| array_flow.rb:706:16:706:27 | call to source | array_flow.rb:706:5:706:5 | a [element 2] | +| array_flow.rb:707:5:707:5 | b [element] | array_flow.rb:711:10:711:10 | b [element] | +| array_flow.rb:707:5:707:5 | b [element] | array_flow.rb:711:10:711:10 | b [element] | +| array_flow.rb:707:9:707:9 | a [element 2] | array_flow.rb:707:20:707:20 | x | +| array_flow.rb:707:9:707:9 | a [element 2] | array_flow.rb:707:20:707:20 | x | +| array_flow.rb:707:9:710:7 | call to map! [element] | array_flow.rb:707:5:707:5 | b [element] | +| array_flow.rb:707:9:710:7 | call to map! [element] | array_flow.rb:707:5:707:5 | b [element] | +| array_flow.rb:707:20:707:20 | x | array_flow.rb:708:14:708:14 | x | +| array_flow.rb:707:20:707:20 | x | array_flow.rb:708:14:708:14 | x | +| array_flow.rb:709:9:709:19 | call to source | array_flow.rb:707:9:710:7 | call to map! [element] | +| array_flow.rb:709:9:709:19 | call to source | array_flow.rb:707:9:710:7 | call to map! [element] | +| array_flow.rb:711:10:711:10 | b [element] | array_flow.rb:711:10:711:13 | ...[...] | +| array_flow.rb:711:10:711:10 | b [element] | array_flow.rb:711:10:711:13 | ...[...] | +| array_flow.rb:715:5:715:5 | a [element 2] | array_flow.rb:718:9:718:9 | a [element 2] | +| array_flow.rb:715:5:715:5 | a [element 2] | array_flow.rb:718:9:718:9 | a [element 2] | +| array_flow.rb:715:5:715:5 | a [element 2] | array_flow.rb:722:9:722:9 | a [element 2] | +| array_flow.rb:715:5:715:5 | a [element 2] | array_flow.rb:722:9:722:9 | a [element 2] | +| array_flow.rb:715:5:715:5 | a [element 2] | array_flow.rb:726:9:726:9 | a [element 2] | +| array_flow.rb:715:5:715:5 | a [element 2] | array_flow.rb:726:9:726:9 | a [element 2] | +| array_flow.rb:715:5:715:5 | a [element 2] | array_flow.rb:734:9:734:9 | a [element 2] | +| array_flow.rb:715:5:715:5 | a [element 2] | array_flow.rb:734:9:734:9 | a [element 2] | +| array_flow.rb:715:16:715:25 | call to source | array_flow.rb:715:5:715:5 | a [element 2] | +| array_flow.rb:715:16:715:25 | call to source | array_flow.rb:715:5:715:5 | a [element 2] | +| array_flow.rb:718:5:718:5 | b | array_flow.rb:719:10:719:10 | b | +| array_flow.rb:718:5:718:5 | b | array_flow.rb:719:10:719:10 | b | +| array_flow.rb:718:9:718:9 | a [element 2] | array_flow.rb:718:9:718:13 | call to max | +| array_flow.rb:718:9:718:9 | a [element 2] | array_flow.rb:718:9:718:13 | call to max | +| array_flow.rb:718:9:718:13 | call to max | array_flow.rb:718:5:718:5 | b | +| array_flow.rb:718:9:718:13 | call to max | array_flow.rb:718:5:718:5 | b | +| array_flow.rb:722:5:722:5 | c [element] | array_flow.rb:723:10:723:10 | c [element] | +| array_flow.rb:722:5:722:5 | c [element] | array_flow.rb:723:10:723:10 | c [element] | +| array_flow.rb:722:9:722:9 | a [element 2] | array_flow.rb:722:9:722:16 | call to max [element] | +| array_flow.rb:722:9:722:9 | a [element 2] | array_flow.rb:722:9:722:16 | call to max [element] | +| array_flow.rb:722:9:722:16 | call to max [element] | array_flow.rb:722:5:722:5 | c [element] | +| array_flow.rb:722:9:722:16 | call to max [element] | array_flow.rb:722:5:722:5 | c [element] | +| array_flow.rb:723:10:723:10 | c [element] | array_flow.rb:723:10:723:13 | ...[...] | +| array_flow.rb:723:10:723:10 | c [element] | array_flow.rb:723:10:723:13 | ...[...] | +| array_flow.rb:726:5:726:5 | d | array_flow.rb:731:10:731:10 | d | +| array_flow.rb:726:5:726:5 | d | array_flow.rb:731:10:731:10 | d | +| array_flow.rb:726:9:726:9 | a [element 2] | array_flow.rb:726:9:730:7 | call to max | +| array_flow.rb:726:9:726:9 | a [element 2] | array_flow.rb:726:9:730:7 | call to max | +| array_flow.rb:726:9:726:9 | a [element 2] | array_flow.rb:726:19:726:19 | x | +| array_flow.rb:726:9:726:9 | a [element 2] | array_flow.rb:726:19:726:19 | x | +| array_flow.rb:726:9:726:9 | a [element 2] | array_flow.rb:726:22:726:22 | y | +| array_flow.rb:726:9:726:9 | a [element 2] | array_flow.rb:726:22:726:22 | y | +| array_flow.rb:726:9:730:7 | call to max | array_flow.rb:726:5:726:5 | d | +| array_flow.rb:726:9:730:7 | call to max | array_flow.rb:726:5:726:5 | d | +| array_flow.rb:726:19:726:19 | x | array_flow.rb:727:14:727:14 | x | +| array_flow.rb:726:19:726:19 | x | array_flow.rb:727:14:727:14 | x | +| array_flow.rb:726:22:726:22 | y | array_flow.rb:728:14:728:14 | y | +| array_flow.rb:726:22:726:22 | y | array_flow.rb:728:14:728:14 | y | +| array_flow.rb:734:5:734:5 | e [element] | array_flow.rb:739:10:739:10 | e [element] | +| array_flow.rb:734:5:734:5 | e [element] | array_flow.rb:739:10:739:10 | e [element] | +| array_flow.rb:734:9:734:9 | a [element 2] | array_flow.rb:734:9:738:7 | call to max [element] | +| array_flow.rb:734:9:734:9 | a [element 2] | array_flow.rb:734:9:738:7 | call to max [element] | +| array_flow.rb:734:9:734:9 | a [element 2] | array_flow.rb:734:22:734:22 | x | +| array_flow.rb:734:9:734:9 | a [element 2] | array_flow.rb:734:22:734:22 | x | +| array_flow.rb:734:9:734:9 | a [element 2] | array_flow.rb:734:25:734:25 | y | +| array_flow.rb:734:9:734:9 | a [element 2] | array_flow.rb:734:25:734:25 | y | +| array_flow.rb:734:9:738:7 | call to max [element] | array_flow.rb:734:5:734:5 | e [element] | +| array_flow.rb:734:9:738:7 | call to max [element] | array_flow.rb:734:5:734:5 | e [element] | +| array_flow.rb:734:22:734:22 | x | array_flow.rb:735:14:735:14 | x | +| array_flow.rb:734:22:734:22 | x | array_flow.rb:735:14:735:14 | x | +| array_flow.rb:734:25:734:25 | y | array_flow.rb:736:14:736:14 | y | +| array_flow.rb:734:25:734:25 | y | array_flow.rb:736:14:736:14 | y | +| array_flow.rb:739:10:739:10 | e [element] | array_flow.rb:739:10:739:13 | ...[...] | +| array_flow.rb:739:10:739:10 | e [element] | array_flow.rb:739:10:739:13 | ...[...] | +| array_flow.rb:743:5:743:5 | a [element 2] | array_flow.rb:746:9:746:9 | a [element 2] | +| array_flow.rb:743:5:743:5 | a [element 2] | array_flow.rb:746:9:746:9 | a [element 2] | +| array_flow.rb:743:5:743:5 | a [element 2] | array_flow.rb:753:9:753:9 | a [element 2] | +| array_flow.rb:743:5:743:5 | a [element 2] | array_flow.rb:753:9:753:9 | a [element 2] | +| array_flow.rb:743:16:743:25 | call to source | array_flow.rb:743:5:743:5 | a [element 2] | +| array_flow.rb:743:16:743:25 | call to source | array_flow.rb:743:5:743:5 | a [element 2] | +| array_flow.rb:746:5:746:5 | b | array_flow.rb:750:10:750:10 | b | +| array_flow.rb:746:5:746:5 | b | array_flow.rb:750:10:750:10 | b | +| array_flow.rb:746:9:746:9 | a [element 2] | array_flow.rb:746:9:749:7 | call to max_by | +| array_flow.rb:746:9:746:9 | a [element 2] | array_flow.rb:746:9:749:7 | call to max_by | +| array_flow.rb:746:9:746:9 | a [element 2] | array_flow.rb:746:22:746:22 | x | +| array_flow.rb:746:9:746:9 | a [element 2] | array_flow.rb:746:22:746:22 | x | +| array_flow.rb:746:9:749:7 | call to max_by | array_flow.rb:746:5:746:5 | b | +| array_flow.rb:746:9:749:7 | call to max_by | array_flow.rb:746:5:746:5 | b | +| array_flow.rb:746:22:746:22 | x | array_flow.rb:747:14:747:14 | x | +| array_flow.rb:746:22:746:22 | x | array_flow.rb:747:14:747:14 | x | +| array_flow.rb:753:5:753:5 | c [element] | array_flow.rb:757:10:757:10 | c [element] | +| array_flow.rb:753:5:753:5 | c [element] | array_flow.rb:757:10:757:10 | c [element] | +| array_flow.rb:753:9:753:9 | a [element 2] | array_flow.rb:753:9:756:7 | call to max_by [element] | +| array_flow.rb:753:9:753:9 | a [element 2] | array_flow.rb:753:9:756:7 | call to max_by [element] | +| array_flow.rb:753:9:753:9 | a [element 2] | array_flow.rb:753:25:753:25 | x | +| array_flow.rb:753:9:753:9 | a [element 2] | array_flow.rb:753:25:753:25 | x | +| array_flow.rb:753:9:756:7 | call to max_by [element] | array_flow.rb:753:5:753:5 | c [element] | +| array_flow.rb:753:9:756:7 | call to max_by [element] | array_flow.rb:753:5:753:5 | c [element] | +| array_flow.rb:753:25:753:25 | x | array_flow.rb:754:14:754:14 | x | +| array_flow.rb:753:25:753:25 | x | array_flow.rb:754:14:754:14 | x | +| array_flow.rb:757:10:757:10 | c [element] | array_flow.rb:757:10:757:13 | ...[...] | +| array_flow.rb:757:10:757:10 | c [element] | array_flow.rb:757:10:757:13 | ...[...] | +| array_flow.rb:761:5:761:5 | a [element 2] | array_flow.rb:764:9:764:9 | a [element 2] | +| array_flow.rb:761:5:761:5 | a [element 2] | array_flow.rb:764:9:764:9 | a [element 2] | +| array_flow.rb:761:5:761:5 | a [element 2] | array_flow.rb:768:9:768:9 | a [element 2] | +| array_flow.rb:761:5:761:5 | a [element 2] | array_flow.rb:768:9:768:9 | a [element 2] | +| array_flow.rb:761:5:761:5 | a [element 2] | array_flow.rb:772:9:772:9 | a [element 2] | +| array_flow.rb:761:5:761:5 | a [element 2] | array_flow.rb:772:9:772:9 | a [element 2] | +| array_flow.rb:761:5:761:5 | a [element 2] | array_flow.rb:780:9:780:9 | a [element 2] | +| array_flow.rb:761:5:761:5 | a [element 2] | array_flow.rb:780:9:780:9 | a [element 2] | +| array_flow.rb:761:16:761:25 | call to source | array_flow.rb:761:5:761:5 | a [element 2] | +| array_flow.rb:761:16:761:25 | call to source | array_flow.rb:761:5:761:5 | a [element 2] | +| array_flow.rb:764:5:764:5 | b | array_flow.rb:765:10:765:10 | b | +| array_flow.rb:764:5:764:5 | b | array_flow.rb:765:10:765:10 | b | +| array_flow.rb:764:9:764:9 | a [element 2] | array_flow.rb:764:9:764:13 | call to min | +| array_flow.rb:764:9:764:9 | a [element 2] | array_flow.rb:764:9:764:13 | call to min | +| array_flow.rb:764:9:764:13 | call to min | array_flow.rb:764:5:764:5 | b | +| array_flow.rb:764:9:764:13 | call to min | array_flow.rb:764:5:764:5 | b | +| array_flow.rb:768:5:768:5 | c [element] | array_flow.rb:769:10:769:10 | c [element] | +| array_flow.rb:768:5:768:5 | c [element] | array_flow.rb:769:10:769:10 | c [element] | +| array_flow.rb:768:9:768:9 | a [element 2] | array_flow.rb:768:9:768:16 | call to min [element] | +| array_flow.rb:768:9:768:9 | a [element 2] | array_flow.rb:768:9:768:16 | call to min [element] | +| array_flow.rb:768:9:768:16 | call to min [element] | array_flow.rb:768:5:768:5 | c [element] | +| array_flow.rb:768:9:768:16 | call to min [element] | array_flow.rb:768:5:768:5 | c [element] | +| array_flow.rb:769:10:769:10 | c [element] | array_flow.rb:769:10:769:13 | ...[...] | +| array_flow.rb:769:10:769:10 | c [element] | array_flow.rb:769:10:769:13 | ...[...] | +| array_flow.rb:772:5:772:5 | d | array_flow.rb:777:10:777:10 | d | +| array_flow.rb:772:5:772:5 | d | array_flow.rb:777:10:777:10 | d | +| array_flow.rb:772:9:772:9 | a [element 2] | array_flow.rb:772:9:776:7 | call to min | +| array_flow.rb:772:9:772:9 | a [element 2] | array_flow.rb:772:9:776:7 | call to min | +| array_flow.rb:772:9:772:9 | a [element 2] | array_flow.rb:772:19:772:19 | x | +| array_flow.rb:772:9:772:9 | a [element 2] | array_flow.rb:772:19:772:19 | x | +| array_flow.rb:772:9:772:9 | a [element 2] | array_flow.rb:772:22:772:22 | y | +| array_flow.rb:772:9:772:9 | a [element 2] | array_flow.rb:772:22:772:22 | y | +| array_flow.rb:772:9:776:7 | call to min | array_flow.rb:772:5:772:5 | d | +| array_flow.rb:772:9:776:7 | call to min | array_flow.rb:772:5:772:5 | d | +| array_flow.rb:772:19:772:19 | x | array_flow.rb:773:14:773:14 | x | +| array_flow.rb:772:19:772:19 | x | array_flow.rb:773:14:773:14 | x | +| array_flow.rb:772:22:772:22 | y | array_flow.rb:774:14:774:14 | y | +| array_flow.rb:772:22:772:22 | y | array_flow.rb:774:14:774:14 | y | +| array_flow.rb:780:5:780:5 | e [element] | array_flow.rb:785:10:785:10 | e [element] | +| array_flow.rb:780:5:780:5 | e [element] | array_flow.rb:785:10:785:10 | e [element] | +| array_flow.rb:780:9:780:9 | a [element 2] | array_flow.rb:780:9:784:7 | call to min [element] | +| array_flow.rb:780:9:780:9 | a [element 2] | array_flow.rb:780:9:784:7 | call to min [element] | +| array_flow.rb:780:9:780:9 | a [element 2] | array_flow.rb:780:22:780:22 | x | +| array_flow.rb:780:9:780:9 | a [element 2] | array_flow.rb:780:22:780:22 | x | +| array_flow.rb:780:9:780:9 | a [element 2] | array_flow.rb:780:25:780:25 | y | +| array_flow.rb:780:9:780:9 | a [element 2] | array_flow.rb:780:25:780:25 | y | +| array_flow.rb:780:9:784:7 | call to min [element] | array_flow.rb:780:5:780:5 | e [element] | +| array_flow.rb:780:9:784:7 | call to min [element] | array_flow.rb:780:5:780:5 | e [element] | +| array_flow.rb:780:22:780:22 | x | array_flow.rb:781:14:781:14 | x | +| array_flow.rb:780:22:780:22 | x | array_flow.rb:781:14:781:14 | x | +| array_flow.rb:780:25:780:25 | y | array_flow.rb:782:14:782:14 | y | +| array_flow.rb:780:25:780:25 | y | array_flow.rb:782:14:782:14 | y | +| array_flow.rb:785:10:785:10 | e [element] | array_flow.rb:785:10:785:13 | ...[...] | +| array_flow.rb:785:10:785:10 | e [element] | array_flow.rb:785:10:785:13 | ...[...] | +| array_flow.rb:789:5:789:5 | a [element 2] | array_flow.rb:792:9:792:9 | a [element 2] | +| array_flow.rb:789:5:789:5 | a [element 2] | array_flow.rb:792:9:792:9 | a [element 2] | +| array_flow.rb:789:5:789:5 | a [element 2] | array_flow.rb:799:9:799:9 | a [element 2] | +| array_flow.rb:789:5:789:5 | a [element 2] | array_flow.rb:799:9:799:9 | a [element 2] | +| array_flow.rb:789:16:789:25 | call to source | array_flow.rb:789:5:789:5 | a [element 2] | +| array_flow.rb:789:16:789:25 | call to source | array_flow.rb:789:5:789:5 | a [element 2] | +| array_flow.rb:792:5:792:5 | b | array_flow.rb:796:10:796:10 | b | +| array_flow.rb:792:5:792:5 | b | array_flow.rb:796:10:796:10 | b | +| array_flow.rb:792:9:792:9 | a [element 2] | array_flow.rb:792:9:795:7 | call to min_by | +| array_flow.rb:792:9:792:9 | a [element 2] | array_flow.rb:792:9:795:7 | call to min_by | +| array_flow.rb:792:9:792:9 | a [element 2] | array_flow.rb:792:22:792:22 | x | +| array_flow.rb:792:9:792:9 | a [element 2] | array_flow.rb:792:22:792:22 | x | +| array_flow.rb:792:9:795:7 | call to min_by | array_flow.rb:792:5:792:5 | b | +| array_flow.rb:792:9:795:7 | call to min_by | array_flow.rb:792:5:792:5 | b | +| array_flow.rb:792:22:792:22 | x | array_flow.rb:793:14:793:14 | x | +| array_flow.rb:792:22:792:22 | x | array_flow.rb:793:14:793:14 | x | +| array_flow.rb:799:5:799:5 | c [element] | array_flow.rb:803:10:803:10 | c [element] | +| array_flow.rb:799:5:799:5 | c [element] | array_flow.rb:803:10:803:10 | c [element] | +| array_flow.rb:799:9:799:9 | a [element 2] | array_flow.rb:799:9:802:7 | call to min_by [element] | +| array_flow.rb:799:9:799:9 | a [element 2] | array_flow.rb:799:9:802:7 | call to min_by [element] | +| array_flow.rb:799:9:799:9 | a [element 2] | array_flow.rb:799:25:799:25 | x | +| array_flow.rb:799:9:799:9 | a [element 2] | array_flow.rb:799:25:799:25 | x | +| array_flow.rb:799:9:802:7 | call to min_by [element] | array_flow.rb:799:5:799:5 | c [element] | +| array_flow.rb:799:9:802:7 | call to min_by [element] | array_flow.rb:799:5:799:5 | c [element] | +| array_flow.rb:799:25:799:25 | x | array_flow.rb:800:14:800:14 | x | +| array_flow.rb:799:25:799:25 | x | array_flow.rb:800:14:800:14 | x | +| array_flow.rb:803:10:803:10 | c [element] | array_flow.rb:803:10:803:13 | ...[...] | +| array_flow.rb:803:10:803:10 | c [element] | array_flow.rb:803:10:803:13 | ...[...] | +| array_flow.rb:807:5:807:5 | a [element 2] | array_flow.rb:809:9:809:9 | a [element 2] | +| array_flow.rb:807:5:807:5 | a [element 2] | array_flow.rb:809:9:809:9 | a [element 2] | +| array_flow.rb:807:5:807:5 | a [element 2] | array_flow.rb:813:9:813:9 | a [element 2] | +| array_flow.rb:807:5:807:5 | a [element 2] | array_flow.rb:813:9:813:9 | a [element 2] | +| array_flow.rb:807:16:807:25 | call to source | array_flow.rb:807:5:807:5 | a [element 2] | +| array_flow.rb:807:16:807:25 | call to source | array_flow.rb:807:5:807:5 | a [element 2] | +| array_flow.rb:809:5:809:5 | b [element] | array_flow.rb:810:10:810:10 | b [element] | +| array_flow.rb:809:5:809:5 | b [element] | array_flow.rb:810:10:810:10 | b [element] | +| array_flow.rb:809:5:809:5 | b [element] | array_flow.rb:811:10:811:10 | b [element] | +| array_flow.rb:809:5:809:5 | b [element] | array_flow.rb:811:10:811:10 | b [element] | +| array_flow.rb:809:9:809:9 | a [element 2] | array_flow.rb:809:9:809:16 | call to minmax [element] | +| array_flow.rb:809:9:809:9 | a [element 2] | array_flow.rb:809:9:809:16 | call to minmax [element] | +| array_flow.rb:809:9:809:16 | call to minmax [element] | array_flow.rb:809:5:809:5 | b [element] | +| array_flow.rb:809:9:809:16 | call to minmax [element] | array_flow.rb:809:5:809:5 | b [element] | +| array_flow.rb:810:10:810:10 | b [element] | array_flow.rb:810:10:810:13 | ...[...] | +| array_flow.rb:810:10:810:10 | b [element] | array_flow.rb:810:10:810:13 | ...[...] | +| array_flow.rb:811:10:811:10 | b [element] | array_flow.rb:811:10:811:13 | ...[...] | +| array_flow.rb:811:10:811:10 | b [element] | array_flow.rb:811:10:811:13 | ...[...] | +| array_flow.rb:813:5:813:5 | c [element] | array_flow.rb:818:10:818:10 | c [element] | +| array_flow.rb:813:5:813:5 | c [element] | array_flow.rb:818:10:818:10 | c [element] | +| array_flow.rb:813:5:813:5 | c [element] | array_flow.rb:819:10:819:10 | c [element] | +| array_flow.rb:813:5:813:5 | c [element] | array_flow.rb:819:10:819:10 | c [element] | +| array_flow.rb:813:9:813:9 | a [element 2] | array_flow.rb:813:9:817:7 | call to minmax [element] | +| array_flow.rb:813:9:813:9 | a [element 2] | array_flow.rb:813:9:817:7 | call to minmax [element] | +| array_flow.rb:813:9:813:9 | a [element 2] | array_flow.rb:813:22:813:22 | x | +| array_flow.rb:813:9:813:9 | a [element 2] | array_flow.rb:813:22:813:22 | x | +| array_flow.rb:813:9:813:9 | a [element 2] | array_flow.rb:813:25:813:25 | y | +| array_flow.rb:813:9:813:9 | a [element 2] | array_flow.rb:813:25:813:25 | y | +| array_flow.rb:813:9:817:7 | call to minmax [element] | array_flow.rb:813:5:813:5 | c [element] | +| array_flow.rb:813:9:817:7 | call to minmax [element] | array_flow.rb:813:5:813:5 | c [element] | +| array_flow.rb:813:22:813:22 | x | array_flow.rb:814:14:814:14 | x | +| array_flow.rb:813:22:813:22 | x | array_flow.rb:814:14:814:14 | x | +| array_flow.rb:813:25:813:25 | y | array_flow.rb:815:14:815:14 | y | +| array_flow.rb:813:25:813:25 | y | array_flow.rb:815:14:815:14 | y | +| array_flow.rb:818:10:818:10 | c [element] | array_flow.rb:818:10:818:13 | ...[...] | +| array_flow.rb:818:10:818:10 | c [element] | array_flow.rb:818:10:818:13 | ...[...] | +| array_flow.rb:819:10:819:10 | c [element] | array_flow.rb:819:10:819:13 | ...[...] | +| array_flow.rb:819:10:819:10 | c [element] | array_flow.rb:819:10:819:13 | ...[...] | +| array_flow.rb:823:5:823:5 | a [element 2] | array_flow.rb:824:9:824:9 | a [element 2] | +| array_flow.rb:823:5:823:5 | a [element 2] | array_flow.rb:824:9:824:9 | a [element 2] | +| array_flow.rb:823:16:823:25 | call to source | array_flow.rb:823:5:823:5 | a [element 2] | +| array_flow.rb:823:16:823:25 | call to source | array_flow.rb:823:5:823:5 | a [element 2] | +| array_flow.rb:824:5:824:5 | b [element] | array_flow.rb:828:10:828:10 | b [element] | +| array_flow.rb:824:5:824:5 | b [element] | array_flow.rb:828:10:828:10 | b [element] | +| array_flow.rb:824:5:824:5 | b [element] | array_flow.rb:829:10:829:10 | b [element] | +| array_flow.rb:824:5:824:5 | b [element] | array_flow.rb:829:10:829:10 | b [element] | +| array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:9:827:7 | call to minmax_by [element] | +| array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:9:827:7 | call to minmax_by [element] | +| array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:25:824:25 | x | +| array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:25:824:25 | x | +| array_flow.rb:824:9:827:7 | call to minmax_by [element] | array_flow.rb:824:5:824:5 | b [element] | +| array_flow.rb:824:9:827:7 | call to minmax_by [element] | array_flow.rb:824:5:824:5 | b [element] | +| array_flow.rb:824:25:824:25 | x | array_flow.rb:825:14:825:14 | x | +| array_flow.rb:824:25:824:25 | x | array_flow.rb:825:14:825:14 | x | +| array_flow.rb:828:10:828:10 | b [element] | array_flow.rb:828:10:828:13 | ...[...] | +| array_flow.rb:828:10:828:10 | b [element] | array_flow.rb:828:10:828:13 | ...[...] | +| array_flow.rb:829:10:829:10 | b [element] | array_flow.rb:829:10:829:13 | ...[...] | +| array_flow.rb:829:10:829:10 | b [element] | array_flow.rb:829:10:829:13 | ...[...] | +| array_flow.rb:833:5:833:5 | a [element 2] | array_flow.rb:834:5:834:5 | a [element 2] | +| array_flow.rb:833:5:833:5 | a [element 2] | array_flow.rb:834:5:834:5 | a [element 2] | +| array_flow.rb:833:16:833:25 | call to source | array_flow.rb:833:5:833:5 | a [element 2] | +| array_flow.rb:833:16:833:25 | call to source | array_flow.rb:833:5:833:5 | a [element 2] | +| array_flow.rb:834:5:834:5 | a [element 2] | array_flow.rb:834:17:834:17 | x | +| array_flow.rb:834:5:834:5 | a [element 2] | array_flow.rb:834:17:834:17 | x | +| array_flow.rb:834:17:834:17 | x | array_flow.rb:835:14:835:14 | x | +| array_flow.rb:834:17:834:17 | x | array_flow.rb:835:14:835:14 | x | +| array_flow.rb:842:5:842:5 | a [element 2] | array_flow.rb:843:5:843:5 | a [element 2] | +| array_flow.rb:842:5:842:5 | a [element 2] | array_flow.rb:843:5:843:5 | a [element 2] | +| array_flow.rb:842:16:842:25 | call to source | array_flow.rb:842:5:842:5 | a [element 2] | +| array_flow.rb:842:16:842:25 | call to source | array_flow.rb:842:5:842:5 | a [element 2] | +| array_flow.rb:843:5:843:5 | a [element 2] | array_flow.rb:843:16:843:16 | x | +| array_flow.rb:843:5:843:5 | a [element 2] | array_flow.rb:843:16:843:16 | x | +| array_flow.rb:843:16:843:16 | x | array_flow.rb:844:14:844:14 | x | +| array_flow.rb:843:16:843:16 | x | array_flow.rb:844:14:844:14 | x | +| array_flow.rb:849:5:849:5 | a [element 2] | array_flow.rb:850:9:850:9 | a [element 2] | +| array_flow.rb:849:16:849:25 | call to source | array_flow.rb:849:5:849:5 | a [element 2] | +| array_flow.rb:850:5:850:5 | b | array_flow.rb:851:10:851:10 | b | +| array_flow.rb:850:9:850:9 | a [element 2] | array_flow.rb:850:9:850:20 | call to pack | +| array_flow.rb:850:9:850:20 | call to pack | array_flow.rb:850:5:850:5 | b | +| array_flow.rb:855:5:855:5 | a [element 2] | array_flow.rb:856:9:856:9 | a [element 2] | +| array_flow.rb:855:5:855:5 | a [element 2] | array_flow.rb:856:9:856:9 | a [element 2] | +| array_flow.rb:855:16:855:25 | call to source | array_flow.rb:855:5:855:5 | a [element 2] | +| array_flow.rb:855:16:855:25 | call to source | array_flow.rb:855:5:855:5 | a [element 2] | +| array_flow.rb:856:5:856:5 | b [element, element] | array_flow.rb:860:10:860:10 | b [element, element] | +| array_flow.rb:856:5:856:5 | b [element, element] | array_flow.rb:860:10:860:10 | b [element, element] | +| array_flow.rb:856:5:856:5 | b [element, element] | array_flow.rb:861:10:861:10 | b [element, element] | +| array_flow.rb:856:5:856:5 | b [element, element] | array_flow.rb:861:10:861:10 | b [element, element] | +| array_flow.rb:856:9:856:9 | a [element 2] | array_flow.rb:856:9:859:7 | call to partition [element, element] | +| array_flow.rb:856:9:856:9 | a [element 2] | array_flow.rb:856:9:859:7 | call to partition [element, element] | +| array_flow.rb:856:9:856:9 | a [element 2] | array_flow.rb:856:25:856:25 | x | +| array_flow.rb:856:9:856:9 | a [element 2] | array_flow.rb:856:25:856:25 | x | +| array_flow.rb:856:9:859:7 | call to partition [element, element] | array_flow.rb:856:5:856:5 | b [element, element] | +| array_flow.rb:856:9:859:7 | call to partition [element, element] | array_flow.rb:856:5:856:5 | b [element, element] | +| array_flow.rb:856:25:856:25 | x | array_flow.rb:857:14:857:14 | x | +| array_flow.rb:856:25:856:25 | x | array_flow.rb:857:14:857:14 | x | +| array_flow.rb:860:10:860:10 | b [element, element] | array_flow.rb:860:10:860:13 | ...[...] [element] | +| array_flow.rb:860:10:860:10 | b [element, element] | array_flow.rb:860:10:860:13 | ...[...] [element] | +| array_flow.rb:860:10:860:13 | ...[...] [element] | array_flow.rb:860:10:860:16 | ...[...] | +| array_flow.rb:860:10:860:13 | ...[...] [element] | array_flow.rb:860:10:860:16 | ...[...] | +| array_flow.rb:861:10:861:10 | b [element, element] | array_flow.rb:861:10:861:13 | ...[...] [element] | +| array_flow.rb:861:10:861:10 | b [element, element] | array_flow.rb:861:10:861:13 | ...[...] [element] | +| array_flow.rb:861:10:861:13 | ...[...] [element] | array_flow.rb:861:10:861:16 | ...[...] | +| array_flow.rb:861:10:861:13 | ...[...] [element] | array_flow.rb:861:10:861:16 | ...[...] | +| array_flow.rb:865:5:865:5 | a [element 2] | array_flow.rb:867:9:867:9 | a [element 2] | +| array_flow.rb:865:5:865:5 | a [element 2] | array_flow.rb:867:9:867:9 | a [element 2] | +| array_flow.rb:865:5:865:5 | a [element 2] | array_flow.rb:875:9:875:9 | a [element 2] | +| array_flow.rb:865:5:865:5 | a [element 2] | array_flow.rb:875:9:875:9 | a [element 2] | +| array_flow.rb:865:5:865:5 | a [element 2] | array_flow.rb:882:9:882:9 | a [element 2] | +| array_flow.rb:865:5:865:5 | a [element 2] | array_flow.rb:882:9:882:9 | a [element 2] | +| array_flow.rb:865:16:865:25 | call to source | array_flow.rb:865:5:865:5 | a [element 2] | +| array_flow.rb:865:16:865:25 | call to source | array_flow.rb:865:5:865:5 | a [element 2] | +| array_flow.rb:867:5:867:5 | b [element 2] | array_flow.rb:873:10:873:10 | b [element 2] | +| array_flow.rb:867:5:867:5 | b [element 2] | array_flow.rb:873:10:873:10 | b [element 2] | +| array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:9:871:7 | call to permutation [element 2] | +| array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:9:871:7 | call to permutation [element 2] | +| array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:27:867:27 | x [element] | +| array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:27:867:27 | x [element] | +| array_flow.rb:867:9:871:7 | call to permutation [element 2] | array_flow.rb:867:5:867:5 | b [element 2] | +| array_flow.rb:867:9:871:7 | call to permutation [element 2] | array_flow.rb:867:5:867:5 | b [element 2] | +| array_flow.rb:867:27:867:27 | x [element] | array_flow.rb:868:14:868:14 | x [element] | +| array_flow.rb:867:27:867:27 | x [element] | array_flow.rb:868:14:868:14 | x [element] | +| array_flow.rb:867:27:867:27 | x [element] | array_flow.rb:869:14:869:14 | x [element] | +| array_flow.rb:867:27:867:27 | x [element] | array_flow.rb:869:14:869:14 | x [element] | +| array_flow.rb:867:27:867:27 | x [element] | array_flow.rb:870:14:870:14 | x [element] | +| array_flow.rb:867:27:867:27 | x [element] | array_flow.rb:870:14:870:14 | x [element] | +| array_flow.rb:868:14:868:14 | x [element] | array_flow.rb:868:14:868:17 | ...[...] | +| array_flow.rb:868:14:868:14 | x [element] | array_flow.rb:868:14:868:17 | ...[...] | +| array_flow.rb:869:14:869:14 | x [element] | array_flow.rb:869:14:869:17 | ...[...] | +| array_flow.rb:869:14:869:14 | x [element] | array_flow.rb:869:14:869:17 | ...[...] | +| array_flow.rb:870:14:870:14 | x [element] | array_flow.rb:870:14:870:17 | ...[...] | +| array_flow.rb:870:14:870:14 | x [element] | array_flow.rb:870:14:870:17 | ...[...] | +| array_flow.rb:873:10:873:10 | b [element 2] | array_flow.rb:873:10:873:13 | ...[...] | +| array_flow.rb:873:10:873:10 | b [element 2] | array_flow.rb:873:10:873:13 | ...[...] | +| array_flow.rb:875:5:875:5 | c [element 2] | array_flow.rb:880:10:880:10 | c [element 2] | +| array_flow.rb:875:5:875:5 | c [element 2] | array_flow.rb:880:10:880:10 | c [element 2] | +| array_flow.rb:875:5:875:5 | c [element 2] | array_flow.rb:887:10:887:10 | c [element 2] | +| array_flow.rb:875:5:875:5 | c [element 2] | array_flow.rb:887:10:887:10 | c [element 2] | +| array_flow.rb:875:9:875:9 | a [element 2] | array_flow.rb:875:9:878:7 | call to permutation [element 2] | +| array_flow.rb:875:9:875:9 | a [element 2] | array_flow.rb:875:9:878:7 | call to permutation [element 2] | +| array_flow.rb:875:9:875:9 | a [element 2] | array_flow.rb:875:30:875:30 | x [element] | +| array_flow.rb:875:9:875:9 | a [element 2] | array_flow.rb:875:30:875:30 | x [element] | +| array_flow.rb:875:9:878:7 | call to permutation [element 2] | array_flow.rb:875:5:875:5 | c [element 2] | +| array_flow.rb:875:9:878:7 | call to permutation [element 2] | array_flow.rb:875:5:875:5 | c [element 2] | +| array_flow.rb:875:30:875:30 | x [element] | array_flow.rb:876:14:876:14 | x [element] | +| array_flow.rb:875:30:875:30 | x [element] | array_flow.rb:876:14:876:14 | x [element] | +| array_flow.rb:875:30:875:30 | x [element] | array_flow.rb:877:14:877:14 | x [element] | +| array_flow.rb:875:30:875:30 | x [element] | array_flow.rb:877:14:877:14 | x [element] | +| array_flow.rb:876:14:876:14 | x [element] | array_flow.rb:876:14:876:17 | ...[...] | +| array_flow.rb:876:14:876:14 | x [element] | array_flow.rb:876:14:876:17 | ...[...] | +| array_flow.rb:877:14:877:14 | x [element] | array_flow.rb:877:14:877:17 | ...[...] | +| array_flow.rb:877:14:877:14 | x [element] | array_flow.rb:877:14:877:17 | ...[...] | +| array_flow.rb:880:10:880:10 | c [element 2] | array_flow.rb:880:10:880:13 | ...[...] | +| array_flow.rb:880:10:880:10 | c [element 2] | array_flow.rb:880:10:880:13 | ...[...] | +| array_flow.rb:882:9:882:9 | a [element 2] | array_flow.rb:882:30:882:30 | x [element] | +| array_flow.rb:882:9:882:9 | a [element 2] | array_flow.rb:882:30:882:30 | x [element] | +| array_flow.rb:882:30:882:30 | x [element] | array_flow.rb:883:14:883:14 | x [element] | +| array_flow.rb:882:30:882:30 | x [element] | array_flow.rb:883:14:883:14 | x [element] | +| array_flow.rb:882:30:882:30 | x [element] | array_flow.rb:884:14:884:14 | x [element] | +| array_flow.rb:882:30:882:30 | x [element] | array_flow.rb:884:14:884:14 | x [element] | +| array_flow.rb:883:14:883:14 | x [element] | array_flow.rb:883:14:883:17 | ...[...] | +| array_flow.rb:883:14:883:14 | x [element] | array_flow.rb:883:14:883:17 | ...[...] | +| array_flow.rb:884:14:884:14 | x [element] | array_flow.rb:884:14:884:17 | ...[...] | +| array_flow.rb:884:14:884:14 | x [element] | array_flow.rb:884:14:884:17 | ...[...] | +| array_flow.rb:887:10:887:10 | c [element 2] | array_flow.rb:887:10:887:13 | ...[...] | +| array_flow.rb:887:10:887:10 | c [element 2] | array_flow.rb:887:10:887:13 | ...[...] | +| array_flow.rb:894:5:894:5 | a [element 1] | array_flow.rb:895:9:895:9 | a [element 1] | +| array_flow.rb:894:5:894:5 | a [element 1] | array_flow.rb:895:9:895:9 | a [element 1] | +| array_flow.rb:894:5:894:5 | a [element 1] | array_flow.rb:898:10:898:10 | a [element 1] | +| array_flow.rb:894:5:894:5 | a [element 1] | array_flow.rb:898:10:898:10 | a [element 1] | +| array_flow.rb:894:5:894:5 | a [element 3] | array_flow.rb:895:9:895:9 | a [element 3] | +| array_flow.rb:894:5:894:5 | a [element 3] | array_flow.rb:895:9:895:9 | a [element 3] | +| array_flow.rb:894:5:894:5 | a [element 3] | array_flow.rb:900:10:900:10 | a [element 3] | +| array_flow.rb:894:5:894:5 | a [element 3] | array_flow.rb:900:10:900:10 | a [element 3] | +| array_flow.rb:894:13:894:24 | call to source | array_flow.rb:894:5:894:5 | a [element 1] | +| array_flow.rb:894:13:894:24 | call to source | array_flow.rb:894:5:894:5 | a [element 1] | +| array_flow.rb:894:30:894:41 | call to source | array_flow.rb:894:5:894:5 | a [element 3] | +| array_flow.rb:894:30:894:41 | call to source | array_flow.rb:894:5:894:5 | a [element 3] | +| array_flow.rb:895:5:895:5 | b | array_flow.rb:896:10:896:10 | b | +| array_flow.rb:895:5:895:5 | b | array_flow.rb:896:10:896:10 | b | +| array_flow.rb:895:9:895:9 | a [element 1] | array_flow.rb:895:9:895:13 | call to pop | +| array_flow.rb:895:9:895:9 | a [element 1] | array_flow.rb:895:9:895:13 | call to pop | +| array_flow.rb:895:9:895:9 | a [element 3] | array_flow.rb:895:9:895:13 | call to pop | +| array_flow.rb:895:9:895:9 | a [element 3] | array_flow.rb:895:9:895:13 | call to pop | +| array_flow.rb:895:9:895:13 | call to pop | array_flow.rb:895:5:895:5 | b | +| array_flow.rb:895:9:895:13 | call to pop | array_flow.rb:895:5:895:5 | b | +| array_flow.rb:898:10:898:10 | a [element 1] | array_flow.rb:898:10:898:13 | ...[...] | +| array_flow.rb:898:10:898:10 | a [element 1] | array_flow.rb:898:10:898:13 | ...[...] | +| array_flow.rb:900:10:900:10 | a [element 3] | array_flow.rb:900:10:900:13 | ...[...] | +| array_flow.rb:900:10:900:10 | a [element 3] | array_flow.rb:900:10:900:13 | ...[...] | +| array_flow.rb:902:5:902:5 | a [element 1] | array_flow.rb:903:9:903:9 | a [element 1] | +| array_flow.rb:902:5:902:5 | a [element 1] | array_flow.rb:903:9:903:9 | a [element 1] | +| array_flow.rb:902:5:902:5 | a [element 1] | array_flow.rb:907:10:907:10 | a [element 1] | +| array_flow.rb:902:5:902:5 | a [element 1] | array_flow.rb:907:10:907:10 | a [element 1] | +| array_flow.rb:902:5:902:5 | a [element 3] | array_flow.rb:903:9:903:9 | a [element 3] | +| array_flow.rb:902:5:902:5 | a [element 3] | array_flow.rb:903:9:903:9 | a [element 3] | +| array_flow.rb:902:5:902:5 | a [element 3] | array_flow.rb:909:10:909:10 | a [element 3] | +| array_flow.rb:902:5:902:5 | a [element 3] | array_flow.rb:909:10:909:10 | a [element 3] | +| array_flow.rb:902:13:902:24 | call to source | array_flow.rb:902:5:902:5 | a [element 1] | +| array_flow.rb:902:13:902:24 | call to source | array_flow.rb:902:5:902:5 | a [element 1] | +| array_flow.rb:902:30:902:41 | call to source | array_flow.rb:902:5:902:5 | a [element 3] | +| array_flow.rb:902:30:902:41 | call to source | array_flow.rb:902:5:902:5 | a [element 3] | +| array_flow.rb:903:5:903:5 | b [element] | array_flow.rb:904:10:904:10 | b [element] | +| array_flow.rb:903:5:903:5 | b [element] | array_flow.rb:904:10:904:10 | b [element] | +| array_flow.rb:903:5:903:5 | b [element] | array_flow.rb:905:10:905:10 | b [element] | +| array_flow.rb:903:5:903:5 | b [element] | array_flow.rb:905:10:905:10 | b [element] | +| array_flow.rb:903:9:903:9 | a [element 1] | array_flow.rb:903:9:903:16 | call to pop [element] | +| array_flow.rb:903:9:903:9 | a [element 1] | array_flow.rb:903:9:903:16 | call to pop [element] | +| array_flow.rb:903:9:903:9 | a [element 3] | array_flow.rb:903:9:903:16 | call to pop [element] | +| array_flow.rb:903:9:903:9 | a [element 3] | array_flow.rb:903:9:903:16 | call to pop [element] | +| array_flow.rb:903:9:903:16 | call to pop [element] | array_flow.rb:903:5:903:5 | b [element] | +| array_flow.rb:903:9:903:16 | call to pop [element] | array_flow.rb:903:5:903:5 | b [element] | +| array_flow.rb:904:10:904:10 | b [element] | array_flow.rb:904:10:904:13 | ...[...] | +| array_flow.rb:904:10:904:10 | b [element] | array_flow.rb:904:10:904:13 | ...[...] | +| array_flow.rb:905:10:905:10 | b [element] | array_flow.rb:905:10:905:13 | ...[...] | +| array_flow.rb:905:10:905:10 | b [element] | array_flow.rb:905:10:905:13 | ...[...] | +| array_flow.rb:907:10:907:10 | a [element 1] | array_flow.rb:907:10:907:13 | ...[...] | +| array_flow.rb:907:10:907:10 | a [element 1] | array_flow.rb:907:10:907:13 | ...[...] | +| array_flow.rb:909:10:909:10 | a [element 3] | array_flow.rb:909:10:909:13 | ...[...] | +| array_flow.rb:909:10:909:10 | a [element 3] | array_flow.rb:909:10:909:13 | ...[...] | +| array_flow.rb:913:5:913:5 | a [element 2] | array_flow.rb:914:5:914:5 | a [element 2] | +| array_flow.rb:913:5:913:5 | a [element 2] | array_flow.rb:914:5:914:5 | a [element 2] | +| array_flow.rb:913:16:913:27 | call to source | array_flow.rb:913:5:913:5 | a [element 2] | +| array_flow.rb:913:16:913:27 | call to source | array_flow.rb:913:5:913:5 | a [element 2] | +| array_flow.rb:914:5:914:5 | [post] a [element 2] | array_flow.rb:917:10:917:10 | a [element 2] | +| array_flow.rb:914:5:914:5 | [post] a [element 2] | array_flow.rb:917:10:917:10 | a [element 2] | +| array_flow.rb:914:5:914:5 | [post] a [element 5] | array_flow.rb:920:10:920:10 | a [element 5] | +| array_flow.rb:914:5:914:5 | [post] a [element 5] | array_flow.rb:920:10:920:10 | a [element 5] | +| array_flow.rb:914:5:914:5 | a [element 2] | array_flow.rb:914:5:914:5 | [post] a [element 5] | +| array_flow.rb:914:5:914:5 | a [element 2] | array_flow.rb:914:5:914:5 | [post] a [element 5] | +| array_flow.rb:914:21:914:32 | call to source | array_flow.rb:914:5:914:5 | [post] a [element 2] | +| array_flow.rb:914:21:914:32 | call to source | array_flow.rb:914:5:914:5 | [post] a [element 2] | +| array_flow.rb:917:10:917:10 | a [element 2] | array_flow.rb:917:10:917:13 | ...[...] | +| array_flow.rb:917:10:917:10 | a [element 2] | array_flow.rb:917:10:917:13 | ...[...] | +| array_flow.rb:920:10:920:10 | a [element 5] | array_flow.rb:920:10:920:13 | ...[...] | +| array_flow.rb:920:10:920:10 | a [element 5] | array_flow.rb:920:10:920:13 | ...[...] | +| array_flow.rb:924:5:924:5 | a [element 2] | array_flow.rb:927:9:927:9 | a [element 2] | +| array_flow.rb:924:5:924:5 | a [element 2] | array_flow.rb:927:9:927:9 | a [element 2] | +| array_flow.rb:924:16:924:27 | call to source | array_flow.rb:924:5:924:5 | a [element 2] | +| array_flow.rb:924:16:924:27 | call to source | array_flow.rb:924:5:924:5 | a [element 2] | +| array_flow.rb:925:5:925:5 | b [element 1] | array_flow.rb:927:19:927:19 | b [element 1] | +| array_flow.rb:925:5:925:5 | b [element 1] | array_flow.rb:927:19:927:19 | b [element 1] | +| array_flow.rb:925:13:925:24 | call to source | array_flow.rb:925:5:925:5 | b [element 1] | +| array_flow.rb:925:13:925:24 | call to source | array_flow.rb:925:5:925:5 | b [element 1] | +| array_flow.rb:926:5:926:5 | c [element 0] | array_flow.rb:927:22:927:22 | c [element 0] | +| array_flow.rb:926:5:926:5 | c [element 0] | array_flow.rb:927:22:927:22 | c [element 0] | +| array_flow.rb:926:10:926:21 | call to source | array_flow.rb:926:5:926:5 | c [element 0] | +| array_flow.rb:926:10:926:21 | call to source | array_flow.rb:926:5:926:5 | c [element 0] | +| array_flow.rb:927:5:927:5 | d [element, element] | array_flow.rb:928:10:928:10 | d [element, element] | +| array_flow.rb:927:5:927:5 | d [element, element] | array_flow.rb:928:10:928:10 | d [element, element] | +| array_flow.rb:927:5:927:5 | d [element, element] | array_flow.rb:929:10:929:10 | d [element, element] | +| array_flow.rb:927:5:927:5 | d [element, element] | array_flow.rb:929:10:929:10 | d [element, element] | +| array_flow.rb:927:9:927:9 | a [element 2] | array_flow.rb:927:9:927:22 | call to product [element, element] | +| array_flow.rb:927:9:927:9 | a [element 2] | array_flow.rb:927:9:927:22 | call to product [element, element] | +| array_flow.rb:927:9:927:22 | call to product [element, element] | array_flow.rb:927:5:927:5 | d [element, element] | +| array_flow.rb:927:9:927:22 | call to product [element, element] | array_flow.rb:927:5:927:5 | d [element, element] | +| array_flow.rb:927:19:927:19 | b [element 1] | array_flow.rb:927:9:927:22 | call to product [element, element] | +| array_flow.rb:927:19:927:19 | b [element 1] | array_flow.rb:927:9:927:22 | call to product [element, element] | +| array_flow.rb:927:22:927:22 | c [element 0] | array_flow.rb:927:9:927:22 | call to product [element, element] | +| array_flow.rb:927:22:927:22 | c [element 0] | array_flow.rb:927:9:927:22 | call to product [element, element] | +| array_flow.rb:928:10:928:10 | d [element, element] | array_flow.rb:928:10:928:13 | ...[...] [element] | +| array_flow.rb:928:10:928:10 | d [element, element] | array_flow.rb:928:10:928:13 | ...[...] [element] | +| array_flow.rb:928:10:928:13 | ...[...] [element] | array_flow.rb:928:10:928:16 | ...[...] | +| array_flow.rb:928:10:928:13 | ...[...] [element] | array_flow.rb:928:10:928:16 | ...[...] | +| array_flow.rb:929:10:929:10 | d [element, element] | array_flow.rb:929:10:929:13 | ...[...] [element] | +| array_flow.rb:929:10:929:10 | d [element, element] | array_flow.rb:929:10:929:13 | ...[...] [element] | +| array_flow.rb:929:10:929:13 | ...[...] [element] | array_flow.rb:929:10:929:16 | ...[...] | +| array_flow.rb:929:10:929:13 | ...[...] [element] | array_flow.rb:929:10:929:16 | ...[...] | +| array_flow.rb:933:5:933:5 | a [element 0] | array_flow.rb:934:9:934:9 | a [element 0] | +| array_flow.rb:933:5:933:5 | a [element 0] | array_flow.rb:934:9:934:9 | a [element 0] | +| array_flow.rb:933:5:933:5 | a [element 0] | array_flow.rb:935:10:935:10 | a [element 0] | +| array_flow.rb:933:5:933:5 | a [element 0] | array_flow.rb:935:10:935:10 | a [element 0] | +| array_flow.rb:933:10:933:21 | call to source | array_flow.rb:933:5:933:5 | a [element 0] | +| array_flow.rb:933:10:933:21 | call to source | array_flow.rb:933:5:933:5 | a [element 0] | +| array_flow.rb:934:5:934:5 | b [element 0] | array_flow.rb:937:10:937:10 | b [element 0] | +| array_flow.rb:934:5:934:5 | b [element 0] | array_flow.rb:937:10:937:10 | b [element 0] | +| array_flow.rb:934:5:934:5 | b [element] | array_flow.rb:937:10:937:10 | b [element] | +| array_flow.rb:934:5:934:5 | b [element] | array_flow.rb:937:10:937:10 | b [element] | +| array_flow.rb:934:5:934:5 | b [element] | array_flow.rb:938:10:938:10 | b [element] | +| array_flow.rb:934:5:934:5 | b [element] | array_flow.rb:938:10:938:10 | b [element] | +| array_flow.rb:934:9:934:9 | [post] a [element] | array_flow.rb:935:10:935:10 | a [element] | +| array_flow.rb:934:9:934:9 | [post] a [element] | array_flow.rb:935:10:935:10 | a [element] | +| array_flow.rb:934:9:934:9 | [post] a [element] | array_flow.rb:936:10:936:10 | a [element] | +| array_flow.rb:934:9:934:9 | [post] a [element] | array_flow.rb:936:10:936:10 | a [element] | +| array_flow.rb:934:9:934:9 | a [element 0] | array_flow.rb:934:9:934:44 | call to append [element 0] | +| array_flow.rb:934:9:934:9 | a [element 0] | array_flow.rb:934:9:934:44 | call to append [element 0] | +| array_flow.rb:934:9:934:44 | call to append [element 0] | array_flow.rb:934:5:934:5 | b [element 0] | +| array_flow.rb:934:9:934:44 | call to append [element 0] | array_flow.rb:934:5:934:5 | b [element 0] | +| array_flow.rb:934:9:934:44 | call to append [element] | array_flow.rb:934:5:934:5 | b [element] | +| array_flow.rb:934:9:934:44 | call to append [element] | array_flow.rb:934:5:934:5 | b [element] | +| array_flow.rb:934:18:934:29 | call to source | array_flow.rb:934:9:934:9 | [post] a [element] | +| array_flow.rb:934:18:934:29 | call to source | array_flow.rb:934:9:934:9 | [post] a [element] | +| array_flow.rb:934:18:934:29 | call to source | array_flow.rb:934:9:934:44 | call to append [element] | +| array_flow.rb:934:18:934:29 | call to source | array_flow.rb:934:9:934:44 | call to append [element] | +| array_flow.rb:934:32:934:43 | call to source | array_flow.rb:934:9:934:9 | [post] a [element] | +| array_flow.rb:934:32:934:43 | call to source | array_flow.rb:934:9:934:9 | [post] a [element] | +| array_flow.rb:934:32:934:43 | call to source | array_flow.rb:934:9:934:44 | call to append [element] | +| array_flow.rb:934:32:934:43 | call to source | array_flow.rb:934:9:934:44 | call to append [element] | +| array_flow.rb:935:10:935:10 | a [element 0] | array_flow.rb:935:10:935:13 | ...[...] | +| array_flow.rb:935:10:935:10 | a [element 0] | array_flow.rb:935:10:935:13 | ...[...] | +| array_flow.rb:935:10:935:10 | a [element] | array_flow.rb:935:10:935:13 | ...[...] | +| array_flow.rb:935:10:935:10 | a [element] | array_flow.rb:935:10:935:13 | ...[...] | +| array_flow.rb:936:10:936:10 | a [element] | array_flow.rb:936:10:936:13 | ...[...] | +| array_flow.rb:936:10:936:10 | a [element] | array_flow.rb:936:10:936:13 | ...[...] | +| array_flow.rb:937:10:937:10 | b [element 0] | array_flow.rb:937:10:937:13 | ...[...] | +| array_flow.rb:937:10:937:10 | b [element 0] | array_flow.rb:937:10:937:13 | ...[...] | +| array_flow.rb:937:10:937:10 | b [element] | array_flow.rb:937:10:937:13 | ...[...] | +| array_flow.rb:937:10:937:10 | b [element] | array_flow.rb:937:10:937:13 | ...[...] | +| array_flow.rb:938:10:938:10 | b [element] | array_flow.rb:938:10:938:13 | ...[...] | +| array_flow.rb:938:10:938:10 | b [element] | array_flow.rb:938:10:938:13 | ...[...] | +| array_flow.rb:944:5:944:5 | c [element 0] | array_flow.rb:945:16:945:16 | c [element 0] | +| array_flow.rb:944:5:944:5 | c [element 0] | array_flow.rb:945:16:945:16 | c [element 0] | +| array_flow.rb:944:10:944:19 | call to source | array_flow.rb:944:5:944:5 | c [element 0] | +| array_flow.rb:944:10:944:19 | call to source | array_flow.rb:944:5:944:5 | c [element 0] | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] | array_flow.rb:946:10:946:10 | d [element 2, element 0] | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] | array_flow.rb:946:10:946:10 | d [element 2, element 0] | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] | array_flow.rb:947:10:947:10 | d [element 2, element 0] | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] | array_flow.rb:947:10:947:10 | d [element 2, element 0] | +| array_flow.rb:945:16:945:16 | c [element 0] | array_flow.rb:945:5:945:5 | d [element 2, element 0] | +| array_flow.rb:945:16:945:16 | c [element 0] | array_flow.rb:945:5:945:5 | d [element 2, element 0] | +| array_flow.rb:946:10:946:10 | d [element 2, element 0] | array_flow.rb:946:10:946:22 | call to rassoc [element 0] | +| array_flow.rb:946:10:946:10 | d [element 2, element 0] | array_flow.rb:946:10:946:22 | call to rassoc [element 0] | +| array_flow.rb:946:10:946:22 | call to rassoc [element 0] | array_flow.rb:946:10:946:25 | ...[...] | +| array_flow.rb:946:10:946:22 | call to rassoc [element 0] | array_flow.rb:946:10:946:25 | ...[...] | +| array_flow.rb:947:10:947:10 | d [element 2, element 0] | array_flow.rb:947:10:947:22 | call to rassoc [element 0] | +| array_flow.rb:947:10:947:10 | d [element 2, element 0] | array_flow.rb:947:10:947:22 | call to rassoc [element 0] | +| array_flow.rb:947:10:947:22 | call to rassoc [element 0] | array_flow.rb:947:10:947:25 | ...[...] | +| array_flow.rb:947:10:947:22 | call to rassoc [element 0] | array_flow.rb:947:10:947:25 | ...[...] | +| array_flow.rb:951:5:951:5 | a [element 0] | array_flow.rb:952:9:952:9 | a [element 0] | +| array_flow.rb:951:5:951:5 | a [element 0] | array_flow.rb:952:9:952:9 | a [element 0] | +| array_flow.rb:951:5:951:5 | a [element 0] | array_flow.rb:957:9:957:9 | a [element 0] | +| array_flow.rb:951:5:951:5 | a [element 0] | array_flow.rb:957:9:957:9 | a [element 0] | +| array_flow.rb:951:5:951:5 | a [element 2] | array_flow.rb:952:9:952:9 | a [element 2] | +| array_flow.rb:951:5:951:5 | a [element 2] | array_flow.rb:952:9:952:9 | a [element 2] | +| array_flow.rb:951:5:951:5 | a [element 2] | array_flow.rb:957:9:957:9 | a [element 2] | +| array_flow.rb:951:5:951:5 | a [element 2] | array_flow.rb:957:9:957:9 | a [element 2] | +| array_flow.rb:951:10:951:21 | call to source | array_flow.rb:951:5:951:5 | a [element 0] | +| array_flow.rb:951:10:951:21 | call to source | array_flow.rb:951:5:951:5 | a [element 0] | +| array_flow.rb:951:27:951:38 | call to source | array_flow.rb:951:5:951:5 | a [element 2] | +| array_flow.rb:951:27:951:38 | call to source | array_flow.rb:951:5:951:5 | a [element 2] | +| array_flow.rb:952:9:952:9 | a [element 0] | array_flow.rb:952:22:952:22 | x | +| array_flow.rb:952:9:952:9 | a [element 0] | array_flow.rb:952:22:952:22 | x | +| array_flow.rb:952:9:952:9 | a [element 2] | array_flow.rb:952:25:952:25 | y | +| array_flow.rb:952:9:952:9 | a [element 2] | array_flow.rb:952:25:952:25 | y | +| array_flow.rb:952:22:952:22 | x | array_flow.rb:953:14:953:14 | x | +| array_flow.rb:952:22:952:22 | x | array_flow.rb:953:14:953:14 | x | +| array_flow.rb:952:25:952:25 | y | array_flow.rb:954:14:954:14 | y | +| array_flow.rb:952:25:952:25 | y | array_flow.rb:954:14:954:14 | y | +| array_flow.rb:957:9:957:9 | a [element 0] | array_flow.rb:957:28:957:28 | y | +| array_flow.rb:957:9:957:9 | a [element 0] | array_flow.rb:957:28:957:28 | y | +| array_flow.rb:957:9:957:9 | a [element 2] | array_flow.rb:957:28:957:28 | y | +| array_flow.rb:957:9:957:9 | a [element 2] | array_flow.rb:957:28:957:28 | y | +| array_flow.rb:957:28:957:28 | y | array_flow.rb:959:14:959:14 | y | +| array_flow.rb:957:28:957:28 | y | array_flow.rb:959:14:959:14 | y | +| array_flow.rb:965:5:965:5 | a [element 2] | array_flow.rb:966:9:966:9 | a [element 2] | +| array_flow.rb:965:5:965:5 | a [element 2] | array_flow.rb:966:9:966:9 | a [element 2] | +| array_flow.rb:965:16:965:25 | call to source | array_flow.rb:965:5:965:5 | a [element 2] | +| array_flow.rb:965:16:965:25 | call to source | array_flow.rb:965:5:965:5 | a [element 2] | +| array_flow.rb:966:5:966:5 | b [element] | array_flow.rb:970:10:970:10 | b [element] | +| array_flow.rb:966:5:966:5 | b [element] | array_flow.rb:970:10:970:10 | b [element] | +| array_flow.rb:966:9:966:9 | a [element 2] | array_flow.rb:966:9:969:7 | call to reject [element] | +| array_flow.rb:966:9:966:9 | a [element 2] | array_flow.rb:966:9:969:7 | call to reject [element] | +| array_flow.rb:966:9:966:9 | a [element 2] | array_flow.rb:966:22:966:22 | x | +| array_flow.rb:966:9:966:9 | a [element 2] | array_flow.rb:966:22:966:22 | x | +| array_flow.rb:966:9:969:7 | call to reject [element] | array_flow.rb:966:5:966:5 | b [element] | +| array_flow.rb:966:9:969:7 | call to reject [element] | array_flow.rb:966:5:966:5 | b [element] | +| array_flow.rb:966:22:966:22 | x | array_flow.rb:967:14:967:14 | x | +| array_flow.rb:966:22:966:22 | x | array_flow.rb:967:14:967:14 | x | +| array_flow.rb:970:10:970:10 | b [element] | array_flow.rb:970:10:970:13 | ...[...] | +| array_flow.rb:970:10:970:10 | b [element] | array_flow.rb:970:10:970:13 | ...[...] | +| array_flow.rb:974:5:974:5 | a [element 2] | array_flow.rb:975:9:975:9 | a [element 2] | +| array_flow.rb:974:5:974:5 | a [element 2] | array_flow.rb:975:9:975:9 | a [element 2] | +| array_flow.rb:974:16:974:25 | call to source | array_flow.rb:974:5:974:5 | a [element 2] | +| array_flow.rb:974:16:974:25 | call to source | array_flow.rb:974:5:974:5 | a [element 2] | +| array_flow.rb:975:5:975:5 | b [element] | array_flow.rb:980:10:980:10 | b [element] | +| array_flow.rb:975:5:975:5 | b [element] | array_flow.rb:980:10:980:10 | b [element] | +| array_flow.rb:975:9:975:9 | [post] a [element] | array_flow.rb:979:10:979:10 | a [element] | +| array_flow.rb:975:9:975:9 | [post] a [element] | array_flow.rb:979:10:979:10 | a [element] | +| array_flow.rb:975:9:975:9 | a [element 2] | array_flow.rb:975:9:975:9 | [post] a [element] | +| array_flow.rb:975:9:975:9 | a [element 2] | array_flow.rb:975:9:975:9 | [post] a [element] | +| array_flow.rb:975:9:975:9 | a [element 2] | array_flow.rb:975:9:978:7 | call to reject! [element] | +| array_flow.rb:975:9:975:9 | a [element 2] | array_flow.rb:975:9:978:7 | call to reject! [element] | +| array_flow.rb:975:9:975:9 | a [element 2] | array_flow.rb:975:23:975:23 | x | +| array_flow.rb:975:9:975:9 | a [element 2] | array_flow.rb:975:23:975:23 | x | +| array_flow.rb:975:9:978:7 | call to reject! [element] | array_flow.rb:975:5:975:5 | b [element] | +| array_flow.rb:975:9:978:7 | call to reject! [element] | array_flow.rb:975:5:975:5 | b [element] | +| array_flow.rb:975:23:975:23 | x | array_flow.rb:976:14:976:14 | x | +| array_flow.rb:975:23:975:23 | x | array_flow.rb:976:14:976:14 | x | +| array_flow.rb:979:10:979:10 | a [element] | array_flow.rb:979:10:979:13 | ...[...] | +| array_flow.rb:979:10:979:10 | a [element] | array_flow.rb:979:10:979:13 | ...[...] | +| array_flow.rb:980:10:980:10 | b [element] | array_flow.rb:980:10:980:13 | ...[...] | +| array_flow.rb:980:10:980:10 | b [element] | array_flow.rb:980:10:980:13 | ...[...] | +| array_flow.rb:984:5:984:5 | a [element 2] | array_flow.rb:985:9:985:9 | a [element 2] | +| array_flow.rb:984:5:984:5 | a [element 2] | array_flow.rb:985:9:985:9 | a [element 2] | +| array_flow.rb:984:16:984:25 | call to source | array_flow.rb:984:5:984:5 | a [element 2] | +| array_flow.rb:984:16:984:25 | call to source | array_flow.rb:984:5:984:5 | a [element 2] | +| array_flow.rb:985:5:985:5 | b [element 2] | array_flow.rb:990:10:990:10 | b [element 2] | +| array_flow.rb:985:5:985:5 | b [element 2] | array_flow.rb:990:10:990:10 | b [element 2] | +| array_flow.rb:985:9:985:9 | a [element 2] | array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] | +| array_flow.rb:985:9:985:9 | a [element 2] | array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] | +| array_flow.rb:985:9:985:9 | a [element 2] | array_flow.rb:985:39:985:39 | x [element] | +| array_flow.rb:985:9:985:9 | a [element 2] | array_flow.rb:985:39:985:39 | x [element] | +| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] | array_flow.rb:985:5:985:5 | b [element 2] | +| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] | array_flow.rb:985:5:985:5 | b [element 2] | +| array_flow.rb:985:39:985:39 | x [element] | array_flow.rb:986:14:986:14 | x [element] | +| array_flow.rb:985:39:985:39 | x [element] | array_flow.rb:986:14:986:14 | x [element] | +| array_flow.rb:985:39:985:39 | x [element] | array_flow.rb:987:14:987:14 | x [element] | +| array_flow.rb:985:39:985:39 | x [element] | array_flow.rb:987:14:987:14 | x [element] | +| array_flow.rb:986:14:986:14 | x [element] | array_flow.rb:986:14:986:17 | ...[...] | +| array_flow.rb:986:14:986:14 | x [element] | array_flow.rb:986:14:986:17 | ...[...] | +| array_flow.rb:987:14:987:14 | x [element] | array_flow.rb:987:14:987:17 | ...[...] | +| array_flow.rb:987:14:987:14 | x [element] | array_flow.rb:987:14:987:17 | ...[...] | +| array_flow.rb:990:10:990:10 | b [element 2] | array_flow.rb:990:10:990:13 | ...[...] | +| array_flow.rb:990:10:990:10 | b [element 2] | array_flow.rb:990:10:990:13 | ...[...] | +| array_flow.rb:994:5:994:5 | a [element 2] | array_flow.rb:995:9:995:9 | a [element 2] | +| array_flow.rb:994:5:994:5 | a [element 2] | array_flow.rb:995:9:995:9 | a [element 2] | +| array_flow.rb:994:16:994:25 | call to source | array_flow.rb:994:5:994:5 | a [element 2] | +| array_flow.rb:994:16:994:25 | call to source | array_flow.rb:994:5:994:5 | a [element 2] | +| array_flow.rb:995:5:995:5 | b [element 2] | array_flow.rb:1000:10:1000:10 | b [element 2] | +| array_flow.rb:995:5:995:5 | b [element 2] | array_flow.rb:1000:10:1000:10 | b [element 2] | +| array_flow.rb:995:9:995:9 | a [element 2] | array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] | +| array_flow.rb:995:9:995:9 | a [element 2] | array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] | +| array_flow.rb:995:9:995:9 | a [element 2] | array_flow.rb:995:39:995:39 | x [element] | +| array_flow.rb:995:9:995:9 | a [element 2] | array_flow.rb:995:39:995:39 | x [element] | +| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] | array_flow.rb:995:5:995:5 | b [element 2] | +| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] | array_flow.rb:995:5:995:5 | b [element 2] | +| array_flow.rb:995:39:995:39 | x [element] | array_flow.rb:996:14:996:14 | x [element] | +| array_flow.rb:995:39:995:39 | x [element] | array_flow.rb:996:14:996:14 | x [element] | +| array_flow.rb:995:39:995:39 | x [element] | array_flow.rb:997:14:997:14 | x [element] | +| array_flow.rb:995:39:995:39 | x [element] | array_flow.rb:997:14:997:14 | x [element] | +| array_flow.rb:996:14:996:14 | x [element] | array_flow.rb:996:14:996:17 | ...[...] | +| array_flow.rb:996:14:996:14 | x [element] | array_flow.rb:996:14:996:17 | ...[...] | +| array_flow.rb:997:14:997:14 | x [element] | array_flow.rb:997:14:997:17 | ...[...] | +| array_flow.rb:997:14:997:14 | x [element] | array_flow.rb:997:14:997:17 | ...[...] | +| array_flow.rb:1000:10:1000:10 | b [element 2] | array_flow.rb:1000:10:1000:13 | ...[...] | +| array_flow.rb:1000:10:1000:10 | b [element 2] | array_flow.rb:1000:10:1000:13 | ...[...] | +| array_flow.rb:1006:5:1006:5 | b [element 0] | array_flow.rb:1008:10:1008:10 | b [element 0] | +| array_flow.rb:1006:5:1006:5 | b [element 0] | array_flow.rb:1008:10:1008:10 | b [element 0] | +| array_flow.rb:1006:9:1006:9 | [post] a [element 0] | array_flow.rb:1007:10:1007:10 | a [element 0] | +| array_flow.rb:1006:9:1006:9 | [post] a [element 0] | array_flow.rb:1007:10:1007:10 | a [element 0] | +| array_flow.rb:1006:9:1006:33 | call to replace [element 0] | array_flow.rb:1006:5:1006:5 | b [element 0] | +| array_flow.rb:1006:9:1006:33 | call to replace [element 0] | array_flow.rb:1006:5:1006:5 | b [element 0] | +| array_flow.rb:1006:20:1006:31 | call to source | array_flow.rb:1006:9:1006:9 | [post] a [element 0] | +| array_flow.rb:1006:20:1006:31 | call to source | array_flow.rb:1006:9:1006:9 | [post] a [element 0] | +| array_flow.rb:1006:20:1006:31 | call to source | array_flow.rb:1006:9:1006:33 | call to replace [element 0] | +| array_flow.rb:1006:20:1006:31 | call to source | array_flow.rb:1006:9:1006:33 | call to replace [element 0] | +| array_flow.rb:1007:10:1007:10 | a [element 0] | array_flow.rb:1007:10:1007:13 | ...[...] | +| array_flow.rb:1007:10:1007:10 | a [element 0] | array_flow.rb:1007:10:1007:13 | ...[...] | +| array_flow.rb:1008:10:1008:10 | b [element 0] | array_flow.rb:1008:10:1008:13 | ...[...] | +| array_flow.rb:1008:10:1008:10 | b [element 0] | array_flow.rb:1008:10:1008:13 | ...[...] | +| array_flow.rb:1012:5:1012:5 | a [element 2] | array_flow.rb:1013:9:1013:9 | a [element 2] | +| array_flow.rb:1012:5:1012:5 | a [element 2] | array_flow.rb:1013:9:1013:9 | a [element 2] | +| array_flow.rb:1012:5:1012:5 | a [element 2] | array_flow.rb:1018:10:1018:10 | a [element 2] | +| array_flow.rb:1012:5:1012:5 | a [element 2] | array_flow.rb:1018:10:1018:10 | a [element 2] | +| array_flow.rb:1012:5:1012:5 | a [element 3] | array_flow.rb:1013:9:1013:9 | a [element 3] | +| array_flow.rb:1012:5:1012:5 | a [element 3] | array_flow.rb:1013:9:1013:9 | a [element 3] | +| array_flow.rb:1012:5:1012:5 | a [element 3] | array_flow.rb:1019:10:1019:10 | a [element 3] | +| array_flow.rb:1012:5:1012:5 | a [element 3] | array_flow.rb:1019:10:1019:10 | a [element 3] | +| array_flow.rb:1012:16:1012:28 | call to source | array_flow.rb:1012:5:1012:5 | a [element 2] | +| array_flow.rb:1012:16:1012:28 | call to source | array_flow.rb:1012:5:1012:5 | a [element 2] | +| array_flow.rb:1012:31:1012:43 | call to source | array_flow.rb:1012:5:1012:5 | a [element 3] | +| array_flow.rb:1012:31:1012:43 | call to source | array_flow.rb:1012:5:1012:5 | a [element 3] | +| array_flow.rb:1013:5:1013:5 | b [element] | array_flow.rb:1014:10:1014:10 | b [element] | +| array_flow.rb:1013:5:1013:5 | b [element] | array_flow.rb:1014:10:1014:10 | b [element] | +| array_flow.rb:1013:5:1013:5 | b [element] | array_flow.rb:1015:10:1015:10 | b [element] | +| array_flow.rb:1013:5:1013:5 | b [element] | array_flow.rb:1015:10:1015:10 | b [element] | +| array_flow.rb:1013:5:1013:5 | b [element] | array_flow.rb:1016:10:1016:10 | b [element] | +| array_flow.rb:1013:5:1013:5 | b [element] | array_flow.rb:1016:10:1016:10 | b [element] | +| array_flow.rb:1013:9:1013:9 | a [element 2] | array_flow.rb:1013:9:1013:17 | call to reverse [element] | +| array_flow.rb:1013:9:1013:9 | a [element 2] | array_flow.rb:1013:9:1013:17 | call to reverse [element] | +| array_flow.rb:1013:9:1013:9 | a [element 3] | array_flow.rb:1013:9:1013:17 | call to reverse [element] | +| array_flow.rb:1013:9:1013:9 | a [element 3] | array_flow.rb:1013:9:1013:17 | call to reverse [element] | +| array_flow.rb:1013:9:1013:17 | call to reverse [element] | array_flow.rb:1013:5:1013:5 | b [element] | +| array_flow.rb:1013:9:1013:17 | call to reverse [element] | array_flow.rb:1013:5:1013:5 | b [element] | +| array_flow.rb:1014:10:1014:10 | b [element] | array_flow.rb:1014:10:1014:13 | ...[...] | +| array_flow.rb:1014:10:1014:10 | b [element] | array_flow.rb:1014:10:1014:13 | ...[...] | +| array_flow.rb:1015:10:1015:10 | b [element] | array_flow.rb:1015:10:1015:13 | ...[...] | +| array_flow.rb:1015:10:1015:10 | b [element] | array_flow.rb:1015:10:1015:13 | ...[...] | +| array_flow.rb:1016:10:1016:10 | b [element] | array_flow.rb:1016:10:1016:13 | ...[...] | +| array_flow.rb:1016:10:1016:10 | b [element] | array_flow.rb:1016:10:1016:13 | ...[...] | +| array_flow.rb:1018:10:1018:10 | a [element 2] | array_flow.rb:1018:10:1018:13 | ...[...] | +| array_flow.rb:1018:10:1018:10 | a [element 2] | array_flow.rb:1018:10:1018:13 | ...[...] | +| array_flow.rb:1019:10:1019:10 | a [element 3] | array_flow.rb:1019:10:1019:13 | ...[...] | +| array_flow.rb:1019:10:1019:10 | a [element 3] | array_flow.rb:1019:10:1019:13 | ...[...] | +| array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1024:9:1024:9 | a [element 2] | +| array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1024:9:1024:9 | a [element 2] | +| array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1029:10:1029:10 | a [element 2] | +| array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1029:10:1029:10 | a [element 2] | +| array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1024:9:1024:9 | a [element 3] | +| array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1024:9:1024:9 | a [element 3] | +| array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1030:10:1030:10 | a [element 3] | +| array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1030:10:1030:10 | a [element 3] | +| array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1023:5:1023:5 | a [element 2] | +| array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1023:5:1023:5 | a [element 2] | +| array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1023:5:1023:5 | a [element 3] | +| array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1023:5:1023:5 | a [element 3] | +| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1025:10:1025:10 | b [element] | +| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1025:10:1025:10 | b [element] | +| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1026:10:1026:10 | b [element] | +| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1026:10:1026:10 | b [element] | +| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1027:10:1027:10 | b [element] | +| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1027:10:1027:10 | b [element] | +| array_flow.rb:1024:9:1024:9 | [post] a [element] | array_flow.rb:1028:10:1028:10 | a [element] | +| array_flow.rb:1024:9:1024:9 | [post] a [element] | array_flow.rb:1028:10:1028:10 | a [element] | +| array_flow.rb:1024:9:1024:9 | [post] a [element] | array_flow.rb:1029:10:1029:10 | a [element] | +| array_flow.rb:1024:9:1024:9 | [post] a [element] | array_flow.rb:1029:10:1029:10 | a [element] | +| array_flow.rb:1024:9:1024:9 | [post] a [element] | array_flow.rb:1030:10:1030:10 | a [element] | +| array_flow.rb:1024:9:1024:9 | [post] a [element] | array_flow.rb:1030:10:1030:10 | a [element] | +| array_flow.rb:1024:9:1024:9 | a [element 2] | array_flow.rb:1024:9:1024:9 | [post] a [element] | +| array_flow.rb:1024:9:1024:9 | a [element 2] | array_flow.rb:1024:9:1024:9 | [post] a [element] | +| array_flow.rb:1024:9:1024:9 | a [element 2] | array_flow.rb:1024:9:1024:18 | call to reverse! [element] | +| array_flow.rb:1024:9:1024:9 | a [element 2] | array_flow.rb:1024:9:1024:18 | call to reverse! [element] | +| array_flow.rb:1024:9:1024:9 | a [element 3] | array_flow.rb:1024:9:1024:9 | [post] a [element] | +| array_flow.rb:1024:9:1024:9 | a [element 3] | array_flow.rb:1024:9:1024:9 | [post] a [element] | +| array_flow.rb:1024:9:1024:9 | a [element 3] | array_flow.rb:1024:9:1024:18 | call to reverse! [element] | +| array_flow.rb:1024:9:1024:9 | a [element 3] | array_flow.rb:1024:9:1024:18 | call to reverse! [element] | +| array_flow.rb:1024:9:1024:18 | call to reverse! [element] | array_flow.rb:1024:5:1024:5 | b [element] | +| array_flow.rb:1024:9:1024:18 | call to reverse! [element] | array_flow.rb:1024:5:1024:5 | b [element] | +| array_flow.rb:1025:10:1025:10 | b [element] | array_flow.rb:1025:10:1025:13 | ...[...] | +| array_flow.rb:1025:10:1025:10 | b [element] | array_flow.rb:1025:10:1025:13 | ...[...] | +| array_flow.rb:1026:10:1026:10 | b [element] | array_flow.rb:1026:10:1026:13 | ...[...] | +| array_flow.rb:1026:10:1026:10 | b [element] | array_flow.rb:1026:10:1026:13 | ...[...] | +| array_flow.rb:1027:10:1027:10 | b [element] | array_flow.rb:1027:10:1027:13 | ...[...] | +| array_flow.rb:1027:10:1027:10 | b [element] | array_flow.rb:1027:10:1027:13 | ...[...] | +| array_flow.rb:1028:10:1028:10 | a [element] | array_flow.rb:1028:10:1028:13 | ...[...] | +| array_flow.rb:1028:10:1028:10 | a [element] | array_flow.rb:1028:10:1028:13 | ...[...] | +| array_flow.rb:1029:10:1029:10 | a [element 2] | array_flow.rb:1029:10:1029:13 | ...[...] | +| array_flow.rb:1029:10:1029:10 | a [element 2] | array_flow.rb:1029:10:1029:13 | ...[...] | +| array_flow.rb:1029:10:1029:10 | a [element] | array_flow.rb:1029:10:1029:13 | ...[...] | +| array_flow.rb:1029:10:1029:10 | a [element] | array_flow.rb:1029:10:1029:13 | ...[...] | +| array_flow.rb:1030:10:1030:10 | a [element 3] | array_flow.rb:1030:10:1030:13 | ...[...] | +| array_flow.rb:1030:10:1030:10 | a [element 3] | array_flow.rb:1030:10:1030:13 | ...[...] | +| array_flow.rb:1030:10:1030:10 | a [element] | array_flow.rb:1030:10:1030:13 | ...[...] | +| array_flow.rb:1030:10:1030:10 | a [element] | array_flow.rb:1030:10:1030:13 | ...[...] | +| array_flow.rb:1034:5:1034:5 | a [element 2] | array_flow.rb:1035:9:1035:9 | a [element 2] | +| array_flow.rb:1034:5:1034:5 | a [element 2] | array_flow.rb:1035:9:1035:9 | a [element 2] | +| array_flow.rb:1034:16:1034:26 | call to source | array_flow.rb:1034:5:1034:5 | a [element 2] | +| array_flow.rb:1034:16:1034:26 | call to source | array_flow.rb:1034:5:1034:5 | a [element 2] | +| array_flow.rb:1035:5:1035:5 | b [element 2] | array_flow.rb:1038:10:1038:10 | b [element 2] | +| array_flow.rb:1035:5:1035:5 | b [element 2] | array_flow.rb:1038:10:1038:10 | b [element 2] | +| array_flow.rb:1035:9:1035:9 | a [element 2] | array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] | +| array_flow.rb:1035:9:1035:9 | a [element 2] | array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] | +| array_flow.rb:1035:9:1035:9 | a [element 2] | array_flow.rb:1035:28:1035:28 | x | +| array_flow.rb:1035:9:1035:9 | a [element 2] | array_flow.rb:1035:28:1035:28 | x | +| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] | array_flow.rb:1035:5:1035:5 | b [element 2] | +| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] | array_flow.rb:1035:5:1035:5 | b [element 2] | +| array_flow.rb:1035:28:1035:28 | x | array_flow.rb:1036:14:1036:14 | x | +| array_flow.rb:1035:28:1035:28 | x | array_flow.rb:1036:14:1036:14 | x | +| array_flow.rb:1038:10:1038:10 | b [element 2] | array_flow.rb:1038:10:1038:13 | ...[...] | +| array_flow.rb:1038:10:1038:10 | b [element 2] | array_flow.rb:1038:10:1038:13 | ...[...] | +| array_flow.rb:1042:5:1042:5 | a [element 2] | array_flow.rb:1043:5:1043:5 | a [element 2] | +| array_flow.rb:1042:5:1042:5 | a [element 2] | array_flow.rb:1043:5:1043:5 | a [element 2] | +| array_flow.rb:1042:16:1042:26 | call to source | array_flow.rb:1042:5:1042:5 | a [element 2] | +| array_flow.rb:1042:16:1042:26 | call to source | array_flow.rb:1042:5:1042:5 | a [element 2] | +| array_flow.rb:1043:5:1043:5 | a [element 2] | array_flow.rb:1043:18:1043:18 | x | +| array_flow.rb:1043:5:1043:5 | a [element 2] | array_flow.rb:1043:18:1043:18 | x | +| array_flow.rb:1043:18:1043:18 | x | array_flow.rb:1044:14:1044:14 | x | +| array_flow.rb:1043:18:1043:18 | x | array_flow.rb:1044:14:1044:14 | x | +| array_flow.rb:1052:5:1052:5 | a [element 0] | array_flow.rb:1054:9:1054:9 | a [element 0] | +| array_flow.rb:1052:5:1052:5 | a [element 0] | array_flow.rb:1054:9:1054:9 | a [element 0] | +| array_flow.rb:1052:5:1052:5 | a [element 0] | array_flow.rb:1060:9:1060:9 | a [element 0] | +| array_flow.rb:1052:5:1052:5 | a [element 0] | array_flow.rb:1060:9:1060:9 | a [element 0] | +| array_flow.rb:1052:5:1052:5 | a [element 0] | array_flow.rb:1066:9:1066:9 | a [element 0] | +| array_flow.rb:1052:5:1052:5 | a [element 0] | array_flow.rb:1066:9:1066:9 | a [element 0] | +| array_flow.rb:1052:5:1052:5 | a [element 0] | array_flow.rb:1072:9:1072:9 | a [element 0] | +| array_flow.rb:1052:5:1052:5 | a [element 0] | array_flow.rb:1072:9:1072:9 | a [element 0] | +| array_flow.rb:1052:5:1052:5 | a [element 2] | array_flow.rb:1054:9:1054:9 | a [element 2] | +| array_flow.rb:1052:5:1052:5 | a [element 2] | array_flow.rb:1054:9:1054:9 | a [element 2] | +| array_flow.rb:1052:5:1052:5 | a [element 2] | array_flow.rb:1060:9:1060:9 | a [element 2] | +| array_flow.rb:1052:5:1052:5 | a [element 2] | array_flow.rb:1060:9:1060:9 | a [element 2] | +| array_flow.rb:1052:5:1052:5 | a [element 2] | array_flow.rb:1066:9:1066:9 | a [element 2] | +| array_flow.rb:1052:5:1052:5 | a [element 2] | array_flow.rb:1066:9:1066:9 | a [element 2] | +| array_flow.rb:1052:5:1052:5 | a [element 2] | array_flow.rb:1072:9:1072:9 | a [element 2] | +| array_flow.rb:1052:5:1052:5 | a [element 2] | array_flow.rb:1072:9:1072:9 | a [element 2] | +| array_flow.rb:1052:5:1052:5 | a [element 3] | array_flow.rb:1054:9:1054:9 | a [element 3] | +| array_flow.rb:1052:5:1052:5 | a [element 3] | array_flow.rb:1054:9:1054:9 | a [element 3] | +| array_flow.rb:1052:5:1052:5 | a [element 3] | array_flow.rb:1060:9:1060:9 | a [element 3] | +| array_flow.rb:1052:5:1052:5 | a [element 3] | array_flow.rb:1060:9:1060:9 | a [element 3] | +| array_flow.rb:1052:5:1052:5 | a [element 3] | array_flow.rb:1066:9:1066:9 | a [element 3] | +| array_flow.rb:1052:5:1052:5 | a [element 3] | array_flow.rb:1066:9:1066:9 | a [element 3] | +| array_flow.rb:1052:5:1052:5 | a [element 3] | array_flow.rb:1072:9:1072:9 | a [element 3] | +| array_flow.rb:1052:5:1052:5 | a [element 3] | array_flow.rb:1072:9:1072:9 | a [element 3] | +| array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1052:5:1052:5 | a [element 0] | +| array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1052:5:1052:5 | a [element 0] | +| array_flow.rb:1052:28:1052:40 | call to source | array_flow.rb:1052:5:1052:5 | a [element 2] | +| array_flow.rb:1052:28:1052:40 | call to source | array_flow.rb:1052:5:1052:5 | a [element 2] | +| array_flow.rb:1052:43:1052:55 | call to source | array_flow.rb:1052:5:1052:5 | a [element 3] | +| array_flow.rb:1052:43:1052:55 | call to source | array_flow.rb:1052:5:1052:5 | a [element 3] | +| array_flow.rb:1054:5:1054:5 | b [element 1] | array_flow.rb:1056:10:1056:10 | b [element 1] | +| array_flow.rb:1054:5:1054:5 | b [element 1] | array_flow.rb:1056:10:1056:10 | b [element 1] | +| array_flow.rb:1054:5:1054:5 | b [element 2] | array_flow.rb:1057:10:1057:10 | b [element 2] | +| array_flow.rb:1054:5:1054:5 | b [element 2] | array_flow.rb:1057:10:1057:10 | b [element 2] | +| array_flow.rb:1054:5:1054:5 | b [element] | array_flow.rb:1055:10:1055:10 | b [element] | +| array_flow.rb:1054:5:1054:5 | b [element] | array_flow.rb:1055:10:1055:10 | b [element] | +| array_flow.rb:1054:5:1054:5 | b [element] | array_flow.rb:1056:10:1056:10 | b [element] | +| array_flow.rb:1054:5:1054:5 | b [element] | array_flow.rb:1056:10:1056:10 | b [element] | +| array_flow.rb:1054:5:1054:5 | b [element] | array_flow.rb:1057:10:1057:10 | b [element] | +| array_flow.rb:1054:5:1054:5 | b [element] | array_flow.rb:1057:10:1057:10 | b [element] | +| array_flow.rb:1054:5:1054:5 | b [element] | array_flow.rb:1058:10:1058:10 | b [element] | +| array_flow.rb:1054:5:1054:5 | b [element] | array_flow.rb:1058:10:1058:10 | b [element] | +| array_flow.rb:1054:9:1054:9 | a [element 0] | array_flow.rb:1054:9:1054:16 | call to rotate [element] | +| array_flow.rb:1054:9:1054:9 | a [element 0] | array_flow.rb:1054:9:1054:16 | call to rotate [element] | +| array_flow.rb:1054:9:1054:9 | a [element 2] | array_flow.rb:1054:9:1054:16 | call to rotate [element 1] | +| array_flow.rb:1054:9:1054:9 | a [element 2] | array_flow.rb:1054:9:1054:16 | call to rotate [element 1] | +| array_flow.rb:1054:9:1054:9 | a [element 3] | array_flow.rb:1054:9:1054:16 | call to rotate [element 2] | +| array_flow.rb:1054:9:1054:9 | a [element 3] | array_flow.rb:1054:9:1054:16 | call to rotate [element 2] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] | array_flow.rb:1054:5:1054:5 | b [element 1] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] | array_flow.rb:1054:5:1054:5 | b [element 1] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] | array_flow.rb:1054:5:1054:5 | b [element 2] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] | array_flow.rb:1054:5:1054:5 | b [element 2] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element] | array_flow.rb:1054:5:1054:5 | b [element] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element] | array_flow.rb:1054:5:1054:5 | b [element] | +| array_flow.rb:1055:10:1055:10 | b [element] | array_flow.rb:1055:10:1055:13 | ...[...] | +| array_flow.rb:1055:10:1055:10 | b [element] | array_flow.rb:1055:10:1055:13 | ...[...] | +| array_flow.rb:1056:10:1056:10 | b [element 1] | array_flow.rb:1056:10:1056:13 | ...[...] | +| array_flow.rb:1056:10:1056:10 | b [element 1] | array_flow.rb:1056:10:1056:13 | ...[...] | +| array_flow.rb:1056:10:1056:10 | b [element] | array_flow.rb:1056:10:1056:13 | ...[...] | +| array_flow.rb:1056:10:1056:10 | b [element] | array_flow.rb:1056:10:1056:13 | ...[...] | +| array_flow.rb:1057:10:1057:10 | b [element 2] | array_flow.rb:1057:10:1057:13 | ...[...] | +| array_flow.rb:1057:10:1057:10 | b [element 2] | array_flow.rb:1057:10:1057:13 | ...[...] | +| array_flow.rb:1057:10:1057:10 | b [element] | array_flow.rb:1057:10:1057:13 | ...[...] | +| array_flow.rb:1057:10:1057:10 | b [element] | array_flow.rb:1057:10:1057:13 | ...[...] | +| array_flow.rb:1058:10:1058:10 | b [element] | array_flow.rb:1058:10:1058:13 | ...[...] | +| array_flow.rb:1058:10:1058:10 | b [element] | array_flow.rb:1058:10:1058:13 | ...[...] | +| array_flow.rb:1060:5:1060:5 | b [element 0] | array_flow.rb:1061:10:1061:10 | b [element 0] | +| array_flow.rb:1060:5:1060:5 | b [element 0] | array_flow.rb:1061:10:1061:10 | b [element 0] | +| array_flow.rb:1060:5:1060:5 | b [element 1] | array_flow.rb:1062:10:1062:10 | b [element 1] | +| array_flow.rb:1060:5:1060:5 | b [element 1] | array_flow.rb:1062:10:1062:10 | b [element 1] | +| array_flow.rb:1060:5:1060:5 | b [element] | array_flow.rb:1061:10:1061:10 | b [element] | +| array_flow.rb:1060:5:1060:5 | b [element] | array_flow.rb:1061:10:1061:10 | b [element] | +| array_flow.rb:1060:5:1060:5 | b [element] | array_flow.rb:1062:10:1062:10 | b [element] | +| array_flow.rb:1060:5:1060:5 | b [element] | array_flow.rb:1062:10:1062:10 | b [element] | +| array_flow.rb:1060:5:1060:5 | b [element] | array_flow.rb:1063:10:1063:10 | b [element] | +| array_flow.rb:1060:5:1060:5 | b [element] | array_flow.rb:1063:10:1063:10 | b [element] | +| array_flow.rb:1060:5:1060:5 | b [element] | array_flow.rb:1064:10:1064:10 | b [element] | +| array_flow.rb:1060:5:1060:5 | b [element] | array_flow.rb:1064:10:1064:10 | b [element] | +| array_flow.rb:1060:9:1060:9 | a [element 0] | array_flow.rb:1060:9:1060:19 | call to rotate [element] | +| array_flow.rb:1060:9:1060:9 | a [element 0] | array_flow.rb:1060:9:1060:19 | call to rotate [element] | +| array_flow.rb:1060:9:1060:9 | a [element 2] | array_flow.rb:1060:9:1060:19 | call to rotate [element 0] | +| array_flow.rb:1060:9:1060:9 | a [element 2] | array_flow.rb:1060:9:1060:19 | call to rotate [element 0] | +| array_flow.rb:1060:9:1060:9 | a [element 3] | array_flow.rb:1060:9:1060:19 | call to rotate [element 1] | +| array_flow.rb:1060:9:1060:9 | a [element 3] | array_flow.rb:1060:9:1060:19 | call to rotate [element 1] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] | array_flow.rb:1060:5:1060:5 | b [element 0] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] | array_flow.rb:1060:5:1060:5 | b [element 0] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] | array_flow.rb:1060:5:1060:5 | b [element 1] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] | array_flow.rb:1060:5:1060:5 | b [element 1] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element] | array_flow.rb:1060:5:1060:5 | b [element] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element] | array_flow.rb:1060:5:1060:5 | b [element] | +| array_flow.rb:1061:10:1061:10 | b [element 0] | array_flow.rb:1061:10:1061:13 | ...[...] | +| array_flow.rb:1061:10:1061:10 | b [element 0] | array_flow.rb:1061:10:1061:13 | ...[...] | +| array_flow.rb:1061:10:1061:10 | b [element] | array_flow.rb:1061:10:1061:13 | ...[...] | +| array_flow.rb:1061:10:1061:10 | b [element] | array_flow.rb:1061:10:1061:13 | ...[...] | +| array_flow.rb:1062:10:1062:10 | b [element 1] | array_flow.rb:1062:10:1062:13 | ...[...] | +| array_flow.rb:1062:10:1062:10 | b [element 1] | array_flow.rb:1062:10:1062:13 | ...[...] | +| array_flow.rb:1062:10:1062:10 | b [element] | array_flow.rb:1062:10:1062:13 | ...[...] | +| array_flow.rb:1062:10:1062:10 | b [element] | array_flow.rb:1062:10:1062:13 | ...[...] | +| array_flow.rb:1063:10:1063:10 | b [element] | array_flow.rb:1063:10:1063:13 | ...[...] | +| array_flow.rb:1063:10:1063:10 | b [element] | array_flow.rb:1063:10:1063:13 | ...[...] | +| array_flow.rb:1064:10:1064:10 | b [element] | array_flow.rb:1064:10:1064:13 | ...[...] | +| array_flow.rb:1064:10:1064:10 | b [element] | array_flow.rb:1064:10:1064:13 | ...[...] | +| array_flow.rb:1066:5:1066:5 | b [element 0] | array_flow.rb:1067:10:1067:10 | b [element 0] | +| array_flow.rb:1066:5:1066:5 | b [element 0] | array_flow.rb:1067:10:1067:10 | b [element 0] | +| array_flow.rb:1066:5:1066:5 | b [element 2] | array_flow.rb:1069:10:1069:10 | b [element 2] | +| array_flow.rb:1066:5:1066:5 | b [element 2] | array_flow.rb:1069:10:1069:10 | b [element 2] | +| array_flow.rb:1066:5:1066:5 | b [element 3] | array_flow.rb:1070:10:1070:10 | b [element 3] | +| array_flow.rb:1066:5:1066:5 | b [element 3] | array_flow.rb:1070:10:1070:10 | b [element 3] | +| array_flow.rb:1066:9:1066:9 | a [element 0] | array_flow.rb:1066:9:1066:19 | call to rotate [element 0] | +| array_flow.rb:1066:9:1066:9 | a [element 0] | array_flow.rb:1066:9:1066:19 | call to rotate [element 0] | +| array_flow.rb:1066:9:1066:9 | a [element 2] | array_flow.rb:1066:9:1066:19 | call to rotate [element 2] | +| array_flow.rb:1066:9:1066:9 | a [element 2] | array_flow.rb:1066:9:1066:19 | call to rotate [element 2] | +| array_flow.rb:1066:9:1066:9 | a [element 3] | array_flow.rb:1066:9:1066:19 | call to rotate [element 3] | +| array_flow.rb:1066:9:1066:9 | a [element 3] | array_flow.rb:1066:9:1066:19 | call to rotate [element 3] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] | array_flow.rb:1066:5:1066:5 | b [element 0] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] | array_flow.rb:1066:5:1066:5 | b [element 0] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] | array_flow.rb:1066:5:1066:5 | b [element 2] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] | array_flow.rb:1066:5:1066:5 | b [element 2] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] | array_flow.rb:1066:5:1066:5 | b [element 3] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] | array_flow.rb:1066:5:1066:5 | b [element 3] | +| array_flow.rb:1067:10:1067:10 | b [element 0] | array_flow.rb:1067:10:1067:13 | ...[...] | +| array_flow.rb:1067:10:1067:10 | b [element 0] | array_flow.rb:1067:10:1067:13 | ...[...] | +| array_flow.rb:1069:10:1069:10 | b [element 2] | array_flow.rb:1069:10:1069:13 | ...[...] | +| array_flow.rb:1069:10:1069:10 | b [element 2] | array_flow.rb:1069:10:1069:13 | ...[...] | +| array_flow.rb:1070:10:1070:10 | b [element 3] | array_flow.rb:1070:10:1070:13 | ...[...] | +| array_flow.rb:1070:10:1070:10 | b [element 3] | array_flow.rb:1070:10:1070:13 | ...[...] | +| array_flow.rb:1072:5:1072:5 | b [element] | array_flow.rb:1073:10:1073:10 | b [element] | +| array_flow.rb:1072:5:1072:5 | b [element] | array_flow.rb:1073:10:1073:10 | b [element] | +| array_flow.rb:1072:5:1072:5 | b [element] | array_flow.rb:1074:10:1074:10 | b [element] | +| array_flow.rb:1072:5:1072:5 | b [element] | array_flow.rb:1074:10:1074:10 | b [element] | +| array_flow.rb:1072:5:1072:5 | b [element] | array_flow.rb:1075:10:1075:10 | b [element] | +| array_flow.rb:1072:5:1072:5 | b [element] | array_flow.rb:1075:10:1075:10 | b [element] | +| array_flow.rb:1072:5:1072:5 | b [element] | array_flow.rb:1076:10:1076:10 | b [element] | +| array_flow.rb:1072:5:1072:5 | b [element] | array_flow.rb:1076:10:1076:10 | b [element] | +| array_flow.rb:1072:9:1072:9 | a [element 0] | array_flow.rb:1072:9:1072:19 | call to rotate [element] | +| array_flow.rb:1072:9:1072:9 | a [element 0] | array_flow.rb:1072:9:1072:19 | call to rotate [element] | +| array_flow.rb:1072:9:1072:9 | a [element 2] | array_flow.rb:1072:9:1072:19 | call to rotate [element] | +| array_flow.rb:1072:9:1072:9 | a [element 2] | array_flow.rb:1072:9:1072:19 | call to rotate [element] | +| array_flow.rb:1072:9:1072:9 | a [element 3] | array_flow.rb:1072:9:1072:19 | call to rotate [element] | +| array_flow.rb:1072:9:1072:9 | a [element 3] | array_flow.rb:1072:9:1072:19 | call to rotate [element] | +| array_flow.rb:1072:9:1072:19 | call to rotate [element] | array_flow.rb:1072:5:1072:5 | b [element] | +| array_flow.rb:1072:9:1072:19 | call to rotate [element] | array_flow.rb:1072:5:1072:5 | b [element] | +| array_flow.rb:1073:10:1073:10 | b [element] | array_flow.rb:1073:10:1073:13 | ...[...] | +| array_flow.rb:1073:10:1073:10 | b [element] | array_flow.rb:1073:10:1073:13 | ...[...] | +| array_flow.rb:1074:10:1074:10 | b [element] | array_flow.rb:1074:10:1074:13 | ...[...] | +| array_flow.rb:1074:10:1074:10 | b [element] | array_flow.rb:1074:10:1074:13 | ...[...] | +| array_flow.rb:1075:10:1075:10 | b [element] | array_flow.rb:1075:10:1075:13 | ...[...] | +| array_flow.rb:1075:10:1075:10 | b [element] | array_flow.rb:1075:10:1075:13 | ...[...] | +| array_flow.rb:1076:10:1076:10 | b [element] | array_flow.rb:1076:10:1076:13 | ...[...] | +| array_flow.rb:1076:10:1076:10 | b [element] | array_flow.rb:1076:10:1076:13 | ...[...] | +| array_flow.rb:1084:5:1084:5 | a [element 0] | array_flow.rb:1085:9:1085:9 | a [element 0] | +| array_flow.rb:1084:5:1084:5 | a [element 0] | array_flow.rb:1085:9:1085:9 | a [element 0] | +| array_flow.rb:1084:5:1084:5 | a [element 2] | array_flow.rb:1085:9:1085:9 | a [element 2] | +| array_flow.rb:1084:5:1084:5 | a [element 2] | array_flow.rb:1085:9:1085:9 | a [element 2] | +| array_flow.rb:1084:5:1084:5 | a [element 3] | array_flow.rb:1085:9:1085:9 | a [element 3] | +| array_flow.rb:1084:5:1084:5 | a [element 3] | array_flow.rb:1085:9:1085:9 | a [element 3] | +| array_flow.rb:1084:10:1084:22 | call to source | array_flow.rb:1084:5:1084:5 | a [element 0] | +| array_flow.rb:1084:10:1084:22 | call to source | array_flow.rb:1084:5:1084:5 | a [element 0] | +| array_flow.rb:1084:28:1084:40 | call to source | array_flow.rb:1084:5:1084:5 | a [element 2] | +| array_flow.rb:1084:28:1084:40 | call to source | array_flow.rb:1084:5:1084:5 | a [element 2] | +| array_flow.rb:1084:43:1084:55 | call to source | array_flow.rb:1084:5:1084:5 | a [element 3] | +| array_flow.rb:1084:43:1084:55 | call to source | array_flow.rb:1084:5:1084:5 | a [element 3] | +| array_flow.rb:1085:5:1085:5 | b [element 1] | array_flow.rb:1091:10:1091:10 | b [element 1] | +| array_flow.rb:1085:5:1085:5 | b [element 1] | array_flow.rb:1091:10:1091:10 | b [element 1] | +| array_flow.rb:1085:5:1085:5 | b [element 2] | array_flow.rb:1092:10:1092:10 | b [element 2] | +| array_flow.rb:1085:5:1085:5 | b [element 2] | array_flow.rb:1092:10:1092:10 | b [element 2] | +| array_flow.rb:1085:5:1085:5 | b [element] | array_flow.rb:1090:10:1090:10 | b [element] | +| array_flow.rb:1085:5:1085:5 | b [element] | array_flow.rb:1090:10:1090:10 | b [element] | +| array_flow.rb:1085:5:1085:5 | b [element] | array_flow.rb:1091:10:1091:10 | b [element] | +| array_flow.rb:1085:5:1085:5 | b [element] | array_flow.rb:1091:10:1091:10 | b [element] | +| array_flow.rb:1085:5:1085:5 | b [element] | array_flow.rb:1092:10:1092:10 | b [element] | +| array_flow.rb:1085:5:1085:5 | b [element] | array_flow.rb:1092:10:1092:10 | b [element] | +| array_flow.rb:1085:5:1085:5 | b [element] | array_flow.rb:1093:10:1093:10 | b [element] | +| array_flow.rb:1085:5:1085:5 | b [element] | array_flow.rb:1093:10:1093:10 | b [element] | +| array_flow.rb:1085:9:1085:9 | [post] a [element 1] | array_flow.rb:1087:10:1087:10 | a [element 1] | +| array_flow.rb:1085:9:1085:9 | [post] a [element 1] | array_flow.rb:1087:10:1087:10 | a [element 1] | +| array_flow.rb:1085:9:1085:9 | [post] a [element 2] | array_flow.rb:1088:10:1088:10 | a [element 2] | +| array_flow.rb:1085:9:1085:9 | [post] a [element 2] | array_flow.rb:1088:10:1088:10 | a [element 2] | +| array_flow.rb:1085:9:1085:9 | [post] a [element] | array_flow.rb:1086:10:1086:10 | a [element] | +| array_flow.rb:1085:9:1085:9 | [post] a [element] | array_flow.rb:1086:10:1086:10 | a [element] | +| array_flow.rb:1085:9:1085:9 | [post] a [element] | array_flow.rb:1087:10:1087:10 | a [element] | +| array_flow.rb:1085:9:1085:9 | [post] a [element] | array_flow.rb:1087:10:1087:10 | a [element] | +| array_flow.rb:1085:9:1085:9 | [post] a [element] | array_flow.rb:1088:10:1088:10 | a [element] | +| array_flow.rb:1085:9:1085:9 | [post] a [element] | array_flow.rb:1088:10:1088:10 | a [element] | +| array_flow.rb:1085:9:1085:9 | [post] a [element] | array_flow.rb:1089:10:1089:10 | a [element] | +| array_flow.rb:1085:9:1085:9 | [post] a [element] | array_flow.rb:1089:10:1089:10 | a [element] | +| array_flow.rb:1085:9:1085:9 | a [element 0] | array_flow.rb:1085:9:1085:9 | [post] a [element] | +| array_flow.rb:1085:9:1085:9 | a [element 0] | array_flow.rb:1085:9:1085:9 | [post] a [element] | +| array_flow.rb:1085:9:1085:9 | a [element 0] | array_flow.rb:1085:9:1085:17 | call to rotate! [element] | +| array_flow.rb:1085:9:1085:9 | a [element 0] | array_flow.rb:1085:9:1085:17 | call to rotate! [element] | +| array_flow.rb:1085:9:1085:9 | a [element 2] | array_flow.rb:1085:9:1085:9 | [post] a [element 1] | +| array_flow.rb:1085:9:1085:9 | a [element 2] | array_flow.rb:1085:9:1085:9 | [post] a [element 1] | +| array_flow.rb:1085:9:1085:9 | a [element 2] | array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] | +| array_flow.rb:1085:9:1085:9 | a [element 2] | array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] | +| array_flow.rb:1085:9:1085:9 | a [element 3] | array_flow.rb:1085:9:1085:9 | [post] a [element 2] | +| array_flow.rb:1085:9:1085:9 | a [element 3] | array_flow.rb:1085:9:1085:9 | [post] a [element 2] | +| array_flow.rb:1085:9:1085:9 | a [element 3] | array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] | +| array_flow.rb:1085:9:1085:9 | a [element 3] | array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] | array_flow.rb:1085:5:1085:5 | b [element 1] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] | array_flow.rb:1085:5:1085:5 | b [element 1] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] | array_flow.rb:1085:5:1085:5 | b [element 2] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] | array_flow.rb:1085:5:1085:5 | b [element 2] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element] | array_flow.rb:1085:5:1085:5 | b [element] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element] | array_flow.rb:1085:5:1085:5 | b [element] | +| array_flow.rb:1086:10:1086:10 | a [element] | array_flow.rb:1086:10:1086:13 | ...[...] | +| array_flow.rb:1086:10:1086:10 | a [element] | array_flow.rb:1086:10:1086:13 | ...[...] | +| array_flow.rb:1087:10:1087:10 | a [element 1] | array_flow.rb:1087:10:1087:13 | ...[...] | +| array_flow.rb:1087:10:1087:10 | a [element 1] | array_flow.rb:1087:10:1087:13 | ...[...] | +| array_flow.rb:1087:10:1087:10 | a [element] | array_flow.rb:1087:10:1087:13 | ...[...] | +| array_flow.rb:1087:10:1087:10 | a [element] | array_flow.rb:1087:10:1087:13 | ...[...] | +| array_flow.rb:1088:10:1088:10 | a [element 2] | array_flow.rb:1088:10:1088:13 | ...[...] | +| array_flow.rb:1088:10:1088:10 | a [element 2] | array_flow.rb:1088:10:1088:13 | ...[...] | +| array_flow.rb:1088:10:1088:10 | a [element] | array_flow.rb:1088:10:1088:13 | ...[...] | +| array_flow.rb:1088:10:1088:10 | a [element] | array_flow.rb:1088:10:1088:13 | ...[...] | +| array_flow.rb:1089:10:1089:10 | a [element] | array_flow.rb:1089:10:1089:13 | ...[...] | +| array_flow.rb:1089:10:1089:10 | a [element] | array_flow.rb:1089:10:1089:13 | ...[...] | +| array_flow.rb:1090:10:1090:10 | b [element] | array_flow.rb:1090:10:1090:13 | ...[...] | +| array_flow.rb:1090:10:1090:10 | b [element] | array_flow.rb:1090:10:1090:13 | ...[...] | +| array_flow.rb:1091:10:1091:10 | b [element 1] | array_flow.rb:1091:10:1091:13 | ...[...] | +| array_flow.rb:1091:10:1091:10 | b [element 1] | array_flow.rb:1091:10:1091:13 | ...[...] | +| array_flow.rb:1091:10:1091:10 | b [element] | array_flow.rb:1091:10:1091:13 | ...[...] | +| array_flow.rb:1091:10:1091:10 | b [element] | array_flow.rb:1091:10:1091:13 | ...[...] | +| array_flow.rb:1092:10:1092:10 | b [element 2] | array_flow.rb:1092:10:1092:13 | ...[...] | +| array_flow.rb:1092:10:1092:10 | b [element 2] | array_flow.rb:1092:10:1092:13 | ...[...] | +| array_flow.rb:1092:10:1092:10 | b [element] | array_flow.rb:1092:10:1092:13 | ...[...] | +| array_flow.rb:1092:10:1092:10 | b [element] | array_flow.rb:1092:10:1092:13 | ...[...] | +| array_flow.rb:1093:10:1093:10 | b [element] | array_flow.rb:1093:10:1093:13 | ...[...] | +| array_flow.rb:1093:10:1093:10 | b [element] | array_flow.rb:1093:10:1093:13 | ...[...] | +| array_flow.rb:1095:5:1095:5 | a [element 0] | array_flow.rb:1096:9:1096:9 | a [element 0] | +| array_flow.rb:1095:5:1095:5 | a [element 0] | array_flow.rb:1096:9:1096:9 | a [element 0] | +| array_flow.rb:1095:5:1095:5 | a [element 2] | array_flow.rb:1096:9:1096:9 | a [element 2] | +| array_flow.rb:1095:5:1095:5 | a [element 2] | array_flow.rb:1096:9:1096:9 | a [element 2] | +| array_flow.rb:1095:5:1095:5 | a [element 3] | array_flow.rb:1096:9:1096:9 | a [element 3] | +| array_flow.rb:1095:5:1095:5 | a [element 3] | array_flow.rb:1096:9:1096:9 | a [element 3] | +| array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1095:5:1095:5 | a [element 0] | +| array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1095:5:1095:5 | a [element 0] | +| array_flow.rb:1095:28:1095:40 | call to source | array_flow.rb:1095:5:1095:5 | a [element 2] | +| array_flow.rb:1095:28:1095:40 | call to source | array_flow.rb:1095:5:1095:5 | a [element 2] | +| array_flow.rb:1095:43:1095:55 | call to source | array_flow.rb:1095:5:1095:5 | a [element 3] | +| array_flow.rb:1095:43:1095:55 | call to source | array_flow.rb:1095:5:1095:5 | a [element 3] | +| array_flow.rb:1096:5:1096:5 | b [element 0] | array_flow.rb:1101:10:1101:10 | b [element 0] | +| array_flow.rb:1096:5:1096:5 | b [element 0] | array_flow.rb:1101:10:1101:10 | b [element 0] | +| array_flow.rb:1096:5:1096:5 | b [element 1] | array_flow.rb:1102:10:1102:10 | b [element 1] | +| array_flow.rb:1096:5:1096:5 | b [element 1] | array_flow.rb:1102:10:1102:10 | b [element 1] | +| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1101:10:1101:10 | b [element] | +| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1101:10:1101:10 | b [element] | +| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1102:10:1102:10 | b [element] | +| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1102:10:1102:10 | b [element] | +| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1103:10:1103:10 | b [element] | +| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1103:10:1103:10 | b [element] | +| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1104:10:1104:10 | b [element] | +| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1104:10:1104:10 | b [element] | +| array_flow.rb:1096:9:1096:9 | [post] a [element 0] | array_flow.rb:1097:10:1097:10 | a [element 0] | +| array_flow.rb:1096:9:1096:9 | [post] a [element 0] | array_flow.rb:1097:10:1097:10 | a [element 0] | +| array_flow.rb:1096:9:1096:9 | [post] a [element 1] | array_flow.rb:1098:10:1098:10 | a [element 1] | +| array_flow.rb:1096:9:1096:9 | [post] a [element 1] | array_flow.rb:1098:10:1098:10 | a [element 1] | +| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1097:10:1097:10 | a [element] | +| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1097:10:1097:10 | a [element] | +| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1098:10:1098:10 | a [element] | +| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1098:10:1098:10 | a [element] | +| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1099:10:1099:10 | a [element] | +| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1099:10:1099:10 | a [element] | +| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1100:10:1100:10 | a [element] | +| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1100:10:1100:10 | a [element] | +| array_flow.rb:1096:9:1096:9 | a [element 0] | array_flow.rb:1096:9:1096:9 | [post] a [element] | +| array_flow.rb:1096:9:1096:9 | a [element 0] | array_flow.rb:1096:9:1096:9 | [post] a [element] | +| array_flow.rb:1096:9:1096:9 | a [element 0] | array_flow.rb:1096:9:1096:20 | call to rotate! [element] | +| array_flow.rb:1096:9:1096:9 | a [element 0] | array_flow.rb:1096:9:1096:20 | call to rotate! [element] | +| array_flow.rb:1096:9:1096:9 | a [element 2] | array_flow.rb:1096:9:1096:9 | [post] a [element 0] | +| array_flow.rb:1096:9:1096:9 | a [element 2] | array_flow.rb:1096:9:1096:9 | [post] a [element 0] | +| array_flow.rb:1096:9:1096:9 | a [element 2] | array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] | +| array_flow.rb:1096:9:1096:9 | a [element 2] | array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] | +| array_flow.rb:1096:9:1096:9 | a [element 3] | array_flow.rb:1096:9:1096:9 | [post] a [element 1] | +| array_flow.rb:1096:9:1096:9 | a [element 3] | array_flow.rb:1096:9:1096:9 | [post] a [element 1] | +| array_flow.rb:1096:9:1096:9 | a [element 3] | array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] | +| array_flow.rb:1096:9:1096:9 | a [element 3] | array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] | array_flow.rb:1096:5:1096:5 | b [element 0] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] | array_flow.rb:1096:5:1096:5 | b [element 0] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] | array_flow.rb:1096:5:1096:5 | b [element 1] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] | array_flow.rb:1096:5:1096:5 | b [element 1] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element] | array_flow.rb:1096:5:1096:5 | b [element] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element] | array_flow.rb:1096:5:1096:5 | b [element] | +| array_flow.rb:1097:10:1097:10 | a [element 0] | array_flow.rb:1097:10:1097:13 | ...[...] | +| array_flow.rb:1097:10:1097:10 | a [element 0] | array_flow.rb:1097:10:1097:13 | ...[...] | +| array_flow.rb:1097:10:1097:10 | a [element] | array_flow.rb:1097:10:1097:13 | ...[...] | +| array_flow.rb:1097:10:1097:10 | a [element] | array_flow.rb:1097:10:1097:13 | ...[...] | +| array_flow.rb:1098:10:1098:10 | a [element 1] | array_flow.rb:1098:10:1098:13 | ...[...] | +| array_flow.rb:1098:10:1098:10 | a [element 1] | array_flow.rb:1098:10:1098:13 | ...[...] | +| array_flow.rb:1098:10:1098:10 | a [element] | array_flow.rb:1098:10:1098:13 | ...[...] | +| array_flow.rb:1098:10:1098:10 | a [element] | array_flow.rb:1098:10:1098:13 | ...[...] | +| array_flow.rb:1099:10:1099:10 | a [element] | array_flow.rb:1099:10:1099:13 | ...[...] | +| array_flow.rb:1099:10:1099:10 | a [element] | array_flow.rb:1099:10:1099:13 | ...[...] | +| array_flow.rb:1100:10:1100:10 | a [element] | array_flow.rb:1100:10:1100:13 | ...[...] | +| array_flow.rb:1100:10:1100:10 | a [element] | array_flow.rb:1100:10:1100:13 | ...[...] | +| array_flow.rb:1101:10:1101:10 | b [element 0] | array_flow.rb:1101:10:1101:13 | ...[...] | +| array_flow.rb:1101:10:1101:10 | b [element 0] | array_flow.rb:1101:10:1101:13 | ...[...] | +| array_flow.rb:1101:10:1101:10 | b [element] | array_flow.rb:1101:10:1101:13 | ...[...] | +| array_flow.rb:1101:10:1101:10 | b [element] | array_flow.rb:1101:10:1101:13 | ...[...] | +| array_flow.rb:1102:10:1102:10 | b [element 1] | array_flow.rb:1102:10:1102:13 | ...[...] | +| array_flow.rb:1102:10:1102:10 | b [element 1] | array_flow.rb:1102:10:1102:13 | ...[...] | +| array_flow.rb:1102:10:1102:10 | b [element] | array_flow.rb:1102:10:1102:13 | ...[...] | +| array_flow.rb:1102:10:1102:10 | b [element] | array_flow.rb:1102:10:1102:13 | ...[...] | +| array_flow.rb:1103:10:1103:10 | b [element] | array_flow.rb:1103:10:1103:13 | ...[...] | +| array_flow.rb:1103:10:1103:10 | b [element] | array_flow.rb:1103:10:1103:13 | ...[...] | +| array_flow.rb:1104:10:1104:10 | b [element] | array_flow.rb:1104:10:1104:13 | ...[...] | +| array_flow.rb:1104:10:1104:10 | b [element] | array_flow.rb:1104:10:1104:13 | ...[...] | +| array_flow.rb:1106:5:1106:5 | a [element 0] | array_flow.rb:1107:9:1107:9 | a [element 0] | +| array_flow.rb:1106:5:1106:5 | a [element 0] | array_flow.rb:1107:9:1107:9 | a [element 0] | +| array_flow.rb:1106:5:1106:5 | a [element 2] | array_flow.rb:1107:9:1107:9 | a [element 2] | +| array_flow.rb:1106:5:1106:5 | a [element 2] | array_flow.rb:1107:9:1107:9 | a [element 2] | +| array_flow.rb:1106:5:1106:5 | a [element 3] | array_flow.rb:1107:9:1107:9 | a [element 3] | +| array_flow.rb:1106:5:1106:5 | a [element 3] | array_flow.rb:1107:9:1107:9 | a [element 3] | +| array_flow.rb:1106:10:1106:22 | call to source | array_flow.rb:1106:5:1106:5 | a [element 0] | +| array_flow.rb:1106:10:1106:22 | call to source | array_flow.rb:1106:5:1106:5 | a [element 0] | +| array_flow.rb:1106:28:1106:40 | call to source | array_flow.rb:1106:5:1106:5 | a [element 2] | +| array_flow.rb:1106:28:1106:40 | call to source | array_flow.rb:1106:5:1106:5 | a [element 2] | +| array_flow.rb:1106:43:1106:55 | call to source | array_flow.rb:1106:5:1106:5 | a [element 3] | +| array_flow.rb:1106:43:1106:55 | call to source | array_flow.rb:1106:5:1106:5 | a [element 3] | +| array_flow.rb:1107:5:1107:5 | b [element 0] | array_flow.rb:1112:10:1112:10 | b [element 0] | +| array_flow.rb:1107:5:1107:5 | b [element 0] | array_flow.rb:1112:10:1112:10 | b [element 0] | +| array_flow.rb:1107:5:1107:5 | b [element 2] | array_flow.rb:1114:10:1114:10 | b [element 2] | +| array_flow.rb:1107:5:1107:5 | b [element 2] | array_flow.rb:1114:10:1114:10 | b [element 2] | +| array_flow.rb:1107:5:1107:5 | b [element 3] | array_flow.rb:1115:10:1115:10 | b [element 3] | +| array_flow.rb:1107:5:1107:5 | b [element 3] | array_flow.rb:1115:10:1115:10 | b [element 3] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 0] | array_flow.rb:1108:10:1108:10 | a [element 0] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 0] | array_flow.rb:1108:10:1108:10 | a [element 0] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 2] | array_flow.rb:1110:10:1110:10 | a [element 2] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 2] | array_flow.rb:1110:10:1110:10 | a [element 2] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 3] | array_flow.rb:1111:10:1111:10 | a [element 3] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 3] | array_flow.rb:1111:10:1111:10 | a [element 3] | +| array_flow.rb:1107:9:1107:9 | a [element 0] | array_flow.rb:1107:9:1107:9 | [post] a [element 0] | +| array_flow.rb:1107:9:1107:9 | a [element 0] | array_flow.rb:1107:9:1107:9 | [post] a [element 0] | +| array_flow.rb:1107:9:1107:9 | a [element 0] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | +| array_flow.rb:1107:9:1107:9 | a [element 0] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | +| array_flow.rb:1107:9:1107:9 | a [element 2] | array_flow.rb:1107:9:1107:9 | [post] a [element 2] | +| array_flow.rb:1107:9:1107:9 | a [element 2] | array_flow.rb:1107:9:1107:9 | [post] a [element 2] | +| array_flow.rb:1107:9:1107:9 | a [element 2] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] | +| array_flow.rb:1107:9:1107:9 | a [element 2] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] | +| array_flow.rb:1107:9:1107:9 | a [element 3] | array_flow.rb:1107:9:1107:9 | [post] a [element 3] | +| array_flow.rb:1107:9:1107:9 | a [element 3] | array_flow.rb:1107:9:1107:9 | [post] a [element 3] | +| array_flow.rb:1107:9:1107:9 | a [element 3] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] | +| array_flow.rb:1107:9:1107:9 | a [element 3] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | array_flow.rb:1107:5:1107:5 | b [element 0] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | array_flow.rb:1107:5:1107:5 | b [element 0] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] | array_flow.rb:1107:5:1107:5 | b [element 2] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] | array_flow.rb:1107:5:1107:5 | b [element 2] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] | array_flow.rb:1107:5:1107:5 | b [element 3] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] | array_flow.rb:1107:5:1107:5 | b [element 3] | +| array_flow.rb:1108:10:1108:10 | a [element 0] | array_flow.rb:1108:10:1108:13 | ...[...] | +| array_flow.rb:1108:10:1108:10 | a [element 0] | array_flow.rb:1108:10:1108:13 | ...[...] | +| array_flow.rb:1110:10:1110:10 | a [element 2] | array_flow.rb:1110:10:1110:13 | ...[...] | +| array_flow.rb:1110:10:1110:10 | a [element 2] | array_flow.rb:1110:10:1110:13 | ...[...] | +| array_flow.rb:1111:10:1111:10 | a [element 3] | array_flow.rb:1111:10:1111:13 | ...[...] | +| array_flow.rb:1111:10:1111:10 | a [element 3] | array_flow.rb:1111:10:1111:13 | ...[...] | +| array_flow.rb:1112:10:1112:10 | b [element 0] | array_flow.rb:1112:10:1112:13 | ...[...] | +| array_flow.rb:1112:10:1112:10 | b [element 0] | array_flow.rb:1112:10:1112:13 | ...[...] | +| array_flow.rb:1114:10:1114:10 | b [element 2] | array_flow.rb:1114:10:1114:13 | ...[...] | +| array_flow.rb:1114:10:1114:10 | b [element 2] | array_flow.rb:1114:10:1114:13 | ...[...] | +| array_flow.rb:1115:10:1115:10 | b [element 3] | array_flow.rb:1115:10:1115:13 | ...[...] | +| array_flow.rb:1115:10:1115:10 | b [element 3] | array_flow.rb:1115:10:1115:13 | ...[...] | +| array_flow.rb:1117:5:1117:5 | a [element 0] | array_flow.rb:1118:9:1118:9 | a [element 0] | +| array_flow.rb:1117:5:1117:5 | a [element 0] | array_flow.rb:1118:9:1118:9 | a [element 0] | +| array_flow.rb:1117:5:1117:5 | a [element 2] | array_flow.rb:1118:9:1118:9 | a [element 2] | +| array_flow.rb:1117:5:1117:5 | a [element 2] | array_flow.rb:1118:9:1118:9 | a [element 2] | +| array_flow.rb:1117:5:1117:5 | a [element 3] | array_flow.rb:1118:9:1118:9 | a [element 3] | +| array_flow.rb:1117:5:1117:5 | a [element 3] | array_flow.rb:1118:9:1118:9 | a [element 3] | +| array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1117:5:1117:5 | a [element 0] | +| array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1117:5:1117:5 | a [element 0] | +| array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1117:5:1117:5 | a [element 2] | +| array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1117:5:1117:5 | a [element 2] | +| array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1117:5:1117:5 | a [element 3] | +| array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1117:5:1117:5 | a [element 3] | +| array_flow.rb:1118:5:1118:5 | b [element] | array_flow.rb:1123:10:1123:10 | b [element] | +| array_flow.rb:1118:5:1118:5 | b [element] | array_flow.rb:1123:10:1123:10 | b [element] | +| array_flow.rb:1118:5:1118:5 | b [element] | array_flow.rb:1124:10:1124:10 | b [element] | +| array_flow.rb:1118:5:1118:5 | b [element] | array_flow.rb:1124:10:1124:10 | b [element] | +| array_flow.rb:1118:5:1118:5 | b [element] | array_flow.rb:1125:10:1125:10 | b [element] | +| array_flow.rb:1118:5:1118:5 | b [element] | array_flow.rb:1125:10:1125:10 | b [element] | +| array_flow.rb:1118:5:1118:5 | b [element] | array_flow.rb:1126:10:1126:10 | b [element] | +| array_flow.rb:1118:5:1118:5 | b [element] | array_flow.rb:1126:10:1126:10 | b [element] | +| array_flow.rb:1118:9:1118:9 | [post] a [element] | array_flow.rb:1119:10:1119:10 | a [element] | +| array_flow.rb:1118:9:1118:9 | [post] a [element] | array_flow.rb:1119:10:1119:10 | a [element] | +| array_flow.rb:1118:9:1118:9 | [post] a [element] | array_flow.rb:1120:10:1120:10 | a [element] | +| array_flow.rb:1118:9:1118:9 | [post] a [element] | array_flow.rb:1120:10:1120:10 | a [element] | +| array_flow.rb:1118:9:1118:9 | [post] a [element] | array_flow.rb:1121:10:1121:10 | a [element] | +| array_flow.rb:1118:9:1118:9 | [post] a [element] | array_flow.rb:1121:10:1121:10 | a [element] | +| array_flow.rb:1118:9:1118:9 | [post] a [element] | array_flow.rb:1122:10:1122:10 | a [element] | +| array_flow.rb:1118:9:1118:9 | [post] a [element] | array_flow.rb:1122:10:1122:10 | a [element] | +| array_flow.rb:1118:9:1118:9 | a [element 0] | array_flow.rb:1118:9:1118:9 | [post] a [element] | +| array_flow.rb:1118:9:1118:9 | a [element 0] | array_flow.rb:1118:9:1118:9 | [post] a [element] | +| array_flow.rb:1118:9:1118:9 | a [element 0] | array_flow.rb:1118:9:1118:20 | call to rotate! [element] | +| array_flow.rb:1118:9:1118:9 | a [element 0] | array_flow.rb:1118:9:1118:20 | call to rotate! [element] | +| array_flow.rb:1118:9:1118:9 | a [element 2] | array_flow.rb:1118:9:1118:9 | [post] a [element] | +| array_flow.rb:1118:9:1118:9 | a [element 2] | array_flow.rb:1118:9:1118:9 | [post] a [element] | +| array_flow.rb:1118:9:1118:9 | a [element 2] | array_flow.rb:1118:9:1118:20 | call to rotate! [element] | +| array_flow.rb:1118:9:1118:9 | a [element 2] | array_flow.rb:1118:9:1118:20 | call to rotate! [element] | +| array_flow.rb:1118:9:1118:9 | a [element 3] | array_flow.rb:1118:9:1118:9 | [post] a [element] | +| array_flow.rb:1118:9:1118:9 | a [element 3] | array_flow.rb:1118:9:1118:9 | [post] a [element] | +| array_flow.rb:1118:9:1118:9 | a [element 3] | array_flow.rb:1118:9:1118:20 | call to rotate! [element] | +| array_flow.rb:1118:9:1118:9 | a [element 3] | array_flow.rb:1118:9:1118:20 | call to rotate! [element] | +| array_flow.rb:1118:9:1118:20 | call to rotate! [element] | array_flow.rb:1118:5:1118:5 | b [element] | +| array_flow.rb:1118:9:1118:20 | call to rotate! [element] | array_flow.rb:1118:5:1118:5 | b [element] | +| array_flow.rb:1119:10:1119:10 | a [element] | array_flow.rb:1119:10:1119:13 | ...[...] | +| array_flow.rb:1119:10:1119:10 | a [element] | array_flow.rb:1119:10:1119:13 | ...[...] | +| array_flow.rb:1120:10:1120:10 | a [element] | array_flow.rb:1120:10:1120:13 | ...[...] | +| array_flow.rb:1120:10:1120:10 | a [element] | array_flow.rb:1120:10:1120:13 | ...[...] | +| array_flow.rb:1121:10:1121:10 | a [element] | array_flow.rb:1121:10:1121:13 | ...[...] | +| array_flow.rb:1121:10:1121:10 | a [element] | array_flow.rb:1121:10:1121:13 | ...[...] | +| array_flow.rb:1122:10:1122:10 | a [element] | array_flow.rb:1122:10:1122:13 | ...[...] | +| array_flow.rb:1122:10:1122:10 | a [element] | array_flow.rb:1122:10:1122:13 | ...[...] | +| array_flow.rb:1123:10:1123:10 | b [element] | array_flow.rb:1123:10:1123:13 | ...[...] | +| array_flow.rb:1123:10:1123:10 | b [element] | array_flow.rb:1123:10:1123:13 | ...[...] | +| array_flow.rb:1124:10:1124:10 | b [element] | array_flow.rb:1124:10:1124:13 | ...[...] | +| array_flow.rb:1124:10:1124:10 | b [element] | array_flow.rb:1124:10:1124:13 | ...[...] | +| array_flow.rb:1125:10:1125:10 | b [element] | array_flow.rb:1125:10:1125:13 | ...[...] | +| array_flow.rb:1125:10:1125:10 | b [element] | array_flow.rb:1125:10:1125:13 | ...[...] | +| array_flow.rb:1126:10:1126:10 | b [element] | array_flow.rb:1126:10:1126:13 | ...[...] | +| array_flow.rb:1126:10:1126:10 | b [element] | array_flow.rb:1126:10:1126:13 | ...[...] | +| array_flow.rb:1130:5:1130:5 | a [element 3] | array_flow.rb:1131:9:1131:9 | a [element 3] | +| array_flow.rb:1130:5:1130:5 | a [element 3] | array_flow.rb:1131:9:1131:9 | a [element 3] | +| array_flow.rb:1130:19:1130:29 | call to source | array_flow.rb:1130:5:1130:5 | a [element 3] | +| array_flow.rb:1130:19:1130:29 | call to source | array_flow.rb:1130:5:1130:5 | a [element 3] | +| array_flow.rb:1131:5:1131:5 | b [element] | array_flow.rb:1134:10:1134:10 | b [element] | +| array_flow.rb:1131:5:1131:5 | b [element] | array_flow.rb:1134:10:1134:10 | b [element] | +| array_flow.rb:1131:9:1131:9 | a [element 3] | array_flow.rb:1131:9:1133:7 | call to select [element] | +| array_flow.rb:1131:9:1131:9 | a [element 3] | array_flow.rb:1131:9:1133:7 | call to select [element] | +| array_flow.rb:1131:9:1131:9 | a [element 3] | array_flow.rb:1131:22:1131:22 | x | +| array_flow.rb:1131:9:1131:9 | a [element 3] | array_flow.rb:1131:22:1131:22 | x | +| array_flow.rb:1131:9:1133:7 | call to select [element] | array_flow.rb:1131:5:1131:5 | b [element] | +| array_flow.rb:1131:9:1133:7 | call to select [element] | array_flow.rb:1131:5:1131:5 | b [element] | +| array_flow.rb:1131:22:1131:22 | x | array_flow.rb:1132:14:1132:14 | x | +| array_flow.rb:1131:22:1131:22 | x | array_flow.rb:1132:14:1132:14 | x | +| array_flow.rb:1134:10:1134:10 | b [element] | array_flow.rb:1134:10:1134:13 | ...[...] | +| array_flow.rb:1134:10:1134:10 | b [element] | array_flow.rb:1134:10:1134:13 | ...[...] | +| array_flow.rb:1138:5:1138:5 | a [element 2] | array_flow.rb:1139:9:1139:9 | a [element 2] | +| array_flow.rb:1138:5:1138:5 | a [element 2] | array_flow.rb:1139:9:1139:9 | a [element 2] | +| array_flow.rb:1138:16:1138:26 | call to source | array_flow.rb:1138:5:1138:5 | a [element 2] | +| array_flow.rb:1138:16:1138:26 | call to source | array_flow.rb:1138:5:1138:5 | a [element 2] | +| array_flow.rb:1139:5:1139:5 | b [element] | array_flow.rb:1144:10:1144:10 | b [element] | +| array_flow.rb:1139:5:1139:5 | b [element] | array_flow.rb:1144:10:1144:10 | b [element] | +| array_flow.rb:1139:9:1139:9 | [post] a [element] | array_flow.rb:1143:10:1143:10 | a [element] | +| array_flow.rb:1139:9:1139:9 | [post] a [element] | array_flow.rb:1143:10:1143:10 | a [element] | +| array_flow.rb:1139:9:1139:9 | a [element 2] | array_flow.rb:1139:9:1139:9 | [post] a [element] | +| array_flow.rb:1139:9:1139:9 | a [element 2] | array_flow.rb:1139:9:1139:9 | [post] a [element] | +| array_flow.rb:1139:9:1139:9 | a [element 2] | array_flow.rb:1139:9:1142:7 | call to select! [element] | +| array_flow.rb:1139:9:1139:9 | a [element 2] | array_flow.rb:1139:9:1142:7 | call to select! [element] | +| array_flow.rb:1139:9:1139:9 | a [element 2] | array_flow.rb:1139:23:1139:23 | x | +| array_flow.rb:1139:9:1139:9 | a [element 2] | array_flow.rb:1139:23:1139:23 | x | +| array_flow.rb:1139:9:1142:7 | call to select! [element] | array_flow.rb:1139:5:1139:5 | b [element] | +| array_flow.rb:1139:9:1142:7 | call to select! [element] | array_flow.rb:1139:5:1139:5 | b [element] | +| array_flow.rb:1139:23:1139:23 | x | array_flow.rb:1140:14:1140:14 | x | +| array_flow.rb:1139:23:1139:23 | x | array_flow.rb:1140:14:1140:14 | x | +| array_flow.rb:1143:10:1143:10 | a [element] | array_flow.rb:1143:10:1143:13 | ...[...] | +| array_flow.rb:1143:10:1143:10 | a [element] | array_flow.rb:1143:10:1143:13 | ...[...] | +| array_flow.rb:1144:10:1144:10 | b [element] | array_flow.rb:1144:10:1144:13 | ...[...] | +| array_flow.rb:1144:10:1144:10 | b [element] | array_flow.rb:1144:10:1144:13 | ...[...] | +| array_flow.rb:1148:5:1148:5 | a [element 0] | array_flow.rb:1149:9:1149:9 | a [element 0] | +| array_flow.rb:1148:5:1148:5 | a [element 0] | array_flow.rb:1149:9:1149:9 | a [element 0] | +| array_flow.rb:1148:5:1148:5 | a [element 2] | array_flow.rb:1149:9:1149:9 | a [element 2] | +| array_flow.rb:1148:5:1148:5 | a [element 2] | array_flow.rb:1149:9:1149:9 | a [element 2] | +| array_flow.rb:1148:10:1148:22 | call to source | array_flow.rb:1148:5:1148:5 | a [element 0] | +| array_flow.rb:1148:10:1148:22 | call to source | array_flow.rb:1148:5:1148:5 | a [element 0] | +| array_flow.rb:1148:28:1148:40 | call to source | array_flow.rb:1148:5:1148:5 | a [element 2] | +| array_flow.rb:1148:28:1148:40 | call to source | array_flow.rb:1148:5:1148:5 | a [element 2] | +| array_flow.rb:1149:5:1149:5 | b | array_flow.rb:1150:10:1150:10 | b | +| array_flow.rb:1149:5:1149:5 | b | array_flow.rb:1150:10:1150:10 | b | +| array_flow.rb:1149:9:1149:9 | [post] a [element 1] | array_flow.rb:1152:10:1152:10 | a [element 1] | +| array_flow.rb:1149:9:1149:9 | [post] a [element 1] | array_flow.rb:1152:10:1152:10 | a [element 1] | +| array_flow.rb:1149:9:1149:9 | a [element 0] | array_flow.rb:1149:9:1149:15 | call to shift | +| array_flow.rb:1149:9:1149:9 | a [element 0] | array_flow.rb:1149:9:1149:15 | call to shift | +| array_flow.rb:1149:9:1149:9 | a [element 2] | array_flow.rb:1149:9:1149:9 | [post] a [element 1] | +| array_flow.rb:1149:9:1149:9 | a [element 2] | array_flow.rb:1149:9:1149:9 | [post] a [element 1] | +| array_flow.rb:1149:9:1149:15 | call to shift | array_flow.rb:1149:5:1149:5 | b | +| array_flow.rb:1149:9:1149:15 | call to shift | array_flow.rb:1149:5:1149:5 | b | +| array_flow.rb:1152:10:1152:10 | a [element 1] | array_flow.rb:1152:10:1152:13 | ...[...] | +| array_flow.rb:1152:10:1152:10 | a [element 1] | array_flow.rb:1152:10:1152:13 | ...[...] | +| array_flow.rb:1155:5:1155:5 | a [element 0] | array_flow.rb:1156:9:1156:9 | a [element 0] | +| array_flow.rb:1155:5:1155:5 | a [element 0] | array_flow.rb:1156:9:1156:9 | a [element 0] | +| array_flow.rb:1155:5:1155:5 | a [element 2] | array_flow.rb:1156:9:1156:9 | a [element 2] | +| array_flow.rb:1155:5:1155:5 | a [element 2] | array_flow.rb:1156:9:1156:9 | a [element 2] | +| array_flow.rb:1155:10:1155:22 | call to source | array_flow.rb:1155:5:1155:5 | a [element 0] | +| array_flow.rb:1155:10:1155:22 | call to source | array_flow.rb:1155:5:1155:5 | a [element 0] | +| array_flow.rb:1155:28:1155:40 | call to source | array_flow.rb:1155:5:1155:5 | a [element 2] | +| array_flow.rb:1155:28:1155:40 | call to source | array_flow.rb:1155:5:1155:5 | a [element 2] | +| array_flow.rb:1156:5:1156:5 | b [element 0] | array_flow.rb:1157:10:1157:10 | b [element 0] | +| array_flow.rb:1156:5:1156:5 | b [element 0] | array_flow.rb:1157:10:1157:10 | b [element 0] | +| array_flow.rb:1156:9:1156:9 | [post] a [element 0] | array_flow.rb:1159:10:1159:10 | a [element 0] | +| array_flow.rb:1156:9:1156:9 | [post] a [element 0] | array_flow.rb:1159:10:1159:10 | a [element 0] | +| array_flow.rb:1156:9:1156:9 | a [element 0] | array_flow.rb:1156:9:1156:18 | call to shift [element 0] | +| array_flow.rb:1156:9:1156:9 | a [element 0] | array_flow.rb:1156:9:1156:18 | call to shift [element 0] | +| array_flow.rb:1156:9:1156:9 | a [element 2] | array_flow.rb:1156:9:1156:9 | [post] a [element 0] | +| array_flow.rb:1156:9:1156:9 | a [element 2] | array_flow.rb:1156:9:1156:9 | [post] a [element 0] | +| array_flow.rb:1156:9:1156:18 | call to shift [element 0] | array_flow.rb:1156:5:1156:5 | b [element 0] | +| array_flow.rb:1156:9:1156:18 | call to shift [element 0] | array_flow.rb:1156:5:1156:5 | b [element 0] | +| array_flow.rb:1157:10:1157:10 | b [element 0] | array_flow.rb:1157:10:1157:13 | ...[...] | +| array_flow.rb:1157:10:1157:10 | b [element 0] | array_flow.rb:1157:10:1157:13 | ...[...] | +| array_flow.rb:1159:10:1159:10 | a [element 0] | array_flow.rb:1159:10:1159:13 | ...[...] | +| array_flow.rb:1159:10:1159:10 | a [element 0] | array_flow.rb:1159:10:1159:13 | ...[...] | +| array_flow.rb:1163:5:1163:5 | a [element 0] | array_flow.rb:1164:9:1164:9 | a [element 0] | +| array_flow.rb:1163:5:1163:5 | a [element 0] | array_flow.rb:1164:9:1164:9 | a [element 0] | +| array_flow.rb:1163:5:1163:5 | a [element 0] | array_flow.rb:1167:10:1167:10 | a [element 0] | +| array_flow.rb:1163:5:1163:5 | a [element 0] | array_flow.rb:1167:10:1167:10 | a [element 0] | +| array_flow.rb:1163:5:1163:5 | a [element 2] | array_flow.rb:1164:9:1164:9 | a [element 2] | +| array_flow.rb:1163:5:1163:5 | a [element 2] | array_flow.rb:1164:9:1164:9 | a [element 2] | +| array_flow.rb:1163:5:1163:5 | a [element 2] | array_flow.rb:1169:10:1169:10 | a [element 2] | +| array_flow.rb:1163:5:1163:5 | a [element 2] | array_flow.rb:1169:10:1169:10 | a [element 2] | +| array_flow.rb:1163:10:1163:22 | call to source | array_flow.rb:1163:5:1163:5 | a [element 0] | +| array_flow.rb:1163:10:1163:22 | call to source | array_flow.rb:1163:5:1163:5 | a [element 0] | +| array_flow.rb:1163:28:1163:40 | call to source | array_flow.rb:1163:5:1163:5 | a [element 2] | +| array_flow.rb:1163:28:1163:40 | call to source | array_flow.rb:1163:5:1163:5 | a [element 2] | +| array_flow.rb:1164:5:1164:5 | b [element] | array_flow.rb:1165:10:1165:10 | b [element] | +| array_flow.rb:1164:5:1164:5 | b [element] | array_flow.rb:1165:10:1165:10 | b [element] | +| array_flow.rb:1164:5:1164:5 | b [element] | array_flow.rb:1166:10:1166:10 | b [element] | +| array_flow.rb:1164:5:1164:5 | b [element] | array_flow.rb:1166:10:1166:10 | b [element] | +| array_flow.rb:1164:9:1164:9 | [post] a [element] | array_flow.rb:1167:10:1167:10 | a [element] | +| array_flow.rb:1164:9:1164:9 | [post] a [element] | array_flow.rb:1167:10:1167:10 | a [element] | +| array_flow.rb:1164:9:1164:9 | [post] a [element] | array_flow.rb:1168:10:1168:10 | a [element] | +| array_flow.rb:1164:9:1164:9 | [post] a [element] | array_flow.rb:1168:10:1168:10 | a [element] | +| array_flow.rb:1164:9:1164:9 | [post] a [element] | array_flow.rb:1169:10:1169:10 | a [element] | +| array_flow.rb:1164:9:1164:9 | [post] a [element] | array_flow.rb:1169:10:1169:10 | a [element] | +| array_flow.rb:1164:9:1164:9 | a [element 0] | array_flow.rb:1164:9:1164:9 | [post] a [element] | +| array_flow.rb:1164:9:1164:9 | a [element 0] | array_flow.rb:1164:9:1164:9 | [post] a [element] | +| array_flow.rb:1164:9:1164:9 | a [element 0] | array_flow.rb:1164:9:1164:18 | call to shift [element] | +| array_flow.rb:1164:9:1164:9 | a [element 0] | array_flow.rb:1164:9:1164:18 | call to shift [element] | +| array_flow.rb:1164:9:1164:9 | a [element 2] | array_flow.rb:1164:9:1164:9 | [post] a [element] | +| array_flow.rb:1164:9:1164:9 | a [element 2] | array_flow.rb:1164:9:1164:9 | [post] a [element] | +| array_flow.rb:1164:9:1164:9 | a [element 2] | array_flow.rb:1164:9:1164:18 | call to shift [element] | +| array_flow.rb:1164:9:1164:9 | a [element 2] | array_flow.rb:1164:9:1164:18 | call to shift [element] | +| array_flow.rb:1164:9:1164:18 | call to shift [element] | array_flow.rb:1164:5:1164:5 | b [element] | +| array_flow.rb:1164:9:1164:18 | call to shift [element] | array_flow.rb:1164:5:1164:5 | b [element] | +| array_flow.rb:1165:10:1165:10 | b [element] | array_flow.rb:1165:10:1165:13 | ...[...] | +| array_flow.rb:1165:10:1165:10 | b [element] | array_flow.rb:1165:10:1165:13 | ...[...] | +| array_flow.rb:1166:10:1166:10 | b [element] | array_flow.rb:1166:10:1166:13 | ...[...] | +| array_flow.rb:1166:10:1166:10 | b [element] | array_flow.rb:1166:10:1166:13 | ...[...] | +| array_flow.rb:1167:10:1167:10 | a [element 0] | array_flow.rb:1167:10:1167:13 | ...[...] | +| array_flow.rb:1167:10:1167:10 | a [element 0] | array_flow.rb:1167:10:1167:13 | ...[...] | +| array_flow.rb:1167:10:1167:10 | a [element] | array_flow.rb:1167:10:1167:13 | ...[...] | +| array_flow.rb:1167:10:1167:10 | a [element] | array_flow.rb:1167:10:1167:13 | ...[...] | +| array_flow.rb:1168:10:1168:10 | a [element] | array_flow.rb:1168:10:1168:13 | ...[...] | +| array_flow.rb:1168:10:1168:10 | a [element] | array_flow.rb:1168:10:1168:13 | ...[...] | +| array_flow.rb:1169:10:1169:10 | a [element 2] | array_flow.rb:1169:10:1169:13 | ...[...] | +| array_flow.rb:1169:10:1169:10 | a [element 2] | array_flow.rb:1169:10:1169:13 | ...[...] | +| array_flow.rb:1169:10:1169:10 | a [element] | array_flow.rb:1169:10:1169:13 | ...[...] | +| array_flow.rb:1169:10:1169:10 | a [element] | array_flow.rb:1169:10:1169:13 | ...[...] | +| array_flow.rb:1173:5:1173:5 | a [element 2] | array_flow.rb:1174:9:1174:9 | a [element 2] | +| array_flow.rb:1173:5:1173:5 | a [element 2] | array_flow.rb:1174:9:1174:9 | a [element 2] | +| array_flow.rb:1173:5:1173:5 | a [element 2] | array_flow.rb:1177:10:1177:10 | a [element 2] | +| array_flow.rb:1173:5:1173:5 | a [element 2] | array_flow.rb:1177:10:1177:10 | a [element 2] | +| array_flow.rb:1173:16:1173:26 | call to source | array_flow.rb:1173:5:1173:5 | a [element 2] | +| array_flow.rb:1173:16:1173:26 | call to source | array_flow.rb:1173:5:1173:5 | a [element 2] | +| array_flow.rb:1174:5:1174:5 | b [element] | array_flow.rb:1178:10:1178:10 | b [element] | +| array_flow.rb:1174:5:1174:5 | b [element] | array_flow.rb:1178:10:1178:10 | b [element] | +| array_flow.rb:1174:5:1174:5 | b [element] | array_flow.rb:1179:10:1179:10 | b [element] | +| array_flow.rb:1174:5:1174:5 | b [element] | array_flow.rb:1179:10:1179:10 | b [element] | +| array_flow.rb:1174:5:1174:5 | b [element] | array_flow.rb:1180:10:1180:10 | b [element] | +| array_flow.rb:1174:5:1174:5 | b [element] | array_flow.rb:1180:10:1180:10 | b [element] | +| array_flow.rb:1174:9:1174:9 | a [element 2] | array_flow.rb:1174:9:1174:17 | call to shuffle [element] | +| array_flow.rb:1174:9:1174:9 | a [element 2] | array_flow.rb:1174:9:1174:17 | call to shuffle [element] | +| array_flow.rb:1174:9:1174:17 | call to shuffle [element] | array_flow.rb:1174:5:1174:5 | b [element] | +| array_flow.rb:1174:9:1174:17 | call to shuffle [element] | array_flow.rb:1174:5:1174:5 | b [element] | +| array_flow.rb:1177:10:1177:10 | a [element 2] | array_flow.rb:1177:10:1177:13 | ...[...] | +| array_flow.rb:1177:10:1177:10 | a [element 2] | array_flow.rb:1177:10:1177:13 | ...[...] | +| array_flow.rb:1178:10:1178:10 | b [element] | array_flow.rb:1178:10:1178:13 | ...[...] | +| array_flow.rb:1178:10:1178:10 | b [element] | array_flow.rb:1178:10:1178:13 | ...[...] | +| array_flow.rb:1179:10:1179:10 | b [element] | array_flow.rb:1179:10:1179:13 | ...[...] | +| array_flow.rb:1179:10:1179:10 | b [element] | array_flow.rb:1179:10:1179:13 | ...[...] | +| array_flow.rb:1180:10:1180:10 | b [element] | array_flow.rb:1180:10:1180:13 | ...[...] | +| array_flow.rb:1180:10:1180:10 | b [element] | array_flow.rb:1180:10:1180:13 | ...[...] | +| array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1185:9:1185:9 | a [element 2] | +| array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1185:9:1185:9 | a [element 2] | +| array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1188:10:1188:10 | a [element 2] | +| array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1188:10:1188:10 | a [element 2] | +| array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1184:5:1184:5 | a [element 2] | +| array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1184:5:1184:5 | a [element 2] | +| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1189:10:1189:10 | b [element] | +| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1189:10:1189:10 | b [element] | +| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1190:10:1190:10 | b [element] | +| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1190:10:1190:10 | b [element] | +| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1191:10:1191:10 | b [element] | +| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1191:10:1191:10 | b [element] | +| array_flow.rb:1185:9:1185:9 | [post] a [element] | array_flow.rb:1186:10:1186:10 | a [element] | +| array_flow.rb:1185:9:1185:9 | [post] a [element] | array_flow.rb:1186:10:1186:10 | a [element] | +| array_flow.rb:1185:9:1185:9 | [post] a [element] | array_flow.rb:1187:10:1187:10 | a [element] | +| array_flow.rb:1185:9:1185:9 | [post] a [element] | array_flow.rb:1187:10:1187:10 | a [element] | +| array_flow.rb:1185:9:1185:9 | [post] a [element] | array_flow.rb:1188:10:1188:10 | a [element] | +| array_flow.rb:1185:9:1185:9 | [post] a [element] | array_flow.rb:1188:10:1188:10 | a [element] | +| array_flow.rb:1185:9:1185:9 | a [element 2] | array_flow.rb:1185:9:1185:9 | [post] a [element] | +| array_flow.rb:1185:9:1185:9 | a [element 2] | array_flow.rb:1185:9:1185:9 | [post] a [element] | +| array_flow.rb:1185:9:1185:9 | a [element 2] | array_flow.rb:1185:9:1185:18 | call to shuffle! [element] | +| array_flow.rb:1185:9:1185:9 | a [element 2] | array_flow.rb:1185:9:1185:18 | call to shuffle! [element] | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] | array_flow.rb:1185:5:1185:5 | b [element] | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] | array_flow.rb:1185:5:1185:5 | b [element] | +| array_flow.rb:1186:10:1186:10 | a [element] | array_flow.rb:1186:10:1186:13 | ...[...] | +| array_flow.rb:1186:10:1186:10 | a [element] | array_flow.rb:1186:10:1186:13 | ...[...] | +| array_flow.rb:1187:10:1187:10 | a [element] | array_flow.rb:1187:10:1187:13 | ...[...] | +| array_flow.rb:1187:10:1187:10 | a [element] | array_flow.rb:1187:10:1187:13 | ...[...] | +| array_flow.rb:1188:10:1188:10 | a [element 2] | array_flow.rb:1188:10:1188:13 | ...[...] | +| array_flow.rb:1188:10:1188:10 | a [element 2] | array_flow.rb:1188:10:1188:13 | ...[...] | +| array_flow.rb:1188:10:1188:10 | a [element] | array_flow.rb:1188:10:1188:13 | ...[...] | +| array_flow.rb:1188:10:1188:10 | a [element] | array_flow.rb:1188:10:1188:13 | ...[...] | +| array_flow.rb:1189:10:1189:10 | b [element] | array_flow.rb:1189:10:1189:13 | ...[...] | +| array_flow.rb:1189:10:1189:10 | b [element] | array_flow.rb:1189:10:1189:13 | ...[...] | +| array_flow.rb:1190:10:1190:10 | b [element] | array_flow.rb:1190:10:1190:13 | ...[...] | +| array_flow.rb:1190:10:1190:10 | b [element] | array_flow.rb:1190:10:1190:13 | ...[...] | +| array_flow.rb:1191:10:1191:10 | b [element] | array_flow.rb:1191:10:1191:13 | ...[...] | +| array_flow.rb:1191:10:1191:10 | b [element] | array_flow.rb:1191:10:1191:13 | ...[...] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1200:9:1200:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1200:9:1200:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1203:9:1203:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1203:9:1203:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1209:9:1209:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1209:9:1209:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1214:9:1214:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1214:9:1214:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1218:9:1218:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1218:9:1218:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1223:9:1223:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1223:9:1223:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1228:9:1228:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1228:9:1228:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1232:9:1232:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1232:9:1232:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1236:9:1236:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1236:9:1236:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1241:9:1241:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1241:9:1241:9 | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1197:9:1197:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1197:9:1197:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1200:9:1200:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1200:9:1200:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1203:9:1203:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1203:9:1203:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1209:9:1209:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1209:9:1209:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1214:9:1214:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1214:9:1214:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1228:9:1228:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1228:9:1228:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1232:9:1232:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1232:9:1232:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1241:9:1241:9 | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | array_flow.rb:1241:9:1241:9 | a [element 4] | +| array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1195:5:1195:5 | a [element 2] | +| array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1195:5:1195:5 | a [element 2] | +| array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1195:5:1195:5 | a [element 4] | +| array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1195:5:1195:5 | a [element 4] | +| array_flow.rb:1197:5:1197:5 | b | array_flow.rb:1198:10:1198:10 | b | +| array_flow.rb:1197:5:1197:5 | b | array_flow.rb:1198:10:1198:10 | b | +| array_flow.rb:1197:9:1197:9 | a [element 4] | array_flow.rb:1197:9:1197:17 | call to slice | +| array_flow.rb:1197:9:1197:9 | a [element 4] | array_flow.rb:1197:9:1197:17 | call to slice | +| array_flow.rb:1197:9:1197:17 | call to slice | array_flow.rb:1197:5:1197:5 | b | +| array_flow.rb:1197:9:1197:17 | call to slice | array_flow.rb:1197:5:1197:5 | b | +| array_flow.rb:1200:5:1200:5 | b | array_flow.rb:1201:10:1201:10 | b | +| array_flow.rb:1200:5:1200:5 | b | array_flow.rb:1201:10:1201:10 | b | +| array_flow.rb:1200:9:1200:9 | a [element 2] | array_flow.rb:1200:9:1200:19 | call to slice | +| array_flow.rb:1200:9:1200:9 | a [element 2] | array_flow.rb:1200:9:1200:19 | call to slice | +| array_flow.rb:1200:9:1200:9 | a [element 4] | array_flow.rb:1200:9:1200:19 | call to slice | +| array_flow.rb:1200:9:1200:9 | a [element 4] | array_flow.rb:1200:9:1200:19 | call to slice | +| array_flow.rb:1200:9:1200:19 | call to slice | array_flow.rb:1200:5:1200:5 | b | +| array_flow.rb:1200:9:1200:19 | call to slice | array_flow.rb:1200:5:1200:5 | b | +| array_flow.rb:1203:5:1203:5 | b | array_flow.rb:1205:10:1205:10 | b | +| array_flow.rb:1203:5:1203:5 | b | array_flow.rb:1205:10:1205:10 | b | +| array_flow.rb:1203:5:1203:5 | b | array_flow.rb:1207:10:1207:10 | b | +| array_flow.rb:1203:5:1203:5 | b [element] | array_flow.rb:1207:10:1207:10 | b [element] | +| array_flow.rb:1203:5:1203:5 | b [element] | array_flow.rb:1207:10:1207:10 | b [element] | +| array_flow.rb:1203:9:1203:9 | a [element 2] | array_flow.rb:1203:9:1203:17 | call to slice | +| array_flow.rb:1203:9:1203:9 | a [element 2] | array_flow.rb:1203:9:1203:17 | call to slice | +| array_flow.rb:1203:9:1203:9 | a [element 2] | array_flow.rb:1203:9:1203:17 | call to slice [element] | +| array_flow.rb:1203:9:1203:9 | a [element 2] | array_flow.rb:1203:9:1203:17 | call to slice [element] | +| array_flow.rb:1203:9:1203:9 | a [element 4] | array_flow.rb:1203:9:1203:17 | call to slice | +| array_flow.rb:1203:9:1203:9 | a [element 4] | array_flow.rb:1203:9:1203:17 | call to slice | +| array_flow.rb:1203:9:1203:9 | a [element 4] | array_flow.rb:1203:9:1203:17 | call to slice [element] | +| array_flow.rb:1203:9:1203:9 | a [element 4] | array_flow.rb:1203:9:1203:17 | call to slice [element] | +| array_flow.rb:1203:9:1203:17 | call to slice | array_flow.rb:1203:5:1203:5 | b | +| array_flow.rb:1203:9:1203:17 | call to slice | array_flow.rb:1203:5:1203:5 | b | +| array_flow.rb:1203:9:1203:17 | call to slice [element] | array_flow.rb:1203:5:1203:5 | b [element] | +| array_flow.rb:1203:9:1203:17 | call to slice [element] | array_flow.rb:1203:5:1203:5 | b [element] | +| array_flow.rb:1207:10:1207:10 | b | array_flow.rb:1207:10:1207:13 | ...[...] | +| array_flow.rb:1207:10:1207:10 | b [element] | array_flow.rb:1207:10:1207:13 | ...[...] | +| array_flow.rb:1207:10:1207:10 | b [element] | array_flow.rb:1207:10:1207:13 | ...[...] | +| array_flow.rb:1209:5:1209:5 | b [element 0] | array_flow.rb:1210:10:1210:10 | b [element 0] | +| array_flow.rb:1209:5:1209:5 | b [element 0] | array_flow.rb:1210:10:1210:10 | b [element 0] | +| array_flow.rb:1209:5:1209:5 | b [element 2] | array_flow.rb:1212:10:1212:10 | b [element 2] | +| array_flow.rb:1209:5:1209:5 | b [element 2] | array_flow.rb:1212:10:1212:10 | b [element 2] | +| array_flow.rb:1209:9:1209:9 | a [element 2] | array_flow.rb:1209:9:1209:21 | call to slice [element 0] | +| array_flow.rb:1209:9:1209:9 | a [element 2] | array_flow.rb:1209:9:1209:21 | call to slice [element 0] | +| array_flow.rb:1209:9:1209:9 | a [element 4] | array_flow.rb:1209:9:1209:21 | call to slice [element 2] | +| array_flow.rb:1209:9:1209:9 | a [element 4] | array_flow.rb:1209:9:1209:21 | call to slice [element 2] | +| array_flow.rb:1209:9:1209:21 | call to slice [element 0] | array_flow.rb:1209:5:1209:5 | b [element 0] | +| array_flow.rb:1209:9:1209:21 | call to slice [element 0] | array_flow.rb:1209:5:1209:5 | b [element 0] | +| array_flow.rb:1209:9:1209:21 | call to slice [element 2] | array_flow.rb:1209:5:1209:5 | b [element 2] | +| array_flow.rb:1209:9:1209:21 | call to slice [element 2] | array_flow.rb:1209:5:1209:5 | b [element 2] | +| array_flow.rb:1210:10:1210:10 | b [element 0] | array_flow.rb:1210:10:1210:13 | ...[...] | +| array_flow.rb:1210:10:1210:10 | b [element 0] | array_flow.rb:1210:10:1210:13 | ...[...] | +| array_flow.rb:1212:10:1212:10 | b [element 2] | array_flow.rb:1212:10:1212:13 | ...[...] | +| array_flow.rb:1212:10:1212:10 | b [element 2] | array_flow.rb:1212:10:1212:13 | ...[...] | +| array_flow.rb:1214:5:1214:5 | b [element] | array_flow.rb:1215:10:1215:10 | b [element] | +| array_flow.rb:1214:5:1214:5 | b [element] | array_flow.rb:1215:10:1215:10 | b [element] | +| array_flow.rb:1214:5:1214:5 | b [element] | array_flow.rb:1216:10:1216:10 | b [element] | +| array_flow.rb:1214:5:1214:5 | b [element] | array_flow.rb:1216:10:1216:10 | b [element] | +| array_flow.rb:1214:9:1214:9 | a [element 2] | array_flow.rb:1214:9:1214:21 | call to slice [element] | +| array_flow.rb:1214:9:1214:9 | a [element 2] | array_flow.rb:1214:9:1214:21 | call to slice [element] | +| array_flow.rb:1214:9:1214:9 | a [element 4] | array_flow.rb:1214:9:1214:21 | call to slice [element] | +| array_flow.rb:1214:9:1214:9 | a [element 4] | array_flow.rb:1214:9:1214:21 | call to slice [element] | +| array_flow.rb:1214:9:1214:21 | call to slice [element] | array_flow.rb:1214:5:1214:5 | b [element] | +| array_flow.rb:1214:9:1214:21 | call to slice [element] | array_flow.rb:1214:5:1214:5 | b [element] | +| array_flow.rb:1215:10:1215:10 | b [element] | array_flow.rb:1215:10:1215:13 | ...[...] | +| array_flow.rb:1215:10:1215:10 | b [element] | array_flow.rb:1215:10:1215:13 | ...[...] | +| array_flow.rb:1216:10:1216:10 | b [element] | array_flow.rb:1216:10:1216:13 | ...[...] | +| array_flow.rb:1216:10:1216:10 | b [element] | array_flow.rb:1216:10:1216:13 | ...[...] | +| array_flow.rb:1218:5:1218:5 | b [element 0] | array_flow.rb:1219:10:1219:10 | b [element 0] | +| array_flow.rb:1218:5:1218:5 | b [element 0] | array_flow.rb:1219:10:1219:10 | b [element 0] | +| array_flow.rb:1218:9:1218:9 | a [element 2] | array_flow.rb:1218:9:1218:21 | call to slice [element 0] | +| array_flow.rb:1218:9:1218:9 | a [element 2] | array_flow.rb:1218:9:1218:21 | call to slice [element 0] | +| array_flow.rb:1218:9:1218:21 | call to slice [element 0] | array_flow.rb:1218:5:1218:5 | b [element 0] | +| array_flow.rb:1218:9:1218:21 | call to slice [element 0] | array_flow.rb:1218:5:1218:5 | b [element 0] | +| array_flow.rb:1219:10:1219:10 | b [element 0] | array_flow.rb:1219:10:1219:13 | ...[...] | +| array_flow.rb:1219:10:1219:10 | b [element 0] | array_flow.rb:1219:10:1219:13 | ...[...] | +| array_flow.rb:1223:5:1223:5 | b [element 0] | array_flow.rb:1224:10:1224:10 | b [element 0] | +| array_flow.rb:1223:5:1223:5 | b [element 0] | array_flow.rb:1224:10:1224:10 | b [element 0] | +| array_flow.rb:1223:9:1223:9 | a [element 2] | array_flow.rb:1223:9:1223:22 | call to slice [element 0] | +| array_flow.rb:1223:9:1223:9 | a [element 2] | array_flow.rb:1223:9:1223:22 | call to slice [element 0] | +| array_flow.rb:1223:9:1223:22 | call to slice [element 0] | array_flow.rb:1223:5:1223:5 | b [element 0] | +| array_flow.rb:1223:9:1223:22 | call to slice [element 0] | array_flow.rb:1223:5:1223:5 | b [element 0] | +| array_flow.rb:1224:10:1224:10 | b [element 0] | array_flow.rb:1224:10:1224:13 | ...[...] | +| array_flow.rb:1224:10:1224:10 | b [element 0] | array_flow.rb:1224:10:1224:13 | ...[...] | +| array_flow.rb:1228:5:1228:5 | b [element] | array_flow.rb:1229:10:1229:10 | b [element] | +| array_flow.rb:1228:5:1228:5 | b [element] | array_flow.rb:1229:10:1229:10 | b [element] | +| array_flow.rb:1228:5:1228:5 | b [element] | array_flow.rb:1230:10:1230:10 | b [element] | +| array_flow.rb:1228:5:1228:5 | b [element] | array_flow.rb:1230:10:1230:10 | b [element] | +| array_flow.rb:1228:9:1228:9 | a [element 2] | array_flow.rb:1228:9:1228:21 | call to slice [element] | +| array_flow.rb:1228:9:1228:9 | a [element 2] | array_flow.rb:1228:9:1228:21 | call to slice [element] | +| array_flow.rb:1228:9:1228:9 | a [element 4] | array_flow.rb:1228:9:1228:21 | call to slice [element] | +| array_flow.rb:1228:9:1228:9 | a [element 4] | array_flow.rb:1228:9:1228:21 | call to slice [element] | +| array_flow.rb:1228:9:1228:21 | call to slice [element] | array_flow.rb:1228:5:1228:5 | b [element] | +| array_flow.rb:1228:9:1228:21 | call to slice [element] | array_flow.rb:1228:5:1228:5 | b [element] | +| array_flow.rb:1229:10:1229:10 | b [element] | array_flow.rb:1229:10:1229:13 | ...[...] | +| array_flow.rb:1229:10:1229:10 | b [element] | array_flow.rb:1229:10:1229:13 | ...[...] | +| array_flow.rb:1230:10:1230:10 | b [element] | array_flow.rb:1230:10:1230:13 | ...[...] | +| array_flow.rb:1230:10:1230:10 | b [element] | array_flow.rb:1230:10:1230:13 | ...[...] | +| array_flow.rb:1232:5:1232:5 | b [element] | array_flow.rb:1233:10:1233:10 | b [element] | +| array_flow.rb:1232:5:1232:5 | b [element] | array_flow.rb:1233:10:1233:10 | b [element] | +| array_flow.rb:1232:5:1232:5 | b [element] | array_flow.rb:1234:10:1234:10 | b [element] | +| array_flow.rb:1232:5:1232:5 | b [element] | array_flow.rb:1234:10:1234:10 | b [element] | +| array_flow.rb:1232:9:1232:9 | a [element 2] | array_flow.rb:1232:9:1232:24 | call to slice [element] | +| array_flow.rb:1232:9:1232:9 | a [element 2] | array_flow.rb:1232:9:1232:24 | call to slice [element] | +| array_flow.rb:1232:9:1232:9 | a [element 4] | array_flow.rb:1232:9:1232:24 | call to slice [element] | +| array_flow.rb:1232:9:1232:9 | a [element 4] | array_flow.rb:1232:9:1232:24 | call to slice [element] | +| array_flow.rb:1232:9:1232:24 | call to slice [element] | array_flow.rb:1232:5:1232:5 | b [element] | +| array_flow.rb:1232:9:1232:24 | call to slice [element] | array_flow.rb:1232:5:1232:5 | b [element] | +| array_flow.rb:1233:10:1233:10 | b [element] | array_flow.rb:1233:10:1233:13 | ...[...] | +| array_flow.rb:1233:10:1233:10 | b [element] | array_flow.rb:1233:10:1233:13 | ...[...] | +| array_flow.rb:1234:10:1234:10 | b [element] | array_flow.rb:1234:10:1234:13 | ...[...] | +| array_flow.rb:1234:10:1234:10 | b [element] | array_flow.rb:1234:10:1234:13 | ...[...] | +| array_flow.rb:1236:5:1236:5 | b [element 2] | array_flow.rb:1239:10:1239:10 | b [element 2] | +| array_flow.rb:1236:5:1236:5 | b [element 2] | array_flow.rb:1239:10:1239:10 | b [element 2] | +| array_flow.rb:1236:9:1236:9 | a [element 2] | array_flow.rb:1236:9:1236:20 | call to slice [element 2] | +| array_flow.rb:1236:9:1236:9 | a [element 2] | array_flow.rb:1236:9:1236:20 | call to slice [element 2] | +| array_flow.rb:1236:9:1236:20 | call to slice [element 2] | array_flow.rb:1236:5:1236:5 | b [element 2] | +| array_flow.rb:1236:9:1236:20 | call to slice [element 2] | array_flow.rb:1236:5:1236:5 | b [element 2] | +| array_flow.rb:1239:10:1239:10 | b [element 2] | array_flow.rb:1239:10:1239:13 | ...[...] | +| array_flow.rb:1239:10:1239:10 | b [element 2] | array_flow.rb:1239:10:1239:13 | ...[...] | +| array_flow.rb:1241:5:1241:5 | b [element] | array_flow.rb:1242:10:1242:10 | b [element] | +| array_flow.rb:1241:5:1241:5 | b [element] | array_flow.rb:1242:10:1242:10 | b [element] | +| array_flow.rb:1241:5:1241:5 | b [element] | array_flow.rb:1243:10:1243:10 | b [element] | +| array_flow.rb:1241:5:1241:5 | b [element] | array_flow.rb:1243:10:1243:10 | b [element] | +| array_flow.rb:1241:5:1241:5 | b [element] | array_flow.rb:1244:10:1244:10 | b [element] | +| array_flow.rb:1241:5:1241:5 | b [element] | array_flow.rb:1244:10:1244:10 | b [element] | +| array_flow.rb:1241:9:1241:9 | a [element 2] | array_flow.rb:1241:9:1241:20 | call to slice [element] | +| array_flow.rb:1241:9:1241:9 | a [element 2] | array_flow.rb:1241:9:1241:20 | call to slice [element] | +| array_flow.rb:1241:9:1241:9 | a [element 4] | array_flow.rb:1241:9:1241:20 | call to slice [element] | +| array_flow.rb:1241:9:1241:9 | a [element 4] | array_flow.rb:1241:9:1241:20 | call to slice [element] | +| array_flow.rb:1241:9:1241:20 | call to slice [element] | array_flow.rb:1241:5:1241:5 | b [element] | +| array_flow.rb:1241:9:1241:20 | call to slice [element] | array_flow.rb:1241:5:1241:5 | b [element] | +| array_flow.rb:1242:10:1242:10 | b [element] | array_flow.rb:1242:10:1242:13 | ...[...] | +| array_flow.rb:1242:10:1242:10 | b [element] | array_flow.rb:1242:10:1242:13 | ...[...] | +| array_flow.rb:1243:10:1243:10 | b [element] | array_flow.rb:1243:10:1243:13 | ...[...] | +| array_flow.rb:1243:10:1243:10 | b [element] | array_flow.rb:1243:10:1243:13 | ...[...] | +| array_flow.rb:1244:10:1244:10 | b [element] | array_flow.rb:1244:10:1244:13 | ...[...] | +| array_flow.rb:1244:10:1244:10 | b [element] | array_flow.rb:1244:10:1244:13 | ...[...] | +| array_flow.rb:1248:5:1248:5 | a [element 2] | array_flow.rb:1249:9:1249:9 | a [element 2] | +| array_flow.rb:1248:5:1248:5 | a [element 2] | array_flow.rb:1249:9:1249:9 | a [element 2] | +| array_flow.rb:1248:5:1248:5 | a [element 4] | array_flow.rb:1249:9:1249:9 | a [element 4] | +| array_flow.rb:1248:5:1248:5 | a [element 4] | array_flow.rb:1249:9:1249:9 | a [element 4] | +| array_flow.rb:1248:16:1248:28 | call to source | array_flow.rb:1248:5:1248:5 | a [element 2] | +| array_flow.rb:1248:16:1248:28 | call to source | array_flow.rb:1248:5:1248:5 | a [element 2] | +| array_flow.rb:1248:34:1248:46 | call to source | array_flow.rb:1248:5:1248:5 | a [element 4] | +| array_flow.rb:1248:34:1248:46 | call to source | array_flow.rb:1248:5:1248:5 | a [element 4] | +| array_flow.rb:1249:5:1249:5 | b | array_flow.rb:1250:10:1250:10 | b | +| array_flow.rb:1249:5:1249:5 | b | array_flow.rb:1250:10:1250:10 | b | +| array_flow.rb:1249:9:1249:9 | [post] a [element 3] | array_flow.rb:1254:10:1254:10 | a [element 3] | +| array_flow.rb:1249:9:1249:9 | [post] a [element 3] | array_flow.rb:1254:10:1254:10 | a [element 3] | +| array_flow.rb:1249:9:1249:9 | a [element 2] | array_flow.rb:1249:9:1249:19 | call to slice! | +| array_flow.rb:1249:9:1249:9 | a [element 2] | array_flow.rb:1249:9:1249:19 | call to slice! | +| array_flow.rb:1249:9:1249:9 | a [element 4] | array_flow.rb:1249:9:1249:9 | [post] a [element 3] | +| array_flow.rb:1249:9:1249:9 | a [element 4] | array_flow.rb:1249:9:1249:9 | [post] a [element 3] | +| array_flow.rb:1249:9:1249:19 | call to slice! | array_flow.rb:1249:5:1249:5 | b | +| array_flow.rb:1249:9:1249:19 | call to slice! | array_flow.rb:1249:5:1249:5 | b | +| array_flow.rb:1254:10:1254:10 | a [element 3] | array_flow.rb:1254:10:1254:13 | ...[...] | +| array_flow.rb:1254:10:1254:10 | a [element 3] | array_flow.rb:1254:10:1254:13 | ...[...] | +| array_flow.rb:1256:5:1256:5 | a [element 2] | array_flow.rb:1257:9:1257:9 | a [element 2] | +| array_flow.rb:1256:5:1256:5 | a [element 2] | array_flow.rb:1257:9:1257:9 | a [element 2] | +| array_flow.rb:1256:5:1256:5 | a [element 4] | array_flow.rb:1257:9:1257:9 | a [element 4] | +| array_flow.rb:1256:5:1256:5 | a [element 4] | array_flow.rb:1257:9:1257:9 | a [element 4] | +| array_flow.rb:1256:16:1256:28 | call to source | array_flow.rb:1256:5:1256:5 | a [element 2] | +| array_flow.rb:1256:16:1256:28 | call to source | array_flow.rb:1256:5:1256:5 | a [element 2] | +| array_flow.rb:1256:34:1256:46 | call to source | array_flow.rb:1256:5:1256:5 | a [element 4] | +| array_flow.rb:1256:34:1256:46 | call to source | array_flow.rb:1256:5:1256:5 | a [element 4] | +| array_flow.rb:1257:5:1257:5 | b | array_flow.rb:1263:10:1263:10 | b | +| array_flow.rb:1257:5:1257:5 | b | array_flow.rb:1263:10:1263:10 | b | +| array_flow.rb:1257:5:1257:5 | b | array_flow.rb:1265:10:1265:10 | b | +| array_flow.rb:1257:5:1257:5 | b [element] | array_flow.rb:1265:10:1265:10 | b [element] | +| array_flow.rb:1257:5:1257:5 | b [element] | array_flow.rb:1265:10:1265:10 | b [element] | +| array_flow.rb:1257:9:1257:9 | [post] a [element] | array_flow.rb:1258:10:1258:10 | a [element] | +| array_flow.rb:1257:9:1257:9 | [post] a [element] | array_flow.rb:1258:10:1258:10 | a [element] | +| array_flow.rb:1257:9:1257:9 | [post] a [element] | array_flow.rb:1259:10:1259:10 | a [element] | +| array_flow.rb:1257:9:1257:9 | [post] a [element] | array_flow.rb:1259:10:1259:10 | a [element] | +| array_flow.rb:1257:9:1257:9 | [post] a [element] | array_flow.rb:1260:10:1260:10 | a [element] | +| array_flow.rb:1257:9:1257:9 | [post] a [element] | array_flow.rb:1260:10:1260:10 | a [element] | +| array_flow.rb:1257:9:1257:9 | [post] a [element] | array_flow.rb:1261:10:1261:10 | a [element] | +| array_flow.rb:1257:9:1257:9 | [post] a [element] | array_flow.rb:1261:10:1261:10 | a [element] | +| array_flow.rb:1257:9:1257:9 | a [element 2] | array_flow.rb:1257:9:1257:9 | [post] a [element] | +| array_flow.rb:1257:9:1257:9 | a [element 2] | array_flow.rb:1257:9:1257:9 | [post] a [element] | +| array_flow.rb:1257:9:1257:9 | a [element 2] | array_flow.rb:1257:9:1257:19 | call to slice! | +| array_flow.rb:1257:9:1257:9 | a [element 2] | array_flow.rb:1257:9:1257:19 | call to slice! | +| array_flow.rb:1257:9:1257:9 | a [element 2] | array_flow.rb:1257:9:1257:19 | call to slice! [element] | +| array_flow.rb:1257:9:1257:9 | a [element 2] | array_flow.rb:1257:9:1257:19 | call to slice! [element] | +| array_flow.rb:1257:9:1257:9 | a [element 4] | array_flow.rb:1257:9:1257:9 | [post] a [element] | +| array_flow.rb:1257:9:1257:9 | a [element 4] | array_flow.rb:1257:9:1257:9 | [post] a [element] | +| array_flow.rb:1257:9:1257:9 | a [element 4] | array_flow.rb:1257:9:1257:19 | call to slice! | +| array_flow.rb:1257:9:1257:9 | a [element 4] | array_flow.rb:1257:9:1257:19 | call to slice! | +| array_flow.rb:1257:9:1257:9 | a [element 4] | array_flow.rb:1257:9:1257:19 | call to slice! [element] | +| array_flow.rb:1257:9:1257:9 | a [element 4] | array_flow.rb:1257:9:1257:19 | call to slice! [element] | +| array_flow.rb:1257:9:1257:19 | call to slice! | array_flow.rb:1257:5:1257:5 | b | +| array_flow.rb:1257:9:1257:19 | call to slice! | array_flow.rb:1257:5:1257:5 | b | +| array_flow.rb:1257:9:1257:19 | call to slice! [element] | array_flow.rb:1257:5:1257:5 | b [element] | +| array_flow.rb:1257:9:1257:19 | call to slice! [element] | array_flow.rb:1257:5:1257:5 | b [element] | +| array_flow.rb:1258:10:1258:10 | a [element] | array_flow.rb:1258:10:1258:13 | ...[...] | +| array_flow.rb:1258:10:1258:10 | a [element] | array_flow.rb:1258:10:1258:13 | ...[...] | +| array_flow.rb:1259:10:1259:10 | a [element] | array_flow.rb:1259:10:1259:13 | ...[...] | +| array_flow.rb:1259:10:1259:10 | a [element] | array_flow.rb:1259:10:1259:13 | ...[...] | +| array_flow.rb:1260:10:1260:10 | a [element] | array_flow.rb:1260:10:1260:13 | ...[...] | +| array_flow.rb:1260:10:1260:10 | a [element] | array_flow.rb:1260:10:1260:13 | ...[...] | +| array_flow.rb:1261:10:1261:10 | a [element] | array_flow.rb:1261:10:1261:13 | ...[...] | +| array_flow.rb:1261:10:1261:10 | a [element] | array_flow.rb:1261:10:1261:13 | ...[...] | +| array_flow.rb:1265:10:1265:10 | b | array_flow.rb:1265:10:1265:13 | ...[...] | +| array_flow.rb:1265:10:1265:10 | b [element] | array_flow.rb:1265:10:1265:13 | ...[...] | +| array_flow.rb:1265:10:1265:10 | b [element] | array_flow.rb:1265:10:1265:13 | ...[...] | +| array_flow.rb:1267:5:1267:5 | a [element 2] | array_flow.rb:1268:9:1268:9 | a [element 2] | +| array_flow.rb:1267:5:1267:5 | a [element 2] | array_flow.rb:1268:9:1268:9 | a [element 2] | +| array_flow.rb:1267:5:1267:5 | a [element 4] | array_flow.rb:1268:9:1268:9 | a [element 4] | +| array_flow.rb:1267:5:1267:5 | a [element 4] | array_flow.rb:1268:9:1268:9 | a [element 4] | +| array_flow.rb:1267:16:1267:28 | call to source | array_flow.rb:1267:5:1267:5 | a [element 2] | +| array_flow.rb:1267:16:1267:28 | call to source | array_flow.rb:1267:5:1267:5 | a [element 2] | +| array_flow.rb:1267:34:1267:46 | call to source | array_flow.rb:1267:5:1267:5 | a [element 4] | +| array_flow.rb:1267:34:1267:46 | call to source | array_flow.rb:1267:5:1267:5 | a [element 4] | +| array_flow.rb:1268:5:1268:5 | b [element 0] | array_flow.rb:1269:10:1269:10 | b [element 0] | +| array_flow.rb:1268:5:1268:5 | b [element 0] | array_flow.rb:1269:10:1269:10 | b [element 0] | +| array_flow.rb:1268:5:1268:5 | b [element 2] | array_flow.rb:1271:10:1271:10 | b [element 2] | +| array_flow.rb:1268:5:1268:5 | b [element 2] | array_flow.rb:1271:10:1271:10 | b [element 2] | +| array_flow.rb:1268:9:1268:9 | a [element 2] | array_flow.rb:1268:9:1268:22 | call to slice! [element 0] | +| array_flow.rb:1268:9:1268:9 | a [element 2] | array_flow.rb:1268:9:1268:22 | call to slice! [element 0] | +| array_flow.rb:1268:9:1268:9 | a [element 4] | array_flow.rb:1268:9:1268:22 | call to slice! [element 2] | +| array_flow.rb:1268:9:1268:9 | a [element 4] | array_flow.rb:1268:9:1268:22 | call to slice! [element 2] | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] | array_flow.rb:1268:5:1268:5 | b [element 0] | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] | array_flow.rb:1268:5:1268:5 | b [element 0] | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] | array_flow.rb:1268:5:1268:5 | b [element 2] | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] | array_flow.rb:1268:5:1268:5 | b [element 2] | +| array_flow.rb:1269:10:1269:10 | b [element 0] | array_flow.rb:1269:10:1269:13 | ...[...] | +| array_flow.rb:1269:10:1269:10 | b [element 0] | array_flow.rb:1269:10:1269:13 | ...[...] | +| array_flow.rb:1271:10:1271:10 | b [element 2] | array_flow.rb:1271:10:1271:13 | ...[...] | +| array_flow.rb:1271:10:1271:10 | b [element 2] | array_flow.rb:1271:10:1271:13 | ...[...] | +| array_flow.rb:1278:5:1278:5 | a [element 2] | array_flow.rb:1279:9:1279:9 | a [element 2] | +| array_flow.rb:1278:5:1278:5 | a [element 2] | array_flow.rb:1279:9:1279:9 | a [element 2] | +| array_flow.rb:1278:5:1278:5 | a [element 4] | array_flow.rb:1279:9:1279:9 | a [element 4] | +| array_flow.rb:1278:5:1278:5 | a [element 4] | array_flow.rb:1279:9:1279:9 | a [element 4] | +| array_flow.rb:1278:16:1278:28 | call to source | array_flow.rb:1278:5:1278:5 | a [element 2] | +| array_flow.rb:1278:16:1278:28 | call to source | array_flow.rb:1278:5:1278:5 | a [element 2] | +| array_flow.rb:1278:34:1278:46 | call to source | array_flow.rb:1278:5:1278:5 | a [element 4] | +| array_flow.rb:1278:34:1278:46 | call to source | array_flow.rb:1278:5:1278:5 | a [element 4] | +| array_flow.rb:1279:5:1279:5 | b [element 0] | array_flow.rb:1280:10:1280:10 | b [element 0] | +| array_flow.rb:1279:5:1279:5 | b [element 0] | array_flow.rb:1280:10:1280:10 | b [element 0] | +| array_flow.rb:1279:9:1279:9 | [post] a [element 2] | array_flow.rb:1285:10:1285:10 | a [element 2] | +| array_flow.rb:1279:9:1279:9 | [post] a [element 2] | array_flow.rb:1285:10:1285:10 | a [element 2] | +| array_flow.rb:1279:9:1279:9 | a [element 2] | array_flow.rb:1279:9:1279:22 | call to slice! [element 0] | +| array_flow.rb:1279:9:1279:9 | a [element 2] | array_flow.rb:1279:9:1279:22 | call to slice! [element 0] | +| array_flow.rb:1279:9:1279:9 | a [element 4] | array_flow.rb:1279:9:1279:9 | [post] a [element 2] | +| array_flow.rb:1279:9:1279:9 | a [element 4] | array_flow.rb:1279:9:1279:9 | [post] a [element 2] | +| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] | array_flow.rb:1279:5:1279:5 | b [element 0] | +| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] | array_flow.rb:1279:5:1279:5 | b [element 0] | +| array_flow.rb:1280:10:1280:10 | b [element 0] | array_flow.rb:1280:10:1280:13 | ...[...] | +| array_flow.rb:1280:10:1280:10 | b [element 0] | array_flow.rb:1280:10:1280:13 | ...[...] | +| array_flow.rb:1285:10:1285:10 | a [element 2] | array_flow.rb:1285:10:1285:13 | ...[...] | +| array_flow.rb:1285:10:1285:10 | a [element 2] | array_flow.rb:1285:10:1285:13 | ...[...] | +| array_flow.rb:1289:5:1289:5 | a [element 2] | array_flow.rb:1290:9:1290:9 | a [element 2] | +| array_flow.rb:1289:5:1289:5 | a [element 2] | array_flow.rb:1290:9:1290:9 | a [element 2] | +| array_flow.rb:1289:5:1289:5 | a [element 4] | array_flow.rb:1290:9:1290:9 | a [element 4] | +| array_flow.rb:1289:5:1289:5 | a [element 4] | array_flow.rb:1290:9:1290:9 | a [element 4] | +| array_flow.rb:1289:16:1289:28 | call to source | array_flow.rb:1289:5:1289:5 | a [element 2] | +| array_flow.rb:1289:16:1289:28 | call to source | array_flow.rb:1289:5:1289:5 | a [element 2] | +| array_flow.rb:1289:34:1289:46 | call to source | array_flow.rb:1289:5:1289:5 | a [element 4] | +| array_flow.rb:1289:34:1289:46 | call to source | array_flow.rb:1289:5:1289:5 | a [element 4] | +| array_flow.rb:1290:5:1290:5 | b [element 0] | array_flow.rb:1291:10:1291:10 | b [element 0] | +| array_flow.rb:1290:5:1290:5 | b [element 0] | array_flow.rb:1291:10:1291:10 | b [element 0] | +| array_flow.rb:1290:9:1290:9 | [post] a [element 2] | array_flow.rb:1296:10:1296:10 | a [element 2] | +| array_flow.rb:1290:9:1290:9 | [post] a [element 2] | array_flow.rb:1296:10:1296:10 | a [element 2] | +| array_flow.rb:1290:9:1290:9 | a [element 2] | array_flow.rb:1290:9:1290:23 | call to slice! [element 0] | +| array_flow.rb:1290:9:1290:9 | a [element 2] | array_flow.rb:1290:9:1290:23 | call to slice! [element 0] | +| array_flow.rb:1290:9:1290:9 | a [element 4] | array_flow.rb:1290:9:1290:9 | [post] a [element 2] | +| array_flow.rb:1290:9:1290:9 | a [element 4] | array_flow.rb:1290:9:1290:9 | [post] a [element 2] | +| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] | array_flow.rb:1290:5:1290:5 | b [element 0] | +| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] | array_flow.rb:1290:5:1290:5 | b [element 0] | +| array_flow.rb:1291:10:1291:10 | b [element 0] | array_flow.rb:1291:10:1291:13 | ...[...] | +| array_flow.rb:1291:10:1291:10 | b [element 0] | array_flow.rb:1291:10:1291:13 | ...[...] | +| array_flow.rb:1296:10:1296:10 | a [element 2] | array_flow.rb:1296:10:1296:13 | ...[...] | +| array_flow.rb:1296:10:1296:10 | a [element 2] | array_flow.rb:1296:10:1296:13 | ...[...] | +| array_flow.rb:1300:5:1300:5 | a [element 2] | array_flow.rb:1301:9:1301:9 | a [element 2] | +| array_flow.rb:1300:5:1300:5 | a [element 2] | array_flow.rb:1301:9:1301:9 | a [element 2] | +| array_flow.rb:1300:5:1300:5 | a [element 4] | array_flow.rb:1301:9:1301:9 | a [element 4] | +| array_flow.rb:1300:5:1300:5 | a [element 4] | array_flow.rb:1301:9:1301:9 | a [element 4] | +| array_flow.rb:1300:16:1300:28 | call to source | array_flow.rb:1300:5:1300:5 | a [element 2] | +| array_flow.rb:1300:16:1300:28 | call to source | array_flow.rb:1300:5:1300:5 | a [element 2] | +| array_flow.rb:1300:34:1300:46 | call to source | array_flow.rb:1300:5:1300:5 | a [element 4] | +| array_flow.rb:1300:34:1300:46 | call to source | array_flow.rb:1300:5:1300:5 | a [element 4] | +| array_flow.rb:1301:5:1301:5 | b [element] | array_flow.rb:1302:10:1302:10 | b [element] | +| array_flow.rb:1301:5:1301:5 | b [element] | array_flow.rb:1302:10:1302:10 | b [element] | +| array_flow.rb:1301:5:1301:5 | b [element] | array_flow.rb:1303:10:1303:10 | b [element] | +| array_flow.rb:1301:5:1301:5 | b [element] | array_flow.rb:1303:10:1303:10 | b [element] | +| array_flow.rb:1301:5:1301:5 | b [element] | array_flow.rb:1304:10:1304:10 | b [element] | +| array_flow.rb:1301:5:1301:5 | b [element] | array_flow.rb:1304:10:1304:10 | b [element] | +| array_flow.rb:1301:9:1301:9 | [post] a [element] | array_flow.rb:1305:10:1305:10 | a [element] | +| array_flow.rb:1301:9:1301:9 | [post] a [element] | array_flow.rb:1305:10:1305:10 | a [element] | +| array_flow.rb:1301:9:1301:9 | [post] a [element] | array_flow.rb:1306:10:1306:10 | a [element] | +| array_flow.rb:1301:9:1301:9 | [post] a [element] | array_flow.rb:1306:10:1306:10 | a [element] | +| array_flow.rb:1301:9:1301:9 | [post] a [element] | array_flow.rb:1307:10:1307:10 | a [element] | +| array_flow.rb:1301:9:1301:9 | [post] a [element] | array_flow.rb:1307:10:1307:10 | a [element] | +| array_flow.rb:1301:9:1301:9 | a [element 2] | array_flow.rb:1301:9:1301:9 | [post] a [element] | +| array_flow.rb:1301:9:1301:9 | a [element 2] | array_flow.rb:1301:9:1301:9 | [post] a [element] | +| array_flow.rb:1301:9:1301:9 | a [element 2] | array_flow.rb:1301:9:1301:22 | call to slice! [element] | +| array_flow.rb:1301:9:1301:9 | a [element 2] | array_flow.rb:1301:9:1301:22 | call to slice! [element] | +| array_flow.rb:1301:9:1301:9 | a [element 4] | array_flow.rb:1301:9:1301:9 | [post] a [element] | +| array_flow.rb:1301:9:1301:9 | a [element 4] | array_flow.rb:1301:9:1301:9 | [post] a [element] | +| array_flow.rb:1301:9:1301:9 | a [element 4] | array_flow.rb:1301:9:1301:22 | call to slice! [element] | +| array_flow.rb:1301:9:1301:9 | a [element 4] | array_flow.rb:1301:9:1301:22 | call to slice! [element] | +| array_flow.rb:1301:9:1301:22 | call to slice! [element] | array_flow.rb:1301:5:1301:5 | b [element] | +| array_flow.rb:1301:9:1301:22 | call to slice! [element] | array_flow.rb:1301:5:1301:5 | b [element] | +| array_flow.rb:1302:10:1302:10 | b [element] | array_flow.rb:1302:10:1302:13 | ...[...] | +| array_flow.rb:1302:10:1302:10 | b [element] | array_flow.rb:1302:10:1302:13 | ...[...] | +| array_flow.rb:1303:10:1303:10 | b [element] | array_flow.rb:1303:10:1303:13 | ...[...] | +| array_flow.rb:1303:10:1303:10 | b [element] | array_flow.rb:1303:10:1303:13 | ...[...] | +| array_flow.rb:1304:10:1304:10 | b [element] | array_flow.rb:1304:10:1304:13 | ...[...] | +| array_flow.rb:1304:10:1304:10 | b [element] | array_flow.rb:1304:10:1304:13 | ...[...] | +| array_flow.rb:1305:10:1305:10 | a [element] | array_flow.rb:1305:10:1305:13 | ...[...] | +| array_flow.rb:1305:10:1305:10 | a [element] | array_flow.rb:1305:10:1305:13 | ...[...] | +| array_flow.rb:1306:10:1306:10 | a [element] | array_flow.rb:1306:10:1306:13 | ...[...] | +| array_flow.rb:1306:10:1306:10 | a [element] | array_flow.rb:1306:10:1306:13 | ...[...] | +| array_flow.rb:1307:10:1307:10 | a [element] | array_flow.rb:1307:10:1307:13 | ...[...] | +| array_flow.rb:1307:10:1307:10 | a [element] | array_flow.rb:1307:10:1307:13 | ...[...] | +| array_flow.rb:1309:5:1309:5 | a [element 2] | array_flow.rb:1310:9:1310:9 | a [element 2] | +| array_flow.rb:1309:5:1309:5 | a [element 2] | array_flow.rb:1310:9:1310:9 | a [element 2] | +| array_flow.rb:1309:5:1309:5 | a [element 4] | array_flow.rb:1310:9:1310:9 | a [element 4] | +| array_flow.rb:1309:5:1309:5 | a [element 4] | array_flow.rb:1310:9:1310:9 | a [element 4] | +| array_flow.rb:1309:16:1309:28 | call to source | array_flow.rb:1309:5:1309:5 | a [element 2] | +| array_flow.rb:1309:16:1309:28 | call to source | array_flow.rb:1309:5:1309:5 | a [element 2] | +| array_flow.rb:1309:34:1309:46 | call to source | array_flow.rb:1309:5:1309:5 | a [element 4] | +| array_flow.rb:1309:34:1309:46 | call to source | array_flow.rb:1309:5:1309:5 | a [element 4] | +| array_flow.rb:1310:5:1310:5 | b [element] | array_flow.rb:1311:10:1311:10 | b [element] | +| array_flow.rb:1310:5:1310:5 | b [element] | array_flow.rb:1311:10:1311:10 | b [element] | +| array_flow.rb:1310:5:1310:5 | b [element] | array_flow.rb:1312:10:1312:10 | b [element] | +| array_flow.rb:1310:5:1310:5 | b [element] | array_flow.rb:1312:10:1312:10 | b [element] | +| array_flow.rb:1310:5:1310:5 | b [element] | array_flow.rb:1313:10:1313:10 | b [element] | +| array_flow.rb:1310:5:1310:5 | b [element] | array_flow.rb:1313:10:1313:10 | b [element] | +| array_flow.rb:1310:9:1310:9 | [post] a [element] | array_flow.rb:1314:10:1314:10 | a [element] | +| array_flow.rb:1310:9:1310:9 | [post] a [element] | array_flow.rb:1314:10:1314:10 | a [element] | +| array_flow.rb:1310:9:1310:9 | [post] a [element] | array_flow.rb:1315:10:1315:10 | a [element] | +| array_flow.rb:1310:9:1310:9 | [post] a [element] | array_flow.rb:1315:10:1315:10 | a [element] | +| array_flow.rb:1310:9:1310:9 | [post] a [element] | array_flow.rb:1316:10:1316:10 | a [element] | +| array_flow.rb:1310:9:1310:9 | [post] a [element] | array_flow.rb:1316:10:1316:10 | a [element] | +| array_flow.rb:1310:9:1310:9 | a [element 2] | array_flow.rb:1310:9:1310:9 | [post] a [element] | +| array_flow.rb:1310:9:1310:9 | a [element 2] | array_flow.rb:1310:9:1310:9 | [post] a [element] | +| array_flow.rb:1310:9:1310:9 | a [element 2] | array_flow.rb:1310:9:1310:22 | call to slice! [element] | +| array_flow.rb:1310:9:1310:9 | a [element 2] | array_flow.rb:1310:9:1310:22 | call to slice! [element] | +| array_flow.rb:1310:9:1310:9 | a [element 4] | array_flow.rb:1310:9:1310:9 | [post] a [element] | +| array_flow.rb:1310:9:1310:9 | a [element 4] | array_flow.rb:1310:9:1310:9 | [post] a [element] | +| array_flow.rb:1310:9:1310:9 | a [element 4] | array_flow.rb:1310:9:1310:22 | call to slice! [element] | +| array_flow.rb:1310:9:1310:9 | a [element 4] | array_flow.rb:1310:9:1310:22 | call to slice! [element] | +| array_flow.rb:1310:9:1310:22 | call to slice! [element] | array_flow.rb:1310:5:1310:5 | b [element] | +| array_flow.rb:1310:9:1310:22 | call to slice! [element] | array_flow.rb:1310:5:1310:5 | b [element] | +| array_flow.rb:1311:10:1311:10 | b [element] | array_flow.rb:1311:10:1311:13 | ...[...] | +| array_flow.rb:1311:10:1311:10 | b [element] | array_flow.rb:1311:10:1311:13 | ...[...] | +| array_flow.rb:1312:10:1312:10 | b [element] | array_flow.rb:1312:10:1312:13 | ...[...] | +| array_flow.rb:1312:10:1312:10 | b [element] | array_flow.rb:1312:10:1312:13 | ...[...] | +| array_flow.rb:1313:10:1313:10 | b [element] | array_flow.rb:1313:10:1313:13 | ...[...] | +| array_flow.rb:1313:10:1313:10 | b [element] | array_flow.rb:1313:10:1313:13 | ...[...] | +| array_flow.rb:1314:10:1314:10 | a [element] | array_flow.rb:1314:10:1314:13 | ...[...] | +| array_flow.rb:1314:10:1314:10 | a [element] | array_flow.rb:1314:10:1314:13 | ...[...] | +| array_flow.rb:1315:10:1315:10 | a [element] | array_flow.rb:1315:10:1315:13 | ...[...] | +| array_flow.rb:1315:10:1315:10 | a [element] | array_flow.rb:1315:10:1315:13 | ...[...] | +| array_flow.rb:1316:10:1316:10 | a [element] | array_flow.rb:1316:10:1316:13 | ...[...] | +| array_flow.rb:1316:10:1316:10 | a [element] | array_flow.rb:1316:10:1316:13 | ...[...] | +| array_flow.rb:1318:5:1318:5 | a [element 2] | array_flow.rb:1319:9:1319:9 | a [element 2] | +| array_flow.rb:1318:5:1318:5 | a [element 2] | array_flow.rb:1319:9:1319:9 | a [element 2] | +| array_flow.rb:1318:5:1318:5 | a [element 4] | array_flow.rb:1319:9:1319:9 | a [element 4] | +| array_flow.rb:1318:5:1318:5 | a [element 4] | array_flow.rb:1319:9:1319:9 | a [element 4] | +| array_flow.rb:1318:16:1318:28 | call to source | array_flow.rb:1318:5:1318:5 | a [element 2] | +| array_flow.rb:1318:16:1318:28 | call to source | array_flow.rb:1318:5:1318:5 | a [element 2] | +| array_flow.rb:1318:34:1318:46 | call to source | array_flow.rb:1318:5:1318:5 | a [element 4] | +| array_flow.rb:1318:34:1318:46 | call to source | array_flow.rb:1318:5:1318:5 | a [element 4] | +| array_flow.rb:1319:5:1319:5 | b [element] | array_flow.rb:1320:10:1320:10 | b [element] | +| array_flow.rb:1319:5:1319:5 | b [element] | array_flow.rb:1320:10:1320:10 | b [element] | +| array_flow.rb:1319:5:1319:5 | b [element] | array_flow.rb:1321:10:1321:10 | b [element] | +| array_flow.rb:1319:5:1319:5 | b [element] | array_flow.rb:1321:10:1321:10 | b [element] | +| array_flow.rb:1319:5:1319:5 | b [element] | array_flow.rb:1322:10:1322:10 | b [element] | +| array_flow.rb:1319:5:1319:5 | b [element] | array_flow.rb:1322:10:1322:10 | b [element] | +| array_flow.rb:1319:9:1319:9 | [post] a [element] | array_flow.rb:1323:10:1323:10 | a [element] | +| array_flow.rb:1319:9:1319:9 | [post] a [element] | array_flow.rb:1323:10:1323:10 | a [element] | +| array_flow.rb:1319:9:1319:9 | [post] a [element] | array_flow.rb:1324:10:1324:10 | a [element] | +| array_flow.rb:1319:9:1319:9 | [post] a [element] | array_flow.rb:1324:10:1324:10 | a [element] | +| array_flow.rb:1319:9:1319:9 | [post] a [element] | array_flow.rb:1325:10:1325:10 | a [element] | +| array_flow.rb:1319:9:1319:9 | [post] a [element] | array_flow.rb:1325:10:1325:10 | a [element] | +| array_flow.rb:1319:9:1319:9 | a [element 2] | array_flow.rb:1319:9:1319:9 | [post] a [element] | +| array_flow.rb:1319:9:1319:9 | a [element 2] | array_flow.rb:1319:9:1319:9 | [post] a [element] | +| array_flow.rb:1319:9:1319:9 | a [element 2] | array_flow.rb:1319:9:1319:25 | call to slice! [element] | +| array_flow.rb:1319:9:1319:9 | a [element 2] | array_flow.rb:1319:9:1319:25 | call to slice! [element] | +| array_flow.rb:1319:9:1319:9 | a [element 4] | array_flow.rb:1319:9:1319:9 | [post] a [element] | +| array_flow.rb:1319:9:1319:9 | a [element 4] | array_flow.rb:1319:9:1319:9 | [post] a [element] | +| array_flow.rb:1319:9:1319:9 | a [element 4] | array_flow.rb:1319:9:1319:25 | call to slice! [element] | +| array_flow.rb:1319:9:1319:9 | a [element 4] | array_flow.rb:1319:9:1319:25 | call to slice! [element] | +| array_flow.rb:1319:9:1319:25 | call to slice! [element] | array_flow.rb:1319:5:1319:5 | b [element] | +| array_flow.rb:1319:9:1319:25 | call to slice! [element] | array_flow.rb:1319:5:1319:5 | b [element] | +| array_flow.rb:1320:10:1320:10 | b [element] | array_flow.rb:1320:10:1320:13 | ...[...] | +| array_flow.rb:1320:10:1320:10 | b [element] | array_flow.rb:1320:10:1320:13 | ...[...] | +| array_flow.rb:1321:10:1321:10 | b [element] | array_flow.rb:1321:10:1321:13 | ...[...] | +| array_flow.rb:1321:10:1321:10 | b [element] | array_flow.rb:1321:10:1321:13 | ...[...] | +| array_flow.rb:1322:10:1322:10 | b [element] | array_flow.rb:1322:10:1322:13 | ...[...] | +| array_flow.rb:1322:10:1322:10 | b [element] | array_flow.rb:1322:10:1322:13 | ...[...] | +| array_flow.rb:1323:10:1323:10 | a [element] | array_flow.rb:1323:10:1323:13 | ...[...] | +| array_flow.rb:1323:10:1323:10 | a [element] | array_flow.rb:1323:10:1323:13 | ...[...] | +| array_flow.rb:1324:10:1324:10 | a [element] | array_flow.rb:1324:10:1324:13 | ...[...] | +| array_flow.rb:1324:10:1324:10 | a [element] | array_flow.rb:1324:10:1324:13 | ...[...] | +| array_flow.rb:1325:10:1325:10 | a [element] | array_flow.rb:1325:10:1325:13 | ...[...] | +| array_flow.rb:1325:10:1325:10 | a [element] | array_flow.rb:1325:10:1325:13 | ...[...] | +| array_flow.rb:1327:5:1327:5 | a [element 2] | array_flow.rb:1328:9:1328:9 | a [element 2] | +| array_flow.rb:1327:5:1327:5 | a [element 2] | array_flow.rb:1328:9:1328:9 | a [element 2] | +| array_flow.rb:1327:5:1327:5 | a [element 4] | array_flow.rb:1328:9:1328:9 | a [element 4] | +| array_flow.rb:1327:5:1327:5 | a [element 4] | array_flow.rb:1328:9:1328:9 | a [element 4] | +| array_flow.rb:1327:16:1327:28 | call to source | array_flow.rb:1327:5:1327:5 | a [element 2] | +| array_flow.rb:1327:16:1327:28 | call to source | array_flow.rb:1327:5:1327:5 | a [element 2] | +| array_flow.rb:1327:34:1327:46 | call to source | array_flow.rb:1327:5:1327:5 | a [element 4] | +| array_flow.rb:1327:34:1327:46 | call to source | array_flow.rb:1327:5:1327:5 | a [element 4] | +| array_flow.rb:1328:5:1328:5 | b [element 2] | array_flow.rb:1331:10:1331:10 | b [element 2] | +| array_flow.rb:1328:5:1328:5 | b [element 2] | array_flow.rb:1331:10:1331:10 | b [element 2] | +| array_flow.rb:1328:9:1328:9 | [post] a [element 1] | array_flow.rb:1333:10:1333:10 | a [element 1] | +| array_flow.rb:1328:9:1328:9 | [post] a [element 1] | array_flow.rb:1333:10:1333:10 | a [element 1] | +| array_flow.rb:1328:9:1328:9 | a [element 2] | array_flow.rb:1328:9:1328:21 | call to slice! [element 2] | +| array_flow.rb:1328:9:1328:9 | a [element 2] | array_flow.rb:1328:9:1328:21 | call to slice! [element 2] | +| array_flow.rb:1328:9:1328:9 | a [element 4] | array_flow.rb:1328:9:1328:9 | [post] a [element 1] | +| array_flow.rb:1328:9:1328:9 | a [element 4] | array_flow.rb:1328:9:1328:9 | [post] a [element 1] | +| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] | array_flow.rb:1328:5:1328:5 | b [element 2] | +| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] | array_flow.rb:1328:5:1328:5 | b [element 2] | +| array_flow.rb:1331:10:1331:10 | b [element 2] | array_flow.rb:1331:10:1331:13 | ...[...] | +| array_flow.rb:1331:10:1331:10 | b [element 2] | array_flow.rb:1331:10:1331:13 | ...[...] | +| array_flow.rb:1333:10:1333:10 | a [element 1] | array_flow.rb:1333:10:1333:13 | ...[...] | +| array_flow.rb:1333:10:1333:10 | a [element 1] | array_flow.rb:1333:10:1333:13 | ...[...] | +| array_flow.rb:1336:5:1336:5 | a [element 2] | array_flow.rb:1337:9:1337:9 | a [element 2] | +| array_flow.rb:1336:5:1336:5 | a [element 2] | array_flow.rb:1337:9:1337:9 | a [element 2] | +| array_flow.rb:1336:5:1336:5 | a [element 4] | array_flow.rb:1337:9:1337:9 | a [element 4] | +| array_flow.rb:1336:5:1336:5 | a [element 4] | array_flow.rb:1337:9:1337:9 | a [element 4] | +| array_flow.rb:1336:16:1336:28 | call to source | array_flow.rb:1336:5:1336:5 | a [element 2] | +| array_flow.rb:1336:16:1336:28 | call to source | array_flow.rb:1336:5:1336:5 | a [element 2] | +| array_flow.rb:1336:34:1336:46 | call to source | array_flow.rb:1336:5:1336:5 | a [element 4] | +| array_flow.rb:1336:34:1336:46 | call to source | array_flow.rb:1336:5:1336:5 | a [element 4] | +| array_flow.rb:1337:5:1337:5 | b [element] | array_flow.rb:1338:10:1338:10 | b [element] | +| array_flow.rb:1337:5:1337:5 | b [element] | array_flow.rb:1338:10:1338:10 | b [element] | +| array_flow.rb:1337:5:1337:5 | b [element] | array_flow.rb:1339:10:1339:10 | b [element] | +| array_flow.rb:1337:5:1337:5 | b [element] | array_flow.rb:1339:10:1339:10 | b [element] | +| array_flow.rb:1337:5:1337:5 | b [element] | array_flow.rb:1340:10:1340:10 | b [element] | +| array_flow.rb:1337:5:1337:5 | b [element] | array_flow.rb:1340:10:1340:10 | b [element] | +| array_flow.rb:1337:9:1337:9 | [post] a [element] | array_flow.rb:1341:10:1341:10 | a [element] | +| array_flow.rb:1337:9:1337:9 | [post] a [element] | array_flow.rb:1341:10:1341:10 | a [element] | +| array_flow.rb:1337:9:1337:9 | [post] a [element] | array_flow.rb:1342:10:1342:10 | a [element] | +| array_flow.rb:1337:9:1337:9 | [post] a [element] | array_flow.rb:1342:10:1342:10 | a [element] | +| array_flow.rb:1337:9:1337:9 | [post] a [element] | array_flow.rb:1343:10:1343:10 | a [element] | +| array_flow.rb:1337:9:1337:9 | [post] a [element] | array_flow.rb:1343:10:1343:10 | a [element] | +| array_flow.rb:1337:9:1337:9 | a [element 2] | array_flow.rb:1337:9:1337:9 | [post] a [element] | +| array_flow.rb:1337:9:1337:9 | a [element 2] | array_flow.rb:1337:9:1337:9 | [post] a [element] | +| array_flow.rb:1337:9:1337:9 | a [element 2] | array_flow.rb:1337:9:1337:21 | call to slice! [element] | +| array_flow.rb:1337:9:1337:9 | a [element 2] | array_flow.rb:1337:9:1337:21 | call to slice! [element] | +| array_flow.rb:1337:9:1337:9 | a [element 4] | array_flow.rb:1337:9:1337:9 | [post] a [element] | +| array_flow.rb:1337:9:1337:9 | a [element 4] | array_flow.rb:1337:9:1337:9 | [post] a [element] | +| array_flow.rb:1337:9:1337:9 | a [element 4] | array_flow.rb:1337:9:1337:21 | call to slice! [element] | +| array_flow.rb:1337:9:1337:9 | a [element 4] | array_flow.rb:1337:9:1337:21 | call to slice! [element] | +| array_flow.rb:1337:9:1337:21 | call to slice! [element] | array_flow.rb:1337:5:1337:5 | b [element] | +| array_flow.rb:1337:9:1337:21 | call to slice! [element] | array_flow.rb:1337:5:1337:5 | b [element] | +| array_flow.rb:1338:10:1338:10 | b [element] | array_flow.rb:1338:10:1338:13 | ...[...] | +| array_flow.rb:1338:10:1338:10 | b [element] | array_flow.rb:1338:10:1338:13 | ...[...] | +| array_flow.rb:1339:10:1339:10 | b [element] | array_flow.rb:1339:10:1339:13 | ...[...] | +| array_flow.rb:1339:10:1339:10 | b [element] | array_flow.rb:1339:10:1339:13 | ...[...] | +| array_flow.rb:1340:10:1340:10 | b [element] | array_flow.rb:1340:10:1340:13 | ...[...] | +| array_flow.rb:1340:10:1340:10 | b [element] | array_flow.rb:1340:10:1340:13 | ...[...] | +| array_flow.rb:1341:10:1341:10 | a [element] | array_flow.rb:1341:10:1341:13 | ...[...] | +| array_flow.rb:1341:10:1341:10 | a [element] | array_flow.rb:1341:10:1341:13 | ...[...] | +| array_flow.rb:1342:10:1342:10 | a [element] | array_flow.rb:1342:10:1342:13 | ...[...] | +| array_flow.rb:1342:10:1342:10 | a [element] | array_flow.rb:1342:10:1342:13 | ...[...] | +| array_flow.rb:1343:10:1343:10 | a [element] | array_flow.rb:1343:10:1343:13 | ...[...] | +| array_flow.rb:1343:10:1343:10 | a [element] | array_flow.rb:1343:10:1343:13 | ...[...] | +| array_flow.rb:1347:5:1347:5 | a [element 2] | array_flow.rb:1348:9:1348:9 | a [element 2] | +| array_flow.rb:1347:5:1347:5 | a [element 2] | array_flow.rb:1348:9:1348:9 | a [element 2] | +| array_flow.rb:1347:16:1347:26 | call to source | array_flow.rb:1347:5:1347:5 | a [element 2] | +| array_flow.rb:1347:16:1347:26 | call to source | array_flow.rb:1347:5:1347:5 | a [element 2] | +| array_flow.rb:1348:9:1348:9 | a [element 2] | array_flow.rb:1348:27:1348:27 | x | +| array_flow.rb:1348:9:1348:9 | a [element 2] | array_flow.rb:1348:27:1348:27 | x | +| array_flow.rb:1348:27:1348:27 | x | array_flow.rb:1349:14:1349:14 | x | +| array_flow.rb:1348:27:1348:27 | x | array_flow.rb:1349:14:1349:14 | x | +| array_flow.rb:1355:5:1355:5 | a [element 2] | array_flow.rb:1356:9:1356:9 | a [element 2] | +| array_flow.rb:1355:5:1355:5 | a [element 2] | array_flow.rb:1356:9:1356:9 | a [element 2] | +| array_flow.rb:1355:16:1355:26 | call to source | array_flow.rb:1355:5:1355:5 | a [element 2] | +| array_flow.rb:1355:16:1355:26 | call to source | array_flow.rb:1355:5:1355:5 | a [element 2] | +| array_flow.rb:1356:9:1356:9 | a [element 2] | array_flow.rb:1356:28:1356:28 | x | +| array_flow.rb:1356:9:1356:9 | a [element 2] | array_flow.rb:1356:28:1356:28 | x | +| array_flow.rb:1356:28:1356:28 | x | array_flow.rb:1357:14:1357:14 | x | +| array_flow.rb:1356:28:1356:28 | x | array_flow.rb:1357:14:1357:14 | x | +| array_flow.rb:1363:5:1363:5 | a [element 2] | array_flow.rb:1364:9:1364:9 | a [element 2] | +| array_flow.rb:1363:5:1363:5 | a [element 2] | array_flow.rb:1364:9:1364:9 | a [element 2] | +| array_flow.rb:1363:16:1363:26 | call to source | array_flow.rb:1363:5:1363:5 | a [element 2] | +| array_flow.rb:1363:16:1363:26 | call to source | array_flow.rb:1363:5:1363:5 | a [element 2] | +| array_flow.rb:1364:9:1364:9 | a [element 2] | array_flow.rb:1364:26:1364:26 | x | +| array_flow.rb:1364:9:1364:9 | a [element 2] | array_flow.rb:1364:26:1364:26 | x | +| array_flow.rb:1364:9:1364:9 | a [element 2] | array_flow.rb:1364:29:1364:29 | y | +| array_flow.rb:1364:9:1364:9 | a [element 2] | array_flow.rb:1364:29:1364:29 | y | +| array_flow.rb:1364:26:1364:26 | x | array_flow.rb:1365:14:1365:14 | x | +| array_flow.rb:1364:26:1364:26 | x | array_flow.rb:1365:14:1365:14 | x | +| array_flow.rb:1364:29:1364:29 | y | array_flow.rb:1366:14:1366:14 | y | +| array_flow.rb:1364:29:1364:29 | y | array_flow.rb:1366:14:1366:14 | y | +| array_flow.rb:1371:5:1371:5 | a [element 2] | array_flow.rb:1372:9:1372:9 | a [element 2] | +| array_flow.rb:1371:5:1371:5 | a [element 2] | array_flow.rb:1372:9:1372:9 | a [element 2] | +| array_flow.rb:1371:5:1371:5 | a [element 2] | array_flow.rb:1375:9:1375:9 | a [element 2] | +| array_flow.rb:1371:5:1371:5 | a [element 2] | array_flow.rb:1375:9:1375:9 | a [element 2] | +| array_flow.rb:1371:16:1371:26 | call to source | array_flow.rb:1371:5:1371:5 | a [element 2] | +| array_flow.rb:1371:16:1371:26 | call to source | array_flow.rb:1371:5:1371:5 | a [element 2] | +| array_flow.rb:1372:5:1372:5 | b [element] | array_flow.rb:1373:10:1373:10 | b [element] | +| array_flow.rb:1372:5:1372:5 | b [element] | array_flow.rb:1373:10:1373:10 | b [element] | +| array_flow.rb:1372:5:1372:5 | b [element] | array_flow.rb:1374:10:1374:10 | b [element] | +| array_flow.rb:1372:5:1372:5 | b [element] | array_flow.rb:1374:10:1374:10 | b [element] | +| array_flow.rb:1372:9:1372:9 | a [element 2] | array_flow.rb:1372:9:1372:14 | call to sort [element] | +| array_flow.rb:1372:9:1372:9 | a [element 2] | array_flow.rb:1372:9:1372:14 | call to sort [element] | +| array_flow.rb:1372:9:1372:14 | call to sort [element] | array_flow.rb:1372:5:1372:5 | b [element] | +| array_flow.rb:1372:9:1372:14 | call to sort [element] | array_flow.rb:1372:5:1372:5 | b [element] | +| array_flow.rb:1373:10:1373:10 | b [element] | array_flow.rb:1373:10:1373:13 | ...[...] | +| array_flow.rb:1373:10:1373:10 | b [element] | array_flow.rb:1373:10:1373:13 | ...[...] | +| array_flow.rb:1374:10:1374:10 | b [element] | array_flow.rb:1374:10:1374:13 | ...[...] | +| array_flow.rb:1374:10:1374:10 | b [element] | array_flow.rb:1374:10:1374:13 | ...[...] | +| array_flow.rb:1375:5:1375:5 | c [element] | array_flow.rb:1380:10:1380:10 | c [element] | +| array_flow.rb:1375:5:1375:5 | c [element] | array_flow.rb:1380:10:1380:10 | c [element] | +| array_flow.rb:1375:5:1375:5 | c [element] | array_flow.rb:1381:10:1381:10 | c [element] | +| array_flow.rb:1375:5:1375:5 | c [element] | array_flow.rb:1381:10:1381:10 | c [element] | +| array_flow.rb:1375:9:1375:9 | a [element 2] | array_flow.rb:1375:9:1379:7 | call to sort [element] | +| array_flow.rb:1375:9:1375:9 | a [element 2] | array_flow.rb:1375:9:1379:7 | call to sort [element] | +| array_flow.rb:1375:9:1375:9 | a [element 2] | array_flow.rb:1375:20:1375:20 | x | +| array_flow.rb:1375:9:1375:9 | a [element 2] | array_flow.rb:1375:20:1375:20 | x | +| array_flow.rb:1375:9:1375:9 | a [element 2] | array_flow.rb:1375:23:1375:23 | y | +| array_flow.rb:1375:9:1375:9 | a [element 2] | array_flow.rb:1375:23:1375:23 | y | +| array_flow.rb:1375:9:1379:7 | call to sort [element] | array_flow.rb:1375:5:1375:5 | c [element] | +| array_flow.rb:1375:9:1379:7 | call to sort [element] | array_flow.rb:1375:5:1375:5 | c [element] | +| array_flow.rb:1375:20:1375:20 | x | array_flow.rb:1376:14:1376:14 | x | +| array_flow.rb:1375:20:1375:20 | x | array_flow.rb:1376:14:1376:14 | x | +| array_flow.rb:1375:23:1375:23 | y | array_flow.rb:1377:14:1377:14 | y | +| array_flow.rb:1375:23:1375:23 | y | array_flow.rb:1377:14:1377:14 | y | +| array_flow.rb:1380:10:1380:10 | c [element] | array_flow.rb:1380:10:1380:13 | ...[...] | +| array_flow.rb:1380:10:1380:10 | c [element] | array_flow.rb:1380:10:1380:13 | ...[...] | +| array_flow.rb:1381:10:1381:10 | c [element] | array_flow.rb:1381:10:1381:13 | ...[...] | +| array_flow.rb:1381:10:1381:10 | c [element] | array_flow.rb:1381:10:1381:13 | ...[...] | +| array_flow.rb:1385:5:1385:5 | a [element 2] | array_flow.rb:1386:9:1386:9 | a [element 2] | +| array_flow.rb:1385:5:1385:5 | a [element 2] | array_flow.rb:1386:9:1386:9 | a [element 2] | +| array_flow.rb:1385:16:1385:26 | call to source | array_flow.rb:1385:5:1385:5 | a [element 2] | +| array_flow.rb:1385:16:1385:26 | call to source | array_flow.rb:1385:5:1385:5 | a [element 2] | +| array_flow.rb:1386:5:1386:5 | b [element] | array_flow.rb:1387:10:1387:10 | b [element] | +| array_flow.rb:1386:5:1386:5 | b [element] | array_flow.rb:1387:10:1387:10 | b [element] | +| array_flow.rb:1386:5:1386:5 | b [element] | array_flow.rb:1388:10:1388:10 | b [element] | +| array_flow.rb:1386:5:1386:5 | b [element] | array_flow.rb:1388:10:1388:10 | b [element] | +| array_flow.rb:1386:9:1386:9 | [post] a [element] | array_flow.rb:1389:10:1389:10 | a [element] | +| array_flow.rb:1386:9:1386:9 | [post] a [element] | array_flow.rb:1389:10:1389:10 | a [element] | +| array_flow.rb:1386:9:1386:9 | [post] a [element] | array_flow.rb:1390:10:1390:10 | a [element] | +| array_flow.rb:1386:9:1386:9 | [post] a [element] | array_flow.rb:1390:10:1390:10 | a [element] | +| array_flow.rb:1386:9:1386:9 | a [element 2] | array_flow.rb:1386:9:1386:9 | [post] a [element] | +| array_flow.rb:1386:9:1386:9 | a [element 2] | array_flow.rb:1386:9:1386:9 | [post] a [element] | +| array_flow.rb:1386:9:1386:9 | a [element 2] | array_flow.rb:1386:9:1386:15 | call to sort! [element] | +| array_flow.rb:1386:9:1386:9 | a [element 2] | array_flow.rb:1386:9:1386:15 | call to sort! [element] | +| array_flow.rb:1386:9:1386:15 | call to sort! [element] | array_flow.rb:1386:5:1386:5 | b [element] | +| array_flow.rb:1386:9:1386:15 | call to sort! [element] | array_flow.rb:1386:5:1386:5 | b [element] | +| array_flow.rb:1387:10:1387:10 | b [element] | array_flow.rb:1387:10:1387:13 | ...[...] | +| array_flow.rb:1387:10:1387:10 | b [element] | array_flow.rb:1387:10:1387:13 | ...[...] | +| array_flow.rb:1388:10:1388:10 | b [element] | array_flow.rb:1388:10:1388:13 | ...[...] | +| array_flow.rb:1388:10:1388:10 | b [element] | array_flow.rb:1388:10:1388:13 | ...[...] | +| array_flow.rb:1389:10:1389:10 | a [element] | array_flow.rb:1389:10:1389:13 | ...[...] | +| array_flow.rb:1389:10:1389:10 | a [element] | array_flow.rb:1389:10:1389:13 | ...[...] | +| array_flow.rb:1390:10:1390:10 | a [element] | array_flow.rb:1390:10:1390:13 | ...[...] | +| array_flow.rb:1390:10:1390:10 | a [element] | array_flow.rb:1390:10:1390:13 | ...[...] | +| array_flow.rb:1392:5:1392:5 | a [element 2] | array_flow.rb:1393:9:1393:9 | a [element 2] | +| array_flow.rb:1392:5:1392:5 | a [element 2] | array_flow.rb:1393:9:1393:9 | a [element 2] | +| array_flow.rb:1392:16:1392:26 | call to source | array_flow.rb:1392:5:1392:5 | a [element 2] | +| array_flow.rb:1392:16:1392:26 | call to source | array_flow.rb:1392:5:1392:5 | a [element 2] | +| array_flow.rb:1393:5:1393:5 | b [element] | array_flow.rb:1398:10:1398:10 | b [element] | +| array_flow.rb:1393:5:1393:5 | b [element] | array_flow.rb:1398:10:1398:10 | b [element] | +| array_flow.rb:1393:5:1393:5 | b [element] | array_flow.rb:1399:10:1399:10 | b [element] | +| array_flow.rb:1393:5:1393:5 | b [element] | array_flow.rb:1399:10:1399:10 | b [element] | +| array_flow.rb:1393:9:1393:9 | [post] a [element] | array_flow.rb:1400:10:1400:10 | a [element] | +| array_flow.rb:1393:9:1393:9 | [post] a [element] | array_flow.rb:1400:10:1400:10 | a [element] | +| array_flow.rb:1393:9:1393:9 | [post] a [element] | array_flow.rb:1401:10:1401:10 | a [element] | +| array_flow.rb:1393:9:1393:9 | [post] a [element] | array_flow.rb:1401:10:1401:10 | a [element] | +| array_flow.rb:1393:9:1393:9 | a [element 2] | array_flow.rb:1393:9:1393:9 | [post] a [element] | +| array_flow.rb:1393:9:1393:9 | a [element 2] | array_flow.rb:1393:9:1393:9 | [post] a [element] | +| array_flow.rb:1393:9:1393:9 | a [element 2] | array_flow.rb:1393:9:1397:7 | call to sort! [element] | +| array_flow.rb:1393:9:1393:9 | a [element 2] | array_flow.rb:1393:9:1397:7 | call to sort! [element] | +| array_flow.rb:1393:9:1393:9 | a [element 2] | array_flow.rb:1393:21:1393:21 | x | +| array_flow.rb:1393:9:1393:9 | a [element 2] | array_flow.rb:1393:21:1393:21 | x | +| array_flow.rb:1393:9:1393:9 | a [element 2] | array_flow.rb:1393:24:1393:24 | y | +| array_flow.rb:1393:9:1393:9 | a [element 2] | array_flow.rb:1393:24:1393:24 | y | +| array_flow.rb:1393:9:1397:7 | call to sort! [element] | array_flow.rb:1393:5:1393:5 | b [element] | +| array_flow.rb:1393:9:1397:7 | call to sort! [element] | array_flow.rb:1393:5:1393:5 | b [element] | +| array_flow.rb:1393:21:1393:21 | x | array_flow.rb:1394:14:1394:14 | x | +| array_flow.rb:1393:21:1393:21 | x | array_flow.rb:1394:14:1394:14 | x | +| array_flow.rb:1393:24:1393:24 | y | array_flow.rb:1395:14:1395:14 | y | +| array_flow.rb:1393:24:1393:24 | y | array_flow.rb:1395:14:1395:14 | y | +| array_flow.rb:1398:10:1398:10 | b [element] | array_flow.rb:1398:10:1398:13 | ...[...] | +| array_flow.rb:1398:10:1398:10 | b [element] | array_flow.rb:1398:10:1398:13 | ...[...] | +| array_flow.rb:1399:10:1399:10 | b [element] | array_flow.rb:1399:10:1399:13 | ...[...] | +| array_flow.rb:1399:10:1399:10 | b [element] | array_flow.rb:1399:10:1399:13 | ...[...] | +| array_flow.rb:1400:10:1400:10 | a [element] | array_flow.rb:1400:10:1400:13 | ...[...] | +| array_flow.rb:1400:10:1400:10 | a [element] | array_flow.rb:1400:10:1400:13 | ...[...] | +| array_flow.rb:1401:10:1401:10 | a [element] | array_flow.rb:1401:10:1401:13 | ...[...] | +| array_flow.rb:1401:10:1401:10 | a [element] | array_flow.rb:1401:10:1401:13 | ...[...] | +| array_flow.rb:1405:5:1405:5 | a [element 2] | array_flow.rb:1406:9:1406:9 | a [element 2] | +| array_flow.rb:1405:5:1405:5 | a [element 2] | array_flow.rb:1406:9:1406:9 | a [element 2] | +| array_flow.rb:1405:16:1405:26 | call to source | array_flow.rb:1405:5:1405:5 | a [element 2] | +| array_flow.rb:1405:16:1405:26 | call to source | array_flow.rb:1405:5:1405:5 | a [element 2] | +| array_flow.rb:1406:5:1406:5 | b [element] | array_flow.rb:1410:10:1410:10 | b [element] | +| array_flow.rb:1406:5:1406:5 | b [element] | array_flow.rb:1410:10:1410:10 | b [element] | +| array_flow.rb:1406:5:1406:5 | b [element] | array_flow.rb:1411:10:1411:10 | b [element] | +| array_flow.rb:1406:5:1406:5 | b [element] | array_flow.rb:1411:10:1411:10 | b [element] | +| array_flow.rb:1406:9:1406:9 | a [element 2] | array_flow.rb:1406:9:1409:7 | call to sort_by [element] | +| array_flow.rb:1406:9:1406:9 | a [element 2] | array_flow.rb:1406:9:1409:7 | call to sort_by [element] | +| array_flow.rb:1406:9:1406:9 | a [element 2] | array_flow.rb:1406:23:1406:23 | x | +| array_flow.rb:1406:9:1406:9 | a [element 2] | array_flow.rb:1406:23:1406:23 | x | +| array_flow.rb:1406:9:1409:7 | call to sort_by [element] | array_flow.rb:1406:5:1406:5 | b [element] | +| array_flow.rb:1406:9:1409:7 | call to sort_by [element] | array_flow.rb:1406:5:1406:5 | b [element] | +| array_flow.rb:1406:23:1406:23 | x | array_flow.rb:1407:14:1407:14 | x | +| array_flow.rb:1406:23:1406:23 | x | array_flow.rb:1407:14:1407:14 | x | +| array_flow.rb:1410:10:1410:10 | b [element] | array_flow.rb:1410:10:1410:13 | ...[...] | +| array_flow.rb:1410:10:1410:10 | b [element] | array_flow.rb:1410:10:1410:13 | ...[...] | +| array_flow.rb:1411:10:1411:10 | b [element] | array_flow.rb:1411:10:1411:13 | ...[...] | +| array_flow.rb:1411:10:1411:10 | b [element] | array_flow.rb:1411:10:1411:13 | ...[...] | +| array_flow.rb:1415:5:1415:5 | a [element 2] | array_flow.rb:1416:9:1416:9 | a [element 2] | +| array_flow.rb:1415:5:1415:5 | a [element 2] | array_flow.rb:1416:9:1416:9 | a [element 2] | +| array_flow.rb:1415:16:1415:26 | call to source | array_flow.rb:1415:5:1415:5 | a [element 2] | +| array_flow.rb:1415:16:1415:26 | call to source | array_flow.rb:1415:5:1415:5 | a [element 2] | +| array_flow.rb:1416:5:1416:5 | b [element] | array_flow.rb:1422:10:1422:10 | b [element] | +| array_flow.rb:1416:5:1416:5 | b [element] | array_flow.rb:1422:10:1422:10 | b [element] | +| array_flow.rb:1416:5:1416:5 | b [element] | array_flow.rb:1423:10:1423:10 | b [element] | +| array_flow.rb:1416:5:1416:5 | b [element] | array_flow.rb:1423:10:1423:10 | b [element] | +| array_flow.rb:1416:9:1416:9 | [post] a [element] | array_flow.rb:1420:10:1420:10 | a [element] | +| array_flow.rb:1416:9:1416:9 | [post] a [element] | array_flow.rb:1420:10:1420:10 | a [element] | +| array_flow.rb:1416:9:1416:9 | [post] a [element] | array_flow.rb:1421:10:1421:10 | a [element] | +| array_flow.rb:1416:9:1416:9 | [post] a [element] | array_flow.rb:1421:10:1421:10 | a [element] | +| array_flow.rb:1416:9:1416:9 | a [element 2] | array_flow.rb:1416:9:1416:9 | [post] a [element] | +| array_flow.rb:1416:9:1416:9 | a [element 2] | array_flow.rb:1416:9:1416:9 | [post] a [element] | +| array_flow.rb:1416:9:1416:9 | a [element 2] | array_flow.rb:1416:9:1419:7 | call to sort_by! [element] | +| array_flow.rb:1416:9:1416:9 | a [element 2] | array_flow.rb:1416:9:1419:7 | call to sort_by! [element] | +| array_flow.rb:1416:9:1416:9 | a [element 2] | array_flow.rb:1416:24:1416:24 | x | +| array_flow.rb:1416:9:1416:9 | a [element 2] | array_flow.rb:1416:24:1416:24 | x | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] | array_flow.rb:1416:5:1416:5 | b [element] | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] | array_flow.rb:1416:5:1416:5 | b [element] | +| array_flow.rb:1416:24:1416:24 | x | array_flow.rb:1417:14:1417:14 | x | +| array_flow.rb:1416:24:1416:24 | x | array_flow.rb:1417:14:1417:14 | x | +| array_flow.rb:1420:10:1420:10 | a [element] | array_flow.rb:1420:10:1420:13 | ...[...] | +| array_flow.rb:1420:10:1420:10 | a [element] | array_flow.rb:1420:10:1420:13 | ...[...] | +| array_flow.rb:1421:10:1421:10 | a [element] | array_flow.rb:1421:10:1421:13 | ...[...] | +| array_flow.rb:1421:10:1421:10 | a [element] | array_flow.rb:1421:10:1421:13 | ...[...] | +| array_flow.rb:1422:10:1422:10 | b [element] | array_flow.rb:1422:10:1422:13 | ...[...] | +| array_flow.rb:1422:10:1422:10 | b [element] | array_flow.rb:1422:10:1422:13 | ...[...] | +| array_flow.rb:1423:10:1423:10 | b [element] | array_flow.rb:1423:10:1423:13 | ...[...] | +| array_flow.rb:1423:10:1423:10 | b [element] | array_flow.rb:1423:10:1423:13 | ...[...] | +| array_flow.rb:1427:5:1427:5 | a [element 2] | array_flow.rb:1428:9:1428:9 | a [element 2] | +| array_flow.rb:1427:5:1427:5 | a [element 2] | array_flow.rb:1428:9:1428:9 | a [element 2] | +| array_flow.rb:1427:16:1427:26 | call to source | array_flow.rb:1427:5:1427:5 | a [element 2] | +| array_flow.rb:1427:16:1427:26 | call to source | array_flow.rb:1427:5:1427:5 | a [element 2] | +| array_flow.rb:1428:9:1428:9 | a [element 2] | array_flow.rb:1428:19:1428:19 | x | +| array_flow.rb:1428:9:1428:9 | a [element 2] | array_flow.rb:1428:19:1428:19 | x | +| array_flow.rb:1428:19:1428:19 | x | array_flow.rb:1429:14:1429:14 | x | +| array_flow.rb:1428:19:1428:19 | x | array_flow.rb:1429:14:1429:14 | x | +| array_flow.rb:1435:5:1435:5 | a [element 2] | array_flow.rb:1436:9:1436:9 | a [element 2] | +| array_flow.rb:1435:5:1435:5 | a [element 2] | array_flow.rb:1436:9:1436:9 | a [element 2] | +| array_flow.rb:1435:5:1435:5 | a [element 2] | array_flow.rb:1441:9:1441:9 | a [element 2] | +| array_flow.rb:1435:5:1435:5 | a [element 2] | array_flow.rb:1441:9:1441:9 | a [element 2] | +| array_flow.rb:1435:5:1435:5 | a [element 2] | array_flow.rb:1447:9:1447:9 | a [element 2] | +| array_flow.rb:1435:5:1435:5 | a [element 2] | array_flow.rb:1447:9:1447:9 | a [element 2] | +| array_flow.rb:1435:5:1435:5 | a [element 2] | array_flow.rb:1454:9:1454:9 | a [element 2] | +| array_flow.rb:1435:5:1435:5 | a [element 2] | array_flow.rb:1454:9:1454:9 | a [element 2] | +| array_flow.rb:1435:5:1435:5 | a [element 3] | array_flow.rb:1436:9:1436:9 | a [element 3] | +| array_flow.rb:1435:5:1435:5 | a [element 3] | array_flow.rb:1436:9:1436:9 | a [element 3] | +| array_flow.rb:1435:5:1435:5 | a [element 3] | array_flow.rb:1447:9:1447:9 | a [element 3] | +| array_flow.rb:1435:5:1435:5 | a [element 3] | array_flow.rb:1447:9:1447:9 | a [element 3] | +| array_flow.rb:1435:16:1435:28 | call to source | array_flow.rb:1435:5:1435:5 | a [element 2] | +| array_flow.rb:1435:16:1435:28 | call to source | array_flow.rb:1435:5:1435:5 | a [element 2] | +| array_flow.rb:1435:31:1435:43 | call to source | array_flow.rb:1435:5:1435:5 | a [element 3] | +| array_flow.rb:1435:31:1435:43 | call to source | array_flow.rb:1435:5:1435:5 | a [element 3] | +| array_flow.rb:1436:5:1436:5 | b [element 2] | array_flow.rb:1439:10:1439:10 | b [element 2] | +| array_flow.rb:1436:5:1436:5 | b [element 2] | array_flow.rb:1439:10:1439:10 | b [element 2] | +| array_flow.rb:1436:5:1436:5 | b [element 3] | array_flow.rb:1440:10:1440:10 | b [element 3] | +| array_flow.rb:1436:5:1436:5 | b [element 3] | array_flow.rb:1440:10:1440:10 | b [element 3] | +| array_flow.rb:1436:9:1436:9 | a [element 2] | array_flow.rb:1436:9:1436:17 | call to take [element 2] | +| array_flow.rb:1436:9:1436:9 | a [element 2] | array_flow.rb:1436:9:1436:17 | call to take [element 2] | +| array_flow.rb:1436:9:1436:9 | a [element 3] | array_flow.rb:1436:9:1436:17 | call to take [element 3] | +| array_flow.rb:1436:9:1436:9 | a [element 3] | array_flow.rb:1436:9:1436:17 | call to take [element 3] | +| array_flow.rb:1436:9:1436:17 | call to take [element 2] | array_flow.rb:1436:5:1436:5 | b [element 2] | +| array_flow.rb:1436:9:1436:17 | call to take [element 2] | array_flow.rb:1436:5:1436:5 | b [element 2] | +| array_flow.rb:1436:9:1436:17 | call to take [element 3] | array_flow.rb:1436:5:1436:5 | b [element 3] | +| array_flow.rb:1436:9:1436:17 | call to take [element 3] | array_flow.rb:1436:5:1436:5 | b [element 3] | +| array_flow.rb:1439:10:1439:10 | b [element 2] | array_flow.rb:1439:10:1439:13 | ...[...] | +| array_flow.rb:1439:10:1439:10 | b [element 2] | array_flow.rb:1439:10:1439:13 | ...[...] | +| array_flow.rb:1440:10:1440:10 | b [element 3] | array_flow.rb:1440:10:1440:13 | ...[...] | +| array_flow.rb:1440:10:1440:10 | b [element 3] | array_flow.rb:1440:10:1440:13 | ...[...] | +| array_flow.rb:1441:5:1441:5 | b [element 2] | array_flow.rb:1444:10:1444:10 | b [element 2] | +| array_flow.rb:1441:5:1441:5 | b [element 2] | array_flow.rb:1444:10:1444:10 | b [element 2] | +| array_flow.rb:1441:5:1441:5 | b [element 2] | array_flow.rb:1446:10:1446:10 | b [element 2] | +| array_flow.rb:1441:5:1441:5 | b [element 2] | array_flow.rb:1446:10:1446:10 | b [element 2] | +| array_flow.rb:1441:9:1441:9 | a [element 2] | array_flow.rb:1441:9:1441:17 | call to take [element 2] | +| array_flow.rb:1441:9:1441:9 | a [element 2] | array_flow.rb:1441:9:1441:17 | call to take [element 2] | +| array_flow.rb:1441:9:1441:17 | call to take [element 2] | array_flow.rb:1441:5:1441:5 | b [element 2] | +| array_flow.rb:1441:9:1441:17 | call to take [element 2] | array_flow.rb:1441:5:1441:5 | b [element 2] | +| array_flow.rb:1444:10:1444:10 | b [element 2] | array_flow.rb:1444:10:1444:13 | ...[...] | +| array_flow.rb:1444:10:1444:10 | b [element 2] | array_flow.rb:1444:10:1444:13 | ...[...] | +| array_flow.rb:1446:10:1446:10 | b [element 2] | array_flow.rb:1446:10:1446:13 | ...[...] | +| array_flow.rb:1446:10:1446:10 | b [element 2] | array_flow.rb:1446:10:1446:13 | ...[...] | +| array_flow.rb:1447:5:1447:5 | b [element 2] | array_flow.rb:1450:10:1450:10 | b [element 2] | +| array_flow.rb:1447:5:1447:5 | b [element 2] | array_flow.rb:1450:10:1450:10 | b [element 2] | +| array_flow.rb:1447:5:1447:5 | b [element 2] | array_flow.rb:1452:10:1452:10 | b [element 2] | +| array_flow.rb:1447:5:1447:5 | b [element 2] | array_flow.rb:1452:10:1452:10 | b [element 2] | +| array_flow.rb:1447:5:1447:5 | b [element 3] | array_flow.rb:1451:10:1451:10 | b [element 3] | +| array_flow.rb:1447:5:1447:5 | b [element 3] | array_flow.rb:1451:10:1451:10 | b [element 3] | +| array_flow.rb:1447:5:1447:5 | b [element 3] | array_flow.rb:1452:10:1452:10 | b [element 3] | +| array_flow.rb:1447:5:1447:5 | b [element 3] | array_flow.rb:1452:10:1452:10 | b [element 3] | +| array_flow.rb:1447:9:1447:9 | a [element 2] | array_flow.rb:1447:9:1447:19 | call to take [element 2] | +| array_flow.rb:1447:9:1447:9 | a [element 2] | array_flow.rb:1447:9:1447:19 | call to take [element 2] | +| array_flow.rb:1447:9:1447:9 | a [element 3] | array_flow.rb:1447:9:1447:19 | call to take [element 3] | +| array_flow.rb:1447:9:1447:9 | a [element 3] | array_flow.rb:1447:9:1447:19 | call to take [element 3] | +| array_flow.rb:1447:9:1447:19 | call to take [element 2] | array_flow.rb:1447:5:1447:5 | b [element 2] | +| array_flow.rb:1447:9:1447:19 | call to take [element 2] | array_flow.rb:1447:5:1447:5 | b [element 2] | +| array_flow.rb:1447:9:1447:19 | call to take [element 3] | array_flow.rb:1447:5:1447:5 | b [element 3] | +| array_flow.rb:1447:9:1447:19 | call to take [element 3] | array_flow.rb:1447:5:1447:5 | b [element 3] | +| array_flow.rb:1450:10:1450:10 | b [element 2] | array_flow.rb:1450:10:1450:13 | ...[...] | +| array_flow.rb:1450:10:1450:10 | b [element 2] | array_flow.rb:1450:10:1450:13 | ...[...] | +| array_flow.rb:1451:10:1451:10 | b [element 3] | array_flow.rb:1451:10:1451:13 | ...[...] | +| array_flow.rb:1451:10:1451:10 | b [element 3] | array_flow.rb:1451:10:1451:13 | ...[...] | +| array_flow.rb:1452:10:1452:10 | b [element 2] | array_flow.rb:1452:10:1452:13 | ...[...] | +| array_flow.rb:1452:10:1452:10 | b [element 2] | array_flow.rb:1452:10:1452:13 | ...[...] | +| array_flow.rb:1452:10:1452:10 | b [element 3] | array_flow.rb:1452:10:1452:13 | ...[...] | +| array_flow.rb:1452:10:1452:10 | b [element 3] | array_flow.rb:1452:10:1452:13 | ...[...] | +| array_flow.rb:1453:5:1453:5 | [post] a [element] | array_flow.rb:1454:9:1454:9 | a [element] | +| array_flow.rb:1453:5:1453:5 | [post] a [element] | array_flow.rb:1454:9:1454:9 | a [element] | +| array_flow.rb:1453:12:1453:24 | call to source | array_flow.rb:1453:5:1453:5 | [post] a [element] | +| array_flow.rb:1453:12:1453:24 | call to source | array_flow.rb:1453:5:1453:5 | [post] a [element] | +| array_flow.rb:1454:5:1454:5 | b [element 2] | array_flow.rb:1455:10:1455:10 | b [element 2] | +| array_flow.rb:1454:5:1454:5 | b [element 2] | array_flow.rb:1455:10:1455:10 | b [element 2] | +| array_flow.rb:1454:5:1454:5 | b [element] | array_flow.rb:1455:10:1455:10 | b [element] | +| array_flow.rb:1454:5:1454:5 | b [element] | array_flow.rb:1455:10:1455:10 | b [element] | +| array_flow.rb:1454:9:1454:9 | a [element 2] | array_flow.rb:1454:9:1454:17 | call to take [element 2] | +| array_flow.rb:1454:9:1454:9 | a [element 2] | array_flow.rb:1454:9:1454:17 | call to take [element 2] | +| array_flow.rb:1454:9:1454:9 | a [element] | array_flow.rb:1454:9:1454:17 | call to take [element] | +| array_flow.rb:1454:9:1454:9 | a [element] | array_flow.rb:1454:9:1454:17 | call to take [element] | +| array_flow.rb:1454:9:1454:17 | call to take [element 2] | array_flow.rb:1454:5:1454:5 | b [element 2] | +| array_flow.rb:1454:9:1454:17 | call to take [element 2] | array_flow.rb:1454:5:1454:5 | b [element 2] | +| array_flow.rb:1454:9:1454:17 | call to take [element] | array_flow.rb:1454:5:1454:5 | b [element] | +| array_flow.rb:1454:9:1454:17 | call to take [element] | array_flow.rb:1454:5:1454:5 | b [element] | +| array_flow.rb:1455:10:1455:10 | b [element 2] | array_flow.rb:1455:10:1455:13 | ...[...] | +| array_flow.rb:1455:10:1455:10 | b [element 2] | array_flow.rb:1455:10:1455:13 | ...[...] | +| array_flow.rb:1455:10:1455:10 | b [element] | array_flow.rb:1455:10:1455:13 | ...[...] | +| array_flow.rb:1455:10:1455:10 | b [element] | array_flow.rb:1455:10:1455:13 | ...[...] | +| array_flow.rb:1459:5:1459:5 | a [element 2] | array_flow.rb:1460:9:1460:9 | a [element 2] | +| array_flow.rb:1459:5:1459:5 | a [element 2] | array_flow.rb:1460:9:1460:9 | a [element 2] | +| array_flow.rb:1459:16:1459:26 | call to source | array_flow.rb:1459:5:1459:5 | a [element 2] | +| array_flow.rb:1459:16:1459:26 | call to source | array_flow.rb:1459:5:1459:5 | a [element 2] | +| array_flow.rb:1460:5:1460:5 | b [element 2] | array_flow.rb:1466:10:1466:10 | b [element 2] | +| array_flow.rb:1460:5:1460:5 | b [element 2] | array_flow.rb:1466:10:1466:10 | b [element 2] | +| array_flow.rb:1460:9:1460:9 | a [element 2] | array_flow.rb:1460:9:1463:7 | call to take_while [element 2] | +| array_flow.rb:1460:9:1460:9 | a [element 2] | array_flow.rb:1460:9:1463:7 | call to take_while [element 2] | +| array_flow.rb:1460:9:1460:9 | a [element 2] | array_flow.rb:1460:26:1460:26 | x | +| array_flow.rb:1460:9:1460:9 | a [element 2] | array_flow.rb:1460:26:1460:26 | x | +| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] | array_flow.rb:1460:5:1460:5 | b [element 2] | +| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] | array_flow.rb:1460:5:1460:5 | b [element 2] | +| array_flow.rb:1460:26:1460:26 | x | array_flow.rb:1461:14:1461:14 | x | +| array_flow.rb:1460:26:1460:26 | x | array_flow.rb:1461:14:1461:14 | x | +| array_flow.rb:1466:10:1466:10 | b [element 2] | array_flow.rb:1466:10:1466:13 | ...[...] | +| array_flow.rb:1466:10:1466:10 | b [element 2] | array_flow.rb:1466:10:1466:13 | ...[...] | +| array_flow.rb:1472:5:1472:5 | a [element 3] | array_flow.rb:1473:9:1473:9 | a [element 3] | +| array_flow.rb:1472:5:1472:5 | a [element 3] | array_flow.rb:1473:9:1473:9 | a [element 3] | +| array_flow.rb:1472:19:1472:29 | call to source | array_flow.rb:1472:5:1472:5 | a [element 3] | +| array_flow.rb:1472:19:1472:29 | call to source | array_flow.rb:1472:5:1472:5 | a [element 3] | +| array_flow.rb:1473:5:1473:5 | b [element 3] | array_flow.rb:1474:10:1474:10 | b [element 3] | +| array_flow.rb:1473:5:1473:5 | b [element 3] | array_flow.rb:1474:10:1474:10 | b [element 3] | +| array_flow.rb:1473:9:1473:9 | a [element 3] | array_flow.rb:1473:9:1473:14 | call to to_a [element 3] | +| array_flow.rb:1473:9:1473:9 | a [element 3] | array_flow.rb:1473:9:1473:14 | call to to_a [element 3] | +| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] | array_flow.rb:1473:5:1473:5 | b [element 3] | +| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] | array_flow.rb:1473:5:1473:5 | b [element 3] | +| array_flow.rb:1474:10:1474:10 | b [element 3] | array_flow.rb:1474:10:1474:13 | ...[...] | +| array_flow.rb:1474:10:1474:10 | b [element 3] | array_flow.rb:1474:10:1474:13 | ...[...] | +| array_flow.rb:1478:5:1478:5 | a [element 2] | array_flow.rb:1479:9:1479:9 | a [element 2] | +| array_flow.rb:1478:5:1478:5 | a [element 2] | array_flow.rb:1479:9:1479:9 | a [element 2] | +| array_flow.rb:1478:16:1478:26 | call to source | array_flow.rb:1478:5:1478:5 | a [element 2] | +| array_flow.rb:1478:16:1478:26 | call to source | array_flow.rb:1478:5:1478:5 | a [element 2] | +| array_flow.rb:1479:5:1479:5 | b [element 2] | array_flow.rb:1482:10:1482:10 | b [element 2] | +| array_flow.rb:1479:5:1479:5 | b [element 2] | array_flow.rb:1482:10:1482:10 | b [element 2] | +| array_flow.rb:1479:9:1479:9 | a [element 2] | array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] | +| array_flow.rb:1479:9:1479:9 | a [element 2] | array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] | +| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] | array_flow.rb:1479:5:1479:5 | b [element 2] | +| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] | array_flow.rb:1479:5:1479:5 | b [element 2] | +| array_flow.rb:1482:10:1482:10 | b [element 2] | array_flow.rb:1482:10:1482:13 | ...[...] | +| array_flow.rb:1482:10:1482:10 | b [element 2] | array_flow.rb:1482:10:1482:13 | ...[...] | +| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] | +| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] | +| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] | +| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] | +| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] | +| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] | +| array_flow.rb:1495:14:1495:26 | call to source | array_flow.rb:1495:5:1495:5 | a [element 0, element 1] | +| array_flow.rb:1495:14:1495:26 | call to source | array_flow.rb:1495:5:1495:5 | a [element 0, element 1] | +| array_flow.rb:1495:34:1495:46 | call to source | array_flow.rb:1495:5:1495:5 | a [element 1, element 1] | +| array_flow.rb:1495:34:1495:46 | call to source | array_flow.rb:1495:5:1495:5 | a [element 1, element 1] | +| array_flow.rb:1495:54:1495:66 | call to source | array_flow.rb:1495:5:1495:5 | a [element 2, element 1] | +| array_flow.rb:1495:54:1495:66 | call to source | array_flow.rb:1495:5:1495:5 | a [element 2, element 1] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] | array_flow.rb:1501:10:1501:10 | b [element 1, element 1] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] | array_flow.rb:1501:10:1501:10 | b [element 1, element 1] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] | array_flow.rb:1502:10:1502:10 | b [element 1, element 2] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] | array_flow.rb:1502:10:1502:10 | b [element 1, element 2] | +| array_flow.rb:1496:9:1496:9 | a [element 0, element 1] | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] | +| array_flow.rb:1496:9:1496:9 | a [element 0, element 1] | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] | +| array_flow.rb:1496:9:1496:9 | a [element 1, element 1] | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] | +| array_flow.rb:1496:9:1496:9 | a [element 1, element 1] | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] | +| array_flow.rb:1496:9:1496:9 | a [element 2, element 1] | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] | +| array_flow.rb:1496:9:1496:9 | a [element 2, element 1] | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] | array_flow.rb:1496:5:1496:5 | b [element 1, element 0] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] | array_flow.rb:1496:5:1496:5 | b [element 1, element 0] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] | array_flow.rb:1496:5:1496:5 | b [element 1, element 1] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] | array_flow.rb:1496:5:1496:5 | b [element 1, element 1] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] | array_flow.rb:1496:5:1496:5 | b [element 1, element 2] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] | array_flow.rb:1496:5:1496:5 | b [element 1, element 2] | +| array_flow.rb:1500:10:1500:10 | b [element 1, element 0] | array_flow.rb:1500:10:1500:13 | ...[...] [element 0] | +| array_flow.rb:1500:10:1500:10 | b [element 1, element 0] | array_flow.rb:1500:10:1500:13 | ...[...] [element 0] | +| array_flow.rb:1500:10:1500:13 | ...[...] [element 0] | array_flow.rb:1500:10:1500:16 | ...[...] | +| array_flow.rb:1500:10:1500:13 | ...[...] [element 0] | array_flow.rb:1500:10:1500:16 | ...[...] | +| array_flow.rb:1501:10:1501:10 | b [element 1, element 1] | array_flow.rb:1501:10:1501:13 | ...[...] [element 1] | +| array_flow.rb:1501:10:1501:10 | b [element 1, element 1] | array_flow.rb:1501:10:1501:13 | ...[...] [element 1] | +| array_flow.rb:1501:10:1501:13 | ...[...] [element 1] | array_flow.rb:1501:10:1501:16 | ...[...] | +| array_flow.rb:1501:10:1501:13 | ...[...] [element 1] | array_flow.rb:1501:10:1501:16 | ...[...] | +| array_flow.rb:1502:10:1502:10 | b [element 1, element 2] | array_flow.rb:1502:10:1502:13 | ...[...] [element 2] | +| array_flow.rb:1502:10:1502:10 | b [element 1, element 2] | array_flow.rb:1502:10:1502:13 | ...[...] [element 2] | +| array_flow.rb:1502:10:1502:13 | ...[...] [element 2] | array_flow.rb:1502:10:1502:16 | ...[...] | +| array_flow.rb:1502:10:1502:13 | ...[...] [element 2] | array_flow.rb:1502:10:1502:16 | ...[...] | +| array_flow.rb:1506:5:1506:5 | a [element 2] | array_flow.rb:1509:9:1509:9 | a [element 2] | +| array_flow.rb:1506:5:1506:5 | a [element 2] | array_flow.rb:1509:9:1509:9 | a [element 2] | +| array_flow.rb:1506:16:1506:28 | call to source | array_flow.rb:1506:5:1506:5 | a [element 2] | +| array_flow.rb:1506:16:1506:28 | call to source | array_flow.rb:1506:5:1506:5 | a [element 2] | +| array_flow.rb:1507:5:1507:5 | b [element 1] | array_flow.rb:1509:17:1509:17 | b [element 1] | +| array_flow.rb:1507:5:1507:5 | b [element 1] | array_flow.rb:1509:17:1509:17 | b [element 1] | +| array_flow.rb:1507:13:1507:25 | call to source | array_flow.rb:1507:5:1507:5 | b [element 1] | +| array_flow.rb:1507:13:1507:25 | call to source | array_flow.rb:1507:5:1507:5 | b [element 1] | +| array_flow.rb:1508:5:1508:5 | c [element 1] | array_flow.rb:1509:20:1509:20 | c [element 1] | +| array_flow.rb:1508:5:1508:5 | c [element 1] | array_flow.rb:1509:20:1509:20 | c [element 1] | +| array_flow.rb:1508:13:1508:25 | call to source | array_flow.rb:1508:5:1508:5 | c [element 1] | +| array_flow.rb:1508:13:1508:25 | call to source | array_flow.rb:1508:5:1508:5 | c [element 1] | +| array_flow.rb:1509:5:1509:5 | d [element] | array_flow.rb:1510:10:1510:10 | d [element] | +| array_flow.rb:1509:5:1509:5 | d [element] | array_flow.rb:1510:10:1510:10 | d [element] | +| array_flow.rb:1509:5:1509:5 | d [element] | array_flow.rb:1511:10:1511:10 | d [element] | +| array_flow.rb:1509:5:1509:5 | d [element] | array_flow.rb:1511:10:1511:10 | d [element] | +| array_flow.rb:1509:5:1509:5 | d [element] | array_flow.rb:1512:10:1512:10 | d [element] | +| array_flow.rb:1509:5:1509:5 | d [element] | array_flow.rb:1512:10:1512:10 | d [element] | +| array_flow.rb:1509:9:1509:9 | a [element 2] | array_flow.rb:1509:9:1509:21 | call to union [element] | +| array_flow.rb:1509:9:1509:9 | a [element 2] | array_flow.rb:1509:9:1509:21 | call to union [element] | +| array_flow.rb:1509:9:1509:21 | call to union [element] | array_flow.rb:1509:5:1509:5 | d [element] | +| array_flow.rb:1509:9:1509:21 | call to union [element] | array_flow.rb:1509:5:1509:5 | d [element] | +| array_flow.rb:1509:17:1509:17 | b [element 1] | array_flow.rb:1509:9:1509:21 | call to union [element] | +| array_flow.rb:1509:17:1509:17 | b [element 1] | array_flow.rb:1509:9:1509:21 | call to union [element] | +| array_flow.rb:1509:20:1509:20 | c [element 1] | array_flow.rb:1509:9:1509:21 | call to union [element] | +| array_flow.rb:1509:20:1509:20 | c [element 1] | array_flow.rb:1509:9:1509:21 | call to union [element] | +| array_flow.rb:1510:10:1510:10 | d [element] | array_flow.rb:1510:10:1510:13 | ...[...] | +| array_flow.rb:1510:10:1510:10 | d [element] | array_flow.rb:1510:10:1510:13 | ...[...] | +| array_flow.rb:1511:10:1511:10 | d [element] | array_flow.rb:1511:10:1511:13 | ...[...] | +| array_flow.rb:1511:10:1511:10 | d [element] | array_flow.rb:1511:10:1511:13 | ...[...] | +| array_flow.rb:1512:10:1512:10 | d [element] | array_flow.rb:1512:10:1512:13 | ...[...] | +| array_flow.rb:1512:10:1512:10 | d [element] | array_flow.rb:1512:10:1512:13 | ...[...] | +| array_flow.rb:1516:5:1516:5 | a [element 3] | array_flow.rb:1518:9:1518:9 | a [element 3] | +| array_flow.rb:1516:5:1516:5 | a [element 3] | array_flow.rb:1518:9:1518:9 | a [element 3] | +| array_flow.rb:1516:5:1516:5 | a [element 3] | array_flow.rb:1522:9:1522:9 | a [element 3] | +| array_flow.rb:1516:5:1516:5 | a [element 3] | array_flow.rb:1522:9:1522:9 | a [element 3] | +| array_flow.rb:1516:5:1516:5 | a [element 4] | array_flow.rb:1518:9:1518:9 | a [element 4] | +| array_flow.rb:1516:5:1516:5 | a [element 4] | array_flow.rb:1518:9:1518:9 | a [element 4] | +| array_flow.rb:1516:5:1516:5 | a [element 4] | array_flow.rb:1522:9:1522:9 | a [element 4] | +| array_flow.rb:1516:5:1516:5 | a [element 4] | array_flow.rb:1522:9:1522:9 | a [element 4] | +| array_flow.rb:1516:19:1516:31 | call to source | array_flow.rb:1516:5:1516:5 | a [element 3] | +| array_flow.rb:1516:19:1516:31 | call to source | array_flow.rb:1516:5:1516:5 | a [element 3] | +| array_flow.rb:1516:34:1516:46 | call to source | array_flow.rb:1516:5:1516:5 | a [element 4] | +| array_flow.rb:1516:34:1516:46 | call to source | array_flow.rb:1516:5:1516:5 | a [element 4] | +| array_flow.rb:1518:5:1518:5 | b [element] | array_flow.rb:1519:10:1519:10 | b [element] | +| array_flow.rb:1518:5:1518:5 | b [element] | array_flow.rb:1519:10:1519:10 | b [element] | +| array_flow.rb:1518:5:1518:5 | b [element] | array_flow.rb:1520:10:1520:10 | b [element] | +| array_flow.rb:1518:5:1518:5 | b [element] | array_flow.rb:1520:10:1520:10 | b [element] | +| array_flow.rb:1518:9:1518:9 | a [element 3] | array_flow.rb:1518:9:1518:14 | call to uniq [element] | +| array_flow.rb:1518:9:1518:9 | a [element 3] | array_flow.rb:1518:9:1518:14 | call to uniq [element] | +| array_flow.rb:1518:9:1518:9 | a [element 4] | array_flow.rb:1518:9:1518:14 | call to uniq [element] | +| array_flow.rb:1518:9:1518:9 | a [element 4] | array_flow.rb:1518:9:1518:14 | call to uniq [element] | +| array_flow.rb:1518:9:1518:14 | call to uniq [element] | array_flow.rb:1518:5:1518:5 | b [element] | +| array_flow.rb:1518:9:1518:14 | call to uniq [element] | array_flow.rb:1518:5:1518:5 | b [element] | +| array_flow.rb:1519:10:1519:10 | b [element] | array_flow.rb:1519:10:1519:13 | ...[...] | +| array_flow.rb:1519:10:1519:10 | b [element] | array_flow.rb:1519:10:1519:13 | ...[...] | +| array_flow.rb:1520:10:1520:10 | b [element] | array_flow.rb:1520:10:1520:13 | ...[...] | +| array_flow.rb:1520:10:1520:10 | b [element] | array_flow.rb:1520:10:1520:13 | ...[...] | +| array_flow.rb:1522:5:1522:5 | c [element] | array_flow.rb:1526:10:1526:10 | c [element] | +| array_flow.rb:1522:5:1522:5 | c [element] | array_flow.rb:1526:10:1526:10 | c [element] | +| array_flow.rb:1522:9:1522:9 | a [element 3] | array_flow.rb:1522:9:1525:7 | call to uniq [element] | +| array_flow.rb:1522:9:1522:9 | a [element 3] | array_flow.rb:1522:9:1525:7 | call to uniq [element] | +| array_flow.rb:1522:9:1522:9 | a [element 3] | array_flow.rb:1522:20:1522:20 | x | +| array_flow.rb:1522:9:1522:9 | a [element 3] | array_flow.rb:1522:20:1522:20 | x | +| array_flow.rb:1522:9:1522:9 | a [element 4] | array_flow.rb:1522:9:1525:7 | call to uniq [element] | +| array_flow.rb:1522:9:1522:9 | a [element 4] | array_flow.rb:1522:9:1525:7 | call to uniq [element] | +| array_flow.rb:1522:9:1522:9 | a [element 4] | array_flow.rb:1522:20:1522:20 | x | +| array_flow.rb:1522:9:1522:9 | a [element 4] | array_flow.rb:1522:20:1522:20 | x | +| array_flow.rb:1522:9:1525:7 | call to uniq [element] | array_flow.rb:1522:5:1522:5 | c [element] | +| array_flow.rb:1522:9:1525:7 | call to uniq [element] | array_flow.rb:1522:5:1522:5 | c [element] | +| array_flow.rb:1522:20:1522:20 | x | array_flow.rb:1523:14:1523:14 | x | +| array_flow.rb:1522:20:1522:20 | x | array_flow.rb:1523:14:1523:14 | x | +| array_flow.rb:1526:10:1526:10 | c [element] | array_flow.rb:1526:10:1526:13 | ...[...] | +| array_flow.rb:1526:10:1526:10 | c [element] | array_flow.rb:1526:10:1526:13 | ...[...] | +| array_flow.rb:1530:5:1530:5 | a [element 2] | array_flow.rb:1531:9:1531:9 | a [element 2] | +| array_flow.rb:1530:5:1530:5 | a [element 2] | array_flow.rb:1531:9:1531:9 | a [element 2] | +| array_flow.rb:1530:5:1530:5 | a [element 3] | array_flow.rb:1531:9:1531:9 | a [element 3] | +| array_flow.rb:1530:5:1530:5 | a [element 3] | array_flow.rb:1531:9:1531:9 | a [element 3] | +| array_flow.rb:1530:16:1530:28 | call to source | array_flow.rb:1530:5:1530:5 | a [element 2] | +| array_flow.rb:1530:16:1530:28 | call to source | array_flow.rb:1530:5:1530:5 | a [element 2] | +| array_flow.rb:1530:31:1530:43 | call to source | array_flow.rb:1530:5:1530:5 | a [element 3] | +| array_flow.rb:1530:31:1530:43 | call to source | array_flow.rb:1530:5:1530:5 | a [element 3] | +| array_flow.rb:1531:5:1531:5 | b [element] | array_flow.rb:1532:10:1532:10 | b [element] | +| array_flow.rb:1531:5:1531:5 | b [element] | array_flow.rb:1532:10:1532:10 | b [element] | +| array_flow.rb:1531:5:1531:5 | b [element] | array_flow.rb:1533:10:1533:10 | b [element] | +| array_flow.rb:1531:5:1531:5 | b [element] | array_flow.rb:1533:10:1533:10 | b [element] | +| array_flow.rb:1531:9:1531:9 | [post] a [element] | array_flow.rb:1534:10:1534:10 | a [element] | +| array_flow.rb:1531:9:1531:9 | [post] a [element] | array_flow.rb:1534:10:1534:10 | a [element] | +| array_flow.rb:1531:9:1531:9 | [post] a [element] | array_flow.rb:1535:10:1535:10 | a [element] | +| array_flow.rb:1531:9:1531:9 | [post] a [element] | array_flow.rb:1535:10:1535:10 | a [element] | +| array_flow.rb:1531:9:1531:9 | a [element 2] | array_flow.rb:1531:9:1531:9 | [post] a [element] | +| array_flow.rb:1531:9:1531:9 | a [element 2] | array_flow.rb:1531:9:1531:9 | [post] a [element] | +| array_flow.rb:1531:9:1531:9 | a [element 2] | array_flow.rb:1531:9:1531:15 | call to uniq! [element] | +| array_flow.rb:1531:9:1531:9 | a [element 2] | array_flow.rb:1531:9:1531:15 | call to uniq! [element] | +| array_flow.rb:1531:9:1531:9 | a [element 3] | array_flow.rb:1531:9:1531:9 | [post] a [element] | +| array_flow.rb:1531:9:1531:9 | a [element 3] | array_flow.rb:1531:9:1531:9 | [post] a [element] | +| array_flow.rb:1531:9:1531:9 | a [element 3] | array_flow.rb:1531:9:1531:15 | call to uniq! [element] | +| array_flow.rb:1531:9:1531:9 | a [element 3] | array_flow.rb:1531:9:1531:15 | call to uniq! [element] | +| array_flow.rb:1531:9:1531:15 | call to uniq! [element] | array_flow.rb:1531:5:1531:5 | b [element] | +| array_flow.rb:1531:9:1531:15 | call to uniq! [element] | array_flow.rb:1531:5:1531:5 | b [element] | +| array_flow.rb:1532:10:1532:10 | b [element] | array_flow.rb:1532:10:1532:13 | ...[...] | +| array_flow.rb:1532:10:1532:10 | b [element] | array_flow.rb:1532:10:1532:13 | ...[...] | +| array_flow.rb:1533:10:1533:10 | b [element] | array_flow.rb:1533:10:1533:13 | ...[...] | +| array_flow.rb:1533:10:1533:10 | b [element] | array_flow.rb:1533:10:1533:13 | ...[...] | +| array_flow.rb:1534:10:1534:10 | a [element] | array_flow.rb:1534:10:1534:13 | ...[...] | +| array_flow.rb:1534:10:1534:10 | a [element] | array_flow.rb:1534:10:1534:13 | ...[...] | +| array_flow.rb:1535:10:1535:10 | a [element] | array_flow.rb:1535:10:1535:13 | ...[...] | +| array_flow.rb:1535:10:1535:10 | a [element] | array_flow.rb:1535:10:1535:13 | ...[...] | +| array_flow.rb:1537:5:1537:5 | a [element 2] | array_flow.rb:1538:9:1538:9 | a [element 2] | +| array_flow.rb:1537:5:1537:5 | a [element 2] | array_flow.rb:1538:9:1538:9 | a [element 2] | +| array_flow.rb:1537:5:1537:5 | a [element 3] | array_flow.rb:1538:9:1538:9 | a [element 3] | +| array_flow.rb:1537:5:1537:5 | a [element 3] | array_flow.rb:1538:9:1538:9 | a [element 3] | +| array_flow.rb:1537:16:1537:28 | call to source | array_flow.rb:1537:5:1537:5 | a [element 2] | +| array_flow.rb:1537:16:1537:28 | call to source | array_flow.rb:1537:5:1537:5 | a [element 2] | +| array_flow.rb:1537:31:1537:43 | call to source | array_flow.rb:1537:5:1537:5 | a [element 3] | +| array_flow.rb:1537:31:1537:43 | call to source | array_flow.rb:1537:5:1537:5 | a [element 3] | +| array_flow.rb:1538:5:1538:5 | b [element] | array_flow.rb:1542:10:1542:10 | b [element] | +| array_flow.rb:1538:5:1538:5 | b [element] | array_flow.rb:1542:10:1542:10 | b [element] | +| array_flow.rb:1538:5:1538:5 | b [element] | array_flow.rb:1543:10:1543:10 | b [element] | +| array_flow.rb:1538:5:1538:5 | b [element] | array_flow.rb:1543:10:1543:10 | b [element] | +| array_flow.rb:1538:9:1538:9 | [post] a [element] | array_flow.rb:1544:10:1544:10 | a [element] | +| array_flow.rb:1538:9:1538:9 | [post] a [element] | array_flow.rb:1544:10:1544:10 | a [element] | +| array_flow.rb:1538:9:1538:9 | [post] a [element] | array_flow.rb:1545:10:1545:10 | a [element] | +| array_flow.rb:1538:9:1538:9 | [post] a [element] | array_flow.rb:1545:10:1545:10 | a [element] | +| array_flow.rb:1538:9:1538:9 | a [element 2] | array_flow.rb:1538:9:1538:9 | [post] a [element] | +| array_flow.rb:1538:9:1538:9 | a [element 2] | array_flow.rb:1538:9:1538:9 | [post] a [element] | +| array_flow.rb:1538:9:1538:9 | a [element 2] | array_flow.rb:1538:9:1541:7 | call to uniq! [element] | +| array_flow.rb:1538:9:1538:9 | a [element 2] | array_flow.rb:1538:9:1541:7 | call to uniq! [element] | +| array_flow.rb:1538:9:1538:9 | a [element 2] | array_flow.rb:1538:21:1538:21 | x | +| array_flow.rb:1538:9:1538:9 | a [element 2] | array_flow.rb:1538:21:1538:21 | x | +| array_flow.rb:1538:9:1538:9 | a [element 3] | array_flow.rb:1538:9:1538:9 | [post] a [element] | +| array_flow.rb:1538:9:1538:9 | a [element 3] | array_flow.rb:1538:9:1538:9 | [post] a [element] | +| array_flow.rb:1538:9:1538:9 | a [element 3] | array_flow.rb:1538:9:1541:7 | call to uniq! [element] | +| array_flow.rb:1538:9:1538:9 | a [element 3] | array_flow.rb:1538:9:1541:7 | call to uniq! [element] | +| array_flow.rb:1538:9:1538:9 | a [element 3] | array_flow.rb:1538:21:1538:21 | x | +| array_flow.rb:1538:9:1538:9 | a [element 3] | array_flow.rb:1538:21:1538:21 | x | +| array_flow.rb:1538:9:1541:7 | call to uniq! [element] | array_flow.rb:1538:5:1538:5 | b [element] | +| array_flow.rb:1538:9:1541:7 | call to uniq! [element] | array_flow.rb:1538:5:1538:5 | b [element] | +| array_flow.rb:1538:21:1538:21 | x | array_flow.rb:1539:14:1539:14 | x | +| array_flow.rb:1538:21:1538:21 | x | array_flow.rb:1539:14:1539:14 | x | +| array_flow.rb:1542:10:1542:10 | b [element] | array_flow.rb:1542:10:1542:13 | ...[...] | +| array_flow.rb:1542:10:1542:10 | b [element] | array_flow.rb:1542:10:1542:13 | ...[...] | +| array_flow.rb:1543:10:1543:10 | b [element] | array_flow.rb:1543:10:1543:13 | ...[...] | +| array_flow.rb:1543:10:1543:10 | b [element] | array_flow.rb:1543:10:1543:13 | ...[...] | +| array_flow.rb:1544:10:1544:10 | a [element] | array_flow.rb:1544:10:1544:13 | ...[...] | +| array_flow.rb:1544:10:1544:10 | a [element] | array_flow.rb:1544:10:1544:13 | ...[...] | +| array_flow.rb:1545:10:1545:10 | a [element] | array_flow.rb:1545:10:1545:13 | ...[...] | +| array_flow.rb:1545:10:1545:10 | a [element] | array_flow.rb:1545:10:1545:13 | ...[...] | +| array_flow.rb:1549:5:1549:5 | a [element 2] | array_flow.rb:1550:5:1550:5 | a [element 2] | +| array_flow.rb:1549:5:1549:5 | a [element 2] | array_flow.rb:1550:5:1550:5 | a [element 2] | +| array_flow.rb:1549:16:1549:28 | call to source | array_flow.rb:1549:5:1549:5 | a [element 2] | +| array_flow.rb:1549:16:1549:28 | call to source | array_flow.rb:1549:5:1549:5 | a [element 2] | +| array_flow.rb:1550:5:1550:5 | [post] a [element 2] | array_flow.rb:1553:10:1553:10 | a [element 2] | +| array_flow.rb:1550:5:1550:5 | [post] a [element 2] | array_flow.rb:1553:10:1553:10 | a [element 2] | +| array_flow.rb:1550:5:1550:5 | [post] a [element 5] | array_flow.rb:1556:10:1556:10 | a [element 5] | +| array_flow.rb:1550:5:1550:5 | [post] a [element 5] | array_flow.rb:1556:10:1556:10 | a [element 5] | +| array_flow.rb:1550:5:1550:5 | a [element 2] | array_flow.rb:1550:5:1550:5 | [post] a [element 5] | +| array_flow.rb:1550:5:1550:5 | a [element 2] | array_flow.rb:1550:5:1550:5 | [post] a [element 5] | +| array_flow.rb:1550:21:1550:33 | call to source | array_flow.rb:1550:5:1550:5 | [post] a [element 2] | +| array_flow.rb:1550:21:1550:33 | call to source | array_flow.rb:1550:5:1550:5 | [post] a [element 2] | +| array_flow.rb:1553:10:1553:10 | a [element 2] | array_flow.rb:1553:10:1553:13 | ...[...] | +| array_flow.rb:1553:10:1553:10 | a [element 2] | array_flow.rb:1553:10:1553:13 | ...[...] | +| array_flow.rb:1556:10:1556:10 | a [element 5] | array_flow.rb:1556:10:1556:13 | ...[...] | +| array_flow.rb:1556:10:1556:10 | a [element 5] | array_flow.rb:1556:10:1556:13 | ...[...] | +| array_flow.rb:1560:5:1560:5 | a [element 1] | array_flow.rb:1562:9:1562:9 | a [element 1] | +| array_flow.rb:1560:5:1560:5 | a [element 1] | array_flow.rb:1562:9:1562:9 | a [element 1] | +| array_flow.rb:1560:5:1560:5 | a [element 1] | array_flow.rb:1568:9:1568:9 | a [element 1] | +| array_flow.rb:1560:5:1560:5 | a [element 1] | array_flow.rb:1568:9:1568:9 | a [element 1] | +| array_flow.rb:1560:5:1560:5 | a [element 1] | array_flow.rb:1572:9:1572:9 | a [element 1] | +| array_flow.rb:1560:5:1560:5 | a [element 1] | array_flow.rb:1572:9:1572:9 | a [element 1] | +| array_flow.rb:1560:5:1560:5 | a [element 1] | array_flow.rb:1576:9:1576:9 | a [element 1] | +| array_flow.rb:1560:5:1560:5 | a [element 1] | array_flow.rb:1576:9:1576:9 | a [element 1] | +| array_flow.rb:1560:5:1560:5 | a [element 3] | array_flow.rb:1568:9:1568:9 | a [element 3] | +| array_flow.rb:1560:5:1560:5 | a [element 3] | array_flow.rb:1568:9:1568:9 | a [element 3] | +| array_flow.rb:1560:5:1560:5 | a [element 3] | array_flow.rb:1572:9:1572:9 | a [element 3] | +| array_flow.rb:1560:5:1560:5 | a [element 3] | array_flow.rb:1572:9:1572:9 | a [element 3] | +| array_flow.rb:1560:5:1560:5 | a [element 3] | array_flow.rb:1576:9:1576:9 | a [element 3] | +| array_flow.rb:1560:5:1560:5 | a [element 3] | array_flow.rb:1576:9:1576:9 | a [element 3] | +| array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1560:5:1560:5 | a [element 1] | +| array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1560:5:1560:5 | a [element 1] | +| array_flow.rb:1560:31:1560:43 | call to source | array_flow.rb:1560:5:1560:5 | a [element 3] | +| array_flow.rb:1560:31:1560:43 | call to source | array_flow.rb:1560:5:1560:5 | a [element 3] | +| array_flow.rb:1562:5:1562:5 | b [element 1] | array_flow.rb:1564:10:1564:10 | b [element 1] | +| array_flow.rb:1562:5:1562:5 | b [element 1] | array_flow.rb:1564:10:1564:10 | b [element 1] | +| array_flow.rb:1562:5:1562:5 | b [element 3] | array_flow.rb:1566:10:1566:10 | b [element 3] | +| array_flow.rb:1562:5:1562:5 | b [element 3] | array_flow.rb:1566:10:1566:10 | b [element 3] | +| array_flow.rb:1562:9:1562:9 | a [element 1] | array_flow.rb:1562:9:1562:31 | call to values_at [element 1] | +| array_flow.rb:1562:9:1562:9 | a [element 1] | array_flow.rb:1562:9:1562:31 | call to values_at [element 1] | +| array_flow.rb:1562:9:1562:9 | a [element 1] | array_flow.rb:1562:9:1562:31 | call to values_at [element 3] | +| array_flow.rb:1562:9:1562:9 | a [element 1] | array_flow.rb:1562:9:1562:31 | call to values_at [element 3] | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] | array_flow.rb:1562:5:1562:5 | b [element 1] | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] | array_flow.rb:1562:5:1562:5 | b [element 1] | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] | array_flow.rb:1562:5:1562:5 | b [element 3] | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] | array_flow.rb:1562:5:1562:5 | b [element 3] | +| array_flow.rb:1564:10:1564:10 | b [element 1] | array_flow.rb:1564:10:1564:13 | ...[...] | +| array_flow.rb:1564:10:1564:10 | b [element 1] | array_flow.rb:1564:10:1564:13 | ...[...] | +| array_flow.rb:1566:10:1566:10 | b [element 3] | array_flow.rb:1566:10:1566:13 | ...[...] | +| array_flow.rb:1566:10:1566:10 | b [element 3] | array_flow.rb:1566:10:1566:13 | ...[...] | +| array_flow.rb:1568:5:1568:5 | b [element] | array_flow.rb:1569:10:1569:10 | b [element] | +| array_flow.rb:1568:5:1568:5 | b [element] | array_flow.rb:1569:10:1569:10 | b [element] | +| array_flow.rb:1568:5:1568:5 | b [element] | array_flow.rb:1570:10:1570:10 | b [element] | +| array_flow.rb:1568:5:1568:5 | b [element] | array_flow.rb:1570:10:1570:10 | b [element] | +| array_flow.rb:1568:9:1568:9 | a [element 1] | array_flow.rb:1568:9:1568:25 | call to values_at [element] | +| array_flow.rb:1568:9:1568:9 | a [element 1] | array_flow.rb:1568:9:1568:25 | call to values_at [element] | +| array_flow.rb:1568:9:1568:9 | a [element 3] | array_flow.rb:1568:9:1568:25 | call to values_at [element] | +| array_flow.rb:1568:9:1568:9 | a [element 3] | array_flow.rb:1568:9:1568:25 | call to values_at [element] | +| array_flow.rb:1568:9:1568:25 | call to values_at [element] | array_flow.rb:1568:5:1568:5 | b [element] | +| array_flow.rb:1568:9:1568:25 | call to values_at [element] | array_flow.rb:1568:5:1568:5 | b [element] | +| array_flow.rb:1569:10:1569:10 | b [element] | array_flow.rb:1569:10:1569:13 | ...[...] | +| array_flow.rb:1569:10:1569:10 | b [element] | array_flow.rb:1569:10:1569:13 | ...[...] | +| array_flow.rb:1570:10:1570:10 | b [element] | array_flow.rb:1570:10:1570:13 | ...[...] | +| array_flow.rb:1570:10:1570:10 | b [element] | array_flow.rb:1570:10:1570:13 | ...[...] | +| array_flow.rb:1572:5:1572:5 | b [element] | array_flow.rb:1573:10:1573:10 | b [element] | +| array_flow.rb:1572:5:1572:5 | b [element] | array_flow.rb:1573:10:1573:10 | b [element] | +| array_flow.rb:1572:5:1572:5 | b [element] | array_flow.rb:1574:10:1574:10 | b [element] | +| array_flow.rb:1572:5:1572:5 | b [element] | array_flow.rb:1574:10:1574:10 | b [element] | +| array_flow.rb:1572:9:1572:9 | a [element 1] | array_flow.rb:1572:9:1572:26 | call to values_at [element] | +| array_flow.rb:1572:9:1572:9 | a [element 1] | array_flow.rb:1572:9:1572:26 | call to values_at [element] | +| array_flow.rb:1572:9:1572:9 | a [element 3] | array_flow.rb:1572:9:1572:26 | call to values_at [element] | +| array_flow.rb:1572:9:1572:9 | a [element 3] | array_flow.rb:1572:9:1572:26 | call to values_at [element] | +| array_flow.rb:1572:9:1572:26 | call to values_at [element] | array_flow.rb:1572:5:1572:5 | b [element] | +| array_flow.rb:1572:9:1572:26 | call to values_at [element] | array_flow.rb:1572:5:1572:5 | b [element] | +| array_flow.rb:1573:10:1573:10 | b [element] | array_flow.rb:1573:10:1573:13 | ...[...] | +| array_flow.rb:1573:10:1573:10 | b [element] | array_flow.rb:1573:10:1573:13 | ...[...] | +| array_flow.rb:1574:10:1574:10 | b [element] | array_flow.rb:1574:10:1574:13 | ...[...] | +| array_flow.rb:1574:10:1574:10 | b [element] | array_flow.rb:1574:10:1574:13 | ...[...] | +| array_flow.rb:1576:5:1576:5 | b [element 1] | array_flow.rb:1578:10:1578:10 | b [element 1] | +| array_flow.rb:1576:5:1576:5 | b [element 1] | array_flow.rb:1578:10:1578:10 | b [element 1] | +| array_flow.rb:1576:5:1576:5 | b [element] | array_flow.rb:1577:10:1577:10 | b [element] | +| array_flow.rb:1576:5:1576:5 | b [element] | array_flow.rb:1577:10:1577:10 | b [element] | +| array_flow.rb:1576:5:1576:5 | b [element] | array_flow.rb:1578:10:1578:10 | b [element] | +| array_flow.rb:1576:5:1576:5 | b [element] | array_flow.rb:1578:10:1578:10 | b [element] | +| array_flow.rb:1576:5:1576:5 | b [element] | array_flow.rb:1579:10:1579:10 | b [element] | +| array_flow.rb:1576:5:1576:5 | b [element] | array_flow.rb:1579:10:1579:10 | b [element] | +| array_flow.rb:1576:5:1576:5 | b [element] | array_flow.rb:1580:10:1580:10 | b [element] | +| array_flow.rb:1576:5:1576:5 | b [element] | array_flow.rb:1580:10:1580:10 | b [element] | +| array_flow.rb:1576:9:1576:9 | a [element 1] | array_flow.rb:1576:9:1576:28 | call to values_at [element] | +| array_flow.rb:1576:9:1576:9 | a [element 1] | array_flow.rb:1576:9:1576:28 | call to values_at [element] | +| array_flow.rb:1576:9:1576:9 | a [element 3] | array_flow.rb:1576:9:1576:28 | call to values_at [element 1] | +| array_flow.rb:1576:9:1576:9 | a [element 3] | array_flow.rb:1576:9:1576:28 | call to values_at [element 1] | +| array_flow.rb:1576:9:1576:9 | a [element 3] | array_flow.rb:1576:9:1576:28 | call to values_at [element] | +| array_flow.rb:1576:9:1576:9 | a [element 3] | array_flow.rb:1576:9:1576:28 | call to values_at [element] | +| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] | array_flow.rb:1576:5:1576:5 | b [element 1] | +| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] | array_flow.rb:1576:5:1576:5 | b [element 1] | +| array_flow.rb:1576:9:1576:28 | call to values_at [element] | array_flow.rb:1576:5:1576:5 | b [element] | +| array_flow.rb:1576:9:1576:28 | call to values_at [element] | array_flow.rb:1576:5:1576:5 | b [element] | +| array_flow.rb:1577:10:1577:10 | b [element] | array_flow.rb:1577:10:1577:13 | ...[...] | +| array_flow.rb:1577:10:1577:10 | b [element] | array_flow.rb:1577:10:1577:13 | ...[...] | +| array_flow.rb:1578:10:1578:10 | b [element 1] | array_flow.rb:1578:10:1578:13 | ...[...] | +| array_flow.rb:1578:10:1578:10 | b [element 1] | array_flow.rb:1578:10:1578:13 | ...[...] | +| array_flow.rb:1578:10:1578:10 | b [element] | array_flow.rb:1578:10:1578:13 | ...[...] | +| array_flow.rb:1578:10:1578:10 | b [element] | array_flow.rb:1578:10:1578:13 | ...[...] | +| array_flow.rb:1579:10:1579:10 | b [element] | array_flow.rb:1579:10:1579:13 | ...[...] | +| array_flow.rb:1579:10:1579:10 | b [element] | array_flow.rb:1579:10:1579:13 | ...[...] | +| array_flow.rb:1580:10:1580:10 | b [element] | array_flow.rb:1580:10:1580:13 | ...[...] | +| array_flow.rb:1580:10:1580:10 | b [element] | array_flow.rb:1580:10:1580:13 | ...[...] | +| array_flow.rb:1584:5:1584:5 | a [element 2] | array_flow.rb:1587:9:1587:9 | a [element 2] | +| array_flow.rb:1584:5:1584:5 | a [element 2] | array_flow.rb:1587:9:1587:9 | a [element 2] | +| array_flow.rb:1584:5:1584:5 | a [element 2] | array_flow.rb:1592:5:1592:5 | a [element 2] | +| array_flow.rb:1584:5:1584:5 | a [element 2] | array_flow.rb:1592:5:1592:5 | a [element 2] | +| array_flow.rb:1584:16:1584:28 | call to source | array_flow.rb:1584:5:1584:5 | a [element 2] | +| array_flow.rb:1584:16:1584:28 | call to source | array_flow.rb:1584:5:1584:5 | a [element 2] | +| array_flow.rb:1585:5:1585:5 | b [element 1] | array_flow.rb:1587:15:1587:15 | b [element 1] | +| array_flow.rb:1585:5:1585:5 | b [element 1] | array_flow.rb:1587:15:1587:15 | b [element 1] | +| array_flow.rb:1585:5:1585:5 | b [element 1] | array_flow.rb:1592:11:1592:11 | b [element 1] | +| array_flow.rb:1585:5:1585:5 | b [element 1] | array_flow.rb:1592:11:1592:11 | b [element 1] | +| array_flow.rb:1585:13:1585:25 | call to source | array_flow.rb:1585:5:1585:5 | b [element 1] | +| array_flow.rb:1585:13:1585:25 | call to source | array_flow.rb:1585:5:1585:5 | b [element 1] | +| array_flow.rb:1586:5:1586:5 | c [element 0] | array_flow.rb:1587:18:1587:18 | c [element 0] | +| array_flow.rb:1586:5:1586:5 | c [element 0] | array_flow.rb:1587:18:1587:18 | c [element 0] | +| array_flow.rb:1586:5:1586:5 | c [element 0] | array_flow.rb:1592:14:1592:14 | c [element 0] | +| array_flow.rb:1586:5:1586:5 | c [element 0] | array_flow.rb:1592:14:1592:14 | c [element 0] | +| array_flow.rb:1586:10:1586:22 | call to source | array_flow.rb:1586:5:1586:5 | c [element 0] | +| array_flow.rb:1586:10:1586:22 | call to source | array_flow.rb:1586:5:1586:5 | c [element 0] | +| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] | array_flow.rb:1589:10:1589:10 | d [element 0, element 2] | +| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] | array_flow.rb:1589:10:1589:10 | d [element 0, element 2] | +| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] | array_flow.rb:1590:10:1590:10 | d [element 1, element 1] | +| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] | array_flow.rb:1590:10:1590:10 | d [element 1, element 1] | +| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] | array_flow.rb:1591:10:1591:10 | d [element 2, element 0] | +| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] | array_flow.rb:1591:10:1591:10 | d [element 2, element 0] | +| array_flow.rb:1587:9:1587:9 | a [element 2] | array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] | +| array_flow.rb:1587:9:1587:9 | a [element 2] | array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] | array_flow.rb:1587:5:1587:5 | d [element 0, element 2] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] | array_flow.rb:1587:5:1587:5 | d [element 0, element 2] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] | array_flow.rb:1587:5:1587:5 | d [element 1, element 1] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] | array_flow.rb:1587:5:1587:5 | d [element 1, element 1] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] | array_flow.rb:1587:5:1587:5 | d [element 2, element 0] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] | array_flow.rb:1587:5:1587:5 | d [element 2, element 0] | +| array_flow.rb:1587:15:1587:15 | b [element 1] | array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] | +| array_flow.rb:1587:15:1587:15 | b [element 1] | array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] | +| array_flow.rb:1587:18:1587:18 | c [element 0] | array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] | +| array_flow.rb:1587:18:1587:18 | c [element 0] | array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] | +| array_flow.rb:1589:10:1589:10 | d [element 0, element 2] | array_flow.rb:1589:10:1589:13 | ...[...] [element 2] | +| array_flow.rb:1589:10:1589:10 | d [element 0, element 2] | array_flow.rb:1589:10:1589:13 | ...[...] [element 2] | +| array_flow.rb:1589:10:1589:13 | ...[...] [element 2] | array_flow.rb:1589:10:1589:16 | ...[...] | +| array_flow.rb:1589:10:1589:13 | ...[...] [element 2] | array_flow.rb:1589:10:1589:16 | ...[...] | +| array_flow.rb:1590:10:1590:10 | d [element 1, element 1] | array_flow.rb:1590:10:1590:13 | ...[...] [element 1] | +| array_flow.rb:1590:10:1590:10 | d [element 1, element 1] | array_flow.rb:1590:10:1590:13 | ...[...] [element 1] | +| array_flow.rb:1590:10:1590:13 | ...[...] [element 1] | array_flow.rb:1590:10:1590:16 | ...[...] | +| array_flow.rb:1590:10:1590:13 | ...[...] [element 1] | array_flow.rb:1590:10:1590:16 | ...[...] | +| array_flow.rb:1591:10:1591:10 | d [element 2, element 0] | array_flow.rb:1591:10:1591:13 | ...[...] [element 0] | +| array_flow.rb:1591:10:1591:10 | d [element 2, element 0] | array_flow.rb:1591:10:1591:13 | ...[...] [element 0] | +| array_flow.rb:1591:10:1591:13 | ...[...] [element 0] | array_flow.rb:1591:10:1591:16 | ...[...] | +| array_flow.rb:1591:10:1591:13 | ...[...] [element 0] | array_flow.rb:1591:10:1591:16 | ...[...] | +| array_flow.rb:1592:5:1592:5 | a [element 2] | array_flow.rb:1592:21:1592:21 | x [element 0] | +| array_flow.rb:1592:5:1592:5 | a [element 2] | array_flow.rb:1592:21:1592:21 | x [element 0] | +| array_flow.rb:1592:11:1592:11 | b [element 1] | array_flow.rb:1592:21:1592:21 | x [element 1] | +| array_flow.rb:1592:11:1592:11 | b [element 1] | array_flow.rb:1592:21:1592:21 | x [element 1] | +| array_flow.rb:1592:14:1592:14 | c [element 0] | array_flow.rb:1592:21:1592:21 | x [element 2] | +| array_flow.rb:1592:14:1592:14 | c [element 0] | array_flow.rb:1592:21:1592:21 | x [element 2] | +| array_flow.rb:1592:21:1592:21 | x [element 0] | array_flow.rb:1593:14:1593:14 | x [element 0] | +| array_flow.rb:1592:21:1592:21 | x [element 0] | array_flow.rb:1593:14:1593:14 | x [element 0] | +| array_flow.rb:1592:21:1592:21 | x [element 1] | array_flow.rb:1594:14:1594:14 | x [element 1] | +| array_flow.rb:1592:21:1592:21 | x [element 1] | array_flow.rb:1594:14:1594:14 | x [element 1] | +| array_flow.rb:1592:21:1592:21 | x [element 2] | array_flow.rb:1595:14:1595:14 | x [element 2] | +| array_flow.rb:1592:21:1592:21 | x [element 2] | array_flow.rb:1595:14:1595:14 | x [element 2] | +| array_flow.rb:1593:14:1593:14 | x [element 0] | array_flow.rb:1593:14:1593:17 | ...[...] | +| array_flow.rb:1593:14:1593:14 | x [element 0] | array_flow.rb:1593:14:1593:17 | ...[...] | +| array_flow.rb:1594:14:1594:14 | x [element 1] | array_flow.rb:1594:14:1594:17 | ...[...] | +| array_flow.rb:1594:14:1594:14 | x [element 1] | array_flow.rb:1594:14:1594:17 | ...[...] | +| array_flow.rb:1595:14:1595:14 | x [element 2] | array_flow.rb:1595:14:1595:17 | ...[...] | +| array_flow.rb:1595:14:1595:14 | x [element 2] | array_flow.rb:1595:14:1595:17 | ...[...] | +| array_flow.rb:1600:5:1600:5 | a [element 2] | array_flow.rb:1602:9:1602:9 | a [element 2] | +| array_flow.rb:1600:5:1600:5 | a [element 2] | array_flow.rb:1602:9:1602:9 | a [element 2] | +| array_flow.rb:1600:16:1600:28 | call to source | array_flow.rb:1600:5:1600:5 | a [element 2] | +| array_flow.rb:1600:16:1600:28 | call to source | array_flow.rb:1600:5:1600:5 | a [element 2] | +| array_flow.rb:1601:5:1601:5 | b [element 1] | array_flow.rb:1602:13:1602:13 | b [element 1] | +| array_flow.rb:1601:5:1601:5 | b [element 1] | array_flow.rb:1602:13:1602:13 | b [element 1] | +| array_flow.rb:1601:13:1601:25 | call to source | array_flow.rb:1601:5:1601:5 | b [element 1] | +| array_flow.rb:1601:13:1601:25 | call to source | array_flow.rb:1601:5:1601:5 | b [element 1] | +| array_flow.rb:1602:5:1602:5 | c [element] | array_flow.rb:1603:10:1603:10 | c [element] | +| array_flow.rb:1602:5:1602:5 | c [element] | array_flow.rb:1603:10:1603:10 | c [element] | +| array_flow.rb:1602:5:1602:5 | c [element] | array_flow.rb:1604:10:1604:10 | c [element] | +| array_flow.rb:1602:5:1602:5 | c [element] | array_flow.rb:1604:10:1604:10 | c [element] | +| array_flow.rb:1602:5:1602:5 | c [element] | array_flow.rb:1605:10:1605:10 | c [element] | +| array_flow.rb:1602:5:1602:5 | c [element] | array_flow.rb:1605:10:1605:10 | c [element] | +| array_flow.rb:1602:9:1602:9 | a [element 2] | array_flow.rb:1602:9:1602:13 | ... \| ... [element] | +| array_flow.rb:1602:9:1602:9 | a [element 2] | array_flow.rb:1602:9:1602:13 | ... \| ... [element] | +| array_flow.rb:1602:9:1602:13 | ... \| ... [element] | array_flow.rb:1602:5:1602:5 | c [element] | +| array_flow.rb:1602:9:1602:13 | ... \| ... [element] | array_flow.rb:1602:5:1602:5 | c [element] | +| array_flow.rb:1602:13:1602:13 | b [element 1] | array_flow.rb:1602:9:1602:13 | ... \| ... [element] | +| array_flow.rb:1602:13:1602:13 | b [element 1] | array_flow.rb:1602:9:1602:13 | ... \| ... [element] | +| array_flow.rb:1603:10:1603:10 | c [element] | array_flow.rb:1603:10:1603:13 | ...[...] | +| array_flow.rb:1603:10:1603:10 | c [element] | array_flow.rb:1603:10:1603:13 | ...[...] | +| array_flow.rb:1604:10:1604:10 | c [element] | array_flow.rb:1604:10:1604:13 | ...[...] | +| array_flow.rb:1604:10:1604:10 | c [element] | array_flow.rb:1604:10:1604:13 | ...[...] | +| array_flow.rb:1605:10:1605:10 | c [element] | array_flow.rb:1605:10:1605:13 | ...[...] | +| array_flow.rb:1605:10:1605:10 | c [element] | array_flow.rb:1605:10:1605:13 | ...[...] | +| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] | array_flow.rb:1611:10:1611:10 | a [element, element 0] | +| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] | array_flow.rb:1611:10:1611:10 | a [element, element 0] | +| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] | array_flow.rb:1614:10:1614:10 | a [element, element 0] | +| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] | array_flow.rb:1614:10:1614:10 | a [element, element 0] | +| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] | array_flow.rb:1615:10:1615:10 | a [element, element 0] | +| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] | array_flow.rb:1615:10:1615:10 | a [element, element 0] | +| array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] | array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] | +| array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] | array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] | +| array_flow.rb:1610:15:1610:27 | call to source | array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] | +| array_flow.rb:1610:15:1610:27 | call to source | array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] | +| array_flow.rb:1611:10:1611:10 | a [element, element 0] | array_flow.rb:1611:10:1611:13 | ...[...] [element 0] | +| array_flow.rb:1611:10:1611:10 | a [element, element 0] | array_flow.rb:1611:10:1611:13 | ...[...] [element 0] | +| array_flow.rb:1611:10:1611:13 | ...[...] [element 0] | array_flow.rb:1611:10:1611:16 | ...[...] | +| array_flow.rb:1611:10:1611:13 | ...[...] [element 0] | array_flow.rb:1611:10:1611:16 | ...[...] | +| array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] | array_flow.rb:1614:10:1614:10 | a [element 1, element 0] | +| array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] | array_flow.rb:1614:10:1614:10 | a [element 1, element 0] | +| array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] | array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] | +| array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] | array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] | +| array_flow.rb:1613:15:1613:27 | call to source | array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] | +| array_flow.rb:1613:15:1613:27 | call to source | array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] | +| array_flow.rb:1614:10:1614:10 | a [element 1, element 0] | array_flow.rb:1614:10:1614:13 | ...[...] [element 0] | +| array_flow.rb:1614:10:1614:10 | a [element 1, element 0] | array_flow.rb:1614:10:1614:13 | ...[...] [element 0] | +| array_flow.rb:1614:10:1614:10 | a [element, element 0] | array_flow.rb:1614:10:1614:13 | ...[...] [element 0] | +| array_flow.rb:1614:10:1614:10 | a [element, element 0] | array_flow.rb:1614:10:1614:13 | ...[...] [element 0] | +| array_flow.rb:1614:10:1614:13 | ...[...] [element 0] | array_flow.rb:1614:10:1614:16 | ...[...] | +| array_flow.rb:1614:10:1614:13 | ...[...] [element 0] | array_flow.rb:1614:10:1614:16 | ...[...] | +| array_flow.rb:1615:10:1615:10 | a [element, element 0] | array_flow.rb:1615:10:1615:13 | ...[...] [element 0] | +| array_flow.rb:1615:10:1615:10 | a [element, element 0] | array_flow.rb:1615:10:1615:13 | ...[...] [element 0] | +| array_flow.rb:1615:10:1615:13 | ...[...] [element 0] | array_flow.rb:1615:10:1615:16 | ...[...] | +| array_flow.rb:1615:10:1615:13 | ...[...] [element 0] | array_flow.rb:1615:10:1615:16 | ...[...] | +| array_flow.rb:1620:5:1620:5 | [post] a [element 0] | array_flow.rb:1629:10:1629:10 | a [element 0] | +| array_flow.rb:1620:5:1620:5 | [post] a [element 0] | array_flow.rb:1629:10:1629:10 | a [element 0] | +| array_flow.rb:1620:5:1620:5 | [post] a [element 0] | array_flow.rb:1631:10:1631:10 | a [element 0] | +| array_flow.rb:1620:5:1620:5 | [post] a [element 0] | array_flow.rb:1631:10:1631:10 | a [element 0] | +| array_flow.rb:1620:12:1620:24 | call to source | array_flow.rb:1620:5:1620:5 | [post] a [element 0] | +| array_flow.rb:1620:12:1620:24 | call to source | array_flow.rb:1620:5:1620:5 | [post] a [element 0] | +| array_flow.rb:1622:5:1622:5 | [post] a [element] | array_flow.rb:1627:10:1627:10 | a [element] | +| array_flow.rb:1622:5:1622:5 | [post] a [element] | array_flow.rb:1627:10:1627:10 | a [element] | +| array_flow.rb:1622:5:1622:5 | [post] a [element] | array_flow.rb:1629:10:1629:10 | a [element] | +| array_flow.rb:1622:5:1622:5 | [post] a [element] | array_flow.rb:1629:10:1629:10 | a [element] | +| array_flow.rb:1622:5:1622:5 | [post] a [element] | array_flow.rb:1631:10:1631:10 | a [element] | +| array_flow.rb:1622:5:1622:5 | [post] a [element] | array_flow.rb:1631:10:1631:10 | a [element] | +| array_flow.rb:1622:16:1622:28 | call to source | array_flow.rb:1622:5:1622:5 | [post] a [element] | +| array_flow.rb:1622:16:1622:28 | call to source | array_flow.rb:1622:5:1622:5 | [post] a [element] | +| array_flow.rb:1624:5:1624:5 | [post] a [element] | array_flow.rb:1627:10:1627:10 | a [element] | +| array_flow.rb:1624:5:1624:5 | [post] a [element] | array_flow.rb:1627:10:1627:10 | a [element] | +| array_flow.rb:1624:5:1624:5 | [post] a [element] | array_flow.rb:1629:10:1629:10 | a [element] | +| array_flow.rb:1624:5:1624:5 | [post] a [element] | array_flow.rb:1629:10:1629:10 | a [element] | +| array_flow.rb:1624:5:1624:5 | [post] a [element] | array_flow.rb:1631:10:1631:10 | a [element] | +| array_flow.rb:1624:5:1624:5 | [post] a [element] | array_flow.rb:1631:10:1631:10 | a [element] | +| array_flow.rb:1624:14:1624:26 | call to source | array_flow.rb:1624:5:1624:5 | [post] a [element] | +| array_flow.rb:1624:14:1624:26 | call to source | array_flow.rb:1624:5:1624:5 | [post] a [element] | +| array_flow.rb:1626:5:1626:5 | [post] a [element] | array_flow.rb:1627:10:1627:10 | a [element] | +| array_flow.rb:1626:5:1626:5 | [post] a [element] | array_flow.rb:1627:10:1627:10 | a [element] | +| array_flow.rb:1626:5:1626:5 | [post] a [element] | array_flow.rb:1629:10:1629:10 | a [element] | +| array_flow.rb:1626:5:1626:5 | [post] a [element] | array_flow.rb:1629:10:1629:10 | a [element] | +| array_flow.rb:1626:5:1626:5 | [post] a [element] | array_flow.rb:1631:10:1631:10 | a [element] | +| array_flow.rb:1626:5:1626:5 | [post] a [element] | array_flow.rb:1631:10:1631:10 | a [element] | +| array_flow.rb:1626:16:1626:28 | call to source | array_flow.rb:1626:5:1626:5 | [post] a [element] | +| array_flow.rb:1626:16:1626:28 | call to source | array_flow.rb:1626:5:1626:5 | [post] a [element] | +| array_flow.rb:1627:10:1627:10 | a [element] | array_flow.rb:1627:10:1627:13 | ...[...] | +| array_flow.rb:1627:10:1627:10 | a [element] | array_flow.rb:1627:10:1627:13 | ...[...] | +| array_flow.rb:1629:10:1629:10 | a [element 0] | array_flow.rb:1629:10:1629:17 | ...[...] | +| array_flow.rb:1629:10:1629:10 | a [element 0] | array_flow.rb:1629:10:1629:17 | ...[...] | +| array_flow.rb:1629:10:1629:10 | a [element] | array_flow.rb:1629:10:1629:17 | ...[...] | +| array_flow.rb:1629:10:1629:10 | a [element] | array_flow.rb:1629:10:1629:17 | ...[...] | +| array_flow.rb:1631:10:1631:10 | a [element 0] | array_flow.rb:1631:10:1631:15 | ...[...] | +| array_flow.rb:1631:10:1631:10 | a [element 0] | array_flow.rb:1631:10:1631:15 | ...[...] | +| array_flow.rb:1631:10:1631:10 | a [element] | array_flow.rb:1631:10:1631:15 | ...[...] | +| array_flow.rb:1631:10:1631:10 | a [element] | array_flow.rb:1631:10:1631:15 | ...[...] | nodes -| array_flow.rb:2:5:2:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:2:5:2:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:2:9:2:20 | * ... [element 0] : | semmle.label | * ... [element 0] : | -| array_flow.rb:2:9:2:20 | * ... [element 0] : | semmle.label | * ... [element 0] : | -| array_flow.rb:2:10:2:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:2:10:2:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:3:10:3:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:3:10:3:10 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:2:5:2:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:2:5:2:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:2:9:2:20 | * ... [element 0] | semmle.label | * ... [element 0] | +| array_flow.rb:2:9:2:20 | * ... [element 0] | semmle.label | * ... [element 0] | +| array_flow.rb:2:10:2:20 | call to source | semmle.label | call to source | +| array_flow.rb:2:10:2:20 | call to source | semmle.label | call to source | +| array_flow.rb:3:10:3:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:3:10:3:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:3:10:3:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:3:10:3:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:5:10:5:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:5:10:5:10 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:5:10:5:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:5:10:5:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:5:10:5:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:5:10:5:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:9:5:9:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:9:5:9:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:9:13:9:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:9:13:9:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:11:10:11:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:11:10:11:10 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:9:5:9:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:9:5:9:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:9:13:9:21 | call to source | semmle.label | call to source | +| array_flow.rb:9:13:9:21 | call to source | semmle.label | call to source | +| array_flow.rb:11:10:11:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:11:10:11:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:11:10:11:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:11:10:11:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:13:10:13:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:13:10:13:10 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:13:10:13:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:13:10:13:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:13:10:13:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:13:10:13:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:17:5:17:5 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:17:5:17:5 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | semmle.label | call to new [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | semmle.label | call to new [element] : | -| array_flow.rb:17:22:17:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:17:22:17:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:18:10:18:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:18:10:18:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:17:5:17:5 | a [element] | semmle.label | a [element] | +| array_flow.rb:17:5:17:5 | a [element] | semmle.label | a [element] | +| array_flow.rb:17:9:17:33 | call to new [element] | semmle.label | call to new [element] | +| array_flow.rb:17:9:17:33 | call to new [element] | semmle.label | call to new [element] | +| array_flow.rb:17:22:17:32 | call to source | semmle.label | call to source | +| array_flow.rb:17:22:17:32 | call to source | semmle.label | call to source | +| array_flow.rb:18:10:18:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:18:10:18:10 | a [element] | semmle.label | a [element] | | array_flow.rb:18:10:18:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:18:10:18:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:19:10:19:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:19:10:19:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:19:10:19:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:19:10:19:10 | a [element] | semmle.label | a [element] | | array_flow.rb:19:10:19:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:19:10:19:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:21:5:21:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:21:5:21:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:21:9:21:20 | call to new [element] : | semmle.label | call to new [element] : | -| array_flow.rb:21:9:21:20 | call to new [element] : | semmle.label | call to new [element] : | -| array_flow.rb:21:19:21:19 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:21:19:21:19 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:22:10:22:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:22:10:22:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:21:5:21:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:21:5:21:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:21:9:21:20 | call to new [element] | semmle.label | call to new [element] | +| array_flow.rb:21:9:21:20 | call to new [element] | semmle.label | call to new [element] | +| array_flow.rb:21:19:21:19 | a [element] | semmle.label | a [element] | +| array_flow.rb:21:19:21:19 | a [element] | semmle.label | a [element] | +| array_flow.rb:22:10:22:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:22:10:22:10 | b [element] | semmle.label | b [element] | | array_flow.rb:22:10:22:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:22:10:22:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:23:10:23:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:23:10:23:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:23:10:23:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:23:10:23:10 | b [element] | semmle.label | b [element] | | array_flow.rb:23:10:23:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:23:10:23:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:25:5:25:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:25:5:25:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:25:9:27:7 | call to new [element] : | semmle.label | call to new [element] : | -| array_flow.rb:25:9:27:7 | call to new [element] : | semmle.label | call to new [element] : | -| array_flow.rb:26:9:26:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:26:9:26:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:28:10:28:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:28:10:28:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:25:5:25:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:25:5:25:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:25:9:27:7 | call to new [element] | semmle.label | call to new [element] | +| array_flow.rb:25:9:27:7 | call to new [element] | semmle.label | call to new [element] | +| array_flow.rb:26:9:26:19 | call to source | semmle.label | call to source | +| array_flow.rb:26:9:26:19 | call to source | semmle.label | call to source | +| array_flow.rb:28:10:28:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:28:10:28:10 | c [element] | semmle.label | c [element] | | array_flow.rb:28:10:28:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:28:10:28:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:29:10:29:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:29:10:29:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:29:10:29:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:29:10:29:10 | c [element] | semmle.label | c [element] | | array_flow.rb:29:10:29:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:29:10:29:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:33:5:33:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:33:5:33:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:33:10:33:18 | call to source : | semmle.label | call to source : | -| array_flow.rb:33:10:33:18 | call to source : | semmle.label | call to source : | -| array_flow.rb:34:5:34:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:34:5:34:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | semmle.label | call to try_convert [element 0] : | -| array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | semmle.label | call to try_convert [element 0] : | -| array_flow.rb:34:27:34:27 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:34:27:34:27 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:35:10:35:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:35:10:35:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:33:5:33:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:33:5:33:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:33:10:33:18 | call to source | semmle.label | call to source | +| array_flow.rb:33:10:33:18 | call to source | semmle.label | call to source | +| array_flow.rb:34:5:34:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:34:5:34:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:34:9:34:28 | call to try_convert [element 0] | semmle.label | call to try_convert [element 0] | +| array_flow.rb:34:9:34:28 | call to try_convert [element 0] | semmle.label | call to try_convert [element 0] | +| array_flow.rb:34:27:34:27 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:34:27:34:27 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:35:10:35:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:35:10:35:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:35:10:35:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:35:10:35:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:40:5:40:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:40:5:40:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:40:10:40:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:40:10:40:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:41:5:41:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:41:5:41:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:41:16:41:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:41:16:41:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:42:5:42:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:42:5:42:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:42:9:42:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:42:9:42:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | semmle.label | ... & ... [element] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | semmle.label | ... & ... [element] : | -| array_flow.rb:42:13:42:13 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:42:13:42:13 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:43:10:43:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:43:10:43:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:40:5:40:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:40:5:40:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:40:10:40:20 | call to source | semmle.label | call to source | +| array_flow.rb:40:10:40:20 | call to source | semmle.label | call to source | +| array_flow.rb:41:5:41:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:41:5:41:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:41:16:41:26 | call to source | semmle.label | call to source | +| array_flow.rb:41:16:41:26 | call to source | semmle.label | call to source | +| array_flow.rb:42:5:42:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:42:5:42:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:42:9:42:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:42:9:42:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:42:9:42:13 | ... & ... [element] | semmle.label | ... & ... [element] | +| array_flow.rb:42:9:42:13 | ... & ... [element] | semmle.label | ... & ... [element] | +| array_flow.rb:42:13:42:13 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:42:13:42:13 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:43:10:43:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:43:10:43:10 | c [element] | semmle.label | c [element] | | array_flow.rb:43:10:43:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:43:10:43:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:44:10:44:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:44:10:44:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:44:10:44:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:44:10:44:10 | c [element] | semmle.label | c [element] | | array_flow.rb:44:10:44:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:44:10:44:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:48:5:48:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:48:5:48:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:48:10:48:18 | call to source : | semmle.label | call to source : | -| array_flow.rb:48:10:48:18 | call to source : | semmle.label | call to source : | -| array_flow.rb:49:5:49:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:49:5:49:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:49:9:49:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:49:9:49:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | semmle.label | ... * ... [element] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | semmle.label | ... * ... [element] : | -| array_flow.rb:50:10:50:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:50:10:50:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:48:5:48:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:48:5:48:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:48:10:48:18 | call to source | semmle.label | call to source | +| array_flow.rb:48:10:48:18 | call to source | semmle.label | call to source | +| array_flow.rb:49:5:49:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:49:5:49:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:49:9:49:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:49:9:49:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:49:9:49:13 | ... * ... [element] | semmle.label | ... * ... [element] | +| array_flow.rb:49:9:49:13 | ... * ... [element] | semmle.label | ... * ... [element] | +| array_flow.rb:50:10:50:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:50:10:50:10 | b [element] | semmle.label | b [element] | | array_flow.rb:50:10:50:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:50:10:50:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:51:10:51:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:51:10:51:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:51:10:51:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:51:10:51:10 | b [element] | semmle.label | b [element] | | array_flow.rb:51:10:51:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:51:10:51:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:55:5:55:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:55:5:55:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:55:10:55:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:55:10:55:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:56:5:56:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:56:5:56:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:56:13:56:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:56:13:56:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:57:5:57:5 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:57:5:57:5 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:57:5:57:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:57:5:57:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:57:9:57:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:57:9:57:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] : | semmle.label | ... + ... [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] : | semmle.label | ... + ... [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | semmle.label | ... + ... [element] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | semmle.label | ... + ... [element] : | -| array_flow.rb:57:13:57:13 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:57:13:57:13 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:58:10:58:10 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:58:10:58:10 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:58:10:58:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:58:10:58:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:55:5:55:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:55:5:55:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:55:10:55:20 | call to source | semmle.label | call to source | +| array_flow.rb:55:10:55:20 | call to source | semmle.label | call to source | +| array_flow.rb:56:5:56:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:56:5:56:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:56:13:56:23 | call to source | semmle.label | call to source | +| array_flow.rb:56:13:56:23 | call to source | semmle.label | call to source | +| array_flow.rb:57:5:57:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:57:5:57:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:57:5:57:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:57:5:57:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:57:9:57:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:57:9:57:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:57:9:57:13 | ... + ... [element 0] | semmle.label | ... + ... [element 0] | +| array_flow.rb:57:9:57:13 | ... + ... [element 0] | semmle.label | ... + ... [element 0] | +| array_flow.rb:57:9:57:13 | ... + ... [element] | semmle.label | ... + ... [element] | +| array_flow.rb:57:9:57:13 | ... + ... [element] | semmle.label | ... + ... [element] | +| array_flow.rb:57:13:57:13 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:57:13:57:13 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:58:10:58:10 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:58:10:58:10 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:58:10:58:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:58:10:58:10 | c [element] | semmle.label | c [element] | | array_flow.rb:58:10:58:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:58:10:58:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:59:10:59:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:59:10:59:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:59:10:59:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:59:10:59:10 | c [element] | semmle.label | c [element] | | array_flow.rb:59:10:59:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:59:10:59:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:63:5:63:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:63:5:63:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:63:10:63:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:63:10:63:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:65:5:65:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:65:5:65:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:65:9:65:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:65:9:65:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | semmle.label | ... - ... [element] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | semmle.label | ... - ... [element] : | -| array_flow.rb:66:10:66:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:66:10:66:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:63:5:63:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:63:5:63:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:63:10:63:20 | call to source | semmle.label | call to source | +| array_flow.rb:63:10:63:20 | call to source | semmle.label | call to source | +| array_flow.rb:65:5:65:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:65:5:65:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:65:9:65:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:65:9:65:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:65:9:65:13 | ... - ... [element] | semmle.label | ... - ... [element] | +| array_flow.rb:65:9:65:13 | ... - ... [element] | semmle.label | ... - ... [element] | +| array_flow.rb:66:10:66:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:66:10:66:10 | c [element] | semmle.label | c [element] | | array_flow.rb:66:10:66:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:66:10:66:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:67:10:67:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:67:10:67:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:67:10:67:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:67:10:67:10 | c [element] | semmle.label | c [element] | | array_flow.rb:67:10:67:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:67:10:67:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:71:5:71:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:71:5:71:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:71:10:71:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:71:10:71:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:72:5:72:5 | b : | semmle.label | b : | -| array_flow.rb:72:5:72:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:72:5:72:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:72:5:72:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:72:5:72:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:72:9:72:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:72:9:72:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:72:9:72:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:72:9:72:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] : | semmle.label | ... << ... [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] : | semmle.label | ... << ... [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | semmle.label | ... << ... [element] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | semmle.label | ... << ... [element] : | -| array_flow.rb:72:14:72:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:72:14:72:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:73:10:73:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:73:10:73:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:73:10:73:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:73:10:73:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:71:5:71:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:71:5:71:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:71:10:71:20 | call to source | semmle.label | call to source | +| array_flow.rb:71:10:71:20 | call to source | semmle.label | call to source | +| array_flow.rb:72:5:72:5 | b | semmle.label | b | +| array_flow.rb:72:5:72:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:72:5:72:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:72:5:72:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:72:5:72:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:72:9:72:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:72:9:72:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:72:9:72:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:72:9:72:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:72:9:72:24 | ... << ... [element 0] | semmle.label | ... << ... [element 0] | +| array_flow.rb:72:9:72:24 | ... << ... [element 0] | semmle.label | ... << ... [element 0] | +| array_flow.rb:72:9:72:24 | ... << ... [element] | semmle.label | ... << ... [element] | +| array_flow.rb:72:9:72:24 | ... << ... [element] | semmle.label | ... << ... [element] | +| array_flow.rb:72:14:72:24 | call to source | semmle.label | call to source | +| array_flow.rb:72:14:72:24 | call to source | semmle.label | call to source | +| array_flow.rb:73:10:73:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:73:10:73:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:73:10:73:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:73:10:73:10 | a [element] | semmle.label | a [element] | | array_flow.rb:73:10:73:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:73:10:73:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:74:10:74:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:74:10:74:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:74:10:74:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:74:10:74:10 | a [element] | semmle.label | a [element] | | array_flow.rb:74:10:74:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:74:10:74:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:75:10:75:10 | b : | semmle.label | b : | -| array_flow.rb:75:10:75:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:75:10:75:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:75:10:75:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:75:10:75:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:75:10:75:10 | b | semmle.label | b | +| array_flow.rb:75:10:75:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:75:10:75:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:75:10:75:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:75:10:75:10 | b [element] | semmle.label | b [element] | | array_flow.rb:75:10:75:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:75:10:75:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:76:10:76:10 | b : | semmle.label | b : | -| array_flow.rb:76:10:76:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:76:10:76:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:76:10:76:10 | b | semmle.label | b | +| array_flow.rb:76:10:76:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:76:10:76:10 | b [element] | semmle.label | b [element] | | array_flow.rb:76:10:76:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:76:10:76:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:80:5:80:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:80:5:80:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:80:13:80:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:80:13:80:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:81:8:81:8 | c : | semmle.label | c : | -| array_flow.rb:81:8:81:8 | c : | semmle.label | c : | -| array_flow.rb:81:15:81:15 | __synth__3 [element 1] : | semmle.label | __synth__3 [element 1] : | -| array_flow.rb:81:15:81:15 | __synth__3 [element 1] : | semmle.label | __synth__3 [element 1] : | -| array_flow.rb:81:15:81:15 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:81:15:81:15 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:80:5:80:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:80:5:80:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:80:13:80:21 | call to source | semmle.label | call to source | +| array_flow.rb:80:13:80:21 | call to source | semmle.label | call to source | +| array_flow.rb:81:8:81:8 | c | semmle.label | c | +| array_flow.rb:81:8:81:8 | c | semmle.label | c | +| array_flow.rb:81:15:81:15 | __synth__3 [element 1] | semmle.label | __synth__3 [element 1] | +| array_flow.rb:81:15:81:15 | __synth__3 [element 1] | semmle.label | __synth__3 [element 1] | +| array_flow.rb:81:15:81:15 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:81:15:81:15 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:83:10:83:10 | c | semmle.label | c | | array_flow.rb:83:10:83:10 | c | semmle.label | c | -| array_flow.rb:88:5:88:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:88:5:88:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:88:13:88:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:88:13:88:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:89:5:89:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:89:5:89:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:89:9:89:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:89:9:89:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:91:10:91:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:91:10:91:10 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:88:5:88:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:88:5:88:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:88:13:88:22 | call to source | semmle.label | call to source | +| array_flow.rb:88:13:88:22 | call to source | semmle.label | call to source | +| array_flow.rb:89:5:89:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:89:5:89:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:89:9:89:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:89:9:89:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:89:9:89:15 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:89:9:89:15 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:91:10:91:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:91:10:91:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:91:10:91:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:91:10:91:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:92:10:92:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:92:10:92:10 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:92:10:92:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:92:10:92:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:92:10:92:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:92:10:92:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:96:5:96:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:96:5:96:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:96:13:96:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:96:13:96:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:97:5:97:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:97:5:97:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:97:9:97:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:97:9:97:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:99:10:99:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:99:10:99:10 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:96:5:96:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:96:5:96:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:96:13:96:22 | call to source | semmle.label | call to source | +| array_flow.rb:96:13:96:22 | call to source | semmle.label | call to source | +| array_flow.rb:97:5:97:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:97:5:97:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:97:9:97:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:97:9:97:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:97:9:97:15 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:97:9:97:15 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:99:10:99:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:99:10:99:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:99:10:99:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:99:10:99:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:101:10:101:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:101:10:101:10 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:101:10:101:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:101:10:101:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:101:10:101:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:101:10:101:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:103:5:103:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:103:5:103:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:103:13:103:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:103:13:103:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:104:5:104:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:104:5:104:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:104:9:104:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:104:9:104:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:106:10:106:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:106:10:106:10 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:103:5:103:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:103:5:103:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:103:13:103:24 | call to source | semmle.label | call to source | +| array_flow.rb:103:13:103:24 | call to source | semmle.label | call to source | +| array_flow.rb:104:5:104:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:104:5:104:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:104:9:104:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:104:9:104:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:104:9:104:16 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:104:9:104:16 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:106:10:106:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:106:10:106:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:106:10:106:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:106:10:106:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:109:5:109:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:109:5:109:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:109:5:109:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:109:5:109:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:109:13:109:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:109:13:109:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:109:30:109:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:109:30:109:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:110:5:110:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:110:5:110:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:110:9:110:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:110:9:110:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:110:9:110:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:110:9:110:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | semmle.label | ...[...] [element] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | semmle.label | ...[...] [element] : | -| array_flow.rb:111:10:111:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:111:10:111:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:109:5:109:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:109:5:109:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:109:5:109:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:109:5:109:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:109:13:109:24 | call to source | semmle.label | call to source | +| array_flow.rb:109:13:109:24 | call to source | semmle.label | call to source | +| array_flow.rb:109:30:109:41 | call to source | semmle.label | call to source | +| array_flow.rb:109:30:109:41 | call to source | semmle.label | call to source | +| array_flow.rb:110:5:110:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:110:5:110:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:110:9:110:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:110:9:110:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:110:9:110:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:110:9:110:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:110:9:110:18 | ...[...] [element] | semmle.label | ...[...] [element] | +| array_flow.rb:110:9:110:18 | ...[...] [element] | semmle.label | ...[...] [element] | +| array_flow.rb:111:10:111:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:111:10:111:10 | b [element] | semmle.label | b [element] | | array_flow.rb:111:10:111:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:111:10:111:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:112:10:112:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:112:10:112:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:112:10:112:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:112:10:112:10 | b [element] | semmle.label | b [element] | | array_flow.rb:112:10:112:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:112:10:112:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:114:5:114:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:114:5:114:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:114:9:114:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:114:9:114:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:114:9:114:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:114:9:114:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | semmle.label | ...[...] [element] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | semmle.label | ...[...] [element] : | -| array_flow.rb:115:10:115:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:115:10:115:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:114:5:114:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:114:5:114:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:114:9:114:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:114:9:114:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:114:9:114:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:114:9:114:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:114:9:114:19 | ...[...] [element] | semmle.label | ...[...] [element] | +| array_flow.rb:114:9:114:19 | ...[...] [element] | semmle.label | ...[...] [element] | +| array_flow.rb:115:10:115:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:115:10:115:10 | b [element] | semmle.label | b [element] | | array_flow.rb:115:10:115:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:115:10:115:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:116:10:116:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:116:10:116:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:116:10:116:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:116:10:116:10 | b [element] | semmle.label | b [element] | | array_flow.rb:116:10:116:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:116:10:116:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:121:5:121:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:121:5:121:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:121:15:121:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:121:15:121:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:122:10:122:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:122:10:122:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:121:5:121:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:121:5:121:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:121:15:121:24 | call to source | semmle.label | call to source | +| array_flow.rb:121:15:121:24 | call to source | semmle.label | call to source | +| array_flow.rb:122:10:122:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:122:10:122:10 | a [element] | semmle.label | a [element] | | array_flow.rb:122:10:122:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:122:10:122:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:123:10:123:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:123:10:123:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:123:10:123:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:123:10:123:10 | a [element] | semmle.label | a [element] | | array_flow.rb:123:10:123:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:123:10:123:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:124:10:124:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:124:10:124:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:124:10:124:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:124:10:124:10 | a [element] | semmle.label | a [element] | | array_flow.rb:124:10:124:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:124:10:124:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:129:5:129:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:129:5:129:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:129:19:129:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:129:19:129:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:130:10:130:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:130:10:130:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:129:5:129:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:129:5:129:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:129:19:129:28 | call to source | semmle.label | call to source | +| array_flow.rb:129:19:129:28 | call to source | semmle.label | call to source | +| array_flow.rb:130:10:130:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:130:10:130:10 | a [element] | semmle.label | a [element] | | array_flow.rb:130:10:130:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:130:10:130:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:131:10:131:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:131:10:131:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:131:10:131:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:131:10:131:10 | a [element] | semmle.label | a [element] | | array_flow.rb:131:10:131:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:131:10:131:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:132:10:132:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:132:10:132:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:132:10:132:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:132:10:132:10 | a [element] | semmle.label | a [element] | | array_flow.rb:132:10:132:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:132:10:132:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:137:5:137:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:137:5:137:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:137:15:137:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:137:15:137:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:138:10:138:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:138:10:138:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:137:5:137:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:137:5:137:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:137:15:137:24 | call to source | semmle.label | call to source | +| array_flow.rb:137:15:137:24 | call to source | semmle.label | call to source | +| array_flow.rb:138:10:138:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:138:10:138:10 | a [element] | semmle.label | a [element] | | array_flow.rb:138:10:138:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:138:10:138:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:139:10:139:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:139:10:139:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:139:10:139:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:139:10:139:10 | a [element] | semmle.label | a [element] | | array_flow.rb:139:10:139:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:139:10:139:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:140:10:140:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:140:10:140:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:140:10:140:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:140:10:140:10 | a [element] | semmle.label | a [element] | | array_flow.rb:140:10:140:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:140:10:140:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:145:5:145:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:145:5:145:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:145:19:145:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:145:19:145:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:146:10:146:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:146:10:146:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:145:5:145:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:145:5:145:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:145:19:145:28 | call to source | semmle.label | call to source | +| array_flow.rb:145:19:145:28 | call to source | semmle.label | call to source | +| array_flow.rb:146:10:146:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:146:10:146:10 | a [element] | semmle.label | a [element] | | array_flow.rb:146:10:146:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:146:10:146:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:147:10:147:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:147:10:147:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:147:10:147:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:147:10:147:10 | a [element] | semmle.label | a [element] | | array_flow.rb:147:10:147:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:147:10:147:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:148:10:148:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:148:10:148:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:148:10:148:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:148:10:148:10 | a [element] | semmle.label | a [element] | | array_flow.rb:148:10:148:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:148:10:148:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:152:5:152:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:152:5:152:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:152:16:152:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:152:16:152:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:153:5:153:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:153:5:153:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:153:16:153:16 | x : | semmle.label | x : | -| array_flow.rb:153:16:153:16 | x : | semmle.label | x : | +| array_flow.rb:152:5:152:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:152:5:152:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:152:16:152:25 | call to source | semmle.label | call to source | +| array_flow.rb:152:16:152:25 | call to source | semmle.label | call to source | +| array_flow.rb:153:5:153:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:153:5:153:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:153:16:153:16 | x | semmle.label | x | +| array_flow.rb:153:16:153:16 | x | semmle.label | x | | array_flow.rb:154:14:154:14 | x | semmle.label | x | | array_flow.rb:154:14:154:14 | x | semmle.label | x | -| array_flow.rb:159:5:159:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:159:5:159:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:159:16:159:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:159:16:159:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:160:5:160:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:160:5:160:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:160:16:160:16 | x : | semmle.label | x : | -| array_flow.rb:160:16:160:16 | x : | semmle.label | x : | +| array_flow.rb:159:5:159:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:159:5:159:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:159:16:159:25 | call to source | semmle.label | call to source | +| array_flow.rb:159:16:159:25 | call to source | semmle.label | call to source | +| array_flow.rb:160:5:160:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:160:5:160:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:160:16:160:16 | x | semmle.label | x | +| array_flow.rb:160:16:160:16 | x | semmle.label | x | | array_flow.rb:161:14:161:14 | x | semmle.label | x | | array_flow.rb:161:14:161:14 | x | semmle.label | x | -| array_flow.rb:166:5:166:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:166:5:166:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:166:10:166:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:166:10:166:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:167:5:167:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:167:5:167:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:167:5:167:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:167:5:167:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:167:9:167:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:167:9:167:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:167:9:167:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:167:9:167:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element 0] : | semmle.label | call to append [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element 0] : | semmle.label | call to append [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | semmle.label | call to append [element] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | semmle.label | call to append [element] : | -| array_flow.rb:167:18:167:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:167:18:167:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:167:32:167:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:167:32:167:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:168:10:168:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:168:10:168:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:168:10:168:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:168:10:168:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:166:5:166:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:166:5:166:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:166:10:166:21 | call to source | semmle.label | call to source | +| array_flow.rb:166:10:166:21 | call to source | semmle.label | call to source | +| array_flow.rb:167:5:167:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:167:5:167:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:167:5:167:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:167:5:167:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:167:9:167:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:167:9:167:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:167:9:167:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:167:9:167:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:167:9:167:44 | call to append [element 0] | semmle.label | call to append [element 0] | +| array_flow.rb:167:9:167:44 | call to append [element 0] | semmle.label | call to append [element 0] | +| array_flow.rb:167:9:167:44 | call to append [element] | semmle.label | call to append [element] | +| array_flow.rb:167:9:167:44 | call to append [element] | semmle.label | call to append [element] | +| array_flow.rb:167:18:167:29 | call to source | semmle.label | call to source | +| array_flow.rb:167:18:167:29 | call to source | semmle.label | call to source | +| array_flow.rb:167:32:167:43 | call to source | semmle.label | call to source | +| array_flow.rb:167:32:167:43 | call to source | semmle.label | call to source | +| array_flow.rb:168:10:168:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:168:10:168:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:168:10:168:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:168:10:168:10 | a [element] | semmle.label | a [element] | | array_flow.rb:168:10:168:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:168:10:168:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:169:10:169:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:169:10:169:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:169:10:169:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:169:10:169:10 | a [element] | semmle.label | a [element] | | array_flow.rb:169:10:169:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:169:10:169:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:170:10:170:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:170:10:170:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:170:10:170:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:170:10:170:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:170:10:170:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:170:10:170:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:170:10:170:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:170:10:170:10 | b [element] | semmle.label | b [element] | | array_flow.rb:170:10:170:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:170:10:170:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:171:10:171:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:171:10:171:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:171:10:171:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:171:10:171:10 | b [element] | semmle.label | b [element] | | array_flow.rb:171:10:171:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:171:10:171:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:177:5:177:5 | c [element 1] : | semmle.label | c [element 1] : | -| array_flow.rb:177:5:177:5 | c [element 1] : | semmle.label | c [element 1] : | -| array_flow.rb:177:15:177:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:177:15:177:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | semmle.label | d [element 2, element 1] : | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | semmle.label | d [element 2, element 1] : | -| array_flow.rb:178:16:178:16 | c [element 1] : | semmle.label | c [element 1] : | -| array_flow.rb:178:16:178:16 | c [element 1] : | semmle.label | c [element 1] : | +| array_flow.rb:177:5:177:5 | c [element 1] | semmle.label | c [element 1] | +| array_flow.rb:177:5:177:5 | c [element 1] | semmle.label | c [element 1] | +| array_flow.rb:177:15:177:24 | call to source | semmle.label | call to source | +| array_flow.rb:177:15:177:24 | call to source | semmle.label | call to source | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | +| array_flow.rb:178:16:178:16 | c [element 1] | semmle.label | c [element 1] | +| array_flow.rb:178:16:178:16 | c [element 1] | semmle.label | c [element 1] | | array_flow.rb:179:10:179:26 | ( ... ) | semmle.label | ( ... ) | | array_flow.rb:179:10:179:26 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:179:11:179:11 | d [element 2, element 1] : | semmle.label | d [element 2, element 1] : | -| array_flow.rb:179:11:179:11 | d [element 2, element 1] : | semmle.label | d [element 2, element 1] : | -| array_flow.rb:179:11:179:22 | call to assoc [element 1] : | semmle.label | call to assoc [element 1] : | -| array_flow.rb:179:11:179:22 | call to assoc [element 1] : | semmle.label | call to assoc [element 1] : | -| array_flow.rb:179:11:179:25 | ...[...] : | semmle.label | ...[...] : | -| array_flow.rb:179:11:179:25 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:179:11:179:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | +| array_flow.rb:179:11:179:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | +| array_flow.rb:179:11:179:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | +| array_flow.rb:179:11:179:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | +| array_flow.rb:179:11:179:25 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:179:11:179:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:180:10:180:26 | ( ... ) | semmle.label | ( ... ) | | array_flow.rb:180:10:180:26 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:180:11:180:11 | d [element 2, element 1] : | semmle.label | d [element 2, element 1] : | -| array_flow.rb:180:11:180:11 | d [element 2, element 1] : | semmle.label | d [element 2, element 1] : | -| array_flow.rb:180:11:180:22 | call to assoc [element 1] : | semmle.label | call to assoc [element 1] : | -| array_flow.rb:180:11:180:22 | call to assoc [element 1] : | semmle.label | call to assoc [element 1] : | -| array_flow.rb:180:11:180:25 | ...[...] : | semmle.label | ...[...] : | -| array_flow.rb:180:11:180:25 | ...[...] : | semmle.label | ...[...] : | -| array_flow.rb:184:5:184:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:184:5:184:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:184:13:184:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:184:13:184:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:186:10:186:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:186:10:186:10 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:180:11:180:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | +| array_flow.rb:180:11:180:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | +| array_flow.rb:180:11:180:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | +| array_flow.rb:180:11:180:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | +| array_flow.rb:180:11:180:25 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:180:11:180:25 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:184:5:184:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:184:5:184:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:184:13:184:22 | call to source | semmle.label | call to source | +| array_flow.rb:184:13:184:22 | call to source | semmle.label | call to source | +| array_flow.rb:186:10:186:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:186:10:186:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:186:10:186:16 | call to at | semmle.label | call to at | | array_flow.rb:186:10:186:16 | call to at | semmle.label | call to at | -| array_flow.rb:188:10:188:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:188:10:188:10 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:188:10:188:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:188:10:188:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:188:10:188:16 | call to at | semmle.label | call to at | | array_flow.rb:188:10:188:16 | call to at | semmle.label | call to at | -| array_flow.rb:192:5:192:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:192:5:192:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:192:16:192:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:192:16:192:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:193:5:193:5 | b : | semmle.label | b : | -| array_flow.rb:193:5:193:5 | b : | semmle.label | b : | -| array_flow.rb:193:9:193:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:193:9:193:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:193:9:195:7 | call to bsearch : | semmle.label | call to bsearch : | -| array_flow.rb:193:9:195:7 | call to bsearch : | semmle.label | call to bsearch : | -| array_flow.rb:193:23:193:23 | x : | semmle.label | x : | -| array_flow.rb:193:23:193:23 | x : | semmle.label | x : | +| array_flow.rb:192:5:192:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:192:5:192:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:192:16:192:25 | call to source | semmle.label | call to source | +| array_flow.rb:192:16:192:25 | call to source | semmle.label | call to source | +| array_flow.rb:193:5:193:5 | b | semmle.label | b | +| array_flow.rb:193:5:193:5 | b | semmle.label | b | +| array_flow.rb:193:9:193:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:193:9:193:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:193:9:195:7 | call to bsearch | semmle.label | call to bsearch | +| array_flow.rb:193:9:195:7 | call to bsearch | semmle.label | call to bsearch | +| array_flow.rb:193:23:193:23 | x | semmle.label | x | +| array_flow.rb:193:23:193:23 | x | semmle.label | x | | array_flow.rb:194:14:194:14 | x | semmle.label | x | | array_flow.rb:194:14:194:14 | x | semmle.label | x | | array_flow.rb:196:10:196:10 | b | semmle.label | b | | array_flow.rb:196:10:196:10 | b | semmle.label | b | -| array_flow.rb:200:5:200:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:200:5:200:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:200:16:200:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:200:16:200:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:201:9:201:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:201:9:201:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:201:29:201:29 | x : | semmle.label | x : | -| array_flow.rb:201:29:201:29 | x : | semmle.label | x : | +| array_flow.rb:200:5:200:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:200:5:200:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:200:16:200:25 | call to source | semmle.label | call to source | +| array_flow.rb:200:16:200:25 | call to source | semmle.label | call to source | +| array_flow.rb:201:9:201:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:201:9:201:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:201:29:201:29 | x | semmle.label | x | +| array_flow.rb:201:29:201:29 | x | semmle.label | x | | array_flow.rb:202:14:202:14 | x | semmle.label | x | | array_flow.rb:202:14:202:14 | x | semmle.label | x | -| array_flow.rb:208:5:208:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:208:5:208:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:208:16:208:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:208:16:208:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:209:5:209:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:209:5:209:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:209:17:209:17 | x : | semmle.label | x : | -| array_flow.rb:209:17:209:17 | x : | semmle.label | x : | +| array_flow.rb:208:5:208:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:208:5:208:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:208:16:208:25 | call to source | semmle.label | call to source | +| array_flow.rb:208:16:208:25 | call to source | semmle.label | call to source | +| array_flow.rb:209:5:209:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:209:5:209:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:209:17:209:17 | x | semmle.label | x | +| array_flow.rb:209:17:209:17 | x | semmle.label | x | | array_flow.rb:210:14:210:14 | x | semmle.label | x | | array_flow.rb:210:14:210:14 | x | semmle.label | x | -| array_flow.rb:215:5:215:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:215:5:215:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:215:5:215:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:215:5:215:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:215:16:215:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:215:16:215:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:215:30:215:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:215:30:215:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:216:9:216:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:216:9:216:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:216:9:216:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:216:9:216:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:216:27:216:27 | x : | semmle.label | x : | -| array_flow.rb:216:27:216:27 | x : | semmle.label | x : | -| array_flow.rb:216:30:216:30 | y : | semmle.label | y : | -| array_flow.rb:216:30:216:30 | y : | semmle.label | y : | +| array_flow.rb:215:5:215:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:215:5:215:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:215:5:215:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:215:5:215:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:215:16:215:27 | call to source | semmle.label | call to source | +| array_flow.rb:215:16:215:27 | call to source | semmle.label | call to source | +| array_flow.rb:215:30:215:41 | call to source | semmle.label | call to source | +| array_flow.rb:215:30:215:41 | call to source | semmle.label | call to source | +| array_flow.rb:216:9:216:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:216:9:216:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:216:9:216:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:216:9:216:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:216:27:216:27 | x | semmle.label | x | +| array_flow.rb:216:27:216:27 | x | semmle.label | x | +| array_flow.rb:216:30:216:30 | y | semmle.label | y | +| array_flow.rb:216:30:216:30 | y | semmle.label | y | | array_flow.rb:217:14:217:14 | x | semmle.label | x | | array_flow.rb:217:14:217:14 | x | semmle.label | x | | array_flow.rb:218:14:218:14 | y | semmle.label | y | | array_flow.rb:218:14:218:14 | y | semmle.label | y | -| array_flow.rb:231:5:231:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:231:5:231:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:231:16:231:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:231:16:231:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:232:5:232:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:232:5:232:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:232:9:232:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:232:9:232:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:232:9:235:7 | call to collect [element] : | semmle.label | call to collect [element] : | -| array_flow.rb:232:9:235:7 | call to collect [element] : | semmle.label | call to collect [element] : | -| array_flow.rb:232:23:232:23 | x : | semmle.label | x : | -| array_flow.rb:232:23:232:23 | x : | semmle.label | x : | +| array_flow.rb:231:5:231:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:231:5:231:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:231:16:231:27 | call to source | semmle.label | call to source | +| array_flow.rb:231:16:231:27 | call to source | semmle.label | call to source | +| array_flow.rb:232:5:232:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:232:5:232:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:232:9:232:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:232:9:232:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:232:9:235:7 | call to collect [element] | semmle.label | call to collect [element] | +| array_flow.rb:232:9:235:7 | call to collect [element] | semmle.label | call to collect [element] | +| array_flow.rb:232:23:232:23 | x | semmle.label | x | +| array_flow.rb:232:23:232:23 | x | semmle.label | x | | array_flow.rb:233:14:233:14 | x | semmle.label | x | | array_flow.rb:233:14:233:14 | x | semmle.label | x | -| array_flow.rb:234:9:234:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:234:9:234:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:236:10:236:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:236:10:236:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:234:9:234:19 | call to source | semmle.label | call to source | +| array_flow.rb:234:9:234:19 | call to source | semmle.label | call to source | +| array_flow.rb:236:10:236:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:236:10:236:10 | b [element] | semmle.label | b [element] | | array_flow.rb:236:10:236:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:236:10:236:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:240:5:240:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:240:5:240:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:240:16:240:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:240:16:240:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:241:5:241:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:241:5:241:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:241:9:241:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:241:9:241:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:241:9:241:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:241:9:241:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:241:9:244:7 | call to collect! [element] : | semmle.label | call to collect! [element] : | -| array_flow.rb:241:9:244:7 | call to collect! [element] : | semmle.label | call to collect! [element] : | -| array_flow.rb:241:24:241:24 | x : | semmle.label | x : | -| array_flow.rb:241:24:241:24 | x : | semmle.label | x : | +| array_flow.rb:240:5:240:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:240:5:240:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:240:16:240:27 | call to source | semmle.label | call to source | +| array_flow.rb:240:16:240:27 | call to source | semmle.label | call to source | +| array_flow.rb:241:5:241:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:241:5:241:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:241:9:241:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:241:9:241:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:241:9:241:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:241:9:241:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:241:9:244:7 | call to collect! [element] | semmle.label | call to collect! [element] | +| array_flow.rb:241:9:244:7 | call to collect! [element] | semmle.label | call to collect! [element] | +| array_flow.rb:241:24:241:24 | x | semmle.label | x | +| array_flow.rb:241:24:241:24 | x | semmle.label | x | | array_flow.rb:242:14:242:14 | x | semmle.label | x | | array_flow.rb:242:14:242:14 | x | semmle.label | x | -| array_flow.rb:243:9:243:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:243:9:243:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:245:10:245:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:245:10:245:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:243:9:243:19 | call to source | semmle.label | call to source | +| array_flow.rb:243:9:243:19 | call to source | semmle.label | call to source | +| array_flow.rb:245:10:245:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:245:10:245:10 | a [element] | semmle.label | a [element] | | array_flow.rb:245:10:245:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:245:10:245:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:246:10:246:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:246:10:246:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:246:10:246:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:246:10:246:10 | b [element] | semmle.label | b [element] | | array_flow.rb:246:10:246:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:246:10:246:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:250:5:250:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:250:5:250:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:250:16:250:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:250:16:250:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:251:5:251:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:251:5:251:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:251:9:251:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:251:9:251:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] : | semmle.label | call to collect_concat [element] : | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] : | semmle.label | call to collect_concat [element] : | -| array_flow.rb:251:30:251:30 | x : | semmle.label | x : | -| array_flow.rb:251:30:251:30 | x : | semmle.label | x : | +| array_flow.rb:250:5:250:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:250:5:250:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:250:16:250:27 | call to source | semmle.label | call to source | +| array_flow.rb:250:16:250:27 | call to source | semmle.label | call to source | +| array_flow.rb:251:5:251:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:251:5:251:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:251:9:251:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:251:9:251:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:251:9:254:7 | call to collect_concat [element] | semmle.label | call to collect_concat [element] | +| array_flow.rb:251:9:254:7 | call to collect_concat [element] | semmle.label | call to collect_concat [element] | +| array_flow.rb:251:30:251:30 | x | semmle.label | x | +| array_flow.rb:251:30:251:30 | x | semmle.label | x | | array_flow.rb:252:14:252:14 | x | semmle.label | x | | array_flow.rb:252:14:252:14 | x | semmle.label | x | -| array_flow.rb:253:13:253:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:253:13:253:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:255:10:255:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:255:10:255:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:253:13:253:24 | call to source | semmle.label | call to source | +| array_flow.rb:253:13:253:24 | call to source | semmle.label | call to source | +| array_flow.rb:255:10:255:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:255:10:255:10 | b [element] | semmle.label | b [element] | | array_flow.rb:255:10:255:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:255:10:255:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:256:5:256:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:256:5:256:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:256:9:256:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:256:9:256:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] : | semmle.label | call to collect_concat [element] : | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] : | semmle.label | call to collect_concat [element] : | -| array_flow.rb:256:30:256:30 | x : | semmle.label | x : | -| array_flow.rb:256:30:256:30 | x : | semmle.label | x : | +| array_flow.rb:256:5:256:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:256:5:256:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:256:9:256:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:256:9:256:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:256:9:259:7 | call to collect_concat [element] | semmle.label | call to collect_concat [element] | +| array_flow.rb:256:9:259:7 | call to collect_concat [element] | semmle.label | call to collect_concat [element] | +| array_flow.rb:256:30:256:30 | x | semmle.label | x | +| array_flow.rb:256:30:256:30 | x | semmle.label | x | | array_flow.rb:257:14:257:14 | x | semmle.label | x | | array_flow.rb:257:14:257:14 | x | semmle.label | x | -| array_flow.rb:258:9:258:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:258:9:258:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:260:10:260:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:260:10:260:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:258:9:258:20 | call to source | semmle.label | call to source | +| array_flow.rb:258:9:258:20 | call to source | semmle.label | call to source | +| array_flow.rb:260:10:260:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:260:10:260:10 | b [element] | semmle.label | b [element] | | array_flow.rb:260:10:260:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:260:10:260:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:264:5:264:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:264:5:264:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:264:16:264:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:264:16:264:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:265:5:265:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:265:5:265:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:265:9:265:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:265:9:265:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:265:9:267:7 | call to combination [element 2] : | semmle.label | call to combination [element 2] : | -| array_flow.rb:265:9:267:7 | call to combination [element 2] : | semmle.label | call to combination [element 2] : | -| array_flow.rb:265:30:265:30 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:265:30:265:30 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:266:14:266:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:266:14:266:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:264:5:264:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:264:5:264:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:264:16:264:25 | call to source | semmle.label | call to source | +| array_flow.rb:264:16:264:25 | call to source | semmle.label | call to source | +| array_flow.rb:265:5:265:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:265:5:265:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:265:9:265:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:265:9:265:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:265:9:267:7 | call to combination [element 2] | semmle.label | call to combination [element 2] | +| array_flow.rb:265:9:267:7 | call to combination [element 2] | semmle.label | call to combination [element 2] | +| array_flow.rb:265:30:265:30 | x [element] | semmle.label | x [element] | +| array_flow.rb:265:30:265:30 | x [element] | semmle.label | x [element] | +| array_flow.rb:266:14:266:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:266:14:266:14 | x [element] | semmle.label | x [element] | | array_flow.rb:266:14:266:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:266:14:266:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:269:10:269:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:269:10:269:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:269:10:269:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:269:10:269:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:273:5:273:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:273:5:273:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:273:16:273:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:273:16:273:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:274:5:274:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:274:5:274:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:274:9:274:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:274:9:274:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:274:9:274:17 | call to compact [element] : | semmle.label | call to compact [element] : | -| array_flow.rb:274:9:274:17 | call to compact [element] : | semmle.label | call to compact [element] : | -| array_flow.rb:275:10:275:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:275:10:275:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:273:5:273:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:273:5:273:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:273:16:273:25 | call to source | semmle.label | call to source | +| array_flow.rb:273:16:273:25 | call to source | semmle.label | call to source | +| array_flow.rb:274:5:274:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:274:5:274:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:274:9:274:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:274:9:274:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:274:9:274:17 | call to compact [element] | semmle.label | call to compact [element] | +| array_flow.rb:274:9:274:17 | call to compact [element] | semmle.label | call to compact [element] | +| array_flow.rb:275:10:275:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:275:10:275:10 | b [element] | semmle.label | b [element] | | array_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:279:5:279:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:279:5:279:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:279:16:279:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:279:16:279:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:280:5:280:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:280:5:280:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:280:9:280:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:280:9:280:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:280:9:280:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:280:9:280:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:280:9:280:18 | call to compact! [element] : | semmle.label | call to compact! [element] : | -| array_flow.rb:280:9:280:18 | call to compact! [element] : | semmle.label | call to compact! [element] : | -| array_flow.rb:281:10:281:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:281:10:281:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:279:5:279:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:279:5:279:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:279:16:279:25 | call to source | semmle.label | call to source | +| array_flow.rb:279:16:279:25 | call to source | semmle.label | call to source | +| array_flow.rb:280:5:280:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:280:5:280:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:280:9:280:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:280:9:280:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:280:9:280:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:280:9:280:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:280:9:280:18 | call to compact! [element] | semmle.label | call to compact! [element] | +| array_flow.rb:280:9:280:18 | call to compact! [element] | semmle.label | call to compact! [element] | +| array_flow.rb:281:10:281:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:281:10:281:10 | a [element] | semmle.label | a [element] | | array_flow.rb:281:10:281:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:281:10:281:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:282:10:282:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:282:10:282:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:282:10:282:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:282:10:282:10 | b [element] | semmle.label | b [element] | | array_flow.rb:282:10:282:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:282:10:282:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:286:5:286:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:286:5:286:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:286:16:286:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:286:16:286:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:287:5:287:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:287:5:287:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:287:16:287:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:287:16:287:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:288:5:288:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:288:5:288:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:288:14:288:14 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:288:14:288:14 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:289:10:289:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:289:10:289:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:286:5:286:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:286:5:286:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:286:16:286:27 | call to source | semmle.label | call to source | +| array_flow.rb:286:16:286:27 | call to source | semmle.label | call to source | +| array_flow.rb:287:5:287:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:287:5:287:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:287:16:287:27 | call to source | semmle.label | call to source | +| array_flow.rb:287:16:287:27 | call to source | semmle.label | call to source | +| array_flow.rb:288:5:288:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:288:5:288:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:288:14:288:14 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:288:14:288:14 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:289:10:289:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:289:10:289:10 | a [element] | semmle.label | a [element] | | array_flow.rb:289:10:289:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:289:10:289:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:290:10:290:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:290:10:290:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:290:10:290:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:290:10:290:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:290:10:290:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:290:10:290:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:290:10:290:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:290:10:290:10 | a [element] | semmle.label | a [element] | | array_flow.rb:290:10:290:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:290:10:290:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:294:5:294:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:294:5:294:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:294:16:294:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:294:16:294:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:295:5:295:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:295:5:295:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:295:17:295:17 | x : | semmle.label | x : | -| array_flow.rb:295:17:295:17 | x : | semmle.label | x : | +| array_flow.rb:294:5:294:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:294:5:294:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:294:16:294:25 | call to source | semmle.label | call to source | +| array_flow.rb:294:16:294:25 | call to source | semmle.label | call to source | +| array_flow.rb:295:5:295:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:295:5:295:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:295:17:295:17 | x | semmle.label | x | +| array_flow.rb:295:17:295:17 | x | semmle.label | x | | array_flow.rb:296:14:296:14 | x | semmle.label | x | | array_flow.rb:296:14:296:14 | x | semmle.label | x | -| array_flow.rb:301:5:301:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:301:5:301:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:301:16:301:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:301:16:301:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:302:5:302:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:302:5:302:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:302:20:302:20 | x : | semmle.label | x : | -| array_flow.rb:302:20:302:20 | x : | semmle.label | x : | +| array_flow.rb:301:5:301:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:301:5:301:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:301:16:301:25 | call to source | semmle.label | call to source | +| array_flow.rb:301:16:301:25 | call to source | semmle.label | call to source | +| array_flow.rb:302:5:302:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:302:5:302:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:302:20:302:20 | x | semmle.label | x | +| array_flow.rb:302:20:302:20 | x | semmle.label | x | | array_flow.rb:303:14:303:14 | x | semmle.label | x | | array_flow.rb:303:14:303:14 | x | semmle.label | x | -| array_flow.rb:308:5:308:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:308:5:308:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:308:16:308:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:308:16:308:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:309:5:309:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:309:5:309:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:309:9:309:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:309:9:309:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | semmle.label | call to deconstruct [element 2] : | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | semmle.label | call to deconstruct [element 2] : | -| array_flow.rb:312:10:312:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:312:10:312:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:308:5:308:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:308:5:308:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:308:16:308:25 | call to source | semmle.label | call to source | +| array_flow.rb:308:16:308:25 | call to source | semmle.label | call to source | +| array_flow.rb:309:5:309:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:309:5:309:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:309:9:309:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:309:9:309:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | semmle.label | call to deconstruct [element 2] | +| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | semmle.label | call to deconstruct [element 2] | +| array_flow.rb:312:10:312:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:312:10:312:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:312:10:312:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:312:10:312:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:316:5:316:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:316:5:316:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:316:16:316:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:316:16:316:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:317:5:317:5 | b : | semmle.label | b : | -| array_flow.rb:317:5:317:5 | b : | semmle.label | b : | -| array_flow.rb:317:9:317:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:317:9:317:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:317:9:317:36 | call to delete : | semmle.label | call to delete : | -| array_flow.rb:317:9:317:36 | call to delete : | semmle.label | call to delete : | -| array_flow.rb:317:23:317:34 | call to source : | semmle.label | call to source : | -| array_flow.rb:317:23:317:34 | call to source : | semmle.label | call to source : | +| array_flow.rb:316:5:316:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:316:5:316:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:316:16:316:27 | call to source | semmle.label | call to source | +| array_flow.rb:316:16:316:27 | call to source | semmle.label | call to source | +| array_flow.rb:317:5:317:5 | b | semmle.label | b | +| array_flow.rb:317:5:317:5 | b | semmle.label | b | +| array_flow.rb:317:9:317:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:317:9:317:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:317:9:317:36 | call to delete | semmle.label | call to delete | +| array_flow.rb:317:9:317:36 | call to delete | semmle.label | call to delete | +| array_flow.rb:317:23:317:34 | call to source | semmle.label | call to source | +| array_flow.rb:317:23:317:34 | call to source | semmle.label | call to source | | array_flow.rb:318:10:318:10 | b | semmle.label | b | | array_flow.rb:318:10:318:10 | b | semmle.label | b | -| array_flow.rb:325:5:325:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:325:5:325:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:325:5:325:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:325:5:325:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:325:16:325:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:325:16:325:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:325:30:325:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:325:30:325:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:326:5:326:5 | b : | semmle.label | b : | -| array_flow.rb:326:5:326:5 | b : | semmle.label | b : | -| array_flow.rb:326:9:326:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:326:9:326:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:326:9:326:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:326:9:326:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:326:9:326:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:326:9:326:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:326:9:326:22 | call to delete_at : | semmle.label | call to delete_at : | -| array_flow.rb:326:9:326:22 | call to delete_at : | semmle.label | call to delete_at : | +| array_flow.rb:325:5:325:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:325:5:325:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:325:5:325:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:325:5:325:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:325:16:325:27 | call to source | semmle.label | call to source | +| array_flow.rb:325:16:325:27 | call to source | semmle.label | call to source | +| array_flow.rb:325:30:325:41 | call to source | semmle.label | call to source | +| array_flow.rb:325:30:325:41 | call to source | semmle.label | call to source | +| array_flow.rb:326:5:326:5 | b | semmle.label | b | +| array_flow.rb:326:5:326:5 | b | semmle.label | b | +| array_flow.rb:326:9:326:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:326:9:326:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:326:9:326:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:326:9:326:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:326:9:326:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:326:9:326:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:326:9:326:22 | call to delete_at | semmle.label | call to delete_at | +| array_flow.rb:326:9:326:22 | call to delete_at | semmle.label | call to delete_at | | array_flow.rb:327:10:327:10 | b | semmle.label | b | | array_flow.rb:327:10:327:10 | b | semmle.label | b | -| array_flow.rb:328:10:328:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:328:10:328:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:328:10:328:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:328:10:328:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:328:10:328:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:328:10:328:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:330:5:330:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:330:5:330:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:330:5:330:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:330:5:330:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:330:16:330:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:330:16:330:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:330:30:330:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:330:30:330:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:331:5:331:5 | b : | semmle.label | b : | -| array_flow.rb:331:5:331:5 | b : | semmle.label | b : | -| array_flow.rb:331:9:331:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:331:9:331:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:331:9:331:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:331:9:331:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:331:9:331:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:331:9:331:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:331:9:331:22 | call to delete_at : | semmle.label | call to delete_at : | -| array_flow.rb:331:9:331:22 | call to delete_at : | semmle.label | call to delete_at : | +| array_flow.rb:330:5:330:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:330:5:330:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:330:5:330:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:330:5:330:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:330:16:330:27 | call to source | semmle.label | call to source | +| array_flow.rb:330:16:330:27 | call to source | semmle.label | call to source | +| array_flow.rb:330:30:330:41 | call to source | semmle.label | call to source | +| array_flow.rb:330:30:330:41 | call to source | semmle.label | call to source | +| array_flow.rb:331:5:331:5 | b | semmle.label | b | +| array_flow.rb:331:5:331:5 | b | semmle.label | b | +| array_flow.rb:331:9:331:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:331:9:331:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:331:9:331:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:331:9:331:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:331:9:331:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:331:9:331:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:331:9:331:22 | call to delete_at | semmle.label | call to delete_at | +| array_flow.rb:331:9:331:22 | call to delete_at | semmle.label | call to delete_at | | array_flow.rb:332:10:332:10 | b | semmle.label | b | | array_flow.rb:332:10:332:10 | b | semmle.label | b | -| array_flow.rb:333:10:333:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:333:10:333:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:333:10:333:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:333:10:333:10 | a [element] | semmle.label | a [element] | | array_flow.rb:333:10:333:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:333:10:333:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:334:10:334:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:334:10:334:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:334:10:334:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:334:10:334:10 | a [element] | semmle.label | a [element] | | array_flow.rb:334:10:334:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:334:10:334:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:338:5:338:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:338:5:338:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:338:16:338:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:338:16:338:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:339:5:339:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:339:5:339:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:339:9:339:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:339:9:339:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:339:9:339:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:339:9:339:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:339:9:341:7 | call to delete_if [element] : | semmle.label | call to delete_if [element] : | -| array_flow.rb:339:9:341:7 | call to delete_if [element] : | semmle.label | call to delete_if [element] : | -| array_flow.rb:339:25:339:25 | x : | semmle.label | x : | -| array_flow.rb:339:25:339:25 | x : | semmle.label | x : | +| array_flow.rb:338:5:338:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:338:5:338:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:338:16:338:25 | call to source | semmle.label | call to source | +| array_flow.rb:338:16:338:25 | call to source | semmle.label | call to source | +| array_flow.rb:339:5:339:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:339:5:339:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:339:9:339:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:339:9:339:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:339:9:339:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:339:9:339:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:339:9:341:7 | call to delete_if [element] | semmle.label | call to delete_if [element] | +| array_flow.rb:339:9:341:7 | call to delete_if [element] | semmle.label | call to delete_if [element] | +| array_flow.rb:339:25:339:25 | x | semmle.label | x | +| array_flow.rb:339:25:339:25 | x | semmle.label | x | | array_flow.rb:340:14:340:14 | x | semmle.label | x | | array_flow.rb:340:14:340:14 | x | semmle.label | x | -| array_flow.rb:342:10:342:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:342:10:342:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:342:10:342:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:342:10:342:10 | b [element] | semmle.label | b [element] | | array_flow.rb:342:10:342:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:342:10:342:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:343:10:343:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:343:10:343:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:343:10:343:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:343:10:343:10 | a [element] | semmle.label | a [element] | | array_flow.rb:343:10:343:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:343:10:343:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:344:10:344:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:344:10:344:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:344:10:344:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:344:10:344:10 | a [element] | semmle.label | a [element] | | array_flow.rb:344:10:344:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:344:10:344:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:345:10:345:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:345:10:345:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:345:10:345:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:345:10:345:10 | a [element] | semmle.label | a [element] | | array_flow.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:349:5:349:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:349:5:349:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:349:16:349:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:349:16:349:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:350:5:350:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:350:5:350:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:350:9:350:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:350:9:350:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:350:9:350:25 | call to difference [element] : | semmle.label | call to difference [element] : | -| array_flow.rb:350:9:350:25 | call to difference [element] : | semmle.label | call to difference [element] : | -| array_flow.rb:351:10:351:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:351:10:351:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:349:5:349:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:349:5:349:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:349:16:349:25 | call to source | semmle.label | call to source | +| array_flow.rb:349:16:349:25 | call to source | semmle.label | call to source | +| array_flow.rb:350:5:350:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:350:5:350:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:350:9:350:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:350:9:350:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:350:9:350:25 | call to difference [element] | semmle.label | call to difference [element] | +| array_flow.rb:350:9:350:25 | call to difference [element] | semmle.label | call to difference [element] | +| array_flow.rb:351:10:351:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:351:10:351:10 | b [element] | semmle.label | b [element] | | array_flow.rb:351:10:351:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:351:10:351:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:355:5:355:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:355:5:355:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:355:5:355:5 | a [element 3, element 1] : | semmle.label | a [element 3, element 1] : | -| array_flow.rb:355:5:355:5 | a [element 3, element 1] : | semmle.label | a [element 3, element 1] : | -| array_flow.rb:355:16:355:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:355:16:355:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:355:34:355:45 | call to source : | semmle.label | call to source : | -| array_flow.rb:355:34:355:45 | call to source : | semmle.label | call to source : | -| array_flow.rb:357:10:357:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:357:10:357:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:355:5:355:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:355:5:355:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:355:5:355:5 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | +| array_flow.rb:355:5:355:5 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | +| array_flow.rb:355:16:355:27 | call to source | semmle.label | call to source | +| array_flow.rb:355:16:355:27 | call to source | semmle.label | call to source | +| array_flow.rb:355:34:355:45 | call to source | semmle.label | call to source | +| array_flow.rb:355:34:355:45 | call to source | semmle.label | call to source | +| array_flow.rb:357:10:357:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:357:10:357:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:357:10:357:17 | call to dig | semmle.label | call to dig | | array_flow.rb:357:10:357:17 | call to dig | semmle.label | call to dig | -| array_flow.rb:358:10:358:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:358:10:358:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:358:10:358:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:358:10:358:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:358:10:358:17 | call to dig | semmle.label | call to dig | | array_flow.rb:358:10:358:17 | call to dig | semmle.label | call to dig | -| array_flow.rb:360:10:360:10 | a [element 3, element 1] : | semmle.label | a [element 3, element 1] : | -| array_flow.rb:360:10:360:10 | a [element 3, element 1] : | semmle.label | a [element 3, element 1] : | +| array_flow.rb:360:10:360:10 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | +| array_flow.rb:360:10:360:10 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | | array_flow.rb:360:10:360:19 | call to dig | semmle.label | call to dig | | array_flow.rb:360:10:360:19 | call to dig | semmle.label | call to dig | -| array_flow.rb:364:5:364:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:364:5:364:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:364:16:364:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:364:16:364:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:365:5:365:5 | b : | semmle.label | b : | -| array_flow.rb:365:5:365:5 | b : | semmle.label | b : | -| array_flow.rb:365:9:365:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:365:9:365:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:365:9:367:7 | call to detect : | semmle.label | call to detect : | -| array_flow.rb:365:9:367:7 | call to detect : | semmle.label | call to detect : | -| array_flow.rb:365:23:365:34 | call to source : | semmle.label | call to source : | -| array_flow.rb:365:23:365:34 | call to source : | semmle.label | call to source : | -| array_flow.rb:365:43:365:43 | x : | semmle.label | x : | -| array_flow.rb:365:43:365:43 | x : | semmle.label | x : | +| array_flow.rb:364:5:364:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:364:5:364:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:364:16:364:27 | call to source | semmle.label | call to source | +| array_flow.rb:364:16:364:27 | call to source | semmle.label | call to source | +| array_flow.rb:365:5:365:5 | b | semmle.label | b | +| array_flow.rb:365:5:365:5 | b | semmle.label | b | +| array_flow.rb:365:9:365:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:365:9:365:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:365:9:367:7 | call to detect | semmle.label | call to detect | +| array_flow.rb:365:9:367:7 | call to detect | semmle.label | call to detect | +| array_flow.rb:365:23:365:34 | call to source | semmle.label | call to source | +| array_flow.rb:365:23:365:34 | call to source | semmle.label | call to source | +| array_flow.rb:365:43:365:43 | x | semmle.label | x | +| array_flow.rb:365:43:365:43 | x | semmle.label | x | | array_flow.rb:366:14:366:14 | x | semmle.label | x | | array_flow.rb:366:14:366:14 | x | semmle.label | x | | array_flow.rb:368:10:368:10 | b | semmle.label | b | | array_flow.rb:368:10:368:10 | b | semmle.label | b | -| array_flow.rb:372:5:372:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:372:5:372:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:372:5:372:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:372:5:372:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:372:16:372:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:372:16:372:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:372:30:372:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:372:30:372:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:373:5:373:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:373:5:373:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:373:9:373:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:373:9:373:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:373:9:373:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:373:9:373:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:373:9:373:17 | call to drop [element] : | semmle.label | call to drop [element] : | -| array_flow.rb:373:9:373:17 | call to drop [element] : | semmle.label | call to drop [element] : | -| array_flow.rb:374:10:374:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:374:10:374:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:372:5:372:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:372:5:372:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:372:5:372:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:372:5:372:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:372:16:372:27 | call to source | semmle.label | call to source | +| array_flow.rb:372:16:372:27 | call to source | semmle.label | call to source | +| array_flow.rb:372:30:372:41 | call to source | semmle.label | call to source | +| array_flow.rb:372:30:372:41 | call to source | semmle.label | call to source | +| array_flow.rb:373:5:373:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:373:5:373:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:373:9:373:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:373:9:373:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:373:9:373:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:373:9:373:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:373:9:373:17 | call to drop [element] | semmle.label | call to drop [element] | +| array_flow.rb:373:9:373:17 | call to drop [element] | semmle.label | call to drop [element] | +| array_flow.rb:374:10:374:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:374:10:374:10 | b [element] | semmle.label | b [element] | | array_flow.rb:374:10:374:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:374:10:374:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:375:5:375:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:375:5:375:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:375:5:375:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:375:5:375:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:375:9:375:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:375:9:375:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:375:9:375:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:375:9:375:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | semmle.label | call to drop [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | semmle.label | call to drop [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 2] : | semmle.label | call to drop [element 2] : | -| array_flow.rb:375:9:375:17 | call to drop [element 2] : | semmle.label | call to drop [element 2] : | -| array_flow.rb:377:10:377:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:377:10:377:10 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:375:5:375:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:375:5:375:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:375:5:375:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:375:5:375:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:375:9:375:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:375:9:375:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:375:9:375:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:375:9:375:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:375:9:375:17 | call to drop [element 1] | semmle.label | call to drop [element 1] | +| array_flow.rb:375:9:375:17 | call to drop [element 1] | semmle.label | call to drop [element 1] | +| array_flow.rb:375:9:375:17 | call to drop [element 2] | semmle.label | call to drop [element 2] | +| array_flow.rb:375:9:375:17 | call to drop [element 2] | semmle.label | call to drop [element 2] | +| array_flow.rb:377:10:377:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:377:10:377:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:377:10:377:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:377:10:377:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:378:10:378:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:378:10:378:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:378:10:378:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:378:10:378:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:378:10:378:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:378:10:378:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:378:10:378:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:378:10:378:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:379:5:379:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:379:5:379:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:379:12:379:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:379:12:379:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:380:5:380:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:380:5:380:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:380:5:380:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:380:5:380:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:380:9:380:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:380:9:380:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:380:9:380:9 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:380:9:380:9 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element 1] : | semmle.label | call to drop [element 1] : | -| array_flow.rb:380:9:380:17 | call to drop [element 1] : | semmle.label | call to drop [element 1] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | semmle.label | call to drop [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | semmle.label | call to drop [element] : | -| array_flow.rb:381:10:381:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:381:10:381:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:381:10:381:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:381:10:381:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:379:5:379:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:379:5:379:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:379:12:379:23 | call to source | semmle.label | call to source | +| array_flow.rb:379:12:379:23 | call to source | semmle.label | call to source | +| array_flow.rb:380:5:380:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:380:5:380:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:380:5:380:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:380:5:380:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:380:9:380:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:380:9:380:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:380:9:380:9 | a [element] | semmle.label | a [element] | +| array_flow.rb:380:9:380:9 | a [element] | semmle.label | a [element] | +| array_flow.rb:380:9:380:17 | call to drop [element 1] | semmle.label | call to drop [element 1] | +| array_flow.rb:380:9:380:17 | call to drop [element 1] | semmle.label | call to drop [element 1] | +| array_flow.rb:380:9:380:17 | call to drop [element] | semmle.label | call to drop [element] | +| array_flow.rb:380:9:380:17 | call to drop [element] | semmle.label | call to drop [element] | +| array_flow.rb:381:10:381:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:381:10:381:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:381:10:381:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:381:10:381:10 | b [element] | semmle.label | b [element] | | array_flow.rb:381:10:381:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:381:10:381:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:382:5:382:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:382:5:382:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:382:9:382:9 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:382:9:382:9 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:382:9:382:19 | call to drop [element] : | semmle.label | call to drop [element] : | -| array_flow.rb:382:9:382:19 | call to drop [element] : | semmle.label | call to drop [element] : | -| array_flow.rb:383:10:383:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:383:10:383:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:382:5:382:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:382:5:382:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:382:9:382:9 | b [element] | semmle.label | b [element] | +| array_flow.rb:382:9:382:9 | b [element] | semmle.label | b [element] | +| array_flow.rb:382:9:382:19 | call to drop [element] | semmle.label | call to drop [element] | +| array_flow.rb:382:9:382:19 | call to drop [element] | semmle.label | call to drop [element] | +| array_flow.rb:383:10:383:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:383:10:383:10 | c [element] | semmle.label | c [element] | | array_flow.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:387:5:387:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:387:5:387:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:387:5:387:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:387:5:387:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:387:16:387:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:387:16:387:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:387:30:387:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:387:30:387:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:388:5:388:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:388:5:388:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:388:9:388:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:388:9:388:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:388:9:388:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:388:9:388:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:388:9:390:7 | call to drop_while [element] : | semmle.label | call to drop_while [element] : | -| array_flow.rb:388:9:390:7 | call to drop_while [element] : | semmle.label | call to drop_while [element] : | -| array_flow.rb:388:26:388:26 | x : | semmle.label | x : | -| array_flow.rb:388:26:388:26 | x : | semmle.label | x : | +| array_flow.rb:387:5:387:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:387:5:387:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:387:5:387:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:387:5:387:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:387:16:387:27 | call to source | semmle.label | call to source | +| array_flow.rb:387:16:387:27 | call to source | semmle.label | call to source | +| array_flow.rb:387:30:387:41 | call to source | semmle.label | call to source | +| array_flow.rb:387:30:387:41 | call to source | semmle.label | call to source | +| array_flow.rb:388:5:388:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:388:5:388:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:388:9:388:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:388:9:388:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:388:9:388:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:388:9:388:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:388:9:390:7 | call to drop_while [element] | semmle.label | call to drop_while [element] | +| array_flow.rb:388:9:390:7 | call to drop_while [element] | semmle.label | call to drop_while [element] | +| array_flow.rb:388:26:388:26 | x | semmle.label | x | +| array_flow.rb:388:26:388:26 | x | semmle.label | x | | array_flow.rb:389:14:389:14 | x | semmle.label | x | | array_flow.rb:389:14:389:14 | x | semmle.label | x | -| array_flow.rb:391:10:391:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:391:10:391:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:391:10:391:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:391:10:391:10 | b [element] | semmle.label | b [element] | | array_flow.rb:391:10:391:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:391:10:391:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:395:5:395:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:395:5:395:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:395:16:395:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:395:16:395:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:396:5:396:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:396:5:396:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:396:9:396:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:396:9:396:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:396:9:398:7 | call to each [element 2] : | semmle.label | call to each [element 2] : | -| array_flow.rb:396:9:398:7 | call to each [element 2] : | semmle.label | call to each [element 2] : | -| array_flow.rb:396:20:396:20 | x : | semmle.label | x : | -| array_flow.rb:396:20:396:20 | x : | semmle.label | x : | +| array_flow.rb:395:5:395:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:395:5:395:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:395:16:395:25 | call to source | semmle.label | call to source | +| array_flow.rb:395:16:395:25 | call to source | semmle.label | call to source | +| array_flow.rb:396:5:396:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:396:5:396:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:396:9:396:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:396:9:396:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:396:9:398:7 | call to each [element 2] | semmle.label | call to each [element 2] | +| array_flow.rb:396:9:398:7 | call to each [element 2] | semmle.label | call to each [element 2] | +| array_flow.rb:396:20:396:20 | x | semmle.label | x | +| array_flow.rb:396:20:396:20 | x | semmle.label | x | | array_flow.rb:397:14:397:14 | x | semmle.label | x | | array_flow.rb:397:14:397:14 | x | semmle.label | x | -| array_flow.rb:399:10:399:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:399:10:399:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:399:10:399:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:399:10:399:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:399:10:399:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:399:10:399:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:403:5:403:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:403:5:403:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:403:16:403:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:403:16:403:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:404:5:404:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:404:5:404:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:404:9:406:7 | __synth__0__1 : | semmle.label | __synth__0__1 : | -| array_flow.rb:404:9:406:7 | __synth__0__1 : | semmle.label | __synth__0__1 : | -| array_flow.rb:404:13:404:13 | x : | semmle.label | x : | -| array_flow.rb:404:13:404:13 | x : | semmle.label | x : | -| array_flow.rb:404:18:404:18 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:404:18:404:18 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:403:5:403:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:403:5:403:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:403:16:403:25 | call to source | semmle.label | call to source | +| array_flow.rb:403:16:403:25 | call to source | semmle.label | call to source | +| array_flow.rb:404:5:404:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:404:5:404:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:404:9:406:7 | __synth__0__1 | semmle.label | __synth__0__1 | +| array_flow.rb:404:9:406:7 | __synth__0__1 | semmle.label | __synth__0__1 | +| array_flow.rb:404:13:404:13 | x | semmle.label | x | +| array_flow.rb:404:13:404:13 | x | semmle.label | x | +| array_flow.rb:404:18:404:18 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:404:18:404:18 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:405:14:405:14 | x | semmle.label | x | | array_flow.rb:405:14:405:14 | x | semmle.label | x | | array_flow.rb:407:10:407:10 | x | semmle.label | x | | array_flow.rb:407:10:407:10 | x | semmle.label | x | -| array_flow.rb:408:10:408:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:408:10:408:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:408:10:408:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:408:10:408:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:408:10:408:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:408:10:408:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:412:5:412:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:412:5:412:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:412:16:412:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:412:16:412:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:413:5:413:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:413:5:413:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:413:24:413:24 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:413:24:413:24 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:412:5:412:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:412:5:412:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:412:16:412:25 | call to source | semmle.label | call to source | +| array_flow.rb:412:16:412:25 | call to source | semmle.label | call to source | +| array_flow.rb:413:5:413:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:413:5:413:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:413:24:413:24 | x [element] | semmle.label | x [element] | +| array_flow.rb:413:24:413:24 | x [element] | semmle.label | x [element] | | array_flow.rb:414:14:414:19 | ( ... ) | semmle.label | ( ... ) | | array_flow.rb:414:14:414:19 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:414:15:414:15 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:414:15:414:15 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:414:15:414:18 | ...[...] : | semmle.label | ...[...] : | -| array_flow.rb:414:15:414:18 | ...[...] : | semmle.label | ...[...] : | -| array_flow.rb:419:5:419:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:419:5:419:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:419:16:419:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:419:16:419:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:420:5:420:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:420:5:420:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:420:9:420:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:420:9:420:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | semmle.label | call to each_entry [element 2] : | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | semmle.label | call to each_entry [element 2] : | -| array_flow.rb:420:26:420:26 | x : | semmle.label | x : | -| array_flow.rb:420:26:420:26 | x : | semmle.label | x : | +| array_flow.rb:414:15:414:15 | x [element] | semmle.label | x [element] | +| array_flow.rb:414:15:414:15 | x [element] | semmle.label | x [element] | +| array_flow.rb:414:15:414:18 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:414:15:414:18 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:419:5:419:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:419:5:419:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:419:16:419:25 | call to source | semmle.label | call to source | +| array_flow.rb:419:16:419:25 | call to source | semmle.label | call to source | +| array_flow.rb:420:5:420:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:420:5:420:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:420:9:420:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:420:9:420:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:420:9:422:7 | call to each_entry [element 2] | semmle.label | call to each_entry [element 2] | +| array_flow.rb:420:9:422:7 | call to each_entry [element 2] | semmle.label | call to each_entry [element 2] | +| array_flow.rb:420:26:420:26 | x | semmle.label | x | +| array_flow.rb:420:26:420:26 | x | semmle.label | x | | array_flow.rb:421:14:421:14 | x | semmle.label | x | | array_flow.rb:421:14:421:14 | x | semmle.label | x | -| array_flow.rb:423:10:423:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:423:10:423:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:423:10:423:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:423:10:423:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:423:10:423:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:423:10:423:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:427:5:427:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:427:5:427:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:427:16:427:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:427:16:427:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:428:5:428:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:428:5:428:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:428:9:428:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:428:9:428:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] : | semmle.label | call to each_index [element 2] : | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] : | semmle.label | call to each_index [element 2] : | -| array_flow.rb:431:10:431:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:431:10:431:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:427:5:427:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:427:5:427:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:427:16:427:25 | call to source | semmle.label | call to source | +| array_flow.rb:427:16:427:25 | call to source | semmle.label | call to source | +| array_flow.rb:428:5:428:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:428:5:428:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:428:9:428:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:428:9:428:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:428:9:430:7 | call to each_index [element 2] | semmle.label | call to each_index [element 2] | +| array_flow.rb:428:9:430:7 | call to each_index [element 2] | semmle.label | call to each_index [element 2] | +| array_flow.rb:431:10:431:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:431:10:431:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:431:10:431:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:431:10:431:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:435:5:435:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:435:5:435:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:435:19:435:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:435:19:435:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:436:5:436:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:436:5:436:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:436:25:436:25 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:436:25:436:25 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:437:14:437:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:437:14:437:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:435:5:435:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:435:5:435:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:435:19:435:28 | call to source | semmle.label | call to source | +| array_flow.rb:435:19:435:28 | call to source | semmle.label | call to source | +| array_flow.rb:436:5:436:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:436:5:436:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:436:25:436:25 | x [element] | semmle.label | x [element] | +| array_flow.rb:436:25:436:25 | x [element] | semmle.label | x [element] | +| array_flow.rb:437:14:437:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:437:14:437:14 | x [element] | semmle.label | x [element] | | array_flow.rb:437:14:437:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:437:14:437:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:442:5:442:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:442:5:442:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:442:19:442:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:442:19:442:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:443:5:443:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:443:5:443:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:443:9:443:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:443:9:443:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | semmle.label | call to each_with_index [element 3] : | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | semmle.label | call to each_with_index [element 3] : | -| array_flow.rb:443:31:443:31 | x : | semmle.label | x : | -| array_flow.rb:443:31:443:31 | x : | semmle.label | x : | +| array_flow.rb:442:5:442:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:442:5:442:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:442:19:442:28 | call to source | semmle.label | call to source | +| array_flow.rb:442:19:442:28 | call to source | semmle.label | call to source | +| array_flow.rb:443:5:443:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:443:5:443:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:443:9:443:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:443:9:443:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | semmle.label | call to each_with_index [element 3] | +| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | semmle.label | call to each_with_index [element 3] | +| array_flow.rb:443:31:443:31 | x | semmle.label | x | +| array_flow.rb:443:31:443:31 | x | semmle.label | x | | array_flow.rb:444:14:444:14 | x | semmle.label | x | | array_flow.rb:444:14:444:14 | x | semmle.label | x | -| array_flow.rb:447:10:447:10 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:447:10:447:10 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:447:10:447:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:447:10:447:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:447:10:447:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:447:10:447:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:451:5:451:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:451:5:451:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:451:19:451:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:451:19:451:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:452:5:452:5 | b : | semmle.label | b : | -| array_flow.rb:452:5:452:5 | b : | semmle.label | b : | -| array_flow.rb:452:9:452:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:452:9:452:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:452:9:455:7 | call to each_with_object : | semmle.label | call to each_with_object : | -| array_flow.rb:452:9:455:7 | call to each_with_object : | semmle.label | call to each_with_object : | -| array_flow.rb:452:28:452:39 | call to source : | semmle.label | call to source : | -| array_flow.rb:452:28:452:39 | call to source : | semmle.label | call to source : | -| array_flow.rb:452:46:452:46 | x : | semmle.label | x : | -| array_flow.rb:452:46:452:46 | x : | semmle.label | x : | -| array_flow.rb:452:48:452:48 | a : | semmle.label | a : | -| array_flow.rb:452:48:452:48 | a : | semmle.label | a : | +| array_flow.rb:451:5:451:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:451:5:451:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:451:19:451:30 | call to source | semmle.label | call to source | +| array_flow.rb:451:19:451:30 | call to source | semmle.label | call to source | +| array_flow.rb:452:5:452:5 | b | semmle.label | b | +| array_flow.rb:452:5:452:5 | b | semmle.label | b | +| array_flow.rb:452:9:452:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:452:9:452:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:452:9:455:7 | call to each_with_object | semmle.label | call to each_with_object | +| array_flow.rb:452:9:455:7 | call to each_with_object | semmle.label | call to each_with_object | +| array_flow.rb:452:28:452:39 | call to source | semmle.label | call to source | +| array_flow.rb:452:28:452:39 | call to source | semmle.label | call to source | +| array_flow.rb:452:46:452:46 | x | semmle.label | x | +| array_flow.rb:452:46:452:46 | x | semmle.label | x | +| array_flow.rb:452:48:452:48 | a | semmle.label | a | +| array_flow.rb:452:48:452:48 | a | semmle.label | a | | array_flow.rb:453:14:453:14 | x | semmle.label | x | | array_flow.rb:453:14:453:14 | x | semmle.label | x | | array_flow.rb:454:14:454:14 | a | semmle.label | a | | array_flow.rb:454:14:454:14 | a | semmle.label | a | | array_flow.rb:456:10:456:10 | b | semmle.label | b | | array_flow.rb:456:10:456:10 | b | semmle.label | b | -| array_flow.rb:460:5:460:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:460:5:460:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:460:19:460:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:460:19:460:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:461:5:461:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:461:5:461:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:461:9:461:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:461:9:461:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:461:9:461:17 | call to entries [element 3] : | semmle.label | call to entries [element 3] : | -| array_flow.rb:461:9:461:17 | call to entries [element 3] : | semmle.label | call to entries [element 3] : | -| array_flow.rb:462:10:462:10 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:462:10:462:10 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:460:5:460:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:460:5:460:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:460:19:460:28 | call to source | semmle.label | call to source | +| array_flow.rb:460:19:460:28 | call to source | semmle.label | call to source | +| array_flow.rb:461:5:461:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:461:5:461:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:461:9:461:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:461:9:461:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:461:9:461:17 | call to entries [element 3] | semmle.label | call to entries [element 3] | +| array_flow.rb:461:9:461:17 | call to entries [element 3] | semmle.label | call to entries [element 3] | +| array_flow.rb:462:10:462:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:462:10:462:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:462:10:462:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:462:10:462:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:466:5:466:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:466:5:466:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:466:5:466:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:466:5:466:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:466:19:466:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:466:19:466:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:466:33:466:44 | call to source : | semmle.label | call to source : | -| array_flow.rb:466:33:466:44 | call to source : | semmle.label | call to source : | -| array_flow.rb:467:5:467:5 | b : | semmle.label | b : | -| array_flow.rb:467:5:467:5 | b : | semmle.label | b : | -| array_flow.rb:467:9:467:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:467:9:467:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:467:9:467:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:467:9:467:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:467:9:469:7 | call to fetch : | semmle.label | call to fetch : | -| array_flow.rb:467:9:469:7 | call to fetch : | semmle.label | call to fetch : | -| array_flow.rb:467:17:467:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:467:17:467:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:467:35:467:35 | x : | semmle.label | x : | -| array_flow.rb:467:35:467:35 | x : | semmle.label | x : | +| array_flow.rb:466:5:466:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:466:5:466:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:466:5:466:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:466:5:466:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:466:19:466:30 | call to source | semmle.label | call to source | +| array_flow.rb:466:19:466:30 | call to source | semmle.label | call to source | +| array_flow.rb:466:33:466:44 | call to source | semmle.label | call to source | +| array_flow.rb:466:33:466:44 | call to source | semmle.label | call to source | +| array_flow.rb:467:5:467:5 | b | semmle.label | b | +| array_flow.rb:467:5:467:5 | b | semmle.label | b | +| array_flow.rb:467:9:467:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:467:9:467:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:467:9:467:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:467:9:467:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:467:9:469:7 | call to fetch | semmle.label | call to fetch | +| array_flow.rb:467:9:469:7 | call to fetch | semmle.label | call to fetch | +| array_flow.rb:467:17:467:28 | call to source | semmle.label | call to source | +| array_flow.rb:467:17:467:28 | call to source | semmle.label | call to source | +| array_flow.rb:467:35:467:35 | x | semmle.label | x | +| array_flow.rb:467:35:467:35 | x | semmle.label | x | | array_flow.rb:468:14:468:14 | x | semmle.label | x | | array_flow.rb:468:14:468:14 | x | semmle.label | x | | array_flow.rb:470:10:470:10 | b | semmle.label | b | | array_flow.rb:470:10:470:10 | b | semmle.label | b | -| array_flow.rb:471:5:471:5 | b : | semmle.label | b : | -| array_flow.rb:471:5:471:5 | b : | semmle.label | b : | -| array_flow.rb:471:9:471:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:471:9:471:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:471:9:471:18 | call to fetch : | semmle.label | call to fetch : | -| array_flow.rb:471:9:471:18 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:471:5:471:5 | b | semmle.label | b | +| array_flow.rb:471:5:471:5 | b | semmle.label | b | +| array_flow.rb:471:9:471:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:471:9:471:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:471:9:471:18 | call to fetch | semmle.label | call to fetch | +| array_flow.rb:471:9:471:18 | call to fetch | semmle.label | call to fetch | | array_flow.rb:472:10:472:10 | b | semmle.label | b | | array_flow.rb:472:10:472:10 | b | semmle.label | b | -| array_flow.rb:473:5:473:5 | b : | semmle.label | b : | -| array_flow.rb:473:5:473:5 | b : | semmle.label | b : | -| array_flow.rb:473:9:473:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:473:9:473:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:473:9:473:32 | call to fetch : | semmle.label | call to fetch : | -| array_flow.rb:473:9:473:32 | call to fetch : | semmle.label | call to fetch : | -| array_flow.rb:473:20:473:31 | call to source : | semmle.label | call to source : | -| array_flow.rb:473:20:473:31 | call to source : | semmle.label | call to source : | +| array_flow.rb:473:5:473:5 | b | semmle.label | b | +| array_flow.rb:473:5:473:5 | b | semmle.label | b | +| array_flow.rb:473:9:473:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:473:9:473:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:473:9:473:32 | call to fetch | semmle.label | call to fetch | +| array_flow.rb:473:9:473:32 | call to fetch | semmle.label | call to fetch | +| array_flow.rb:473:20:473:31 | call to source | semmle.label | call to source | +| array_flow.rb:473:20:473:31 | call to source | semmle.label | call to source | | array_flow.rb:474:10:474:10 | b | semmle.label | b | | array_flow.rb:474:10:474:10 | b | semmle.label | b | -| array_flow.rb:475:5:475:5 | b : | semmle.label | b : | -| array_flow.rb:475:5:475:5 | b : | semmle.label | b : | -| array_flow.rb:475:9:475:34 | call to fetch : | semmle.label | call to fetch : | -| array_flow.rb:475:9:475:34 | call to fetch : | semmle.label | call to fetch : | -| array_flow.rb:475:22:475:33 | call to source : | semmle.label | call to source : | -| array_flow.rb:475:22:475:33 | call to source : | semmle.label | call to source : | +| array_flow.rb:475:5:475:5 | b | semmle.label | b | +| array_flow.rb:475:5:475:5 | b | semmle.label | b | +| array_flow.rb:475:9:475:34 | call to fetch | semmle.label | call to fetch | +| array_flow.rb:475:9:475:34 | call to fetch | semmle.label | call to fetch | +| array_flow.rb:475:22:475:33 | call to source | semmle.label | call to source | +| array_flow.rb:475:22:475:33 | call to source | semmle.label | call to source | | array_flow.rb:476:10:476:10 | b | semmle.label | b | | array_flow.rb:476:10:476:10 | b | semmle.label | b | -| array_flow.rb:477:5:477:5 | b : | semmle.label | b : | -| array_flow.rb:477:5:477:5 | b : | semmle.label | b : | -| array_flow.rb:477:9:477:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:477:9:477:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:477:9:477:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:477:9:477:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:477:9:477:32 | call to fetch : | semmle.label | call to fetch : | -| array_flow.rb:477:9:477:32 | call to fetch : | semmle.label | call to fetch : | -| array_flow.rb:477:20:477:31 | call to source : | semmle.label | call to source : | -| array_flow.rb:477:20:477:31 | call to source : | semmle.label | call to source : | +| array_flow.rb:477:5:477:5 | b | semmle.label | b | +| array_flow.rb:477:5:477:5 | b | semmle.label | b | +| array_flow.rb:477:9:477:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:477:9:477:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:477:9:477:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:477:9:477:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:477:9:477:32 | call to fetch | semmle.label | call to fetch | +| array_flow.rb:477:9:477:32 | call to fetch | semmle.label | call to fetch | +| array_flow.rb:477:20:477:31 | call to source | semmle.label | call to source | +| array_flow.rb:477:20:477:31 | call to source | semmle.label | call to source | | array_flow.rb:478:10:478:10 | b | semmle.label | b | | array_flow.rb:478:10:478:10 | b | semmle.label | b | -| array_flow.rb:482:5:482:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:482:5:482:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:482:19:482:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:482:19:482:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:483:5:483:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:483:5:483:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:483:12:483:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:483:12:483:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:484:10:484:10 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:484:10:484:10 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:484:10:484:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:484:10:484:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:482:5:482:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:482:5:482:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:482:19:482:30 | call to source | semmle.label | call to source | +| array_flow.rb:482:19:482:30 | call to source | semmle.label | call to source | +| array_flow.rb:483:5:483:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:483:5:483:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:483:12:483:23 | call to source | semmle.label | call to source | +| array_flow.rb:483:12:483:23 | call to source | semmle.label | call to source | +| array_flow.rb:484:10:484:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:484:10:484:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:484:10:484:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:484:10:484:10 | a [element] | semmle.label | a [element] | | array_flow.rb:484:10:484:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:484:10:484:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:485:5:485:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:485:5:485:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:485:12:485:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:485:12:485:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:486:10:486:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:486:10:486:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:485:5:485:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:485:5:485:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:485:12:485:23 | call to source | semmle.label | call to source | +| array_flow.rb:485:12:485:23 | call to source | semmle.label | call to source | +| array_flow.rb:486:10:486:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:486:10:486:10 | a [element] | semmle.label | a [element] | | array_flow.rb:486:10:486:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:486:10:486:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:487:5:487:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:487:5:487:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:488:9:488:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:488:9:488:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:490:10:490:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:490:10:490:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:487:5:487:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:487:5:487:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:488:9:488:20 | call to source | semmle.label | call to source | +| array_flow.rb:488:9:488:20 | call to source | semmle.label | call to source | +| array_flow.rb:490:10:490:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:490:10:490:10 | a [element] | semmle.label | a [element] | | array_flow.rb:490:10:490:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:490:10:490:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:491:5:491:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:491:5:491:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:492:9:492:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:492:9:492:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:494:10:494:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:494:10:494:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:491:5:491:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:491:5:491:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:492:9:492:20 | call to source | semmle.label | call to source | +| array_flow.rb:492:9:492:20 | call to source | semmle.label | call to source | +| array_flow.rb:494:10:494:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:494:10:494:10 | a [element] | semmle.label | a [element] | | array_flow.rb:494:10:494:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:494:10:494:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:498:5:498:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:498:5:498:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:498:19:498:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:498:19:498:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:499:5:499:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:499:5:499:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:499:9:499:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:499:9:499:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:499:9:501:7 | call to filter [element] : | semmle.label | call to filter [element] : | -| array_flow.rb:499:9:501:7 | call to filter [element] : | semmle.label | call to filter [element] : | -| array_flow.rb:499:22:499:22 | x : | semmle.label | x : | -| array_flow.rb:499:22:499:22 | x : | semmle.label | x : | +| array_flow.rb:498:5:498:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:498:5:498:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:498:19:498:28 | call to source | semmle.label | call to source | +| array_flow.rb:498:19:498:28 | call to source | semmle.label | call to source | +| array_flow.rb:499:5:499:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:499:5:499:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:499:9:499:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:499:9:499:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:499:9:501:7 | call to filter [element] | semmle.label | call to filter [element] | +| array_flow.rb:499:9:501:7 | call to filter [element] | semmle.label | call to filter [element] | +| array_flow.rb:499:22:499:22 | x | semmle.label | x | +| array_flow.rb:499:22:499:22 | x | semmle.label | x | | array_flow.rb:500:14:500:14 | x | semmle.label | x | | array_flow.rb:500:14:500:14 | x | semmle.label | x | -| array_flow.rb:502:10:502:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:502:10:502:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:502:10:502:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:502:10:502:10 | b [element] | semmle.label | b [element] | | array_flow.rb:502:10:502:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:502:10:502:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:506:5:506:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:506:5:506:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:506:19:506:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:506:19:506:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:507:5:507:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:507:5:507:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:507:9:507:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:507:9:507:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:507:9:509:7 | call to filter_map [element] : | semmle.label | call to filter_map [element] : | -| array_flow.rb:507:9:509:7 | call to filter_map [element] : | semmle.label | call to filter_map [element] : | -| array_flow.rb:507:26:507:26 | x : | semmle.label | x : | -| array_flow.rb:507:26:507:26 | x : | semmle.label | x : | +| array_flow.rb:506:5:506:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:506:5:506:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:506:19:506:28 | call to source | semmle.label | call to source | +| array_flow.rb:506:19:506:28 | call to source | semmle.label | call to source | +| array_flow.rb:507:5:507:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:507:5:507:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:507:9:507:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:507:9:507:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:507:9:509:7 | call to filter_map [element] | semmle.label | call to filter_map [element] | +| array_flow.rb:507:9:509:7 | call to filter_map [element] | semmle.label | call to filter_map [element] | +| array_flow.rb:507:26:507:26 | x | semmle.label | x | +| array_flow.rb:507:26:507:26 | x | semmle.label | x | | array_flow.rb:508:14:508:14 | x | semmle.label | x | | array_flow.rb:508:14:508:14 | x | semmle.label | x | -| array_flow.rb:510:10:510:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:510:10:510:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:510:10:510:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:510:10:510:10 | b [element] | semmle.label | b [element] | | array_flow.rb:510:10:510:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:510:10:510:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:514:5:514:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:514:5:514:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:514:19:514:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:514:19:514:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:515:5:515:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:515:5:515:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:515:9:515:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:515:9:515:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:515:9:515:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:515:9:515:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:515:9:518:7 | call to filter! [element] : | semmle.label | call to filter! [element] : | -| array_flow.rb:515:9:518:7 | call to filter! [element] : | semmle.label | call to filter! [element] : | -| array_flow.rb:515:23:515:23 | x : | semmle.label | x : | -| array_flow.rb:515:23:515:23 | x : | semmle.label | x : | +| array_flow.rb:514:5:514:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:514:5:514:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:514:19:514:28 | call to source | semmle.label | call to source | +| array_flow.rb:514:19:514:28 | call to source | semmle.label | call to source | +| array_flow.rb:515:5:515:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:515:5:515:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:515:9:515:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:515:9:515:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:515:9:515:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:515:9:515:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:515:9:518:7 | call to filter! [element] | semmle.label | call to filter! [element] | +| array_flow.rb:515:9:518:7 | call to filter! [element] | semmle.label | call to filter! [element] | +| array_flow.rb:515:23:515:23 | x | semmle.label | x | +| array_flow.rb:515:23:515:23 | x | semmle.label | x | | array_flow.rb:516:14:516:14 | x | semmle.label | x | | array_flow.rb:516:14:516:14 | x | semmle.label | x | -| array_flow.rb:519:10:519:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:519:10:519:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:519:10:519:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:519:10:519:10 | a [element] | semmle.label | a [element] | | array_flow.rb:519:10:519:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:519:10:519:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:520:10:520:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:520:10:520:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:520:10:520:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:520:10:520:10 | b [element] | semmle.label | b [element] | | array_flow.rb:520:10:520:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:520:10:520:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:524:5:524:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:524:5:524:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:524:19:524:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:524:19:524:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:525:5:525:5 | b : | semmle.label | b : | -| array_flow.rb:525:5:525:5 | b : | semmle.label | b : | -| array_flow.rb:525:9:525:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:525:9:525:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:525:9:527:7 | call to find : | semmle.label | call to find : | -| array_flow.rb:525:9:527:7 | call to find : | semmle.label | call to find : | -| array_flow.rb:525:21:525:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:525:21:525:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:525:41:525:41 | x : | semmle.label | x : | -| array_flow.rb:525:41:525:41 | x : | semmle.label | x : | +| array_flow.rb:524:5:524:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:524:5:524:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:524:19:524:30 | call to source | semmle.label | call to source | +| array_flow.rb:524:19:524:30 | call to source | semmle.label | call to source | +| array_flow.rb:525:5:525:5 | b | semmle.label | b | +| array_flow.rb:525:5:525:5 | b | semmle.label | b | +| array_flow.rb:525:9:525:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:525:9:525:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:525:9:527:7 | call to find | semmle.label | call to find | +| array_flow.rb:525:9:527:7 | call to find | semmle.label | call to find | +| array_flow.rb:525:21:525:32 | call to source | semmle.label | call to source | +| array_flow.rb:525:21:525:32 | call to source | semmle.label | call to source | +| array_flow.rb:525:41:525:41 | x | semmle.label | x | +| array_flow.rb:525:41:525:41 | x | semmle.label | x | | array_flow.rb:526:14:526:14 | x | semmle.label | x | | array_flow.rb:526:14:526:14 | x | semmle.label | x | | array_flow.rb:528:10:528:10 | b | semmle.label | b | | array_flow.rb:528:10:528:10 | b | semmle.label | b | -| array_flow.rb:532:5:532:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:532:5:532:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:532:19:532:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:532:19:532:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:533:5:533:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:533:5:533:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:533:9:533:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:533:9:533:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:533:9:535:7 | call to find_all [element] : | semmle.label | call to find_all [element] : | -| array_flow.rb:533:9:535:7 | call to find_all [element] : | semmle.label | call to find_all [element] : | -| array_flow.rb:533:24:533:24 | x : | semmle.label | x : | -| array_flow.rb:533:24:533:24 | x : | semmle.label | x : | +| array_flow.rb:532:5:532:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:532:5:532:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:532:19:532:28 | call to source | semmle.label | call to source | +| array_flow.rb:532:19:532:28 | call to source | semmle.label | call to source | +| array_flow.rb:533:5:533:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:533:5:533:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:533:9:533:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:533:9:533:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:533:9:535:7 | call to find_all [element] | semmle.label | call to find_all [element] | +| array_flow.rb:533:9:535:7 | call to find_all [element] | semmle.label | call to find_all [element] | +| array_flow.rb:533:24:533:24 | x | semmle.label | x | +| array_flow.rb:533:24:533:24 | x | semmle.label | x | | array_flow.rb:534:14:534:14 | x | semmle.label | x | | array_flow.rb:534:14:534:14 | x | semmle.label | x | -| array_flow.rb:536:10:536:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:536:10:536:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:536:10:536:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:536:10:536:10 | b [element] | semmle.label | b [element] | | array_flow.rb:536:10:536:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:536:10:536:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:540:5:540:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:540:5:540:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:540:19:540:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:540:19:540:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:541:5:541:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:541:5:541:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:541:22:541:22 | x : | semmle.label | x : | -| array_flow.rb:541:22:541:22 | x : | semmle.label | x : | +| array_flow.rb:540:5:540:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:540:5:540:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:540:19:540:28 | call to source | semmle.label | call to source | +| array_flow.rb:540:19:540:28 | call to source | semmle.label | call to source | +| array_flow.rb:541:5:541:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:541:5:541:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:541:22:541:22 | x | semmle.label | x | +| array_flow.rb:541:22:541:22 | x | semmle.label | x | | array_flow.rb:542:14:542:14 | x | semmle.label | x | | array_flow.rb:542:14:542:14 | x | semmle.label | x | -| array_flow.rb:547:5:547:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:547:5:547:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:547:5:547:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:547:5:547:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:547:10:547:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:547:10:547:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:547:30:547:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:547:30:547:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:548:5:548:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:548:5:548:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:548:12:548:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:548:12:548:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:549:10:549:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:549:10:549:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:549:10:549:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:549:10:549:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:547:5:547:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:547:5:547:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:547:5:547:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:547:5:547:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:547:10:547:21 | call to source | semmle.label | call to source | +| array_flow.rb:547:10:547:21 | call to source | semmle.label | call to source | +| array_flow.rb:547:30:547:41 | call to source | semmle.label | call to source | +| array_flow.rb:547:30:547:41 | call to source | semmle.label | call to source | +| array_flow.rb:548:5:548:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:548:5:548:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:548:12:548:23 | call to source | semmle.label | call to source | +| array_flow.rb:548:12:548:23 | call to source | semmle.label | call to source | +| array_flow.rb:549:10:549:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:549:10:549:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:549:10:549:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:549:10:549:10 | a [element] | semmle.label | a [element] | | array_flow.rb:549:10:549:16 | call to first | semmle.label | call to first | | array_flow.rb:549:10:549:16 | call to first | semmle.label | call to first | -| array_flow.rb:550:5:550:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:550:5:550:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:550:5:550:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:550:5:550:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:550:9:550:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:550:9:550:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:550:9:550:9 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:550:9:550:9 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:550:9:550:18 | call to first [element 0] : | semmle.label | call to first [element 0] : | -| array_flow.rb:550:9:550:18 | call to first [element 0] : | semmle.label | call to first [element 0] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | semmle.label | call to first [element] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | semmle.label | call to first [element] : | -| array_flow.rb:551:10:551:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:551:10:551:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:551:10:551:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:551:10:551:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:550:5:550:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:550:5:550:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:550:5:550:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:550:5:550:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:550:9:550:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:550:9:550:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:550:9:550:9 | a [element] | semmle.label | a [element] | +| array_flow.rb:550:9:550:9 | a [element] | semmle.label | a [element] | +| array_flow.rb:550:9:550:18 | call to first [element 0] | semmle.label | call to first [element 0] | +| array_flow.rb:550:9:550:18 | call to first [element 0] | semmle.label | call to first [element 0] | +| array_flow.rb:550:9:550:18 | call to first [element] | semmle.label | call to first [element] | +| array_flow.rb:550:9:550:18 | call to first [element] | semmle.label | call to first [element] | +| array_flow.rb:551:10:551:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:551:10:551:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:551:10:551:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:551:10:551:10 | b [element] | semmle.label | b [element] | | array_flow.rb:551:10:551:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:551:10:551:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:552:10:552:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:552:10:552:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:552:10:552:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:552:10:552:10 | b [element] | semmle.label | b [element] | | array_flow.rb:552:10:552:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:552:10:552:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:553:5:553:5 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:553:5:553:5 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:553:5:553:5 | c [element 3] : | semmle.label | c [element 3] : | -| array_flow.rb:553:5:553:5 | c [element 3] : | semmle.label | c [element 3] : | -| array_flow.rb:553:5:553:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:553:5:553:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:553:9:553:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:553:9:553:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:553:9:553:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:553:9:553:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:553:9:553:9 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:553:9:553:9 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:553:9:553:18 | call to first [element 0] : | semmle.label | call to first [element 0] : | -| array_flow.rb:553:9:553:18 | call to first [element 0] : | semmle.label | call to first [element 0] : | -| array_flow.rb:553:9:553:18 | call to first [element 3] : | semmle.label | call to first [element 3] : | -| array_flow.rb:553:9:553:18 | call to first [element 3] : | semmle.label | call to first [element 3] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | semmle.label | call to first [element] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | semmle.label | call to first [element] : | -| array_flow.rb:554:10:554:10 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:554:10:554:10 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:554:10:554:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:554:10:554:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:553:5:553:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:553:5:553:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:553:5:553:5 | c [element 3] | semmle.label | c [element 3] | +| array_flow.rb:553:5:553:5 | c [element 3] | semmle.label | c [element 3] | +| array_flow.rb:553:5:553:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:553:5:553:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:553:9:553:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:553:9:553:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:553:9:553:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:553:9:553:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:553:9:553:9 | a [element] | semmle.label | a [element] | +| array_flow.rb:553:9:553:9 | a [element] | semmle.label | a [element] | +| array_flow.rb:553:9:553:18 | call to first [element 0] | semmle.label | call to first [element 0] | +| array_flow.rb:553:9:553:18 | call to first [element 0] | semmle.label | call to first [element 0] | +| array_flow.rb:553:9:553:18 | call to first [element 3] | semmle.label | call to first [element 3] | +| array_flow.rb:553:9:553:18 | call to first [element 3] | semmle.label | call to first [element 3] | +| array_flow.rb:553:9:553:18 | call to first [element] | semmle.label | call to first [element] | +| array_flow.rb:553:9:553:18 | call to first [element] | semmle.label | call to first [element] | +| array_flow.rb:554:10:554:10 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:554:10:554:10 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:554:10:554:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:554:10:554:10 | c [element] | semmle.label | c [element] | | array_flow.rb:554:10:554:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:554:10:554:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:555:10:555:10 | c [element 3] : | semmle.label | c [element 3] : | -| array_flow.rb:555:10:555:10 | c [element 3] : | semmle.label | c [element 3] : | -| array_flow.rb:555:10:555:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:555:10:555:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:555:10:555:10 | c [element 3] | semmle.label | c [element 3] | +| array_flow.rb:555:10:555:10 | c [element 3] | semmle.label | c [element 3] | +| array_flow.rb:555:10:555:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:555:10:555:10 | c [element] | semmle.label | c [element] | | array_flow.rb:555:10:555:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:555:10:555:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:559:5:559:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:559:5:559:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:559:16:559:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:559:16:559:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:560:5:560:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:560:5:560:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:560:9:560:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:560:9:560:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:560:9:563:7 | call to flat_map [element] : | semmle.label | call to flat_map [element] : | -| array_flow.rb:560:9:563:7 | call to flat_map [element] : | semmle.label | call to flat_map [element] : | -| array_flow.rb:560:24:560:24 | x : | semmle.label | x : | -| array_flow.rb:560:24:560:24 | x : | semmle.label | x : | +| array_flow.rb:559:5:559:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:559:5:559:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:559:16:559:27 | call to source | semmle.label | call to source | +| array_flow.rb:559:16:559:27 | call to source | semmle.label | call to source | +| array_flow.rb:560:5:560:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:560:5:560:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:560:9:560:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:560:9:560:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:560:9:563:7 | call to flat_map [element] | semmle.label | call to flat_map [element] | +| array_flow.rb:560:9:563:7 | call to flat_map [element] | semmle.label | call to flat_map [element] | +| array_flow.rb:560:24:560:24 | x | semmle.label | x | +| array_flow.rb:560:24:560:24 | x | semmle.label | x | | array_flow.rb:561:14:561:14 | x | semmle.label | x | | array_flow.rb:561:14:561:14 | x | semmle.label | x | -| array_flow.rb:562:13:562:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:562:13:562:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:564:10:564:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:564:10:564:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:562:13:562:24 | call to source | semmle.label | call to source | +| array_flow.rb:562:13:562:24 | call to source | semmle.label | call to source | +| array_flow.rb:564:10:564:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:564:10:564:10 | b [element] | semmle.label | b [element] | | array_flow.rb:564:10:564:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:564:10:564:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:565:5:565:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:565:5:565:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:565:9:565:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:565:9:565:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:565:9:568:7 | call to flat_map [element] : | semmle.label | call to flat_map [element] : | -| array_flow.rb:565:9:568:7 | call to flat_map [element] : | semmle.label | call to flat_map [element] : | -| array_flow.rb:565:24:565:24 | x : | semmle.label | x : | -| array_flow.rb:565:24:565:24 | x : | semmle.label | x : | +| array_flow.rb:565:5:565:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:565:5:565:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:565:9:565:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:565:9:565:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:565:9:568:7 | call to flat_map [element] | semmle.label | call to flat_map [element] | +| array_flow.rb:565:9:568:7 | call to flat_map [element] | semmle.label | call to flat_map [element] | +| array_flow.rb:565:24:565:24 | x | semmle.label | x | +| array_flow.rb:565:24:565:24 | x | semmle.label | x | | array_flow.rb:566:14:566:14 | x | semmle.label | x | | array_flow.rb:566:14:566:14 | x | semmle.label | x | -| array_flow.rb:567:9:567:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:567:9:567:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:569:10:569:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:569:10:569:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:567:9:567:20 | call to source | semmle.label | call to source | +| array_flow.rb:567:9:567:20 | call to source | semmle.label | call to source | +| array_flow.rb:569:10:569:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:569:10:569:10 | b [element] | semmle.label | b [element] | | array_flow.rb:569:10:569:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:569:10:569:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:573:5:573:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:573:5:573:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:573:20:573:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:573:20:573:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:574:5:574:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:574:5:574:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:574:9:574:9 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:574:9:574:9 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:574:9:574:17 | call to flatten [element] : | semmle.label | call to flatten [element] : | -| array_flow.rb:574:9:574:17 | call to flatten [element] : | semmle.label | call to flatten [element] : | -| array_flow.rb:575:10:575:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:575:10:575:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:573:5:573:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:573:5:573:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:573:20:573:29 | call to source | semmle.label | call to source | +| array_flow.rb:573:20:573:29 | call to source | semmle.label | call to source | +| array_flow.rb:574:5:574:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:574:5:574:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:574:9:574:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:574:9:574:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:574:9:574:17 | call to flatten [element] | semmle.label | call to flatten [element] | +| array_flow.rb:574:9:574:17 | call to flatten [element] | semmle.label | call to flatten [element] | +| array_flow.rb:575:10:575:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:575:10:575:10 | b [element] | semmle.label | b [element] | | array_flow.rb:575:10:575:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:575:10:575:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:579:20:579:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:579:20:579:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:580:10:580:10 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:580:10:580:10 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:580:10:580:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:580:10:580:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:579:20:579:29 | call to source | semmle.label | call to source | +| array_flow.rb:579:20:579:29 | call to source | semmle.label | call to source | +| array_flow.rb:580:10:580:10 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:580:10:580:10 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:580:10:580:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:580:10:580:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:580:10:580:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:580:10:580:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:581:5:581:5 | b [element, element 1] : | semmle.label | b [element, element 1] : | -| array_flow.rb:581:5:581:5 | b [element, element 1] : | semmle.label | b [element, element 1] : | -| array_flow.rb:581:5:581:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:581:5:581:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:581:9:581:9 | [post] a [element, element 1] : | semmle.label | [post] a [element, element 1] : | -| array_flow.rb:581:9:581:9 | [post] a [element, element 1] : | semmle.label | [post] a [element, element 1] : | -| array_flow.rb:581:9:581:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:581:9:581:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:581:9:581:9 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:581:9:581:9 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | semmle.label | call to flatten! [element, element 1] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | semmle.label | call to flatten! [element, element 1] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element] : | semmle.label | call to flatten! [element] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element] : | semmle.label | call to flatten! [element] : | -| array_flow.rb:582:10:582:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:582:10:582:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:581:5:581:5 | b [element, element 1] | semmle.label | b [element, element 1] | +| array_flow.rb:581:5:581:5 | b [element, element 1] | semmle.label | b [element, element 1] | +| array_flow.rb:581:5:581:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:581:5:581:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:581:9:581:9 | [post] a [element, element 1] | semmle.label | [post] a [element, element 1] | +| array_flow.rb:581:9:581:9 | [post] a [element, element 1] | semmle.label | [post] a [element, element 1] | +| array_flow.rb:581:9:581:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:581:9:581:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:581:9:581:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:581:9:581:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] | semmle.label | call to flatten! [element, element 1] | +| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] | semmle.label | call to flatten! [element, element 1] | +| array_flow.rb:581:9:581:18 | call to flatten! [element] | semmle.label | call to flatten! [element] | +| array_flow.rb:581:9:581:18 | call to flatten! [element] | semmle.label | call to flatten! [element] | +| array_flow.rb:582:10:582:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:582:10:582:10 | a [element] | semmle.label | a [element] | | array_flow.rb:582:10:582:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:582:10:582:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:583:10:583:10 | a [element, element 1] : | semmle.label | a [element, element 1] : | -| array_flow.rb:583:10:583:10 | a [element, element 1] : | semmle.label | a [element, element 1] : | -| array_flow.rb:583:10:583:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:583:10:583:13 | ...[...] : | semmle.label | ...[...] : | -| array_flow.rb:583:10:583:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:583:10:583:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | +| array_flow.rb:583:10:583:10 | a [element, element 1] | semmle.label | a [element, element 1] | +| array_flow.rb:583:10:583:10 | a [element, element 1] | semmle.label | a [element, element 1] | +| array_flow.rb:583:10:583:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:583:10:583:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:583:10:583:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:583:10:583:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:583:10:583:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:583:10:583:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:584:10:584:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:584:10:584:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:584:10:584:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:584:10:584:10 | b [element] | semmle.label | b [element] | | array_flow.rb:584:10:584:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:584:10:584:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:585:10:585:10 | b [element, element 1] : | semmle.label | b [element, element 1] : | -| array_flow.rb:585:10:585:10 | b [element, element 1] : | semmle.label | b [element, element 1] : | -| array_flow.rb:585:10:585:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:585:10:585:13 | ...[...] : | semmle.label | ...[...] : | -| array_flow.rb:585:10:585:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:585:10:585:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | +| array_flow.rb:585:10:585:10 | b [element, element 1] | semmle.label | b [element, element 1] | +| array_flow.rb:585:10:585:10 | b [element, element 1] | semmle.label | b [element, element 1] | +| array_flow.rb:585:10:585:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:585:10:585:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:585:10:585:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:585:10:585:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:585:10:585:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:585:10:585:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:589:5:589:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:589:5:589:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:589:19:589:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:589:19:589:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:590:5:590:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:590:5:590:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:590:9:590:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:590:9:590:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:590:9:590:20 | call to grep [element] : | semmle.label | call to grep [element] : | -| array_flow.rb:590:9:590:20 | call to grep [element] : | semmle.label | call to grep [element] : | -| array_flow.rb:591:10:591:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:591:10:591:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:589:5:589:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:589:5:589:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:589:19:589:30 | call to source | semmle.label | call to source | +| array_flow.rb:589:19:589:30 | call to source | semmle.label | call to source | +| array_flow.rb:590:5:590:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:590:5:590:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:590:9:590:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:590:9:590:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:590:9:590:20 | call to grep [element] | semmle.label | call to grep [element] | +| array_flow.rb:590:9:590:20 | call to grep [element] | semmle.label | call to grep [element] | +| array_flow.rb:591:10:591:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:591:10:591:10 | b [element] | semmle.label | b [element] | | array_flow.rb:591:10:591:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:591:10:591:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:592:5:592:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:592:5:592:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:592:9:592:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:592:9:592:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:592:9:595:7 | call to grep [element] : | semmle.label | call to grep [element] : | -| array_flow.rb:592:9:595:7 | call to grep [element] : | semmle.label | call to grep [element] : | -| array_flow.rb:592:26:592:26 | x : | semmle.label | x : | -| array_flow.rb:592:26:592:26 | x : | semmle.label | x : | +| array_flow.rb:592:5:592:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:592:5:592:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:592:9:592:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:592:9:592:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:592:9:595:7 | call to grep [element] | semmle.label | call to grep [element] | +| array_flow.rb:592:9:595:7 | call to grep [element] | semmle.label | call to grep [element] | +| array_flow.rb:592:26:592:26 | x | semmle.label | x | +| array_flow.rb:592:26:592:26 | x | semmle.label | x | | array_flow.rb:593:14:593:14 | x | semmle.label | x | | array_flow.rb:593:14:593:14 | x | semmle.label | x | -| array_flow.rb:594:9:594:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:594:9:594:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:596:10:596:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:596:10:596:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:594:9:594:20 | call to source | semmle.label | call to source | +| array_flow.rb:594:9:594:20 | call to source | semmle.label | call to source | +| array_flow.rb:596:10:596:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:596:10:596:10 | b [element] | semmle.label | b [element] | | array_flow.rb:596:10:596:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:596:10:596:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:600:5:600:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:600:5:600:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:600:19:600:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:600:19:600:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:601:5:601:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:601:5:601:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:601:9:601:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:601:9:601:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:601:9:601:21 | call to grep_v [element] : | semmle.label | call to grep_v [element] : | -| array_flow.rb:601:9:601:21 | call to grep_v [element] : | semmle.label | call to grep_v [element] : | -| array_flow.rb:602:10:602:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:602:10:602:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:600:5:600:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:600:5:600:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:600:19:600:30 | call to source | semmle.label | call to source | +| array_flow.rb:600:19:600:30 | call to source | semmle.label | call to source | +| array_flow.rb:601:5:601:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:601:5:601:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:601:9:601:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:601:9:601:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:601:9:601:21 | call to grep_v [element] | semmle.label | call to grep_v [element] | +| array_flow.rb:601:9:601:21 | call to grep_v [element] | semmle.label | call to grep_v [element] | +| array_flow.rb:602:10:602:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:602:10:602:10 | b [element] | semmle.label | b [element] | | array_flow.rb:602:10:602:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:602:10:602:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:603:5:603:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:603:5:603:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:603:9:603:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:603:9:603:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:603:9:606:7 | call to grep_v [element] : | semmle.label | call to grep_v [element] : | -| array_flow.rb:603:9:606:7 | call to grep_v [element] : | semmle.label | call to grep_v [element] : | -| array_flow.rb:603:27:603:27 | x : | semmle.label | x : | -| array_flow.rb:603:27:603:27 | x : | semmle.label | x : | +| array_flow.rb:603:5:603:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:603:5:603:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:603:9:603:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:603:9:603:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:603:9:606:7 | call to grep_v [element] | semmle.label | call to grep_v [element] | +| array_flow.rb:603:9:606:7 | call to grep_v [element] | semmle.label | call to grep_v [element] | +| array_flow.rb:603:27:603:27 | x | semmle.label | x | +| array_flow.rb:603:27:603:27 | x | semmle.label | x | | array_flow.rb:604:14:604:14 | x | semmle.label | x | | array_flow.rb:604:14:604:14 | x | semmle.label | x | -| array_flow.rb:605:9:605:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:605:9:605:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:607:10:607:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:607:10:607:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:605:9:605:20 | call to source | semmle.label | call to source | +| array_flow.rb:605:9:605:20 | call to source | semmle.label | call to source | +| array_flow.rb:607:10:607:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:607:10:607:10 | b [element] | semmle.label | b [element] | | array_flow.rb:607:10:607:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:607:10:607:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:611:5:611:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:611:5:611:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:611:19:611:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:611:19:611:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:612:9:612:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:612:9:612:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:612:24:612:24 | x : | semmle.label | x : | -| array_flow.rb:612:24:612:24 | x : | semmle.label | x : | +| array_flow.rb:611:5:611:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:611:5:611:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:611:19:611:30 | call to source | semmle.label | call to source | +| array_flow.rb:611:19:611:30 | call to source | semmle.label | call to source | +| array_flow.rb:612:9:612:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:612:9:612:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:612:24:612:24 | x | semmle.label | x | +| array_flow.rb:612:24:612:24 | x | semmle.label | x | | array_flow.rb:613:14:613:14 | x | semmle.label | x | | array_flow.rb:613:14:613:14 | x | semmle.label | x | -| array_flow.rb:620:5:620:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:620:5:620:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:620:19:620:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:620:19:620:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:621:5:621:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:621:5:621:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:621:17:621:17 | x : | semmle.label | x : | -| array_flow.rb:621:17:621:17 | x : | semmle.label | x : | +| array_flow.rb:620:5:620:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:620:5:620:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:620:19:620:28 | call to source | semmle.label | call to source | +| array_flow.rb:620:19:620:28 | call to source | semmle.label | call to source | +| array_flow.rb:621:5:621:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:621:5:621:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:621:17:621:17 | x | semmle.label | x | +| array_flow.rb:621:17:621:17 | x | semmle.label | x | | array_flow.rb:622:14:622:14 | x | semmle.label | x | | array_flow.rb:622:14:622:14 | x | semmle.label | x | -| array_flow.rb:627:5:627:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:627:5:627:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:627:5:627:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:627:5:627:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:627:10:627:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:627:10:627:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:627:27:627:38 | call to source : | semmle.label | call to source : | -| array_flow.rb:627:27:627:38 | call to source : | semmle.label | call to source : | -| array_flow.rb:628:5:628:5 | b : | semmle.label | b : | -| array_flow.rb:628:5:628:5 | b : | semmle.label | b : | -| array_flow.rb:628:9:628:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:628:9:628:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:628:9:628:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:628:9:628:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:628:9:632:7 | call to inject : | semmle.label | call to inject : | -| array_flow.rb:628:9:632:7 | call to inject : | semmle.label | call to inject : | -| array_flow.rb:628:22:628:22 | x : | semmle.label | x : | -| array_flow.rb:628:22:628:22 | x : | semmle.label | x : | -| array_flow.rb:628:25:628:25 | y : | semmle.label | y : | -| array_flow.rb:628:25:628:25 | y : | semmle.label | y : | +| array_flow.rb:627:5:627:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:627:5:627:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:627:5:627:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:627:5:627:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:627:10:627:21 | call to source | semmle.label | call to source | +| array_flow.rb:627:10:627:21 | call to source | semmle.label | call to source | +| array_flow.rb:627:27:627:38 | call to source | semmle.label | call to source | +| array_flow.rb:627:27:627:38 | call to source | semmle.label | call to source | +| array_flow.rb:628:5:628:5 | b | semmle.label | b | +| array_flow.rb:628:5:628:5 | b | semmle.label | b | +| array_flow.rb:628:9:628:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:628:9:628:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:628:9:628:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:628:9:628:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:628:9:632:7 | call to inject | semmle.label | call to inject | +| array_flow.rb:628:9:632:7 | call to inject | semmle.label | call to inject | +| array_flow.rb:628:22:628:22 | x | semmle.label | x | +| array_flow.rb:628:22:628:22 | x | semmle.label | x | +| array_flow.rb:628:25:628:25 | y | semmle.label | y | +| array_flow.rb:628:25:628:25 | y | semmle.label | y | | array_flow.rb:629:14:629:14 | x | semmle.label | x | | array_flow.rb:629:14:629:14 | x | semmle.label | x | | array_flow.rb:630:14:630:14 | y | semmle.label | y | | array_flow.rb:630:14:630:14 | y | semmle.label | y | -| array_flow.rb:631:9:631:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:631:9:631:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:631:9:631:19 | call to source | semmle.label | call to source | +| array_flow.rb:631:9:631:19 | call to source | semmle.label | call to source | | array_flow.rb:633:10:633:10 | b | semmle.label | b | | array_flow.rb:633:10:633:10 | b | semmle.label | b | -| array_flow.rb:634:5:634:5 | c : | semmle.label | c : | -| array_flow.rb:634:5:634:5 | c : | semmle.label | c : | -| array_flow.rb:634:9:634:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:634:9:634:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:634:9:634:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:634:9:634:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:634:9:638:7 | call to inject : | semmle.label | call to inject : | -| array_flow.rb:634:9:638:7 | call to inject : | semmle.label | call to inject : | -| array_flow.rb:634:28:634:28 | y : | semmle.label | y : | -| array_flow.rb:634:28:634:28 | y : | semmle.label | y : | +| array_flow.rb:634:5:634:5 | c | semmle.label | c | +| array_flow.rb:634:5:634:5 | c | semmle.label | c | +| array_flow.rb:634:9:634:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:634:9:634:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:634:9:634:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:634:9:634:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:634:9:638:7 | call to inject | semmle.label | call to inject | +| array_flow.rb:634:9:638:7 | call to inject | semmle.label | call to inject | +| array_flow.rb:634:28:634:28 | y | semmle.label | y | +| array_flow.rb:634:28:634:28 | y | semmle.label | y | | array_flow.rb:636:14:636:14 | y | semmle.label | y | | array_flow.rb:636:14:636:14 | y | semmle.label | y | -| array_flow.rb:637:9:637:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:637:9:637:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:637:9:637:19 | call to source | semmle.label | call to source | +| array_flow.rb:637:9:637:19 | call to source | semmle.label | call to source | | array_flow.rb:639:10:639:10 | c | semmle.label | c | | array_flow.rb:639:10:639:10 | c | semmle.label | c | -| array_flow.rb:644:5:644:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:644:5:644:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:644:16:644:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:644:16:644:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:645:5:645:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:645:5:645:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:645:5:645:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:645:5:645:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:645:5:645:5 | b [element 4] : | semmle.label | b [element 4] : | -| array_flow.rb:645:5:645:5 | b [element 4] : | semmle.label | b [element 4] : | -| array_flow.rb:645:9:645:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| array_flow.rb:645:9:645:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| array_flow.rb:645:9:645:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:645:9:645:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:645:9:645:9 | [post] a [element 4] : | semmle.label | [post] a [element 4] : | -| array_flow.rb:645:9:645:9 | [post] a [element 4] : | semmle.label | [post] a [element 4] : | -| array_flow.rb:645:9:645:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:645:9:645:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:645:9:645:47 | call to insert [element 1] : | semmle.label | call to insert [element 1] : | -| array_flow.rb:645:9:645:47 | call to insert [element 1] : | semmle.label | call to insert [element 1] : | -| array_flow.rb:645:9:645:47 | call to insert [element 2] : | semmle.label | call to insert [element 2] : | -| array_flow.rb:645:9:645:47 | call to insert [element 2] : | semmle.label | call to insert [element 2] : | -| array_flow.rb:645:9:645:47 | call to insert [element 4] : | semmle.label | call to insert [element 4] : | -| array_flow.rb:645:9:645:47 | call to insert [element 4] : | semmle.label | call to insert [element 4] : | -| array_flow.rb:645:21:645:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:645:21:645:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:645:35:645:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:645:35:645:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:647:10:647:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:647:10:647:10 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:644:5:644:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:644:5:644:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:644:16:644:27 | call to source | semmle.label | call to source | +| array_flow.rb:644:16:644:27 | call to source | semmle.label | call to source | +| array_flow.rb:645:5:645:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:645:5:645:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:645:5:645:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:645:5:645:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:645:5:645:5 | b [element 4] | semmle.label | b [element 4] | +| array_flow.rb:645:5:645:5 | b [element 4] | semmle.label | b [element 4] | +| array_flow.rb:645:9:645:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| array_flow.rb:645:9:645:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| array_flow.rb:645:9:645:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:645:9:645:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:645:9:645:9 | [post] a [element 4] | semmle.label | [post] a [element 4] | +| array_flow.rb:645:9:645:9 | [post] a [element 4] | semmle.label | [post] a [element 4] | +| array_flow.rb:645:9:645:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:645:9:645:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:645:9:645:47 | call to insert [element 1] | semmle.label | call to insert [element 1] | +| array_flow.rb:645:9:645:47 | call to insert [element 1] | semmle.label | call to insert [element 1] | +| array_flow.rb:645:9:645:47 | call to insert [element 2] | semmle.label | call to insert [element 2] | +| array_flow.rb:645:9:645:47 | call to insert [element 2] | semmle.label | call to insert [element 2] | +| array_flow.rb:645:9:645:47 | call to insert [element 4] | semmle.label | call to insert [element 4] | +| array_flow.rb:645:9:645:47 | call to insert [element 4] | semmle.label | call to insert [element 4] | +| array_flow.rb:645:21:645:32 | call to source | semmle.label | call to source | +| array_flow.rb:645:21:645:32 | call to source | semmle.label | call to source | +| array_flow.rb:645:35:645:46 | call to source | semmle.label | call to source | +| array_flow.rb:645:35:645:46 | call to source | semmle.label | call to source | +| array_flow.rb:647:10:647:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:647:10:647:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:647:10:647:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:647:10:647:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:648:10:648:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:648:10:648:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:648:10:648:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:648:10:648:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:648:10:648:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:648:10:648:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:650:10:650:10 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:650:10:650:10 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:650:10:650:10 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:650:10:650:10 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:650:10:650:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:650:10:650:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:652:10:652:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:652:10:652:10 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:652:10:652:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:652:10:652:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:652:10:652:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:652:10:652:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:653:10:653:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:653:10:653:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:653:10:653:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:653:10:653:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:653:10:653:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:653:10:653:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:655:10:655:10 | b [element 4] : | semmle.label | b [element 4] : | -| array_flow.rb:655:10:655:10 | b [element 4] : | semmle.label | b [element 4] : | +| array_flow.rb:655:10:655:10 | b [element 4] | semmle.label | b [element 4] | +| array_flow.rb:655:10:655:10 | b [element 4] | semmle.label | b [element 4] | | array_flow.rb:655:10:655:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:655:10:655:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:658:5:658:5 | c [element 2] : | semmle.label | c [element 2] : | -| array_flow.rb:658:5:658:5 | c [element 2] : | semmle.label | c [element 2] : | -| array_flow.rb:658:16:658:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:658:16:658:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:659:5:659:5 | d [element] : | semmle.label | d [element] : | -| array_flow.rb:659:5:659:5 | d [element] : | semmle.label | d [element] : | -| array_flow.rb:659:9:659:9 | [post] c [element] : | semmle.label | [post] c [element] : | -| array_flow.rb:659:9:659:9 | [post] c [element] : | semmle.label | [post] c [element] : | -| array_flow.rb:659:9:659:9 | c [element 2] : | semmle.label | c [element 2] : | -| array_flow.rb:659:9:659:9 | c [element 2] : | semmle.label | c [element 2] : | -| array_flow.rb:659:9:659:47 | call to insert [element] : | semmle.label | call to insert [element] : | -| array_flow.rb:659:9:659:47 | call to insert [element] : | semmle.label | call to insert [element] : | -| array_flow.rb:659:21:659:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:659:21:659:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:659:35:659:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:659:35:659:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:660:10:660:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:660:10:660:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:658:5:658:5 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:658:5:658:5 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:658:16:658:27 | call to source | semmle.label | call to source | +| array_flow.rb:658:16:658:27 | call to source | semmle.label | call to source | +| array_flow.rb:659:5:659:5 | d [element] | semmle.label | d [element] | +| array_flow.rb:659:5:659:5 | d [element] | semmle.label | d [element] | +| array_flow.rb:659:9:659:9 | [post] c [element] | semmle.label | [post] c [element] | +| array_flow.rb:659:9:659:9 | [post] c [element] | semmle.label | [post] c [element] | +| array_flow.rb:659:9:659:9 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:659:9:659:9 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:659:9:659:47 | call to insert [element] | semmle.label | call to insert [element] | +| array_flow.rb:659:9:659:47 | call to insert [element] | semmle.label | call to insert [element] | +| array_flow.rb:659:21:659:32 | call to source | semmle.label | call to source | +| array_flow.rb:659:21:659:32 | call to source | semmle.label | call to source | +| array_flow.rb:659:35:659:46 | call to source | semmle.label | call to source | +| array_flow.rb:659:35:659:46 | call to source | semmle.label | call to source | +| array_flow.rb:660:10:660:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:660:10:660:10 | c [element] | semmle.label | c [element] | | array_flow.rb:660:10:660:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:660:10:660:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:661:10:661:10 | d [element] : | semmle.label | d [element] : | -| array_flow.rb:661:10:661:10 | d [element] : | semmle.label | d [element] : | +| array_flow.rb:661:10:661:10 | d [element] | semmle.label | d [element] | +| array_flow.rb:661:10:661:10 | d [element] | semmle.label | d [element] | | array_flow.rb:661:10:661:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:661:10:661:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:672:5:672:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:672:5:672:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:672:16:672:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:672:16:672:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:673:5:673:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:673:5:673:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:673:9:673:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:673:9:673:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:673:9:673:60 | call to intersection [element] : | semmle.label | call to intersection [element] : | -| array_flow.rb:673:9:673:60 | call to intersection [element] : | semmle.label | call to intersection [element] : | -| array_flow.rb:673:31:673:42 | call to source : | semmle.label | call to source : | -| array_flow.rb:673:31:673:42 | call to source : | semmle.label | call to source : | -| array_flow.rb:673:47:673:58 | call to source : | semmle.label | call to source : | -| array_flow.rb:673:47:673:58 | call to source : | semmle.label | call to source : | -| array_flow.rb:674:10:674:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:674:10:674:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:672:5:672:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:672:5:672:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:672:16:672:27 | call to source | semmle.label | call to source | +| array_flow.rb:672:16:672:27 | call to source | semmle.label | call to source | +| array_flow.rb:673:5:673:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:673:5:673:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:673:9:673:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:673:9:673:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:673:9:673:60 | call to intersection [element] | semmle.label | call to intersection [element] | +| array_flow.rb:673:9:673:60 | call to intersection [element] | semmle.label | call to intersection [element] | +| array_flow.rb:673:31:673:42 | call to source | semmle.label | call to source | +| array_flow.rb:673:31:673:42 | call to source | semmle.label | call to source | +| array_flow.rb:673:47:673:58 | call to source | semmle.label | call to source | +| array_flow.rb:673:47:673:58 | call to source | semmle.label | call to source | +| array_flow.rb:674:10:674:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:674:10:674:10 | b [element] | semmle.label | b [element] | | array_flow.rb:674:10:674:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:674:10:674:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:678:5:678:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:678:5:678:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:678:16:678:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:678:16:678:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:679:5:679:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:679:5:679:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:679:9:679:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:679:9:679:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:679:9:679:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:679:9:679:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:679:9:682:7 | call to keep_if [element] : | semmle.label | call to keep_if [element] : | -| array_flow.rb:679:9:682:7 | call to keep_if [element] : | semmle.label | call to keep_if [element] : | -| array_flow.rb:679:23:679:23 | x : | semmle.label | x : | -| array_flow.rb:679:23:679:23 | x : | semmle.label | x : | +| array_flow.rb:678:5:678:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:678:5:678:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:678:16:678:25 | call to source | semmle.label | call to source | +| array_flow.rb:678:16:678:25 | call to source | semmle.label | call to source | +| array_flow.rb:679:5:679:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:679:5:679:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:679:9:679:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:679:9:679:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:679:9:679:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:679:9:679:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:679:9:682:7 | call to keep_if [element] | semmle.label | call to keep_if [element] | +| array_flow.rb:679:9:682:7 | call to keep_if [element] | semmle.label | call to keep_if [element] | +| array_flow.rb:679:23:679:23 | x | semmle.label | x | +| array_flow.rb:679:23:679:23 | x | semmle.label | x | | array_flow.rb:680:14:680:14 | x | semmle.label | x | | array_flow.rb:680:14:680:14 | x | semmle.label | x | -| array_flow.rb:683:10:683:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:683:10:683:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:683:10:683:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:683:10:683:10 | a [element] | semmle.label | a [element] | | array_flow.rb:683:10:683:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:683:10:683:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:684:10:684:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:684:10:684:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:684:10:684:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:684:10:684:10 | b [element] | semmle.label | b [element] | | array_flow.rb:684:10:684:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:684:10:684:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:688:5:688:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:688:5:688:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:688:16:688:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:688:16:688:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:689:5:689:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:689:5:689:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:689:12:689:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:689:12:689:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:690:10:690:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:690:10:690:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:690:10:690:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:690:10:690:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:688:5:688:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:688:5:688:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:688:16:688:27 | call to source | semmle.label | call to source | +| array_flow.rb:688:16:688:27 | call to source | semmle.label | call to source | +| array_flow.rb:689:5:689:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:689:5:689:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:689:12:689:23 | call to source | semmle.label | call to source | +| array_flow.rb:689:12:689:23 | call to source | semmle.label | call to source | +| array_flow.rb:690:10:690:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:690:10:690:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:690:10:690:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:690:10:690:10 | a [element] | semmle.label | a [element] | | array_flow.rb:690:10:690:15 | call to last | semmle.label | call to last | | array_flow.rb:690:10:690:15 | call to last | semmle.label | call to last | -| array_flow.rb:691:5:691:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:691:5:691:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:691:9:691:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:691:9:691:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:691:9:691:9 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:691:9:691:9 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | semmle.label | call to last [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | semmle.label | call to last [element] : | -| array_flow.rb:692:10:692:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:692:10:692:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:691:5:691:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:691:5:691:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:691:9:691:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:691:9:691:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:691:9:691:9 | a [element] | semmle.label | a [element] | +| array_flow.rb:691:9:691:9 | a [element] | semmle.label | a [element] | +| array_flow.rb:691:9:691:17 | call to last [element] | semmle.label | call to last [element] | +| array_flow.rb:691:9:691:17 | call to last [element] | semmle.label | call to last [element] | +| array_flow.rb:692:10:692:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:692:10:692:10 | b [element] | semmle.label | b [element] | | array_flow.rb:692:10:692:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:692:10:692:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:693:10:693:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:693:10:693:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:693:10:693:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:693:10:693:10 | b [element] | semmle.label | b [element] | | array_flow.rb:693:10:693:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:693:10:693:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:697:5:697:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:697:5:697:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:697:16:697:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:697:16:697:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:698:5:698:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:698:5:698:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:698:9:698:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:698:9:698:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:698:9:701:7 | call to map [element] : | semmle.label | call to map [element] : | -| array_flow.rb:698:9:701:7 | call to map [element] : | semmle.label | call to map [element] : | -| array_flow.rb:698:19:698:19 | x : | semmle.label | x : | -| array_flow.rb:698:19:698:19 | x : | semmle.label | x : | +| array_flow.rb:697:5:697:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:697:5:697:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:697:16:697:27 | call to source | semmle.label | call to source | +| array_flow.rb:697:16:697:27 | call to source | semmle.label | call to source | +| array_flow.rb:698:5:698:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:698:5:698:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:698:9:698:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:698:9:698:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:698:9:701:7 | call to map [element] | semmle.label | call to map [element] | +| array_flow.rb:698:9:701:7 | call to map [element] | semmle.label | call to map [element] | +| array_flow.rb:698:19:698:19 | x | semmle.label | x | +| array_flow.rb:698:19:698:19 | x | semmle.label | x | | array_flow.rb:699:14:699:14 | x | semmle.label | x | | array_flow.rb:699:14:699:14 | x | semmle.label | x | -| array_flow.rb:700:9:700:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:700:9:700:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:702:10:702:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:702:10:702:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:700:9:700:19 | call to source | semmle.label | call to source | +| array_flow.rb:700:9:700:19 | call to source | semmle.label | call to source | +| array_flow.rb:702:10:702:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:702:10:702:10 | b [element] | semmle.label | b [element] | | array_flow.rb:702:10:702:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:702:10:702:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:706:5:706:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:706:5:706:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:706:16:706:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:706:16:706:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:707:5:707:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:707:5:707:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:707:9:707:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:707:9:707:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:707:9:710:7 | call to map! [element] : | semmle.label | call to map! [element] : | -| array_flow.rb:707:9:710:7 | call to map! [element] : | semmle.label | call to map! [element] : | -| array_flow.rb:707:20:707:20 | x : | semmle.label | x : | -| array_flow.rb:707:20:707:20 | x : | semmle.label | x : | +| array_flow.rb:706:5:706:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:706:5:706:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:706:16:706:27 | call to source | semmle.label | call to source | +| array_flow.rb:706:16:706:27 | call to source | semmle.label | call to source | +| array_flow.rb:707:5:707:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:707:5:707:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:707:9:707:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:707:9:707:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:707:9:710:7 | call to map! [element] | semmle.label | call to map! [element] | +| array_flow.rb:707:9:710:7 | call to map! [element] | semmle.label | call to map! [element] | +| array_flow.rb:707:20:707:20 | x | semmle.label | x | +| array_flow.rb:707:20:707:20 | x | semmle.label | x | | array_flow.rb:708:14:708:14 | x | semmle.label | x | | array_flow.rb:708:14:708:14 | x | semmle.label | x | -| array_flow.rb:709:9:709:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:709:9:709:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:711:10:711:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:711:10:711:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:709:9:709:19 | call to source | semmle.label | call to source | +| array_flow.rb:709:9:709:19 | call to source | semmle.label | call to source | +| array_flow.rb:711:10:711:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:711:10:711:10 | b [element] | semmle.label | b [element] | | array_flow.rb:711:10:711:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:711:10:711:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:715:5:715:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:715:5:715:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:715:16:715:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:718:5:718:5 | b : | semmle.label | b : | -| array_flow.rb:718:5:718:5 | b : | semmle.label | b : | -| array_flow.rb:718:9:718:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:718:9:718:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:718:9:718:13 | call to max : | semmle.label | call to max : | -| array_flow.rb:718:9:718:13 | call to max : | semmle.label | call to max : | +| array_flow.rb:715:5:715:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:715:5:715:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:715:16:715:25 | call to source | semmle.label | call to source | +| array_flow.rb:715:16:715:25 | call to source | semmle.label | call to source | +| array_flow.rb:718:5:718:5 | b | semmle.label | b | +| array_flow.rb:718:5:718:5 | b | semmle.label | b | +| array_flow.rb:718:9:718:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:718:9:718:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:718:9:718:13 | call to max | semmle.label | call to max | +| array_flow.rb:718:9:718:13 | call to max | semmle.label | call to max | | array_flow.rb:719:10:719:10 | b | semmle.label | b | | array_flow.rb:719:10:719:10 | b | semmle.label | b | -| array_flow.rb:722:5:722:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:722:5:722:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:722:9:722:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:722:9:722:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:722:9:722:16 | call to max [element] : | semmle.label | call to max [element] : | -| array_flow.rb:722:9:722:16 | call to max [element] : | semmle.label | call to max [element] : | -| array_flow.rb:723:10:723:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:723:10:723:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:722:5:722:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:722:5:722:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:722:9:722:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:722:9:722:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:722:9:722:16 | call to max [element] | semmle.label | call to max [element] | +| array_flow.rb:722:9:722:16 | call to max [element] | semmle.label | call to max [element] | +| array_flow.rb:723:10:723:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:723:10:723:10 | c [element] | semmle.label | c [element] | | array_flow.rb:723:10:723:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:723:10:723:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:726:5:726:5 | d : | semmle.label | d : | -| array_flow.rb:726:5:726:5 | d : | semmle.label | d : | -| array_flow.rb:726:9:726:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:726:9:726:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:726:9:730:7 | call to max : | semmle.label | call to max : | -| array_flow.rb:726:9:730:7 | call to max : | semmle.label | call to max : | -| array_flow.rb:726:19:726:19 | x : | semmle.label | x : | -| array_flow.rb:726:19:726:19 | x : | semmle.label | x : | -| array_flow.rb:726:22:726:22 | y : | semmle.label | y : | -| array_flow.rb:726:22:726:22 | y : | semmle.label | y : | +| array_flow.rb:726:5:726:5 | d | semmle.label | d | +| array_flow.rb:726:5:726:5 | d | semmle.label | d | +| array_flow.rb:726:9:726:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:726:9:726:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:726:9:730:7 | call to max | semmle.label | call to max | +| array_flow.rb:726:9:730:7 | call to max | semmle.label | call to max | +| array_flow.rb:726:19:726:19 | x | semmle.label | x | +| array_flow.rb:726:19:726:19 | x | semmle.label | x | +| array_flow.rb:726:22:726:22 | y | semmle.label | y | +| array_flow.rb:726:22:726:22 | y | semmle.label | y | | array_flow.rb:727:14:727:14 | x | semmle.label | x | | array_flow.rb:727:14:727:14 | x | semmle.label | x | | array_flow.rb:728:14:728:14 | y | semmle.label | y | | array_flow.rb:728:14:728:14 | y | semmle.label | y | | array_flow.rb:731:10:731:10 | d | semmle.label | d | | array_flow.rb:731:10:731:10 | d | semmle.label | d | -| array_flow.rb:734:5:734:5 | e [element] : | semmle.label | e [element] : | -| array_flow.rb:734:5:734:5 | e [element] : | semmle.label | e [element] : | -| array_flow.rb:734:9:734:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:734:9:734:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:734:9:738:7 | call to max [element] : | semmle.label | call to max [element] : | -| array_flow.rb:734:9:738:7 | call to max [element] : | semmle.label | call to max [element] : | -| array_flow.rb:734:22:734:22 | x : | semmle.label | x : | -| array_flow.rb:734:22:734:22 | x : | semmle.label | x : | -| array_flow.rb:734:25:734:25 | y : | semmle.label | y : | -| array_flow.rb:734:25:734:25 | y : | semmle.label | y : | +| array_flow.rb:734:5:734:5 | e [element] | semmle.label | e [element] | +| array_flow.rb:734:5:734:5 | e [element] | semmle.label | e [element] | +| array_flow.rb:734:9:734:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:734:9:734:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:734:9:738:7 | call to max [element] | semmle.label | call to max [element] | +| array_flow.rb:734:9:738:7 | call to max [element] | semmle.label | call to max [element] | +| array_flow.rb:734:22:734:22 | x | semmle.label | x | +| array_flow.rb:734:22:734:22 | x | semmle.label | x | +| array_flow.rb:734:25:734:25 | y | semmle.label | y | +| array_flow.rb:734:25:734:25 | y | semmle.label | y | | array_flow.rb:735:14:735:14 | x | semmle.label | x | | array_flow.rb:735:14:735:14 | x | semmle.label | x | | array_flow.rb:736:14:736:14 | y | semmle.label | y | | array_flow.rb:736:14:736:14 | y | semmle.label | y | -| array_flow.rb:739:10:739:10 | e [element] : | semmle.label | e [element] : | -| array_flow.rb:739:10:739:10 | e [element] : | semmle.label | e [element] : | +| array_flow.rb:739:10:739:10 | e [element] | semmle.label | e [element] | +| array_flow.rb:739:10:739:10 | e [element] | semmle.label | e [element] | | array_flow.rb:739:10:739:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:739:10:739:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:743:5:743:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:743:5:743:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:743:16:743:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:743:16:743:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:746:5:746:5 | b : | semmle.label | b : | -| array_flow.rb:746:5:746:5 | b : | semmle.label | b : | -| array_flow.rb:746:9:746:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:746:9:746:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:746:9:749:7 | call to max_by : | semmle.label | call to max_by : | -| array_flow.rb:746:9:749:7 | call to max_by : | semmle.label | call to max_by : | -| array_flow.rb:746:22:746:22 | x : | semmle.label | x : | -| array_flow.rb:746:22:746:22 | x : | semmle.label | x : | +| array_flow.rb:743:5:743:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:743:5:743:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:743:16:743:25 | call to source | semmle.label | call to source | +| array_flow.rb:743:16:743:25 | call to source | semmle.label | call to source | +| array_flow.rb:746:5:746:5 | b | semmle.label | b | +| array_flow.rb:746:5:746:5 | b | semmle.label | b | +| array_flow.rb:746:9:746:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:746:9:746:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:746:9:749:7 | call to max_by | semmle.label | call to max_by | +| array_flow.rb:746:9:749:7 | call to max_by | semmle.label | call to max_by | +| array_flow.rb:746:22:746:22 | x | semmle.label | x | +| array_flow.rb:746:22:746:22 | x | semmle.label | x | | array_flow.rb:747:14:747:14 | x | semmle.label | x | | array_flow.rb:747:14:747:14 | x | semmle.label | x | | array_flow.rb:750:10:750:10 | b | semmle.label | b | | array_flow.rb:750:10:750:10 | b | semmle.label | b | -| array_flow.rb:753:5:753:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:753:5:753:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:753:9:753:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:753:9:753:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:753:9:756:7 | call to max_by [element] : | semmle.label | call to max_by [element] : | -| array_flow.rb:753:9:756:7 | call to max_by [element] : | semmle.label | call to max_by [element] : | -| array_flow.rb:753:25:753:25 | x : | semmle.label | x : | -| array_flow.rb:753:25:753:25 | x : | semmle.label | x : | +| array_flow.rb:753:5:753:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:753:5:753:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:753:9:753:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:753:9:753:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:753:9:756:7 | call to max_by [element] | semmle.label | call to max_by [element] | +| array_flow.rb:753:9:756:7 | call to max_by [element] | semmle.label | call to max_by [element] | +| array_flow.rb:753:25:753:25 | x | semmle.label | x | +| array_flow.rb:753:25:753:25 | x | semmle.label | x | | array_flow.rb:754:14:754:14 | x | semmle.label | x | | array_flow.rb:754:14:754:14 | x | semmle.label | x | -| array_flow.rb:757:10:757:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:757:10:757:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:757:10:757:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:757:10:757:10 | c [element] | semmle.label | c [element] | | array_flow.rb:757:10:757:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:757:10:757:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:761:5:761:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:761:5:761:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:761:16:761:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:764:5:764:5 | b : | semmle.label | b : | -| array_flow.rb:764:5:764:5 | b : | semmle.label | b : | -| array_flow.rb:764:9:764:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:764:9:764:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:764:9:764:13 | call to min : | semmle.label | call to min : | -| array_flow.rb:764:9:764:13 | call to min : | semmle.label | call to min : | +| array_flow.rb:761:5:761:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:761:5:761:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:761:16:761:25 | call to source | semmle.label | call to source | +| array_flow.rb:761:16:761:25 | call to source | semmle.label | call to source | +| array_flow.rb:764:5:764:5 | b | semmle.label | b | +| array_flow.rb:764:5:764:5 | b | semmle.label | b | +| array_flow.rb:764:9:764:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:764:9:764:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:764:9:764:13 | call to min | semmle.label | call to min | +| array_flow.rb:764:9:764:13 | call to min | semmle.label | call to min | | array_flow.rb:765:10:765:10 | b | semmle.label | b | | array_flow.rb:765:10:765:10 | b | semmle.label | b | -| array_flow.rb:768:5:768:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:768:5:768:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:768:9:768:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:768:9:768:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:768:9:768:16 | call to min [element] : | semmle.label | call to min [element] : | -| array_flow.rb:768:9:768:16 | call to min [element] : | semmle.label | call to min [element] : | -| array_flow.rb:769:10:769:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:769:10:769:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:768:5:768:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:768:5:768:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:768:9:768:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:768:9:768:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:768:9:768:16 | call to min [element] | semmle.label | call to min [element] | +| array_flow.rb:768:9:768:16 | call to min [element] | semmle.label | call to min [element] | +| array_flow.rb:769:10:769:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:769:10:769:10 | c [element] | semmle.label | c [element] | | array_flow.rb:769:10:769:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:769:10:769:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:772:5:772:5 | d : | semmle.label | d : | -| array_flow.rb:772:5:772:5 | d : | semmle.label | d : | -| array_flow.rb:772:9:772:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:772:9:772:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:772:9:776:7 | call to min : | semmle.label | call to min : | -| array_flow.rb:772:9:776:7 | call to min : | semmle.label | call to min : | -| array_flow.rb:772:19:772:19 | x : | semmle.label | x : | -| array_flow.rb:772:19:772:19 | x : | semmle.label | x : | -| array_flow.rb:772:22:772:22 | y : | semmle.label | y : | -| array_flow.rb:772:22:772:22 | y : | semmle.label | y : | +| array_flow.rb:772:5:772:5 | d | semmle.label | d | +| array_flow.rb:772:5:772:5 | d | semmle.label | d | +| array_flow.rb:772:9:772:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:772:9:772:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:772:9:776:7 | call to min | semmle.label | call to min | +| array_flow.rb:772:9:776:7 | call to min | semmle.label | call to min | +| array_flow.rb:772:19:772:19 | x | semmle.label | x | +| array_flow.rb:772:19:772:19 | x | semmle.label | x | +| array_flow.rb:772:22:772:22 | y | semmle.label | y | +| array_flow.rb:772:22:772:22 | y | semmle.label | y | | array_flow.rb:773:14:773:14 | x | semmle.label | x | | array_flow.rb:773:14:773:14 | x | semmle.label | x | | array_flow.rb:774:14:774:14 | y | semmle.label | y | | array_flow.rb:774:14:774:14 | y | semmle.label | y | | array_flow.rb:777:10:777:10 | d | semmle.label | d | | array_flow.rb:777:10:777:10 | d | semmle.label | d | -| array_flow.rb:780:5:780:5 | e [element] : | semmle.label | e [element] : | -| array_flow.rb:780:5:780:5 | e [element] : | semmle.label | e [element] : | -| array_flow.rb:780:9:780:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:780:9:780:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:780:9:784:7 | call to min [element] : | semmle.label | call to min [element] : | -| array_flow.rb:780:9:784:7 | call to min [element] : | semmle.label | call to min [element] : | -| array_flow.rb:780:22:780:22 | x : | semmle.label | x : | -| array_flow.rb:780:22:780:22 | x : | semmle.label | x : | -| array_flow.rb:780:25:780:25 | y : | semmle.label | y : | -| array_flow.rb:780:25:780:25 | y : | semmle.label | y : | +| array_flow.rb:780:5:780:5 | e [element] | semmle.label | e [element] | +| array_flow.rb:780:5:780:5 | e [element] | semmle.label | e [element] | +| array_flow.rb:780:9:780:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:780:9:780:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:780:9:784:7 | call to min [element] | semmle.label | call to min [element] | +| array_flow.rb:780:9:784:7 | call to min [element] | semmle.label | call to min [element] | +| array_flow.rb:780:22:780:22 | x | semmle.label | x | +| array_flow.rb:780:22:780:22 | x | semmle.label | x | +| array_flow.rb:780:25:780:25 | y | semmle.label | y | +| array_flow.rb:780:25:780:25 | y | semmle.label | y | | array_flow.rb:781:14:781:14 | x | semmle.label | x | | array_flow.rb:781:14:781:14 | x | semmle.label | x | | array_flow.rb:782:14:782:14 | y | semmle.label | y | | array_flow.rb:782:14:782:14 | y | semmle.label | y | -| array_flow.rb:785:10:785:10 | e [element] : | semmle.label | e [element] : | -| array_flow.rb:785:10:785:10 | e [element] : | semmle.label | e [element] : | +| array_flow.rb:785:10:785:10 | e [element] | semmle.label | e [element] | +| array_flow.rb:785:10:785:10 | e [element] | semmle.label | e [element] | | array_flow.rb:785:10:785:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:785:10:785:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:789:5:789:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:789:5:789:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:789:16:789:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:789:16:789:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:792:5:792:5 | b : | semmle.label | b : | -| array_flow.rb:792:5:792:5 | b : | semmle.label | b : | -| array_flow.rb:792:9:792:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:792:9:792:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:792:9:795:7 | call to min_by : | semmle.label | call to min_by : | -| array_flow.rb:792:9:795:7 | call to min_by : | semmle.label | call to min_by : | -| array_flow.rb:792:22:792:22 | x : | semmle.label | x : | -| array_flow.rb:792:22:792:22 | x : | semmle.label | x : | +| array_flow.rb:789:5:789:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:789:5:789:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:789:16:789:25 | call to source | semmle.label | call to source | +| array_flow.rb:789:16:789:25 | call to source | semmle.label | call to source | +| array_flow.rb:792:5:792:5 | b | semmle.label | b | +| array_flow.rb:792:5:792:5 | b | semmle.label | b | +| array_flow.rb:792:9:792:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:792:9:792:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:792:9:795:7 | call to min_by | semmle.label | call to min_by | +| array_flow.rb:792:9:795:7 | call to min_by | semmle.label | call to min_by | +| array_flow.rb:792:22:792:22 | x | semmle.label | x | +| array_flow.rb:792:22:792:22 | x | semmle.label | x | | array_flow.rb:793:14:793:14 | x | semmle.label | x | | array_flow.rb:793:14:793:14 | x | semmle.label | x | | array_flow.rb:796:10:796:10 | b | semmle.label | b | | array_flow.rb:796:10:796:10 | b | semmle.label | b | -| array_flow.rb:799:5:799:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:799:5:799:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:799:9:799:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:799:9:799:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:799:9:802:7 | call to min_by [element] : | semmle.label | call to min_by [element] : | -| array_flow.rb:799:9:802:7 | call to min_by [element] : | semmle.label | call to min_by [element] : | -| array_flow.rb:799:25:799:25 | x : | semmle.label | x : | -| array_flow.rb:799:25:799:25 | x : | semmle.label | x : | +| array_flow.rb:799:5:799:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:799:5:799:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:799:9:799:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:799:9:799:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:799:9:802:7 | call to min_by [element] | semmle.label | call to min_by [element] | +| array_flow.rb:799:9:802:7 | call to min_by [element] | semmle.label | call to min_by [element] | +| array_flow.rb:799:25:799:25 | x | semmle.label | x | +| array_flow.rb:799:25:799:25 | x | semmle.label | x | | array_flow.rb:800:14:800:14 | x | semmle.label | x | | array_flow.rb:800:14:800:14 | x | semmle.label | x | -| array_flow.rb:803:10:803:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:803:10:803:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:803:10:803:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:803:10:803:10 | c [element] | semmle.label | c [element] | | array_flow.rb:803:10:803:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:803:10:803:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:807:5:807:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:807:5:807:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:807:16:807:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:807:16:807:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:809:5:809:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:809:5:809:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:809:9:809:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:809:9:809:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | semmle.label | call to minmax [element] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | semmle.label | call to minmax [element] : | -| array_flow.rb:810:10:810:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:810:10:810:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:807:5:807:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:807:5:807:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:807:16:807:25 | call to source | semmle.label | call to source | +| array_flow.rb:807:16:807:25 | call to source | semmle.label | call to source | +| array_flow.rb:809:5:809:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:809:5:809:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:809:9:809:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:809:9:809:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:809:9:809:16 | call to minmax [element] | semmle.label | call to minmax [element] | +| array_flow.rb:809:9:809:16 | call to minmax [element] | semmle.label | call to minmax [element] | +| array_flow.rb:810:10:810:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:810:10:810:10 | b [element] | semmle.label | b [element] | | array_flow.rb:810:10:810:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:810:10:810:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:811:10:811:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:811:10:811:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:811:10:811:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:811:10:811:10 | b [element] | semmle.label | b [element] | | array_flow.rb:811:10:811:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:811:10:811:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:813:5:813:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:813:5:813:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:813:9:813:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:813:9:813:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | semmle.label | call to minmax [element] : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | semmle.label | call to minmax [element] : | -| array_flow.rb:813:22:813:22 | x : | semmle.label | x : | -| array_flow.rb:813:22:813:22 | x : | semmle.label | x : | -| array_flow.rb:813:25:813:25 | y : | semmle.label | y : | -| array_flow.rb:813:25:813:25 | y : | semmle.label | y : | +| array_flow.rb:813:5:813:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:813:5:813:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:813:9:813:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:813:9:813:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:813:9:817:7 | call to minmax [element] | semmle.label | call to minmax [element] | +| array_flow.rb:813:9:817:7 | call to minmax [element] | semmle.label | call to minmax [element] | +| array_flow.rb:813:22:813:22 | x | semmle.label | x | +| array_flow.rb:813:22:813:22 | x | semmle.label | x | +| array_flow.rb:813:25:813:25 | y | semmle.label | y | +| array_flow.rb:813:25:813:25 | y | semmle.label | y | | array_flow.rb:814:14:814:14 | x | semmle.label | x | | array_flow.rb:814:14:814:14 | x | semmle.label | x | | array_flow.rb:815:14:815:14 | y | semmle.label | y | | array_flow.rb:815:14:815:14 | y | semmle.label | y | -| array_flow.rb:818:10:818:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:818:10:818:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:818:10:818:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:818:10:818:10 | c [element] | semmle.label | c [element] | | array_flow.rb:818:10:818:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:818:10:818:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:819:10:819:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:819:10:819:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:819:10:819:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:819:10:819:10 | c [element] | semmle.label | c [element] | | array_flow.rb:819:10:819:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:819:10:819:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:823:5:823:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:823:5:823:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:823:16:823:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:823:16:823:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:824:5:824:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:824:5:824:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:824:9:824:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:824:9:824:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | semmle.label | call to minmax_by [element] : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | semmle.label | call to minmax_by [element] : | -| array_flow.rb:824:25:824:25 | x : | semmle.label | x : | -| array_flow.rb:824:25:824:25 | x : | semmle.label | x : | +| array_flow.rb:823:5:823:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:823:5:823:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:823:16:823:25 | call to source | semmle.label | call to source | +| array_flow.rb:823:16:823:25 | call to source | semmle.label | call to source | +| array_flow.rb:824:5:824:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:824:5:824:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:824:9:824:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:824:9:824:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:824:9:827:7 | call to minmax_by [element] | semmle.label | call to minmax_by [element] | +| array_flow.rb:824:9:827:7 | call to minmax_by [element] | semmle.label | call to minmax_by [element] | +| array_flow.rb:824:25:824:25 | x | semmle.label | x | +| array_flow.rb:824:25:824:25 | x | semmle.label | x | | array_flow.rb:825:14:825:14 | x | semmle.label | x | | array_flow.rb:825:14:825:14 | x | semmle.label | x | -| array_flow.rb:828:10:828:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:828:10:828:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:828:10:828:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:828:10:828:10 | b [element] | semmle.label | b [element] | | array_flow.rb:828:10:828:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:828:10:828:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:829:10:829:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:829:10:829:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:829:10:829:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:829:10:829:10 | b [element] | semmle.label | b [element] | | array_flow.rb:829:10:829:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:829:10:829:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:833:5:833:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:833:5:833:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:833:16:833:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:833:16:833:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:834:5:834:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:834:5:834:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:834:17:834:17 | x : | semmle.label | x : | -| array_flow.rb:834:17:834:17 | x : | semmle.label | x : | +| array_flow.rb:833:5:833:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:833:5:833:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:833:16:833:25 | call to source | semmle.label | call to source | +| array_flow.rb:833:16:833:25 | call to source | semmle.label | call to source | +| array_flow.rb:834:5:834:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:834:5:834:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:834:17:834:17 | x | semmle.label | x | +| array_flow.rb:834:17:834:17 | x | semmle.label | x | | array_flow.rb:835:14:835:14 | x | semmle.label | x | | array_flow.rb:835:14:835:14 | x | semmle.label | x | -| array_flow.rb:842:5:842:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:842:5:842:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:842:16:842:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:842:16:842:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:843:5:843:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:843:5:843:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:843:16:843:16 | x : | semmle.label | x : | -| array_flow.rb:843:16:843:16 | x : | semmle.label | x : | +| array_flow.rb:842:5:842:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:842:5:842:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:842:16:842:25 | call to source | semmle.label | call to source | +| array_flow.rb:842:16:842:25 | call to source | semmle.label | call to source | +| array_flow.rb:843:5:843:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:843:5:843:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:843:16:843:16 | x | semmle.label | x | +| array_flow.rb:843:16:843:16 | x | semmle.label | x | | array_flow.rb:844:14:844:14 | x | semmle.label | x | | array_flow.rb:844:14:844:14 | x | semmle.label | x | -| array_flow.rb:849:5:849:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:849:16:849:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:850:5:850:5 | b : | semmle.label | b : | -| array_flow.rb:850:9:850:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:850:9:850:20 | call to pack : | semmle.label | call to pack : | +| array_flow.rb:849:5:849:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:849:16:849:25 | call to source | semmle.label | call to source | +| array_flow.rb:850:5:850:5 | b | semmle.label | b | +| array_flow.rb:850:9:850:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:850:9:850:20 | call to pack | semmle.label | call to pack | | array_flow.rb:851:10:851:10 | b | semmle.label | b | -| array_flow.rb:855:5:855:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:855:5:855:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:855:16:855:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:855:16:855:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:856:5:856:5 | b [element, element] : | semmle.label | b [element, element] : | -| array_flow.rb:856:5:856:5 | b [element, element] : | semmle.label | b [element, element] : | -| array_flow.rb:856:9:856:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:856:9:856:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | semmle.label | call to partition [element, element] : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | semmle.label | call to partition [element, element] : | -| array_flow.rb:856:25:856:25 | x : | semmle.label | x : | -| array_flow.rb:856:25:856:25 | x : | semmle.label | x : | +| array_flow.rb:855:5:855:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:855:5:855:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:855:16:855:25 | call to source | semmle.label | call to source | +| array_flow.rb:855:16:855:25 | call to source | semmle.label | call to source | +| array_flow.rb:856:5:856:5 | b [element, element] | semmle.label | b [element, element] | +| array_flow.rb:856:5:856:5 | b [element, element] | semmle.label | b [element, element] | +| array_flow.rb:856:9:856:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:856:9:856:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:856:9:859:7 | call to partition [element, element] | semmle.label | call to partition [element, element] | +| array_flow.rb:856:9:859:7 | call to partition [element, element] | semmle.label | call to partition [element, element] | +| array_flow.rb:856:25:856:25 | x | semmle.label | x | +| array_flow.rb:856:25:856:25 | x | semmle.label | x | | array_flow.rb:857:14:857:14 | x | semmle.label | x | | array_flow.rb:857:14:857:14 | x | semmle.label | x | -| array_flow.rb:860:10:860:10 | b [element, element] : | semmle.label | b [element, element] : | -| array_flow.rb:860:10:860:10 | b [element, element] : | semmle.label | b [element, element] : | -| array_flow.rb:860:10:860:13 | ...[...] [element] : | semmle.label | ...[...] [element] : | -| array_flow.rb:860:10:860:13 | ...[...] [element] : | semmle.label | ...[...] [element] : | +| array_flow.rb:860:10:860:10 | b [element, element] | semmle.label | b [element, element] | +| array_flow.rb:860:10:860:10 | b [element, element] | semmle.label | b [element, element] | +| array_flow.rb:860:10:860:13 | ...[...] [element] | semmle.label | ...[...] [element] | +| array_flow.rb:860:10:860:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:860:10:860:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:860:10:860:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:861:10:861:10 | b [element, element] : | semmle.label | b [element, element] : | -| array_flow.rb:861:10:861:10 | b [element, element] : | semmle.label | b [element, element] : | -| array_flow.rb:861:10:861:13 | ...[...] [element] : | semmle.label | ...[...] [element] : | -| array_flow.rb:861:10:861:13 | ...[...] [element] : | semmle.label | ...[...] [element] : | +| array_flow.rb:861:10:861:10 | b [element, element] | semmle.label | b [element, element] | +| array_flow.rb:861:10:861:10 | b [element, element] | semmle.label | b [element, element] | +| array_flow.rb:861:10:861:13 | ...[...] [element] | semmle.label | ...[...] [element] | +| array_flow.rb:861:10:861:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:861:10:861:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:861:10:861:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:865:5:865:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:865:5:865:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:865:16:865:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:867:5:867:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:867:5:867:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:867:9:867:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:867:9:867:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:867:9:871:7 | call to permutation [element 2] : | semmle.label | call to permutation [element 2] : | -| array_flow.rb:867:9:871:7 | call to permutation [element 2] : | semmle.label | call to permutation [element 2] : | -| array_flow.rb:867:27:867:27 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:867:27:867:27 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:868:14:868:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:868:14:868:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:865:5:865:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:865:5:865:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:865:16:865:25 | call to source | semmle.label | call to source | +| array_flow.rb:865:16:865:25 | call to source | semmle.label | call to source | +| array_flow.rb:867:5:867:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:867:5:867:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:867:9:867:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:867:9:867:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:867:9:871:7 | call to permutation [element 2] | semmle.label | call to permutation [element 2] | +| array_flow.rb:867:9:871:7 | call to permutation [element 2] | semmle.label | call to permutation [element 2] | +| array_flow.rb:867:27:867:27 | x [element] | semmle.label | x [element] | +| array_flow.rb:867:27:867:27 | x [element] | semmle.label | x [element] | +| array_flow.rb:868:14:868:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:868:14:868:14 | x [element] | semmle.label | x [element] | | array_flow.rb:868:14:868:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:868:14:868:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:869:14:869:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:869:14:869:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:869:14:869:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:869:14:869:14 | x [element] | semmle.label | x [element] | | array_flow.rb:869:14:869:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:869:14:869:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:870:14:870:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:870:14:870:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:870:14:870:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:870:14:870:14 | x [element] | semmle.label | x [element] | | array_flow.rb:870:14:870:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:870:14:870:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:873:10:873:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:873:10:873:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:873:10:873:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:873:10:873:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:873:10:873:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:873:10:873:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:875:5:875:5 | c [element 2] : | semmle.label | c [element 2] : | -| array_flow.rb:875:5:875:5 | c [element 2] : | semmle.label | c [element 2] : | -| array_flow.rb:875:9:875:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:875:9:875:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | semmle.label | call to permutation [element 2] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | semmle.label | call to permutation [element 2] : | -| array_flow.rb:875:30:875:30 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:875:30:875:30 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:876:14:876:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:876:14:876:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:875:5:875:5 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:875:5:875:5 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:875:9:875:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:875:9:875:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:875:9:878:7 | call to permutation [element 2] | semmle.label | call to permutation [element 2] | +| array_flow.rb:875:9:878:7 | call to permutation [element 2] | semmle.label | call to permutation [element 2] | +| array_flow.rb:875:30:875:30 | x [element] | semmle.label | x [element] | +| array_flow.rb:875:30:875:30 | x [element] | semmle.label | x [element] | +| array_flow.rb:876:14:876:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:876:14:876:14 | x [element] | semmle.label | x [element] | | array_flow.rb:876:14:876:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:876:14:876:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:877:14:877:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:877:14:877:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:877:14:877:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:877:14:877:14 | x [element] | semmle.label | x [element] | | array_flow.rb:877:14:877:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:877:14:877:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:880:10:880:10 | c [element 2] : | semmle.label | c [element 2] : | -| array_flow.rb:880:10:880:10 | c [element 2] : | semmle.label | c [element 2] : | +| array_flow.rb:880:10:880:10 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:880:10:880:10 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:880:10:880:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:880:10:880:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:882:9:882:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:882:9:882:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:882:30:882:30 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:882:30:882:30 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:883:14:883:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:883:14:883:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:882:9:882:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:882:9:882:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:882:30:882:30 | x [element] | semmle.label | x [element] | +| array_flow.rb:882:30:882:30 | x [element] | semmle.label | x [element] | +| array_flow.rb:883:14:883:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:883:14:883:14 | x [element] | semmle.label | x [element] | | array_flow.rb:883:14:883:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:883:14:883:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:884:14:884:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:884:14:884:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:884:14:884:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:884:14:884:14 | x [element] | semmle.label | x [element] | | array_flow.rb:884:14:884:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:884:14:884:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:887:10:887:10 | c [element 2] : | semmle.label | c [element 2] : | -| array_flow.rb:887:10:887:10 | c [element 2] : | semmle.label | c [element 2] : | +| array_flow.rb:887:10:887:10 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:887:10:887:10 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:887:10:887:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:887:10:887:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:894:5:894:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:894:5:894:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:894:5:894:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:894:5:894:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:894:13:894:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:894:13:894:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:894:30:894:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:894:30:894:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:895:5:895:5 | b : | semmle.label | b : | -| array_flow.rb:895:5:895:5 | b : | semmle.label | b : | -| array_flow.rb:895:9:895:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:895:9:895:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:895:9:895:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:895:9:895:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:895:9:895:13 | call to pop : | semmle.label | call to pop : | -| array_flow.rb:895:9:895:13 | call to pop : | semmle.label | call to pop : | +| array_flow.rb:894:5:894:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:894:5:894:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:894:5:894:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:894:5:894:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:894:13:894:24 | call to source | semmle.label | call to source | +| array_flow.rb:894:13:894:24 | call to source | semmle.label | call to source | +| array_flow.rb:894:30:894:41 | call to source | semmle.label | call to source | +| array_flow.rb:894:30:894:41 | call to source | semmle.label | call to source | +| array_flow.rb:895:5:895:5 | b | semmle.label | b | +| array_flow.rb:895:5:895:5 | b | semmle.label | b | +| array_flow.rb:895:9:895:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:895:9:895:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:895:9:895:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:895:9:895:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:895:9:895:13 | call to pop | semmle.label | call to pop | +| array_flow.rb:895:9:895:13 | call to pop | semmle.label | call to pop | | array_flow.rb:896:10:896:10 | b | semmle.label | b | | array_flow.rb:896:10:896:10 | b | semmle.label | b | -| array_flow.rb:898:10:898:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:898:10:898:10 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:898:10:898:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:898:10:898:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:898:10:898:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:898:10:898:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:900:10:900:10 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:900:10:900:10 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:900:10:900:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:900:10:900:10 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:900:10:900:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:900:10:900:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:902:5:902:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:902:5:902:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:902:5:902:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:902:5:902:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:902:13:902:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:902:13:902:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:902:30:902:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:902:30:902:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:903:5:903:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:903:5:903:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:903:9:903:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:903:9:903:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:903:9:903:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:903:9:903:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | semmle.label | call to pop [element] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | semmle.label | call to pop [element] : | -| array_flow.rb:904:10:904:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:904:10:904:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:902:5:902:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:902:5:902:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:902:5:902:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:902:5:902:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:902:13:902:24 | call to source | semmle.label | call to source | +| array_flow.rb:902:13:902:24 | call to source | semmle.label | call to source | +| array_flow.rb:902:30:902:41 | call to source | semmle.label | call to source | +| array_flow.rb:902:30:902:41 | call to source | semmle.label | call to source | +| array_flow.rb:903:5:903:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:903:5:903:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:903:9:903:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:903:9:903:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:903:9:903:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:903:9:903:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:903:9:903:16 | call to pop [element] | semmle.label | call to pop [element] | +| array_flow.rb:903:9:903:16 | call to pop [element] | semmle.label | call to pop [element] | +| array_flow.rb:904:10:904:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:904:10:904:10 | b [element] | semmle.label | b [element] | | array_flow.rb:904:10:904:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:904:10:904:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:905:10:905:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:905:10:905:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:905:10:905:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:905:10:905:10 | b [element] | semmle.label | b [element] | | array_flow.rb:905:10:905:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:905:10:905:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:907:10:907:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:907:10:907:10 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:907:10:907:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:907:10:907:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:907:10:907:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:907:10:907:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:909:10:909:10 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:909:10:909:10 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:909:10:909:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:909:10:909:10 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:909:10:909:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:909:10:909:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:913:5:913:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:913:5:913:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:913:16:913:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:913:16:913:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:914:5:914:5 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:914:5:914:5 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:914:5:914:5 | [post] a [element 5] : | semmle.label | [post] a [element 5] : | -| array_flow.rb:914:5:914:5 | [post] a [element 5] : | semmle.label | [post] a [element 5] : | -| array_flow.rb:914:5:914:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:914:5:914:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:914:21:914:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:914:21:914:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:917:10:917:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:917:10:917:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:913:5:913:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:913:5:913:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:913:16:913:27 | call to source | semmle.label | call to source | +| array_flow.rb:913:16:913:27 | call to source | semmle.label | call to source | +| array_flow.rb:914:5:914:5 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:914:5:914:5 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:914:5:914:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | +| array_flow.rb:914:5:914:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | +| array_flow.rb:914:5:914:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:914:5:914:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:914:21:914:32 | call to source | semmle.label | call to source | +| array_flow.rb:914:21:914:32 | call to source | semmle.label | call to source | +| array_flow.rb:917:10:917:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:917:10:917:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:917:10:917:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:917:10:917:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:920:10:920:10 | a [element 5] : | semmle.label | a [element 5] : | -| array_flow.rb:920:10:920:10 | a [element 5] : | semmle.label | a [element 5] : | +| array_flow.rb:920:10:920:10 | a [element 5] | semmle.label | a [element 5] | +| array_flow.rb:920:10:920:10 | a [element 5] | semmle.label | a [element 5] | | array_flow.rb:920:10:920:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:920:10:920:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:924:5:924:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:924:5:924:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:924:16:924:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:924:16:924:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:925:5:925:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:925:5:925:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:925:13:925:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:925:13:925:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:926:5:926:5 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:926:5:926:5 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:926:10:926:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:926:10:926:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:927:5:927:5 | d [element, element] : | semmle.label | d [element, element] : | -| array_flow.rb:927:5:927:5 | d [element, element] : | semmle.label | d [element, element] : | -| array_flow.rb:927:9:927:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:927:9:927:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:927:9:927:22 | call to product [element, element] : | semmle.label | call to product [element, element] : | -| array_flow.rb:927:9:927:22 | call to product [element, element] : | semmle.label | call to product [element, element] : | -| array_flow.rb:927:19:927:19 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:927:19:927:19 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:927:22:927:22 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:927:22:927:22 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:928:10:928:10 | d [element, element] : | semmle.label | d [element, element] : | -| array_flow.rb:928:10:928:10 | d [element, element] : | semmle.label | d [element, element] : | -| array_flow.rb:928:10:928:13 | ...[...] [element] : | semmle.label | ...[...] [element] : | -| array_flow.rb:928:10:928:13 | ...[...] [element] : | semmle.label | ...[...] [element] : | +| array_flow.rb:924:5:924:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:924:5:924:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:924:16:924:27 | call to source | semmle.label | call to source | +| array_flow.rb:924:16:924:27 | call to source | semmle.label | call to source | +| array_flow.rb:925:5:925:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:925:5:925:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:925:13:925:24 | call to source | semmle.label | call to source | +| array_flow.rb:925:13:925:24 | call to source | semmle.label | call to source | +| array_flow.rb:926:5:926:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:926:5:926:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:926:10:926:21 | call to source | semmle.label | call to source | +| array_flow.rb:926:10:926:21 | call to source | semmle.label | call to source | +| array_flow.rb:927:5:927:5 | d [element, element] | semmle.label | d [element, element] | +| array_flow.rb:927:5:927:5 | d [element, element] | semmle.label | d [element, element] | +| array_flow.rb:927:9:927:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:927:9:927:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:927:9:927:22 | call to product [element, element] | semmle.label | call to product [element, element] | +| array_flow.rb:927:9:927:22 | call to product [element, element] | semmle.label | call to product [element, element] | +| array_flow.rb:927:19:927:19 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:927:19:927:19 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:927:22:927:22 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:927:22:927:22 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:928:10:928:10 | d [element, element] | semmle.label | d [element, element] | +| array_flow.rb:928:10:928:10 | d [element, element] | semmle.label | d [element, element] | +| array_flow.rb:928:10:928:13 | ...[...] [element] | semmle.label | ...[...] [element] | +| array_flow.rb:928:10:928:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:928:10:928:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:928:10:928:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:929:10:929:10 | d [element, element] : | semmle.label | d [element, element] : | -| array_flow.rb:929:10:929:10 | d [element, element] : | semmle.label | d [element, element] : | -| array_flow.rb:929:10:929:13 | ...[...] [element] : | semmle.label | ...[...] [element] : | -| array_flow.rb:929:10:929:13 | ...[...] [element] : | semmle.label | ...[...] [element] : | +| array_flow.rb:929:10:929:10 | d [element, element] | semmle.label | d [element, element] | +| array_flow.rb:929:10:929:10 | d [element, element] | semmle.label | d [element, element] | +| array_flow.rb:929:10:929:13 | ...[...] [element] | semmle.label | ...[...] [element] | +| array_flow.rb:929:10:929:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:929:10:929:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:929:10:929:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:933:5:933:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:933:5:933:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:933:10:933:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:933:10:933:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:934:5:934:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:934:5:934:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:934:5:934:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:934:5:934:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:934:9:934:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:934:9:934:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:934:9:934:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:934:9:934:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element 0] : | semmle.label | call to append [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element 0] : | semmle.label | call to append [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | semmle.label | call to append [element] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | semmle.label | call to append [element] : | -| array_flow.rb:934:18:934:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:934:18:934:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:934:32:934:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:934:32:934:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:935:10:935:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:935:10:935:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:935:10:935:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:935:10:935:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:933:5:933:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:933:5:933:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:933:10:933:21 | call to source | semmle.label | call to source | +| array_flow.rb:933:10:933:21 | call to source | semmle.label | call to source | +| array_flow.rb:934:5:934:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:934:5:934:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:934:5:934:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:934:5:934:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:934:9:934:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:934:9:934:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:934:9:934:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:934:9:934:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:934:9:934:44 | call to append [element 0] | semmle.label | call to append [element 0] | +| array_flow.rb:934:9:934:44 | call to append [element 0] | semmle.label | call to append [element 0] | +| array_flow.rb:934:9:934:44 | call to append [element] | semmle.label | call to append [element] | +| array_flow.rb:934:9:934:44 | call to append [element] | semmle.label | call to append [element] | +| array_flow.rb:934:18:934:29 | call to source | semmle.label | call to source | +| array_flow.rb:934:18:934:29 | call to source | semmle.label | call to source | +| array_flow.rb:934:32:934:43 | call to source | semmle.label | call to source | +| array_flow.rb:934:32:934:43 | call to source | semmle.label | call to source | +| array_flow.rb:935:10:935:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:935:10:935:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:935:10:935:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:935:10:935:10 | a [element] | semmle.label | a [element] | | array_flow.rb:935:10:935:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:935:10:935:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:936:10:936:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:936:10:936:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:936:10:936:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:936:10:936:10 | a [element] | semmle.label | a [element] | | array_flow.rb:936:10:936:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:936:10:936:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:937:10:937:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:937:10:937:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:937:10:937:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:937:10:937:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:937:10:937:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:937:10:937:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:937:10:937:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:937:10:937:10 | b [element] | semmle.label | b [element] | | array_flow.rb:937:10:937:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:937:10:937:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:938:10:938:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:938:10:938:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:938:10:938:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:938:10:938:10 | b [element] | semmle.label | b [element] | | array_flow.rb:938:10:938:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:938:10:938:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:944:5:944:5 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:944:5:944:5 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:944:10:944:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:944:10:944:19 | call to source : | semmle.label | call to source : | -| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | -| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | -| array_flow.rb:945:16:945:16 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:945:16:945:16 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:946:10:946:10 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | -| array_flow.rb:946:10:946:10 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | -| array_flow.rb:946:10:946:22 | call to rassoc [element 0] : | semmle.label | call to rassoc [element 0] : | -| array_flow.rb:946:10:946:22 | call to rassoc [element 0] : | semmle.label | call to rassoc [element 0] : | +| array_flow.rb:944:5:944:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:944:5:944:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:944:10:944:19 | call to source | semmle.label | call to source | +| array_flow.rb:944:10:944:19 | call to source | semmle.label | call to source | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:945:16:945:16 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:945:16:945:16 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:946:10:946:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:946:10:946:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:946:10:946:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | +| array_flow.rb:946:10:946:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | | array_flow.rb:946:10:946:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:946:10:946:25 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:947:10:947:10 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | -| array_flow.rb:947:10:947:10 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | -| array_flow.rb:947:10:947:22 | call to rassoc [element 0] : | semmle.label | call to rassoc [element 0] : | -| array_flow.rb:947:10:947:22 | call to rassoc [element 0] : | semmle.label | call to rassoc [element 0] : | +| array_flow.rb:947:10:947:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:947:10:947:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:947:10:947:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | +| array_flow.rb:947:10:947:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | | array_flow.rb:947:10:947:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:947:10:947:25 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:951:5:951:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:951:5:951:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:951:5:951:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:951:5:951:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:951:10:951:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:951:10:951:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:951:27:951:38 | call to source : | semmle.label | call to source : | -| array_flow.rb:951:27:951:38 | call to source : | semmle.label | call to source : | -| array_flow.rb:952:9:952:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:952:9:952:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:952:9:952:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:952:9:952:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:952:22:952:22 | x : | semmle.label | x : | -| array_flow.rb:952:22:952:22 | x : | semmle.label | x : | -| array_flow.rb:952:25:952:25 | y : | semmle.label | y : | -| array_flow.rb:952:25:952:25 | y : | semmle.label | y : | +| array_flow.rb:951:5:951:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:951:5:951:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:951:5:951:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:951:5:951:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:951:10:951:21 | call to source | semmle.label | call to source | +| array_flow.rb:951:10:951:21 | call to source | semmle.label | call to source | +| array_flow.rb:951:27:951:38 | call to source | semmle.label | call to source | +| array_flow.rb:951:27:951:38 | call to source | semmle.label | call to source | +| array_flow.rb:952:9:952:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:952:9:952:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:952:9:952:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:952:9:952:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:952:22:952:22 | x | semmle.label | x | +| array_flow.rb:952:22:952:22 | x | semmle.label | x | +| array_flow.rb:952:25:952:25 | y | semmle.label | y | +| array_flow.rb:952:25:952:25 | y | semmle.label | y | | array_flow.rb:953:14:953:14 | x | semmle.label | x | | array_flow.rb:953:14:953:14 | x | semmle.label | x | | array_flow.rb:954:14:954:14 | y | semmle.label | y | | array_flow.rb:954:14:954:14 | y | semmle.label | y | -| array_flow.rb:957:9:957:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:957:9:957:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:957:9:957:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:957:9:957:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:957:28:957:28 | y : | semmle.label | y : | -| array_flow.rb:957:28:957:28 | y : | semmle.label | y : | +| array_flow.rb:957:9:957:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:957:9:957:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:957:9:957:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:957:9:957:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:957:28:957:28 | y | semmle.label | y | +| array_flow.rb:957:28:957:28 | y | semmle.label | y | | array_flow.rb:959:14:959:14 | y | semmle.label | y | | array_flow.rb:959:14:959:14 | y | semmle.label | y | -| array_flow.rb:965:5:965:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:965:5:965:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:965:16:965:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:965:16:965:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:966:5:966:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:966:5:966:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:966:9:966:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:966:9:966:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:966:9:969:7 | call to reject [element] : | semmle.label | call to reject [element] : | -| array_flow.rb:966:9:969:7 | call to reject [element] : | semmle.label | call to reject [element] : | -| array_flow.rb:966:22:966:22 | x : | semmle.label | x : | -| array_flow.rb:966:22:966:22 | x : | semmle.label | x : | +| array_flow.rb:965:5:965:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:965:5:965:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:965:16:965:25 | call to source | semmle.label | call to source | +| array_flow.rb:965:16:965:25 | call to source | semmle.label | call to source | +| array_flow.rb:966:5:966:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:966:5:966:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:966:9:966:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:966:9:966:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:966:9:969:7 | call to reject [element] | semmle.label | call to reject [element] | +| array_flow.rb:966:9:969:7 | call to reject [element] | semmle.label | call to reject [element] | +| array_flow.rb:966:22:966:22 | x | semmle.label | x | +| array_flow.rb:966:22:966:22 | x | semmle.label | x | | array_flow.rb:967:14:967:14 | x | semmle.label | x | | array_flow.rb:967:14:967:14 | x | semmle.label | x | -| array_flow.rb:970:10:970:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:970:10:970:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:970:10:970:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:970:10:970:10 | b [element] | semmle.label | b [element] | | array_flow.rb:970:10:970:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:970:10:970:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:974:5:974:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:974:5:974:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:974:16:974:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:974:16:974:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:975:5:975:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:975:5:975:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:975:9:975:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:975:9:975:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:975:9:975:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:975:9:975:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:975:9:978:7 | call to reject! [element] : | semmle.label | call to reject! [element] : | -| array_flow.rb:975:9:978:7 | call to reject! [element] : | semmle.label | call to reject! [element] : | -| array_flow.rb:975:23:975:23 | x : | semmle.label | x : | -| array_flow.rb:975:23:975:23 | x : | semmle.label | x : | +| array_flow.rb:974:5:974:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:974:5:974:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:974:16:974:25 | call to source | semmle.label | call to source | +| array_flow.rb:974:16:974:25 | call to source | semmle.label | call to source | +| array_flow.rb:975:5:975:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:975:5:975:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:975:9:975:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:975:9:975:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:975:9:975:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:975:9:975:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:975:9:978:7 | call to reject! [element] | semmle.label | call to reject! [element] | +| array_flow.rb:975:9:978:7 | call to reject! [element] | semmle.label | call to reject! [element] | +| array_flow.rb:975:23:975:23 | x | semmle.label | x | +| array_flow.rb:975:23:975:23 | x | semmle.label | x | | array_flow.rb:976:14:976:14 | x | semmle.label | x | | array_flow.rb:976:14:976:14 | x | semmle.label | x | -| array_flow.rb:979:10:979:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:979:10:979:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:979:10:979:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:979:10:979:10 | a [element] | semmle.label | a [element] | | array_flow.rb:979:10:979:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:979:10:979:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:980:10:980:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:980:10:980:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:980:10:980:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:980:10:980:10 | b [element] | semmle.label | b [element] | | array_flow.rb:980:10:980:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:980:10:980:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:984:5:984:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:984:5:984:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:984:16:984:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:984:16:984:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:985:5:985:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:985:5:985:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:985:9:985:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:985:9:985:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | semmle.label | call to repeated_combination [element 2] : | -| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | semmle.label | call to repeated_combination [element 2] : | -| array_flow.rb:985:39:985:39 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:985:39:985:39 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:986:14:986:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:986:14:986:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:984:5:984:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:984:5:984:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:984:16:984:25 | call to source | semmle.label | call to source | +| array_flow.rb:984:16:984:25 | call to source | semmle.label | call to source | +| array_flow.rb:985:5:985:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:985:5:985:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:985:9:985:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:985:9:985:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] | semmle.label | call to repeated_combination [element 2] | +| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] | semmle.label | call to repeated_combination [element 2] | +| array_flow.rb:985:39:985:39 | x [element] | semmle.label | x [element] | +| array_flow.rb:985:39:985:39 | x [element] | semmle.label | x [element] | +| array_flow.rb:986:14:986:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:986:14:986:14 | x [element] | semmle.label | x [element] | | array_flow.rb:986:14:986:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:986:14:986:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:987:14:987:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:987:14:987:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:987:14:987:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:987:14:987:14 | x [element] | semmle.label | x [element] | | array_flow.rb:987:14:987:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:987:14:987:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:990:10:990:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:990:10:990:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:990:10:990:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:990:10:990:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:990:10:990:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:990:10:990:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:994:5:994:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:994:5:994:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:994:16:994:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:994:16:994:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:995:5:995:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:995:5:995:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:995:9:995:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:995:9:995:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | semmle.label | call to repeated_permutation [element 2] : | -| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | semmle.label | call to repeated_permutation [element 2] : | -| array_flow.rb:995:39:995:39 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:995:39:995:39 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:996:14:996:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:996:14:996:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:994:5:994:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:994:5:994:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:994:16:994:25 | call to source | semmle.label | call to source | +| array_flow.rb:994:16:994:25 | call to source | semmle.label | call to source | +| array_flow.rb:995:5:995:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:995:5:995:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:995:9:995:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:995:9:995:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] | semmle.label | call to repeated_permutation [element 2] | +| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] | semmle.label | call to repeated_permutation [element 2] | +| array_flow.rb:995:39:995:39 | x [element] | semmle.label | x [element] | +| array_flow.rb:995:39:995:39 | x [element] | semmle.label | x [element] | +| array_flow.rb:996:14:996:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:996:14:996:14 | x [element] | semmle.label | x [element] | | array_flow.rb:996:14:996:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:996:14:996:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:997:14:997:14 | x [element] : | semmle.label | x [element] : | -| array_flow.rb:997:14:997:14 | x [element] : | semmle.label | x [element] : | +| array_flow.rb:997:14:997:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:997:14:997:14 | x [element] | semmle.label | x [element] | | array_flow.rb:997:14:997:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:997:14:997:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1000:10:1000:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1000:10:1000:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1000:10:1000:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1000:10:1000:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1000:10:1000:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1000:10:1000:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1006:5:1006:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1006:5:1006:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | semmle.label | call to replace [element 0] : | -| array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | semmle.label | call to replace [element 0] : | -| array_flow.rb:1006:20:1006:31 | call to source : | semmle.label | call to source : | -| array_flow.rb:1006:20:1006:31 | call to source : | semmle.label | call to source : | -| array_flow.rb:1007:10:1007:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1007:10:1007:10 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1006:5:1006:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1006:5:1006:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1006:9:1006:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1006:9:1006:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1006:9:1006:33 | call to replace [element 0] | semmle.label | call to replace [element 0] | +| array_flow.rb:1006:9:1006:33 | call to replace [element 0] | semmle.label | call to replace [element 0] | +| array_flow.rb:1006:20:1006:31 | call to source | semmle.label | call to source | +| array_flow.rb:1006:20:1006:31 | call to source | semmle.label | call to source | +| array_flow.rb:1007:10:1007:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1007:10:1007:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1007:10:1007:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1007:10:1007:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1008:10:1008:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1008:10:1008:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1008:10:1008:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1008:10:1008:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1008:10:1008:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1008:10:1008:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1012:5:1012:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1012:5:1012:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1012:5:1012:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1012:5:1012:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1012:16:1012:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1012:16:1012:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1012:31:1012:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1012:31:1012:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1013:5:1013:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1013:5:1013:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1013:9:1013:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1013:9:1013:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1013:9:1013:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1013:9:1013:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | semmle.label | call to reverse [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | semmle.label | call to reverse [element] : | -| array_flow.rb:1014:10:1014:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1014:10:1014:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1012:5:1012:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1012:5:1012:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1012:5:1012:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1012:5:1012:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1012:16:1012:28 | call to source | semmle.label | call to source | +| array_flow.rb:1012:16:1012:28 | call to source | semmle.label | call to source | +| array_flow.rb:1012:31:1012:43 | call to source | semmle.label | call to source | +| array_flow.rb:1012:31:1012:43 | call to source | semmle.label | call to source | +| array_flow.rb:1013:5:1013:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1013:5:1013:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1013:9:1013:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1013:9:1013:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1013:9:1013:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1013:9:1013:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1013:9:1013:17 | call to reverse [element] | semmle.label | call to reverse [element] | +| array_flow.rb:1013:9:1013:17 | call to reverse [element] | semmle.label | call to reverse [element] | +| array_flow.rb:1014:10:1014:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1014:10:1014:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1014:10:1014:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1014:10:1014:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1015:10:1015:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1015:10:1015:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1015:10:1015:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1015:10:1015:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1015:10:1015:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1015:10:1015:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1016:10:1016:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1016:10:1016:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1016:10:1016:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1016:10:1016:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1016:10:1016:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1016:10:1016:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1018:10:1018:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1018:10:1018:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1018:10:1018:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1018:10:1018:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1018:10:1018:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1018:10:1018:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1019:10:1019:10 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1019:10:1019:10 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1019:10:1019:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1019:10:1019:10 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1019:10:1019:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1019:10:1019:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1023:5:1023:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1023:5:1023:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1023:5:1023:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1023:5:1023:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1023:16:1023:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1023:16:1023:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1023:31:1023:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1023:31:1023:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1024:5:1024:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1024:5:1024:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1024:9:1024:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1024:9:1024:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1024:9:1024:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1024:9:1024:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1024:9:1024:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1024:9:1024:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | semmle.label | call to reverse! [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | semmle.label | call to reverse! [element] : | -| array_flow.rb:1025:10:1025:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1025:10:1025:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1023:5:1023:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1023:5:1023:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1023:5:1023:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1023:5:1023:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1023:16:1023:28 | call to source | semmle.label | call to source | +| array_flow.rb:1023:16:1023:28 | call to source | semmle.label | call to source | +| array_flow.rb:1023:31:1023:43 | call to source | semmle.label | call to source | +| array_flow.rb:1023:31:1023:43 | call to source | semmle.label | call to source | +| array_flow.rb:1024:5:1024:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1024:5:1024:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1024:9:1024:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1024:9:1024:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1024:9:1024:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1024:9:1024:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1024:9:1024:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1024:9:1024:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1024:9:1024:18 | call to reverse! [element] | semmle.label | call to reverse! [element] | +| array_flow.rb:1024:9:1024:18 | call to reverse! [element] | semmle.label | call to reverse! [element] | +| array_flow.rb:1025:10:1025:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1025:10:1025:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1025:10:1025:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1025:10:1025:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1026:10:1026:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1026:10:1026:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1026:10:1026:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1026:10:1026:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1026:10:1026:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1026:10:1026:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1027:10:1027:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1027:10:1027:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1027:10:1027:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1027:10:1027:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1027:10:1027:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1027:10:1027:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1028:10:1028:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1028:10:1028:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1028:10:1028:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1028:10:1028:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1028:10:1028:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1028:10:1028:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1029:10:1029:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1029:10:1029:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1029:10:1029:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1029:10:1029:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1029:10:1029:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1029:10:1029:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1029:10:1029:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1029:10:1029:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1029:10:1029:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1029:10:1029:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1030:10:1030:10 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1030:10:1030:10 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1030:10:1030:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1030:10:1030:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1030:10:1030:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1030:10:1030:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1030:10:1030:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1030:10:1030:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1030:10:1030:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1030:10:1030:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1034:5:1034:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1034:5:1034:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1034:16:1034:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1034:16:1034:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1035:5:1035:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1035:5:1035:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1035:9:1035:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1035:9:1035:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | semmle.label | call to reverse_each [element 2] : | -| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | semmle.label | call to reverse_each [element 2] : | -| array_flow.rb:1035:28:1035:28 | x : | semmle.label | x : | -| array_flow.rb:1035:28:1035:28 | x : | semmle.label | x : | +| array_flow.rb:1034:5:1034:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1034:5:1034:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1034:16:1034:26 | call to source | semmle.label | call to source | +| array_flow.rb:1034:16:1034:26 | call to source | semmle.label | call to source | +| array_flow.rb:1035:5:1035:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1035:5:1035:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1035:9:1035:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1035:9:1035:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] | semmle.label | call to reverse_each [element 2] | +| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] | semmle.label | call to reverse_each [element 2] | +| array_flow.rb:1035:28:1035:28 | x | semmle.label | x | +| array_flow.rb:1035:28:1035:28 | x | semmle.label | x | | array_flow.rb:1036:14:1036:14 | x | semmle.label | x | | array_flow.rb:1036:14:1036:14 | x | semmle.label | x | -| array_flow.rb:1038:10:1038:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1038:10:1038:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1038:10:1038:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1038:10:1038:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1038:10:1038:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1038:10:1038:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1042:5:1042:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1042:5:1042:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1042:16:1042:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1042:16:1042:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1043:5:1043:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1043:5:1043:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1043:18:1043:18 | x : | semmle.label | x : | -| array_flow.rb:1043:18:1043:18 | x : | semmle.label | x : | +| array_flow.rb:1042:5:1042:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1042:5:1042:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1042:16:1042:26 | call to source | semmle.label | call to source | +| array_flow.rb:1042:16:1042:26 | call to source | semmle.label | call to source | +| array_flow.rb:1043:5:1043:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1043:5:1043:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1043:18:1043:18 | x | semmle.label | x | +| array_flow.rb:1043:18:1043:18 | x | semmle.label | x | | array_flow.rb:1044:14:1044:14 | x | semmle.label | x | | array_flow.rb:1044:14:1044:14 | x | semmle.label | x | -| array_flow.rb:1052:5:1052:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1052:5:1052:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1052:5:1052:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1052:5:1052:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1052:5:1052:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1052:5:1052:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1052:10:1052:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1052:10:1052:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1052:28:1052:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1052:28:1052:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1052:43:1052:55 | call to source : | semmle.label | call to source : | -| array_flow.rb:1052:43:1052:55 | call to source : | semmle.label | call to source : | -| array_flow.rb:1054:5:1054:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1054:5:1054:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1054:5:1054:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1054:5:1054:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1054:5:1054:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1054:5:1054:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1054:9:1054:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1054:9:1054:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1054:9:1054:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1054:9:1054:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1054:9:1054:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1054:9:1054:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | semmle.label | call to rotate [element 1] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | semmle.label | call to rotate [element 1] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | semmle.label | call to rotate [element 2] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | semmle.label | call to rotate [element 2] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | semmle.label | call to rotate [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | semmle.label | call to rotate [element] : | -| array_flow.rb:1055:10:1055:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1055:10:1055:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1052:5:1052:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1052:5:1052:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1052:5:1052:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1052:5:1052:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1052:5:1052:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1052:5:1052:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1052:10:1052:22 | call to source | semmle.label | call to source | +| array_flow.rb:1052:10:1052:22 | call to source | semmle.label | call to source | +| array_flow.rb:1052:28:1052:40 | call to source | semmle.label | call to source | +| array_flow.rb:1052:28:1052:40 | call to source | semmle.label | call to source | +| array_flow.rb:1052:43:1052:55 | call to source | semmle.label | call to source | +| array_flow.rb:1052:43:1052:55 | call to source | semmle.label | call to source | +| array_flow.rb:1054:5:1054:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1054:5:1054:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1054:5:1054:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1054:5:1054:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1054:5:1054:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1054:5:1054:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1054:9:1054:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1054:9:1054:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1054:9:1054:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1054:9:1054:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1054:9:1054:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1054:9:1054:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] | semmle.label | call to rotate [element 1] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] | semmle.label | call to rotate [element 1] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] | semmle.label | call to rotate [element 2] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] | semmle.label | call to rotate [element 2] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element] | semmle.label | call to rotate [element] | +| array_flow.rb:1054:9:1054:16 | call to rotate [element] | semmle.label | call to rotate [element] | +| array_flow.rb:1055:10:1055:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1055:10:1055:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1055:10:1055:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1055:10:1055:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1056:10:1056:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1056:10:1056:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1056:10:1056:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1056:10:1056:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1056:10:1056:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1056:10:1056:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1056:10:1056:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1056:10:1056:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1056:10:1056:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1056:10:1056:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1057:10:1057:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1057:10:1057:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1057:10:1057:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1057:10:1057:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1057:10:1057:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1057:10:1057:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1057:10:1057:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1057:10:1057:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1057:10:1057:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1057:10:1057:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1058:10:1058:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1058:10:1058:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1058:10:1058:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1058:10:1058:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1058:10:1058:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1058:10:1058:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1060:5:1060:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1060:5:1060:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1060:5:1060:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1060:5:1060:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1060:5:1060:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1060:5:1060:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1060:9:1060:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1060:9:1060:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1060:9:1060:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1060:9:1060:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1060:9:1060:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1060:9:1060:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | semmle.label | call to rotate [element 0] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | semmle.label | call to rotate [element 0] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | semmle.label | call to rotate [element 1] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | semmle.label | call to rotate [element 1] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | semmle.label | call to rotate [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | semmle.label | call to rotate [element] : | -| array_flow.rb:1061:10:1061:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1061:10:1061:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1061:10:1061:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1061:10:1061:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1060:5:1060:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1060:5:1060:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1060:5:1060:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1060:5:1060:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1060:5:1060:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1060:5:1060:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1060:9:1060:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1060:9:1060:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1060:9:1060:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1060:9:1060:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1060:9:1060:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1060:9:1060:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] | semmle.label | call to rotate [element 0] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] | semmle.label | call to rotate [element 0] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] | semmle.label | call to rotate [element 1] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] | semmle.label | call to rotate [element 1] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element] | semmle.label | call to rotate [element] | +| array_flow.rb:1060:9:1060:19 | call to rotate [element] | semmle.label | call to rotate [element] | +| array_flow.rb:1061:10:1061:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1061:10:1061:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1061:10:1061:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1061:10:1061:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1061:10:1061:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1061:10:1061:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1062:10:1062:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1062:10:1062:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1062:10:1062:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1062:10:1062:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1062:10:1062:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1062:10:1062:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1062:10:1062:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1062:10:1062:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1062:10:1062:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1062:10:1062:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1063:10:1063:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1063:10:1063:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1063:10:1063:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1063:10:1063:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1063:10:1063:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1063:10:1063:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1064:10:1064:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1064:10:1064:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1064:10:1064:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1064:10:1064:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1064:10:1064:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1064:10:1064:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1066:5:1066:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1066:5:1066:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1066:5:1066:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1066:5:1066:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1066:5:1066:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1066:5:1066:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1066:9:1066:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1066:9:1066:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1066:9:1066:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1066:9:1066:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1066:9:1066:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1066:9:1066:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | semmle.label | call to rotate [element 0] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | semmle.label | call to rotate [element 0] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | semmle.label | call to rotate [element 2] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | semmle.label | call to rotate [element 2] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | semmle.label | call to rotate [element 3] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | semmle.label | call to rotate [element 3] : | -| array_flow.rb:1067:10:1067:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1067:10:1067:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1066:5:1066:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1066:5:1066:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1066:5:1066:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1066:5:1066:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1066:5:1066:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1066:5:1066:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1066:9:1066:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1066:9:1066:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1066:9:1066:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1066:9:1066:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1066:9:1066:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1066:9:1066:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] | semmle.label | call to rotate [element 0] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] | semmle.label | call to rotate [element 0] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] | semmle.label | call to rotate [element 2] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] | semmle.label | call to rotate [element 2] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] | semmle.label | call to rotate [element 3] | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] | semmle.label | call to rotate [element 3] | +| array_flow.rb:1067:10:1067:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1067:10:1067:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1067:10:1067:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1067:10:1067:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1069:10:1069:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1069:10:1069:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1069:10:1069:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1069:10:1069:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1069:10:1069:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1069:10:1069:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1070:10:1070:10 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1070:10:1070:10 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1070:10:1070:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1070:10:1070:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1070:10:1070:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1070:10:1070:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1072:5:1072:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1072:5:1072:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1072:9:1072:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1072:9:1072:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1072:9:1072:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1072:9:1072:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1072:9:1072:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1072:9:1072:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | semmle.label | call to rotate [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | semmle.label | call to rotate [element] : | -| array_flow.rb:1073:10:1073:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1073:10:1073:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1072:5:1072:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1072:5:1072:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1072:9:1072:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1072:9:1072:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1072:9:1072:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1072:9:1072:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1072:9:1072:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1072:9:1072:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1072:9:1072:19 | call to rotate [element] | semmle.label | call to rotate [element] | +| array_flow.rb:1072:9:1072:19 | call to rotate [element] | semmle.label | call to rotate [element] | +| array_flow.rb:1073:10:1073:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1073:10:1073:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1073:10:1073:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1073:10:1073:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1074:10:1074:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1074:10:1074:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1074:10:1074:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1074:10:1074:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1074:10:1074:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1074:10:1074:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1075:10:1075:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1075:10:1075:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1075:10:1075:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1075:10:1075:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1075:10:1075:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1075:10:1075:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1076:10:1076:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1076:10:1076:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1076:10:1076:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1076:10:1076:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1076:10:1076:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1076:10:1076:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1084:5:1084:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1084:5:1084:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1084:5:1084:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1084:5:1084:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1084:5:1084:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1084:5:1084:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1084:10:1084:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1084:10:1084:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1084:28:1084:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1084:28:1084:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1084:43:1084:55 | call to source : | semmle.label | call to source : | -| array_flow.rb:1084:43:1084:55 | call to source : | semmle.label | call to source : | -| array_flow.rb:1085:5:1085:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1085:5:1085:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1085:5:1085:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1085:5:1085:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1085:5:1085:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1085:5:1085:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1085:9:1085:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1085:9:1085:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1085:9:1085:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1085:9:1085:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1085:9:1085:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1085:9:1085:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1085:9:1085:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | semmle.label | call to rotate! [element 1] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | semmle.label | call to rotate! [element 1] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | semmle.label | call to rotate! [element 2] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | semmle.label | call to rotate! [element 2] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | semmle.label | call to rotate! [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | semmle.label | call to rotate! [element] : | -| array_flow.rb:1086:10:1086:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1086:10:1086:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1084:5:1084:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1084:5:1084:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1084:5:1084:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1084:5:1084:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1084:5:1084:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1084:5:1084:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1084:10:1084:22 | call to source | semmle.label | call to source | +| array_flow.rb:1084:10:1084:22 | call to source | semmle.label | call to source | +| array_flow.rb:1084:28:1084:40 | call to source | semmle.label | call to source | +| array_flow.rb:1084:28:1084:40 | call to source | semmle.label | call to source | +| array_flow.rb:1084:43:1084:55 | call to source | semmle.label | call to source | +| array_flow.rb:1084:43:1084:55 | call to source | semmle.label | call to source | +| array_flow.rb:1085:5:1085:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1085:5:1085:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1085:5:1085:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1085:5:1085:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1085:5:1085:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1085:5:1085:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1085:9:1085:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| array_flow.rb:1085:9:1085:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| array_flow.rb:1085:9:1085:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:1085:9:1085:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:1085:9:1085:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1085:9:1085:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1085:9:1085:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1085:9:1085:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1085:9:1085:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1085:9:1085:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1085:9:1085:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1085:9:1085:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] | semmle.label | call to rotate! [element 1] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] | semmle.label | call to rotate! [element 1] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] | semmle.label | call to rotate! [element 2] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] | semmle.label | call to rotate! [element 2] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element] | semmle.label | call to rotate! [element] | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element] | semmle.label | call to rotate! [element] | +| array_flow.rb:1086:10:1086:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1086:10:1086:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1086:10:1086:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1086:10:1086:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1087:10:1087:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1087:10:1087:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1087:10:1087:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1087:10:1087:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1087:10:1087:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1087:10:1087:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1087:10:1087:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1087:10:1087:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1087:10:1087:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1087:10:1087:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1088:10:1088:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1088:10:1088:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1088:10:1088:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1088:10:1088:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1088:10:1088:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1088:10:1088:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1088:10:1088:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1088:10:1088:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1088:10:1088:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1088:10:1088:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1089:10:1089:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1089:10:1089:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1089:10:1089:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1089:10:1089:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1089:10:1089:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1089:10:1089:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1090:10:1090:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1090:10:1090:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1090:10:1090:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1090:10:1090:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1090:10:1090:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1090:10:1090:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1091:10:1091:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1091:10:1091:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1091:10:1091:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1091:10:1091:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1091:10:1091:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1091:10:1091:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1091:10:1091:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1091:10:1091:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1091:10:1091:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1091:10:1091:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1092:10:1092:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1092:10:1092:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1092:10:1092:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1092:10:1092:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1092:10:1092:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1092:10:1092:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1092:10:1092:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1092:10:1092:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1092:10:1092:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1092:10:1092:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1093:10:1093:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1093:10:1093:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1093:10:1093:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1093:10:1093:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1093:10:1093:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1093:10:1093:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1095:5:1095:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1095:5:1095:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1095:5:1095:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1095:5:1095:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1095:5:1095:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1095:5:1095:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1095:10:1095:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1095:10:1095:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1095:28:1095:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1095:28:1095:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1095:43:1095:55 | call to source : | semmle.label | call to source : | -| array_flow.rb:1095:43:1095:55 | call to source : | semmle.label | call to source : | -| array_flow.rb:1096:5:1096:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1096:5:1096:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1096:5:1096:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1096:5:1096:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1096:5:1096:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1096:5:1096:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1096:9:1096:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1096:9:1096:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1096:9:1096:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1096:9:1096:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1096:9:1096:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1096:9:1096:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1096:9:1096:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | semmle.label | call to rotate! [element 0] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | semmle.label | call to rotate! [element 0] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | semmle.label | call to rotate! [element 1] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | semmle.label | call to rotate! [element 1] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | semmle.label | call to rotate! [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | semmle.label | call to rotate! [element] : | -| array_flow.rb:1097:10:1097:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1097:10:1097:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1097:10:1097:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1097:10:1097:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1095:5:1095:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1095:5:1095:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1095:5:1095:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1095:5:1095:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1095:5:1095:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1095:5:1095:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1095:10:1095:22 | call to source | semmle.label | call to source | +| array_flow.rb:1095:10:1095:22 | call to source | semmle.label | call to source | +| array_flow.rb:1095:28:1095:40 | call to source | semmle.label | call to source | +| array_flow.rb:1095:28:1095:40 | call to source | semmle.label | call to source | +| array_flow.rb:1095:43:1095:55 | call to source | semmle.label | call to source | +| array_flow.rb:1095:43:1095:55 | call to source | semmle.label | call to source | +| array_flow.rb:1096:5:1096:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1096:5:1096:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1096:5:1096:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1096:5:1096:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1096:5:1096:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1096:5:1096:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1096:9:1096:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1096:9:1096:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1096:9:1096:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| array_flow.rb:1096:9:1096:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| array_flow.rb:1096:9:1096:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1096:9:1096:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1096:9:1096:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1096:9:1096:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1096:9:1096:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1096:9:1096:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1096:9:1096:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1096:9:1096:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] | semmle.label | call to rotate! [element 0] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] | semmle.label | call to rotate! [element 0] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] | semmle.label | call to rotate! [element 1] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] | semmle.label | call to rotate! [element 1] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element] | semmle.label | call to rotate! [element] | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element] | semmle.label | call to rotate! [element] | +| array_flow.rb:1097:10:1097:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1097:10:1097:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1097:10:1097:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1097:10:1097:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1097:10:1097:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1097:10:1097:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1098:10:1098:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1098:10:1098:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1098:10:1098:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1098:10:1098:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1098:10:1098:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1098:10:1098:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1098:10:1098:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1098:10:1098:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1098:10:1098:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1098:10:1098:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1099:10:1099:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1099:10:1099:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1099:10:1099:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1099:10:1099:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1099:10:1099:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1099:10:1099:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1100:10:1100:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1100:10:1100:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1100:10:1100:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1100:10:1100:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1100:10:1100:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1100:10:1100:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1101:10:1101:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1101:10:1101:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1101:10:1101:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1101:10:1101:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1101:10:1101:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1101:10:1101:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1101:10:1101:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1101:10:1101:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1101:10:1101:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1101:10:1101:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1102:10:1102:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1102:10:1102:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1102:10:1102:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1102:10:1102:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1102:10:1102:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1102:10:1102:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1102:10:1102:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1102:10:1102:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1102:10:1102:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1102:10:1102:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1103:10:1103:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1103:10:1103:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1103:10:1103:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1103:10:1103:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1103:10:1103:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1103:10:1103:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1104:10:1104:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1104:10:1104:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1104:10:1104:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1104:10:1104:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1104:10:1104:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1104:10:1104:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1106:5:1106:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1106:5:1106:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1106:5:1106:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1106:5:1106:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1106:5:1106:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1106:5:1106:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1106:10:1106:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1106:10:1106:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1106:28:1106:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1106:28:1106:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1106:43:1106:55 | call to source : | semmle.label | call to source : | -| array_flow.rb:1106:43:1106:55 | call to source : | semmle.label | call to source : | -| array_flow.rb:1107:5:1107:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1107:5:1107:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1107:5:1107:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1107:5:1107:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1107:5:1107:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1107:5:1107:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 3] : | semmle.label | [post] a [element 3] : | -| array_flow.rb:1107:9:1107:9 | [post] a [element 3] : | semmle.label | [post] a [element 3] : | -| array_flow.rb:1107:9:1107:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1107:9:1107:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1107:9:1107:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1107:9:1107:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1107:9:1107:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1107:9:1107:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | semmle.label | call to rotate! [element 0] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | semmle.label | call to rotate! [element 0] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | semmle.label | call to rotate! [element 2] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | semmle.label | call to rotate! [element 2] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | semmle.label | call to rotate! [element 3] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | semmle.label | call to rotate! [element 3] : | -| array_flow.rb:1108:10:1108:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1108:10:1108:10 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1106:5:1106:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1106:5:1106:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1106:5:1106:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1106:5:1106:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1106:5:1106:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1106:5:1106:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1106:10:1106:22 | call to source | semmle.label | call to source | +| array_flow.rb:1106:10:1106:22 | call to source | semmle.label | call to source | +| array_flow.rb:1106:28:1106:40 | call to source | semmle.label | call to source | +| array_flow.rb:1106:28:1106:40 | call to source | semmle.label | call to source | +| array_flow.rb:1106:43:1106:55 | call to source | semmle.label | call to source | +| array_flow.rb:1106:43:1106:55 | call to source | semmle.label | call to source | +| array_flow.rb:1107:5:1107:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1107:5:1107:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1107:5:1107:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1107:5:1107:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1107:5:1107:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1107:5:1107:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 3] | semmle.label | [post] a [element 3] | +| array_flow.rb:1107:9:1107:9 | [post] a [element 3] | semmle.label | [post] a [element 3] | +| array_flow.rb:1107:9:1107:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1107:9:1107:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1107:9:1107:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1107:9:1107:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1107:9:1107:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1107:9:1107:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | semmle.label | call to rotate! [element 0] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | semmle.label | call to rotate! [element 0] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] | semmle.label | call to rotate! [element 2] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] | semmle.label | call to rotate! [element 2] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] | semmle.label | call to rotate! [element 3] | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] | semmle.label | call to rotate! [element 3] | +| array_flow.rb:1108:10:1108:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1108:10:1108:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1108:10:1108:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1108:10:1108:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1110:10:1110:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1110:10:1110:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1110:10:1110:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1110:10:1110:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1110:10:1110:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1110:10:1110:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1111:10:1111:10 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1111:10:1111:10 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1111:10:1111:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1111:10:1111:10 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1111:10:1111:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1111:10:1111:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1112:10:1112:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1112:10:1112:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1112:10:1112:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1112:10:1112:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1112:10:1112:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1112:10:1112:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1114:10:1114:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1114:10:1114:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1114:10:1114:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1114:10:1114:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1114:10:1114:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1114:10:1114:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1115:10:1115:10 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1115:10:1115:10 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1115:10:1115:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1115:10:1115:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1115:10:1115:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1115:10:1115:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1117:5:1117:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1117:5:1117:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1117:5:1117:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1117:5:1117:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1117:5:1117:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1117:5:1117:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1117:10:1117:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1117:10:1117:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1117:28:1117:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1117:28:1117:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1117:43:1117:55 | call to source : | semmle.label | call to source : | -| array_flow.rb:1117:43:1117:55 | call to source : | semmle.label | call to source : | -| array_flow.rb:1118:5:1118:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1118:5:1118:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1118:9:1118:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1118:9:1118:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1118:9:1118:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1118:9:1118:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1118:9:1118:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1118:9:1118:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1118:9:1118:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1118:9:1118:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | semmle.label | call to rotate! [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | semmle.label | call to rotate! [element] : | -| array_flow.rb:1119:10:1119:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1119:10:1119:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1117:5:1117:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1117:5:1117:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1117:5:1117:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1117:5:1117:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1117:5:1117:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1117:5:1117:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1117:10:1117:22 | call to source | semmle.label | call to source | +| array_flow.rb:1117:10:1117:22 | call to source | semmle.label | call to source | +| array_flow.rb:1117:28:1117:40 | call to source | semmle.label | call to source | +| array_flow.rb:1117:28:1117:40 | call to source | semmle.label | call to source | +| array_flow.rb:1117:43:1117:55 | call to source | semmle.label | call to source | +| array_flow.rb:1117:43:1117:55 | call to source | semmle.label | call to source | +| array_flow.rb:1118:5:1118:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1118:5:1118:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1118:9:1118:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1118:9:1118:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1118:9:1118:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1118:9:1118:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1118:9:1118:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1118:9:1118:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1118:9:1118:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1118:9:1118:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1118:9:1118:20 | call to rotate! [element] | semmle.label | call to rotate! [element] | +| array_flow.rb:1118:9:1118:20 | call to rotate! [element] | semmle.label | call to rotate! [element] | +| array_flow.rb:1119:10:1119:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1119:10:1119:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1119:10:1119:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1119:10:1119:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1120:10:1120:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1120:10:1120:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1120:10:1120:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1120:10:1120:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1120:10:1120:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1120:10:1120:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1121:10:1121:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1121:10:1121:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1121:10:1121:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1121:10:1121:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1121:10:1121:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1121:10:1121:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1122:10:1122:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1122:10:1122:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1122:10:1122:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1122:10:1122:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1122:10:1122:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1122:10:1122:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1123:10:1123:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1123:10:1123:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1123:10:1123:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1123:10:1123:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1123:10:1123:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1123:10:1123:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1124:10:1124:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1124:10:1124:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1124:10:1124:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1124:10:1124:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1124:10:1124:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1124:10:1124:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1125:10:1125:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1125:10:1125:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1125:10:1125:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1125:10:1125:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1125:10:1125:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1125:10:1125:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1126:10:1126:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1126:10:1126:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1126:10:1126:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1126:10:1126:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1126:10:1126:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1126:10:1126:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1130:5:1130:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1130:5:1130:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1130:19:1130:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:1130:19:1130:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:1131:5:1131:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1131:5:1131:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1131:9:1131:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1131:9:1131:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1131:9:1133:7 | call to select [element] : | semmle.label | call to select [element] : | -| array_flow.rb:1131:9:1133:7 | call to select [element] : | semmle.label | call to select [element] : | -| array_flow.rb:1131:22:1131:22 | x : | semmle.label | x : | -| array_flow.rb:1131:22:1131:22 | x : | semmle.label | x : | +| array_flow.rb:1130:5:1130:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1130:5:1130:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1130:19:1130:29 | call to source | semmle.label | call to source | +| array_flow.rb:1130:19:1130:29 | call to source | semmle.label | call to source | +| array_flow.rb:1131:5:1131:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1131:5:1131:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1131:9:1131:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1131:9:1131:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1131:9:1133:7 | call to select [element] | semmle.label | call to select [element] | +| array_flow.rb:1131:9:1133:7 | call to select [element] | semmle.label | call to select [element] | +| array_flow.rb:1131:22:1131:22 | x | semmle.label | x | +| array_flow.rb:1131:22:1131:22 | x | semmle.label | x | | array_flow.rb:1132:14:1132:14 | x | semmle.label | x | | array_flow.rb:1132:14:1132:14 | x | semmle.label | x | -| array_flow.rb:1134:10:1134:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1134:10:1134:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1134:10:1134:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1134:10:1134:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1134:10:1134:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1134:10:1134:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1138:5:1138:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1138:5:1138:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1138:16:1138:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1138:16:1138:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1139:5:1139:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1139:5:1139:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1139:9:1139:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1139:9:1139:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1139:9:1139:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1139:9:1139:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1139:9:1142:7 | call to select! [element] : | semmle.label | call to select! [element] : | -| array_flow.rb:1139:9:1142:7 | call to select! [element] : | semmle.label | call to select! [element] : | -| array_flow.rb:1139:23:1139:23 | x : | semmle.label | x : | -| array_flow.rb:1139:23:1139:23 | x : | semmle.label | x : | +| array_flow.rb:1138:5:1138:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1138:5:1138:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1138:16:1138:26 | call to source | semmle.label | call to source | +| array_flow.rb:1138:16:1138:26 | call to source | semmle.label | call to source | +| array_flow.rb:1139:5:1139:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1139:5:1139:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1139:9:1139:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1139:9:1139:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1139:9:1139:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1139:9:1139:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1139:9:1142:7 | call to select! [element] | semmle.label | call to select! [element] | +| array_flow.rb:1139:9:1142:7 | call to select! [element] | semmle.label | call to select! [element] | +| array_flow.rb:1139:23:1139:23 | x | semmle.label | x | +| array_flow.rb:1139:23:1139:23 | x | semmle.label | x | | array_flow.rb:1140:14:1140:14 | x | semmle.label | x | | array_flow.rb:1140:14:1140:14 | x | semmle.label | x | -| array_flow.rb:1143:10:1143:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1143:10:1143:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1143:10:1143:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1143:10:1143:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1143:10:1143:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1143:10:1143:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1144:10:1144:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1144:10:1144:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1144:10:1144:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1144:10:1144:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1144:10:1144:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1144:10:1144:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1148:5:1148:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1148:5:1148:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1148:5:1148:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1148:5:1148:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1148:10:1148:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1148:10:1148:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1148:28:1148:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1148:28:1148:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1149:5:1149:5 | b : | semmle.label | b : | -| array_flow.rb:1149:5:1149:5 | b : | semmle.label | b : | -| array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| array_flow.rb:1149:9:1149:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1149:9:1149:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1149:9:1149:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1149:9:1149:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1149:9:1149:15 | call to shift : | semmle.label | call to shift : | -| array_flow.rb:1149:9:1149:15 | call to shift : | semmle.label | call to shift : | +| array_flow.rb:1148:5:1148:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1148:5:1148:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1148:5:1148:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1148:5:1148:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1148:10:1148:22 | call to source | semmle.label | call to source | +| array_flow.rb:1148:10:1148:22 | call to source | semmle.label | call to source | +| array_flow.rb:1148:28:1148:40 | call to source | semmle.label | call to source | +| array_flow.rb:1148:28:1148:40 | call to source | semmle.label | call to source | +| array_flow.rb:1149:5:1149:5 | b | semmle.label | b | +| array_flow.rb:1149:5:1149:5 | b | semmle.label | b | +| array_flow.rb:1149:9:1149:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| array_flow.rb:1149:9:1149:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| array_flow.rb:1149:9:1149:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1149:9:1149:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1149:9:1149:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1149:9:1149:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1149:9:1149:15 | call to shift | semmle.label | call to shift | +| array_flow.rb:1149:9:1149:15 | call to shift | semmle.label | call to shift | | array_flow.rb:1150:10:1150:10 | b | semmle.label | b | | array_flow.rb:1150:10:1150:10 | b | semmle.label | b | -| array_flow.rb:1152:10:1152:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1152:10:1152:10 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:1152:10:1152:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1152:10:1152:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:1152:10:1152:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1152:10:1152:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1155:5:1155:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1155:5:1155:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1155:5:1155:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1155:5:1155:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1155:10:1155:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1155:10:1155:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1155:28:1155:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1155:28:1155:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1156:5:1156:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1156:5:1156:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| array_flow.rb:1156:9:1156:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1156:9:1156:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1156:9:1156:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1156:9:1156:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | semmle.label | call to shift [element 0] : | -| array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | semmle.label | call to shift [element 0] : | -| array_flow.rb:1157:10:1157:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1157:10:1157:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1155:5:1155:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1155:5:1155:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1155:5:1155:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1155:5:1155:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1155:10:1155:22 | call to source | semmle.label | call to source | +| array_flow.rb:1155:10:1155:22 | call to source | semmle.label | call to source | +| array_flow.rb:1155:28:1155:40 | call to source | semmle.label | call to source | +| array_flow.rb:1155:28:1155:40 | call to source | semmle.label | call to source | +| array_flow.rb:1156:5:1156:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1156:5:1156:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1156:9:1156:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1156:9:1156:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1156:9:1156:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1156:9:1156:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1156:9:1156:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1156:9:1156:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1156:9:1156:18 | call to shift [element 0] | semmle.label | call to shift [element 0] | +| array_flow.rb:1156:9:1156:18 | call to shift [element 0] | semmle.label | call to shift [element 0] | +| array_flow.rb:1157:10:1157:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1157:10:1157:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1157:10:1157:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1157:10:1157:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1159:10:1159:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1159:10:1159:10 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1159:10:1159:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1159:10:1159:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1159:10:1159:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1159:10:1159:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1163:5:1163:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1163:5:1163:5 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1163:5:1163:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1163:5:1163:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1163:10:1163:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1163:10:1163:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1163:28:1163:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1163:28:1163:40 | call to source : | semmle.label | call to source : | -| array_flow.rb:1164:5:1164:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1164:5:1164:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1164:9:1164:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1164:9:1164:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1164:9:1164:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1164:9:1164:9 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1164:9:1164:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1164:9:1164:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | semmle.label | call to shift [element] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | semmle.label | call to shift [element] : | -| array_flow.rb:1165:10:1165:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1165:10:1165:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1163:5:1163:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1163:5:1163:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1163:5:1163:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1163:5:1163:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1163:10:1163:22 | call to source | semmle.label | call to source | +| array_flow.rb:1163:10:1163:22 | call to source | semmle.label | call to source | +| array_flow.rb:1163:28:1163:40 | call to source | semmle.label | call to source | +| array_flow.rb:1163:28:1163:40 | call to source | semmle.label | call to source | +| array_flow.rb:1164:5:1164:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1164:5:1164:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1164:9:1164:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1164:9:1164:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1164:9:1164:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1164:9:1164:9 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1164:9:1164:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1164:9:1164:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1164:9:1164:18 | call to shift [element] | semmle.label | call to shift [element] | +| array_flow.rb:1164:9:1164:18 | call to shift [element] | semmle.label | call to shift [element] | +| array_flow.rb:1165:10:1165:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1165:10:1165:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1165:10:1165:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1165:10:1165:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1166:10:1166:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1166:10:1166:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1166:10:1166:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1166:10:1166:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1166:10:1166:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1166:10:1166:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1167:10:1167:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1167:10:1167:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1167:10:1167:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1167:10:1167:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1167:10:1167:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1167:10:1167:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1167:10:1167:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1167:10:1167:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1167:10:1167:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1167:10:1167:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1168:10:1168:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1168:10:1168:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1168:10:1168:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1168:10:1168:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1168:10:1168:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1168:10:1168:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1169:10:1169:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1169:10:1169:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1169:10:1169:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1169:10:1169:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1169:10:1169:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1169:10:1169:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1169:10:1169:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1169:10:1169:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1169:10:1169:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1169:10:1169:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1173:5:1173:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1173:5:1173:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1173:16:1173:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1173:16:1173:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1174:5:1174:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1174:5:1174:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1174:9:1174:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1174:9:1174:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | semmle.label | call to shuffle [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | semmle.label | call to shuffle [element] : | -| array_flow.rb:1177:10:1177:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1177:10:1177:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1173:5:1173:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1173:5:1173:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1173:16:1173:26 | call to source | semmle.label | call to source | +| array_flow.rb:1173:16:1173:26 | call to source | semmle.label | call to source | +| array_flow.rb:1174:5:1174:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1174:5:1174:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1174:9:1174:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1174:9:1174:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1174:9:1174:17 | call to shuffle [element] | semmle.label | call to shuffle [element] | +| array_flow.rb:1174:9:1174:17 | call to shuffle [element] | semmle.label | call to shuffle [element] | +| array_flow.rb:1177:10:1177:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1177:10:1177:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1177:10:1177:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1177:10:1177:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1178:10:1178:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1178:10:1178:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1178:10:1178:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1178:10:1178:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1178:10:1178:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1178:10:1178:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1179:10:1179:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1179:10:1179:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1179:10:1179:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1179:10:1179:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1179:10:1179:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1179:10:1179:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1180:10:1180:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1180:10:1180:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1180:10:1180:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1180:10:1180:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1180:10:1180:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1180:10:1180:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1184:5:1184:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1184:5:1184:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1184:16:1184:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1184:16:1184:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1185:5:1185:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1185:5:1185:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1185:9:1185:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1185:9:1185:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1185:9:1185:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1185:9:1185:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | semmle.label | call to shuffle! [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | semmle.label | call to shuffle! [element] : | -| array_flow.rb:1186:10:1186:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1186:10:1186:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1184:5:1184:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1184:5:1184:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1184:16:1184:26 | call to source | semmle.label | call to source | +| array_flow.rb:1184:16:1184:26 | call to source | semmle.label | call to source | +| array_flow.rb:1185:5:1185:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1185:5:1185:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1185:9:1185:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1185:9:1185:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1185:9:1185:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1185:9:1185:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] | semmle.label | call to shuffle! [element] | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] | semmle.label | call to shuffle! [element] | +| array_flow.rb:1186:10:1186:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1186:10:1186:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1186:10:1186:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1186:10:1186:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1187:10:1187:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1187:10:1187:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1187:10:1187:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1187:10:1187:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1187:10:1187:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1187:10:1187:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1188:10:1188:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1188:10:1188:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1188:10:1188:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1188:10:1188:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1188:10:1188:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1188:10:1188:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1188:10:1188:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1188:10:1188:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1188:10:1188:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1188:10:1188:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1189:10:1189:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1189:10:1189:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1189:10:1189:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1189:10:1189:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1189:10:1189:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1189:10:1189:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1190:10:1190:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1190:10:1190:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1190:10:1190:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1190:10:1190:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1190:10:1190:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1190:10:1190:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1191:10:1191:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1191:10:1191:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1191:10:1191:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1191:10:1191:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1191:10:1191:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1191:10:1191:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1195:5:1195:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1195:16:1195:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1195:16:1195:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1195:34:1195:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1195:34:1195:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1197:5:1197:5 | b : | semmle.label | b : | -| array_flow.rb:1197:5:1197:5 | b : | semmle.label | b : | -| array_flow.rb:1197:9:1197:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1197:9:1197:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1197:9:1197:17 | call to slice : | semmle.label | call to slice : | -| array_flow.rb:1197:9:1197:17 | call to slice : | semmle.label | call to slice : | +| array_flow.rb:1195:5:1195:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1195:5:1195:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1195:16:1195:28 | call to source | semmle.label | call to source | +| array_flow.rb:1195:16:1195:28 | call to source | semmle.label | call to source | +| array_flow.rb:1195:34:1195:46 | call to source | semmle.label | call to source | +| array_flow.rb:1195:34:1195:46 | call to source | semmle.label | call to source | +| array_flow.rb:1197:5:1197:5 | b | semmle.label | b | +| array_flow.rb:1197:5:1197:5 | b | semmle.label | b | +| array_flow.rb:1197:9:1197:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1197:9:1197:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1197:9:1197:17 | call to slice | semmle.label | call to slice | +| array_flow.rb:1197:9:1197:17 | call to slice | semmle.label | call to slice | | array_flow.rb:1198:10:1198:10 | b | semmle.label | b | | array_flow.rb:1198:10:1198:10 | b | semmle.label | b | -| array_flow.rb:1200:5:1200:5 | b : | semmle.label | b : | -| array_flow.rb:1200:5:1200:5 | b : | semmle.label | b : | -| array_flow.rb:1200:9:1200:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1200:9:1200:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1200:9:1200:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1200:9:1200:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1200:9:1200:19 | call to slice : | semmle.label | call to slice : | -| array_flow.rb:1200:9:1200:19 | call to slice : | semmle.label | call to slice : | +| array_flow.rb:1200:5:1200:5 | b | semmle.label | b | +| array_flow.rb:1200:5:1200:5 | b | semmle.label | b | +| array_flow.rb:1200:9:1200:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1200:9:1200:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1200:9:1200:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1200:9:1200:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1200:9:1200:19 | call to slice | semmle.label | call to slice | +| array_flow.rb:1200:9:1200:19 | call to slice | semmle.label | call to slice | | array_flow.rb:1201:10:1201:10 | b | semmle.label | b | | array_flow.rb:1201:10:1201:10 | b | semmle.label | b | -| array_flow.rb:1203:5:1203:5 | b : | semmle.label | b : | -| array_flow.rb:1203:5:1203:5 | b : | semmle.label | b : | -| array_flow.rb:1203:5:1203:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1203:5:1203:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1203:9:1203:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1203:9:1203:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1203:9:1203:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1203:9:1203:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1203:9:1203:17 | call to slice : | semmle.label | call to slice : | -| array_flow.rb:1203:9:1203:17 | call to slice : | semmle.label | call to slice : | -| array_flow.rb:1203:9:1203:17 | call to slice [element] : | semmle.label | call to slice [element] : | -| array_flow.rb:1203:9:1203:17 | call to slice [element] : | semmle.label | call to slice [element] : | +| array_flow.rb:1203:5:1203:5 | b | semmle.label | b | +| array_flow.rb:1203:5:1203:5 | b | semmle.label | b | +| array_flow.rb:1203:5:1203:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1203:5:1203:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1203:9:1203:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1203:9:1203:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1203:9:1203:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1203:9:1203:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1203:9:1203:17 | call to slice | semmle.label | call to slice | +| array_flow.rb:1203:9:1203:17 | call to slice | semmle.label | call to slice | +| array_flow.rb:1203:9:1203:17 | call to slice [element] | semmle.label | call to slice [element] | +| array_flow.rb:1203:9:1203:17 | call to slice [element] | semmle.label | call to slice [element] | | array_flow.rb:1205:10:1205:10 | b | semmle.label | b | | array_flow.rb:1205:10:1205:10 | b | semmle.label | b | -| array_flow.rb:1207:10:1207:10 | b : | semmle.label | b : | -| array_flow.rb:1207:10:1207:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1207:10:1207:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1207:10:1207:10 | b | semmle.label | b | +| array_flow.rb:1207:10:1207:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1207:10:1207:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1207:10:1207:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1207:10:1207:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1209:5:1209:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1209:5:1209:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1209:5:1209:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1209:5:1209:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1209:9:1209:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1209:9:1209:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1209:9:1209:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1209:9:1209:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | semmle.label | call to slice [element 0] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | semmle.label | call to slice [element 0] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | semmle.label | call to slice [element 2] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | semmle.label | call to slice [element 2] : | -| array_flow.rb:1210:10:1210:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1210:10:1210:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1209:5:1209:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1209:5:1209:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1209:5:1209:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1209:5:1209:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1209:9:1209:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1209:9:1209:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1209:9:1209:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1209:9:1209:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1209:9:1209:21 | call to slice [element 0] | semmle.label | call to slice [element 0] | +| array_flow.rb:1209:9:1209:21 | call to slice [element 0] | semmle.label | call to slice [element 0] | +| array_flow.rb:1209:9:1209:21 | call to slice [element 2] | semmle.label | call to slice [element 2] | +| array_flow.rb:1209:9:1209:21 | call to slice [element 2] | semmle.label | call to slice [element 2] | +| array_flow.rb:1210:10:1210:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1210:10:1210:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1210:10:1210:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1210:10:1210:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1212:10:1212:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1212:10:1212:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1212:10:1212:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1212:10:1212:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1212:10:1212:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1212:10:1212:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1214:5:1214:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1214:5:1214:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1214:9:1214:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1214:9:1214:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1214:9:1214:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1214:9:1214:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | semmle.label | call to slice [element] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | semmle.label | call to slice [element] : | -| array_flow.rb:1215:10:1215:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1215:10:1215:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1214:5:1214:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1214:5:1214:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1214:9:1214:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1214:9:1214:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1214:9:1214:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1214:9:1214:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1214:9:1214:21 | call to slice [element] | semmle.label | call to slice [element] | +| array_flow.rb:1214:9:1214:21 | call to slice [element] | semmle.label | call to slice [element] | +| array_flow.rb:1215:10:1215:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1215:10:1215:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1215:10:1215:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1215:10:1215:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1216:10:1216:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1216:10:1216:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1216:10:1216:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1216:10:1216:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1216:10:1216:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1216:10:1216:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1218:5:1218:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1218:5:1218:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1218:9:1218:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1218:9:1218:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | semmle.label | call to slice [element 0] : | -| array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | semmle.label | call to slice [element 0] : | -| array_flow.rb:1219:10:1219:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1219:10:1219:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1218:5:1218:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1218:5:1218:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1218:9:1218:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1218:9:1218:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1218:9:1218:21 | call to slice [element 0] | semmle.label | call to slice [element 0] | +| array_flow.rb:1218:9:1218:21 | call to slice [element 0] | semmle.label | call to slice [element 0] | +| array_flow.rb:1219:10:1219:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1219:10:1219:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1219:10:1219:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1219:10:1219:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1223:5:1223:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1223:5:1223:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1223:9:1223:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1223:9:1223:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | semmle.label | call to slice [element 0] : | -| array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | semmle.label | call to slice [element 0] : | -| array_flow.rb:1224:10:1224:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1224:10:1224:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1223:5:1223:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1223:5:1223:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1223:9:1223:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1223:9:1223:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1223:9:1223:22 | call to slice [element 0] | semmle.label | call to slice [element 0] | +| array_flow.rb:1223:9:1223:22 | call to slice [element 0] | semmle.label | call to slice [element 0] | +| array_flow.rb:1224:10:1224:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1224:10:1224:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1224:10:1224:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1224:10:1224:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1228:5:1228:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1228:5:1228:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1228:9:1228:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1228:9:1228:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1228:9:1228:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1228:9:1228:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | semmle.label | call to slice [element] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | semmle.label | call to slice [element] : | -| array_flow.rb:1229:10:1229:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1229:10:1229:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1228:5:1228:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1228:5:1228:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1228:9:1228:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1228:9:1228:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1228:9:1228:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1228:9:1228:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1228:9:1228:21 | call to slice [element] | semmle.label | call to slice [element] | +| array_flow.rb:1228:9:1228:21 | call to slice [element] | semmle.label | call to slice [element] | +| array_flow.rb:1229:10:1229:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1229:10:1229:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1229:10:1229:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1229:10:1229:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1230:10:1230:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1230:10:1230:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1230:10:1230:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1230:10:1230:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1230:10:1230:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1230:10:1230:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1232:5:1232:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1232:5:1232:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1232:9:1232:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1232:9:1232:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1232:9:1232:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1232:9:1232:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | semmle.label | call to slice [element] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | semmle.label | call to slice [element] : | -| array_flow.rb:1233:10:1233:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1233:10:1233:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1232:5:1232:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1232:5:1232:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1232:9:1232:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1232:9:1232:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1232:9:1232:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1232:9:1232:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1232:9:1232:24 | call to slice [element] | semmle.label | call to slice [element] | +| array_flow.rb:1232:9:1232:24 | call to slice [element] | semmle.label | call to slice [element] | +| array_flow.rb:1233:10:1233:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1233:10:1233:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1233:10:1233:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1233:10:1233:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1234:10:1234:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1234:10:1234:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1234:10:1234:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1234:10:1234:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1234:10:1234:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1234:10:1234:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1236:5:1236:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1236:5:1236:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1236:9:1236:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1236:9:1236:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | semmle.label | call to slice [element 2] : | -| array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | semmle.label | call to slice [element 2] : | -| array_flow.rb:1239:10:1239:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1239:10:1239:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1236:5:1236:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1236:5:1236:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1236:9:1236:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1236:9:1236:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1236:9:1236:20 | call to slice [element 2] | semmle.label | call to slice [element 2] | +| array_flow.rb:1236:9:1236:20 | call to slice [element 2] | semmle.label | call to slice [element 2] | +| array_flow.rb:1239:10:1239:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1239:10:1239:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1239:10:1239:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1239:10:1239:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1241:5:1241:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1241:5:1241:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1241:9:1241:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1241:9:1241:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1241:9:1241:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1241:9:1241:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | semmle.label | call to slice [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | semmle.label | call to slice [element] : | -| array_flow.rb:1242:10:1242:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1242:10:1242:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1241:5:1241:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1241:5:1241:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1241:9:1241:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1241:9:1241:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1241:9:1241:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1241:9:1241:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1241:9:1241:20 | call to slice [element] | semmle.label | call to slice [element] | +| array_flow.rb:1241:9:1241:20 | call to slice [element] | semmle.label | call to slice [element] | +| array_flow.rb:1242:10:1242:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1242:10:1242:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1242:10:1242:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1242:10:1242:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1243:10:1243:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1243:10:1243:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1243:10:1243:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1243:10:1243:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1243:10:1243:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1243:10:1243:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1244:10:1244:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1244:10:1244:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1244:10:1244:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1244:10:1244:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1244:10:1244:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1244:10:1244:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1248:5:1248:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1248:5:1248:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1248:5:1248:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1248:5:1248:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1248:16:1248:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1248:16:1248:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1248:34:1248:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1248:34:1248:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1249:5:1249:5 | b : | semmle.label | b : | -| array_flow.rb:1249:5:1249:5 | b : | semmle.label | b : | -| array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | semmle.label | [post] a [element 3] : | -| array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | semmle.label | [post] a [element 3] : | -| array_flow.rb:1249:9:1249:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1249:9:1249:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1249:9:1249:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1249:9:1249:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1249:9:1249:19 | call to slice! : | semmle.label | call to slice! : | -| array_flow.rb:1249:9:1249:19 | call to slice! : | semmle.label | call to slice! : | +| array_flow.rb:1248:5:1248:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1248:5:1248:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1248:5:1248:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1248:5:1248:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1248:16:1248:28 | call to source | semmle.label | call to source | +| array_flow.rb:1248:16:1248:28 | call to source | semmle.label | call to source | +| array_flow.rb:1248:34:1248:46 | call to source | semmle.label | call to source | +| array_flow.rb:1248:34:1248:46 | call to source | semmle.label | call to source | +| array_flow.rb:1249:5:1249:5 | b | semmle.label | b | +| array_flow.rb:1249:5:1249:5 | b | semmle.label | b | +| array_flow.rb:1249:9:1249:9 | [post] a [element 3] | semmle.label | [post] a [element 3] | +| array_flow.rb:1249:9:1249:9 | [post] a [element 3] | semmle.label | [post] a [element 3] | +| array_flow.rb:1249:9:1249:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1249:9:1249:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1249:9:1249:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1249:9:1249:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1249:9:1249:19 | call to slice! | semmle.label | call to slice! | +| array_flow.rb:1249:9:1249:19 | call to slice! | semmle.label | call to slice! | | array_flow.rb:1250:10:1250:10 | b | semmle.label | b | | array_flow.rb:1250:10:1250:10 | b | semmle.label | b | -| array_flow.rb:1254:10:1254:10 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1254:10:1254:10 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1254:10:1254:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1254:10:1254:10 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1254:10:1254:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1254:10:1254:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1256:5:1256:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1256:5:1256:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1256:5:1256:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1256:5:1256:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1256:16:1256:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1256:16:1256:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1256:34:1256:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1256:34:1256:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1257:5:1257:5 | b : | semmle.label | b : | -| array_flow.rb:1257:5:1257:5 | b : | semmle.label | b : | -| array_flow.rb:1257:5:1257:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1257:5:1257:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1257:9:1257:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1257:9:1257:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1257:9:1257:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1257:9:1257:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1257:9:1257:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1257:9:1257:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1257:9:1257:19 | call to slice! : | semmle.label | call to slice! : | -| array_flow.rb:1257:9:1257:19 | call to slice! : | semmle.label | call to slice! : | -| array_flow.rb:1257:9:1257:19 | call to slice! [element] : | semmle.label | call to slice! [element] : | -| array_flow.rb:1257:9:1257:19 | call to slice! [element] : | semmle.label | call to slice! [element] : | -| array_flow.rb:1258:10:1258:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1258:10:1258:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1256:5:1256:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1256:5:1256:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1256:5:1256:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1256:5:1256:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1256:16:1256:28 | call to source | semmle.label | call to source | +| array_flow.rb:1256:16:1256:28 | call to source | semmle.label | call to source | +| array_flow.rb:1256:34:1256:46 | call to source | semmle.label | call to source | +| array_flow.rb:1256:34:1256:46 | call to source | semmle.label | call to source | +| array_flow.rb:1257:5:1257:5 | b | semmle.label | b | +| array_flow.rb:1257:5:1257:5 | b | semmle.label | b | +| array_flow.rb:1257:5:1257:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1257:5:1257:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1257:9:1257:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1257:9:1257:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1257:9:1257:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1257:9:1257:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1257:9:1257:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1257:9:1257:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1257:9:1257:19 | call to slice! | semmle.label | call to slice! | +| array_flow.rb:1257:9:1257:19 | call to slice! | semmle.label | call to slice! | +| array_flow.rb:1257:9:1257:19 | call to slice! [element] | semmle.label | call to slice! [element] | +| array_flow.rb:1257:9:1257:19 | call to slice! [element] | semmle.label | call to slice! [element] | +| array_flow.rb:1258:10:1258:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1258:10:1258:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1258:10:1258:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1258:10:1258:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1259:10:1259:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1259:10:1259:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1259:10:1259:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1259:10:1259:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1259:10:1259:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1259:10:1259:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1260:10:1260:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1260:10:1260:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1260:10:1260:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1260:10:1260:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1260:10:1260:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1260:10:1260:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1261:10:1261:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1261:10:1261:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1261:10:1261:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1261:10:1261:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1261:10:1261:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1261:10:1261:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1263:10:1263:10 | b | semmle.label | b | | array_flow.rb:1263:10:1263:10 | b | semmle.label | b | -| array_flow.rb:1265:10:1265:10 | b : | semmle.label | b : | -| array_flow.rb:1265:10:1265:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1265:10:1265:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1265:10:1265:10 | b | semmle.label | b | +| array_flow.rb:1265:10:1265:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1265:10:1265:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1265:10:1265:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1265:10:1265:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1267:5:1267:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1267:5:1267:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1267:5:1267:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1267:5:1267:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1267:16:1267:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1267:16:1267:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1267:34:1267:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1267:34:1267:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1268:5:1268:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1268:5:1268:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1268:5:1268:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1268:5:1268:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1268:9:1268:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1268:9:1268:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1268:9:1268:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1268:9:1268:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | semmle.label | call to slice! [element 0] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | semmle.label | call to slice! [element 0] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | semmle.label | call to slice! [element 2] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | semmle.label | call to slice! [element 2] : | -| array_flow.rb:1269:10:1269:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1269:10:1269:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1267:5:1267:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1267:5:1267:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1267:5:1267:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1267:5:1267:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1267:16:1267:28 | call to source | semmle.label | call to source | +| array_flow.rb:1267:16:1267:28 | call to source | semmle.label | call to source | +| array_flow.rb:1267:34:1267:46 | call to source | semmle.label | call to source | +| array_flow.rb:1267:34:1267:46 | call to source | semmle.label | call to source | +| array_flow.rb:1268:5:1268:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1268:5:1268:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1268:5:1268:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1268:5:1268:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1268:9:1268:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1268:9:1268:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1268:9:1268:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1268:9:1268:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] | semmle.label | call to slice! [element 2] | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] | semmle.label | call to slice! [element 2] | +| array_flow.rb:1269:10:1269:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1269:10:1269:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1269:10:1269:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1269:10:1269:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1271:10:1271:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1271:10:1271:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1271:10:1271:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1271:10:1271:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1271:10:1271:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1271:10:1271:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1278:5:1278:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1278:5:1278:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1278:5:1278:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1278:5:1278:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1278:16:1278:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1278:16:1278:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1278:34:1278:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1278:34:1278:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1279:5:1279:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1279:5:1279:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:1279:9:1279:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1279:9:1279:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1279:9:1279:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1279:9:1279:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | semmle.label | call to slice! [element 0] : | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | semmle.label | call to slice! [element 0] : | -| array_flow.rb:1280:10:1280:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1280:10:1280:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1278:5:1278:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1278:5:1278:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1278:5:1278:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1278:5:1278:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1278:16:1278:28 | call to source | semmle.label | call to source | +| array_flow.rb:1278:16:1278:28 | call to source | semmle.label | call to source | +| array_flow.rb:1278:34:1278:46 | call to source | semmle.label | call to source | +| array_flow.rb:1278:34:1278:46 | call to source | semmle.label | call to source | +| array_flow.rb:1279:5:1279:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1279:5:1279:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1279:9:1279:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:1279:9:1279:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:1279:9:1279:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1279:9:1279:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1279:9:1279:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1279:9:1279:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | +| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | +| array_flow.rb:1280:10:1280:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1280:10:1280:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1280:10:1280:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1280:10:1280:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1285:10:1285:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1285:10:1285:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1285:10:1285:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1285:10:1285:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1285:10:1285:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1285:10:1285:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1289:5:1289:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1289:5:1289:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1289:5:1289:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1289:5:1289:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1289:16:1289:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1289:16:1289:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1289:34:1289:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1289:34:1289:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1290:5:1290:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1290:5:1290:5 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:1290:9:1290:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1290:9:1290:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1290:9:1290:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1290:9:1290:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | semmle.label | call to slice! [element 0] : | -| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | semmle.label | call to slice! [element 0] : | -| array_flow.rb:1291:10:1291:10 | b [element 0] : | semmle.label | b [element 0] : | -| array_flow.rb:1291:10:1291:10 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1289:5:1289:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1289:5:1289:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1289:5:1289:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1289:5:1289:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1289:16:1289:28 | call to source | semmle.label | call to source | +| array_flow.rb:1289:16:1289:28 | call to source | semmle.label | call to source | +| array_flow.rb:1289:34:1289:46 | call to source | semmle.label | call to source | +| array_flow.rb:1289:34:1289:46 | call to source | semmle.label | call to source | +| array_flow.rb:1290:5:1290:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1290:5:1290:5 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1290:9:1290:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:1290:9:1290:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:1290:9:1290:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1290:9:1290:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1290:9:1290:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1290:9:1290:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | +| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | +| array_flow.rb:1291:10:1291:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1291:10:1291:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1291:10:1291:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1291:10:1291:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1296:10:1296:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1296:10:1296:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1296:10:1296:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1296:10:1296:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1296:10:1296:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1296:10:1296:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1300:5:1300:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1300:5:1300:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1300:5:1300:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1300:5:1300:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1300:16:1300:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1300:16:1300:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1300:34:1300:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1300:34:1300:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1301:5:1301:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1301:5:1301:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1301:9:1301:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1301:9:1301:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1301:9:1301:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1301:9:1301:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1301:9:1301:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1301:9:1301:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | semmle.label | call to slice! [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | semmle.label | call to slice! [element] : | -| array_flow.rb:1302:10:1302:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1302:10:1302:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1300:5:1300:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1300:5:1300:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1300:5:1300:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1300:5:1300:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1300:16:1300:28 | call to source | semmle.label | call to source | +| array_flow.rb:1300:16:1300:28 | call to source | semmle.label | call to source | +| array_flow.rb:1300:34:1300:46 | call to source | semmle.label | call to source | +| array_flow.rb:1300:34:1300:46 | call to source | semmle.label | call to source | +| array_flow.rb:1301:5:1301:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1301:5:1301:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1301:9:1301:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1301:9:1301:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1301:9:1301:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1301:9:1301:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1301:9:1301:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1301:9:1301:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1301:9:1301:22 | call to slice! [element] | semmle.label | call to slice! [element] | +| array_flow.rb:1301:9:1301:22 | call to slice! [element] | semmle.label | call to slice! [element] | +| array_flow.rb:1302:10:1302:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1302:10:1302:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1302:10:1302:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1302:10:1302:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1303:10:1303:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1303:10:1303:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1303:10:1303:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1303:10:1303:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1303:10:1303:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1303:10:1303:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1304:10:1304:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1304:10:1304:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1304:10:1304:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1304:10:1304:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1304:10:1304:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1304:10:1304:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1305:10:1305:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1305:10:1305:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1305:10:1305:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1305:10:1305:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1305:10:1305:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1305:10:1305:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1306:10:1306:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1306:10:1306:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1306:10:1306:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1306:10:1306:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1306:10:1306:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1306:10:1306:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1307:10:1307:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1307:10:1307:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1307:10:1307:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1307:10:1307:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1307:10:1307:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1307:10:1307:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1309:5:1309:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1309:5:1309:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1309:5:1309:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1309:5:1309:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1309:16:1309:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1309:16:1309:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1309:34:1309:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1309:34:1309:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1310:5:1310:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1310:5:1310:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1310:9:1310:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1310:9:1310:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1310:9:1310:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1310:9:1310:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1310:9:1310:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1310:9:1310:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | semmle.label | call to slice! [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | semmle.label | call to slice! [element] : | -| array_flow.rb:1311:10:1311:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1311:10:1311:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1309:5:1309:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1309:5:1309:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1309:5:1309:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1309:5:1309:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1309:16:1309:28 | call to source | semmle.label | call to source | +| array_flow.rb:1309:16:1309:28 | call to source | semmle.label | call to source | +| array_flow.rb:1309:34:1309:46 | call to source | semmle.label | call to source | +| array_flow.rb:1309:34:1309:46 | call to source | semmle.label | call to source | +| array_flow.rb:1310:5:1310:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1310:5:1310:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1310:9:1310:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1310:9:1310:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1310:9:1310:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1310:9:1310:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1310:9:1310:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1310:9:1310:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1310:9:1310:22 | call to slice! [element] | semmle.label | call to slice! [element] | +| array_flow.rb:1310:9:1310:22 | call to slice! [element] | semmle.label | call to slice! [element] | +| array_flow.rb:1311:10:1311:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1311:10:1311:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1311:10:1311:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1311:10:1311:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1312:10:1312:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1312:10:1312:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1312:10:1312:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1312:10:1312:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1312:10:1312:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1312:10:1312:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1313:10:1313:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1313:10:1313:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1313:10:1313:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1313:10:1313:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1313:10:1313:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1313:10:1313:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1314:10:1314:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1314:10:1314:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1314:10:1314:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1314:10:1314:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1314:10:1314:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1314:10:1314:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1315:10:1315:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1315:10:1315:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1315:10:1315:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1315:10:1315:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1315:10:1315:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1315:10:1315:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1316:10:1316:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1316:10:1316:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1316:10:1316:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1316:10:1316:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1316:10:1316:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1316:10:1316:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1318:5:1318:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1318:5:1318:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1318:5:1318:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1318:5:1318:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1318:16:1318:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1318:16:1318:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1318:34:1318:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1318:34:1318:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1319:5:1319:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1319:5:1319:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1319:9:1319:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1319:9:1319:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1319:9:1319:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1319:9:1319:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1319:9:1319:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1319:9:1319:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | semmle.label | call to slice! [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | semmle.label | call to slice! [element] : | -| array_flow.rb:1320:10:1320:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1320:10:1320:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1318:5:1318:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1318:5:1318:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1318:5:1318:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1318:5:1318:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1318:16:1318:28 | call to source | semmle.label | call to source | +| array_flow.rb:1318:16:1318:28 | call to source | semmle.label | call to source | +| array_flow.rb:1318:34:1318:46 | call to source | semmle.label | call to source | +| array_flow.rb:1318:34:1318:46 | call to source | semmle.label | call to source | +| array_flow.rb:1319:5:1319:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1319:5:1319:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1319:9:1319:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1319:9:1319:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1319:9:1319:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1319:9:1319:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1319:9:1319:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1319:9:1319:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1319:9:1319:25 | call to slice! [element] | semmle.label | call to slice! [element] | +| array_flow.rb:1319:9:1319:25 | call to slice! [element] | semmle.label | call to slice! [element] | +| array_flow.rb:1320:10:1320:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1320:10:1320:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1320:10:1320:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1320:10:1320:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1321:10:1321:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1321:10:1321:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1321:10:1321:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1321:10:1321:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1321:10:1321:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1321:10:1321:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1322:10:1322:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1322:10:1322:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1322:10:1322:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1322:10:1322:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1322:10:1322:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1322:10:1322:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1323:10:1323:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1323:10:1323:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1323:10:1323:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1323:10:1323:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1323:10:1323:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1323:10:1323:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1324:10:1324:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1324:10:1324:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1324:10:1324:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1324:10:1324:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1324:10:1324:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1324:10:1324:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1325:10:1325:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1325:10:1325:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1325:10:1325:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1325:10:1325:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1325:10:1325:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1325:10:1325:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1327:5:1327:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1327:5:1327:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1327:5:1327:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1327:5:1327:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1327:16:1327:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1327:16:1327:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1327:34:1327:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1327:34:1327:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1328:5:1328:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1328:5:1328:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| array_flow.rb:1328:9:1328:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1328:9:1328:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1328:9:1328:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1328:9:1328:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | semmle.label | call to slice! [element 2] : | -| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | semmle.label | call to slice! [element 2] : | -| array_flow.rb:1331:10:1331:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1331:10:1331:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1327:5:1327:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1327:5:1327:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1327:5:1327:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1327:5:1327:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1327:16:1327:28 | call to source | semmle.label | call to source | +| array_flow.rb:1327:16:1327:28 | call to source | semmle.label | call to source | +| array_flow.rb:1327:34:1327:46 | call to source | semmle.label | call to source | +| array_flow.rb:1327:34:1327:46 | call to source | semmle.label | call to source | +| array_flow.rb:1328:5:1328:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1328:5:1328:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1328:9:1328:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| array_flow.rb:1328:9:1328:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| array_flow.rb:1328:9:1328:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1328:9:1328:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1328:9:1328:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1328:9:1328:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] | semmle.label | call to slice! [element 2] | +| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] | semmle.label | call to slice! [element 2] | +| array_flow.rb:1331:10:1331:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1331:10:1331:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1331:10:1331:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1331:10:1331:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1333:10:1333:10 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1333:10:1333:10 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:1333:10:1333:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1333:10:1333:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:1333:10:1333:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1333:10:1333:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1336:5:1336:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1336:5:1336:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1336:5:1336:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1336:5:1336:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1336:16:1336:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1336:16:1336:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1336:34:1336:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1336:34:1336:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1337:5:1337:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1337:5:1337:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1337:9:1337:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1337:9:1337:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1337:9:1337:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1337:9:1337:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1337:9:1337:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1337:9:1337:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | semmle.label | call to slice! [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | semmle.label | call to slice! [element] : | -| array_flow.rb:1338:10:1338:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1338:10:1338:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1336:5:1336:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1336:5:1336:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1336:5:1336:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1336:5:1336:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1336:16:1336:28 | call to source | semmle.label | call to source | +| array_flow.rb:1336:16:1336:28 | call to source | semmle.label | call to source | +| array_flow.rb:1336:34:1336:46 | call to source | semmle.label | call to source | +| array_flow.rb:1336:34:1336:46 | call to source | semmle.label | call to source | +| array_flow.rb:1337:5:1337:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1337:5:1337:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1337:9:1337:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1337:9:1337:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1337:9:1337:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1337:9:1337:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1337:9:1337:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1337:9:1337:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1337:9:1337:21 | call to slice! [element] | semmle.label | call to slice! [element] | +| array_flow.rb:1337:9:1337:21 | call to slice! [element] | semmle.label | call to slice! [element] | +| array_flow.rb:1338:10:1338:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1338:10:1338:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1338:10:1338:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1338:10:1338:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1339:10:1339:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1339:10:1339:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1339:10:1339:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1339:10:1339:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1339:10:1339:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1339:10:1339:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1340:10:1340:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1340:10:1340:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1340:10:1340:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1340:10:1340:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1340:10:1340:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1340:10:1340:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1341:10:1341:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1341:10:1341:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1341:10:1341:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1341:10:1341:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1341:10:1341:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1341:10:1341:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1342:10:1342:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1342:10:1342:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1342:10:1342:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1342:10:1342:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1342:10:1342:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1342:10:1342:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1343:10:1343:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1343:10:1343:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1343:10:1343:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1343:10:1343:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1343:10:1343:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1343:10:1343:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1347:5:1347:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1347:5:1347:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1347:16:1347:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1347:16:1347:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1348:9:1348:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1348:9:1348:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1348:27:1348:27 | x : | semmle.label | x : | -| array_flow.rb:1348:27:1348:27 | x : | semmle.label | x : | +| array_flow.rb:1347:5:1347:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1347:5:1347:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1347:16:1347:26 | call to source | semmle.label | call to source | +| array_flow.rb:1347:16:1347:26 | call to source | semmle.label | call to source | +| array_flow.rb:1348:9:1348:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1348:9:1348:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1348:27:1348:27 | x | semmle.label | x | +| array_flow.rb:1348:27:1348:27 | x | semmle.label | x | | array_flow.rb:1349:14:1349:14 | x | semmle.label | x | | array_flow.rb:1349:14:1349:14 | x | semmle.label | x | -| array_flow.rb:1355:5:1355:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1355:5:1355:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1355:16:1355:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1355:16:1355:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1356:9:1356:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1356:9:1356:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1356:28:1356:28 | x : | semmle.label | x : | -| array_flow.rb:1356:28:1356:28 | x : | semmle.label | x : | +| array_flow.rb:1355:5:1355:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1355:5:1355:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1355:16:1355:26 | call to source | semmle.label | call to source | +| array_flow.rb:1355:16:1355:26 | call to source | semmle.label | call to source | +| array_flow.rb:1356:9:1356:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1356:9:1356:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1356:28:1356:28 | x | semmle.label | x | +| array_flow.rb:1356:28:1356:28 | x | semmle.label | x | | array_flow.rb:1357:14:1357:14 | x | semmle.label | x | | array_flow.rb:1357:14:1357:14 | x | semmle.label | x | -| array_flow.rb:1363:5:1363:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1363:5:1363:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1363:16:1363:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1363:16:1363:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1364:9:1364:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1364:9:1364:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1364:26:1364:26 | x : | semmle.label | x : | -| array_flow.rb:1364:26:1364:26 | x : | semmle.label | x : | -| array_flow.rb:1364:29:1364:29 | y : | semmle.label | y : | -| array_flow.rb:1364:29:1364:29 | y : | semmle.label | y : | +| array_flow.rb:1363:5:1363:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1363:5:1363:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1363:16:1363:26 | call to source | semmle.label | call to source | +| array_flow.rb:1363:16:1363:26 | call to source | semmle.label | call to source | +| array_flow.rb:1364:9:1364:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1364:9:1364:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1364:26:1364:26 | x | semmle.label | x | +| array_flow.rb:1364:26:1364:26 | x | semmle.label | x | +| array_flow.rb:1364:29:1364:29 | y | semmle.label | y | +| array_flow.rb:1364:29:1364:29 | y | semmle.label | y | | array_flow.rb:1365:14:1365:14 | x | semmle.label | x | | array_flow.rb:1365:14:1365:14 | x | semmle.label | x | | array_flow.rb:1366:14:1366:14 | y | semmle.label | y | | array_flow.rb:1366:14:1366:14 | y | semmle.label | y | -| array_flow.rb:1371:5:1371:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1371:5:1371:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1371:16:1371:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1371:16:1371:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1372:5:1372:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1372:5:1372:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1372:9:1372:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1372:9:1372:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | semmle.label | call to sort [element] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | semmle.label | call to sort [element] : | -| array_flow.rb:1373:10:1373:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1373:10:1373:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1371:5:1371:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1371:5:1371:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1371:16:1371:26 | call to source | semmle.label | call to source | +| array_flow.rb:1371:16:1371:26 | call to source | semmle.label | call to source | +| array_flow.rb:1372:5:1372:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1372:5:1372:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1372:9:1372:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1372:9:1372:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1372:9:1372:14 | call to sort [element] | semmle.label | call to sort [element] | +| array_flow.rb:1372:9:1372:14 | call to sort [element] | semmle.label | call to sort [element] | +| array_flow.rb:1373:10:1373:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1373:10:1373:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1373:10:1373:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1373:10:1373:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1374:10:1374:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1374:10:1374:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1374:10:1374:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1374:10:1374:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1374:10:1374:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1374:10:1374:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1375:5:1375:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1375:5:1375:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1375:9:1375:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1375:9:1375:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | semmle.label | call to sort [element] : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | semmle.label | call to sort [element] : | -| array_flow.rb:1375:20:1375:20 | x : | semmle.label | x : | -| array_flow.rb:1375:20:1375:20 | x : | semmle.label | x : | -| array_flow.rb:1375:23:1375:23 | y : | semmle.label | y : | -| array_flow.rb:1375:23:1375:23 | y : | semmle.label | y : | +| array_flow.rb:1375:5:1375:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:1375:5:1375:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:1375:9:1375:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1375:9:1375:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1375:9:1379:7 | call to sort [element] | semmle.label | call to sort [element] | +| array_flow.rb:1375:9:1379:7 | call to sort [element] | semmle.label | call to sort [element] | +| array_flow.rb:1375:20:1375:20 | x | semmle.label | x | +| array_flow.rb:1375:20:1375:20 | x | semmle.label | x | +| array_flow.rb:1375:23:1375:23 | y | semmle.label | y | +| array_flow.rb:1375:23:1375:23 | y | semmle.label | y | | array_flow.rb:1376:14:1376:14 | x | semmle.label | x | | array_flow.rb:1376:14:1376:14 | x | semmle.label | x | | array_flow.rb:1377:14:1377:14 | y | semmle.label | y | | array_flow.rb:1377:14:1377:14 | y | semmle.label | y | -| array_flow.rb:1380:10:1380:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1380:10:1380:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:1380:10:1380:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1380:10:1380:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1380:10:1380:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1380:10:1380:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1381:10:1381:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1381:10:1381:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:1381:10:1381:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1381:10:1381:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1381:10:1381:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1381:10:1381:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1385:5:1385:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1385:5:1385:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1385:16:1385:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1385:16:1385:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1386:5:1386:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1386:5:1386:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1386:9:1386:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1386:9:1386:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1386:9:1386:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1386:9:1386:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | semmle.label | call to sort! [element] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | semmle.label | call to sort! [element] : | -| array_flow.rb:1387:10:1387:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1387:10:1387:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1385:5:1385:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1385:5:1385:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1385:16:1385:26 | call to source | semmle.label | call to source | +| array_flow.rb:1385:16:1385:26 | call to source | semmle.label | call to source | +| array_flow.rb:1386:5:1386:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1386:5:1386:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1386:9:1386:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1386:9:1386:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1386:9:1386:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1386:9:1386:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1386:9:1386:15 | call to sort! [element] | semmle.label | call to sort! [element] | +| array_flow.rb:1386:9:1386:15 | call to sort! [element] | semmle.label | call to sort! [element] | +| array_flow.rb:1387:10:1387:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1387:10:1387:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1387:10:1387:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1387:10:1387:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1388:10:1388:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1388:10:1388:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1388:10:1388:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1388:10:1388:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1388:10:1388:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1388:10:1388:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1389:10:1389:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1389:10:1389:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1389:10:1389:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1389:10:1389:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1389:10:1389:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1389:10:1389:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1390:10:1390:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1390:10:1390:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1390:10:1390:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1390:10:1390:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1390:10:1390:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1390:10:1390:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1392:5:1392:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1392:5:1392:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1392:16:1392:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1392:16:1392:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1393:5:1393:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1393:5:1393:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1393:9:1393:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1393:9:1393:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1393:9:1393:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1393:9:1393:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | semmle.label | call to sort! [element] : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | semmle.label | call to sort! [element] : | -| array_flow.rb:1393:21:1393:21 | x : | semmle.label | x : | -| array_flow.rb:1393:21:1393:21 | x : | semmle.label | x : | -| array_flow.rb:1393:24:1393:24 | y : | semmle.label | y : | -| array_flow.rb:1393:24:1393:24 | y : | semmle.label | y : | +| array_flow.rb:1392:5:1392:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1392:5:1392:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1392:16:1392:26 | call to source | semmle.label | call to source | +| array_flow.rb:1392:16:1392:26 | call to source | semmle.label | call to source | +| array_flow.rb:1393:5:1393:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1393:5:1393:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1393:9:1393:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1393:9:1393:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1393:9:1393:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1393:9:1393:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1393:9:1397:7 | call to sort! [element] | semmle.label | call to sort! [element] | +| array_flow.rb:1393:9:1397:7 | call to sort! [element] | semmle.label | call to sort! [element] | +| array_flow.rb:1393:21:1393:21 | x | semmle.label | x | +| array_flow.rb:1393:21:1393:21 | x | semmle.label | x | +| array_flow.rb:1393:24:1393:24 | y | semmle.label | y | +| array_flow.rb:1393:24:1393:24 | y | semmle.label | y | | array_flow.rb:1394:14:1394:14 | x | semmle.label | x | | array_flow.rb:1394:14:1394:14 | x | semmle.label | x | | array_flow.rb:1395:14:1395:14 | y | semmle.label | y | | array_flow.rb:1395:14:1395:14 | y | semmle.label | y | -| array_flow.rb:1398:10:1398:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1398:10:1398:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1398:10:1398:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1398:10:1398:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1398:10:1398:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1398:10:1398:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1399:10:1399:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1399:10:1399:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1399:10:1399:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1399:10:1399:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1399:10:1399:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1399:10:1399:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1400:10:1400:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1400:10:1400:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1400:10:1400:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1400:10:1400:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1400:10:1400:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1400:10:1400:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1401:10:1401:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1401:10:1401:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1401:10:1401:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1401:10:1401:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1401:10:1401:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1401:10:1401:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1405:5:1405:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1405:5:1405:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1405:16:1405:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1405:16:1405:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1406:5:1406:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1406:5:1406:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1406:9:1406:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1406:9:1406:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | semmle.label | call to sort_by [element] : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | semmle.label | call to sort_by [element] : | -| array_flow.rb:1406:23:1406:23 | x : | semmle.label | x : | -| array_flow.rb:1406:23:1406:23 | x : | semmle.label | x : | +| array_flow.rb:1405:5:1405:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1405:5:1405:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1405:16:1405:26 | call to source | semmle.label | call to source | +| array_flow.rb:1405:16:1405:26 | call to source | semmle.label | call to source | +| array_flow.rb:1406:5:1406:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1406:5:1406:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1406:9:1406:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1406:9:1406:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1406:9:1409:7 | call to sort_by [element] | semmle.label | call to sort_by [element] | +| array_flow.rb:1406:9:1409:7 | call to sort_by [element] | semmle.label | call to sort_by [element] | +| array_flow.rb:1406:23:1406:23 | x | semmle.label | x | +| array_flow.rb:1406:23:1406:23 | x | semmle.label | x | | array_flow.rb:1407:14:1407:14 | x | semmle.label | x | | array_flow.rb:1407:14:1407:14 | x | semmle.label | x | -| array_flow.rb:1410:10:1410:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1410:10:1410:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1410:10:1410:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1410:10:1410:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1410:10:1410:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1410:10:1410:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1411:10:1411:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1411:10:1411:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1411:10:1411:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1411:10:1411:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1411:10:1411:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1411:10:1411:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1415:5:1415:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1415:5:1415:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1415:16:1415:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1415:16:1415:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1416:5:1416:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1416:5:1416:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1416:9:1416:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1416:9:1416:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1416:9:1416:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1416:9:1416:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | semmle.label | call to sort_by! [element] : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | semmle.label | call to sort_by! [element] : | -| array_flow.rb:1416:24:1416:24 | x : | semmle.label | x : | -| array_flow.rb:1416:24:1416:24 | x : | semmle.label | x : | +| array_flow.rb:1415:5:1415:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1415:5:1415:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1415:16:1415:26 | call to source | semmle.label | call to source | +| array_flow.rb:1415:16:1415:26 | call to source | semmle.label | call to source | +| array_flow.rb:1416:5:1416:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1416:5:1416:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1416:9:1416:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1416:9:1416:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1416:9:1416:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1416:9:1416:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] | semmle.label | call to sort_by! [element] | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] | semmle.label | call to sort_by! [element] | +| array_flow.rb:1416:24:1416:24 | x | semmle.label | x | +| array_flow.rb:1416:24:1416:24 | x | semmle.label | x | | array_flow.rb:1417:14:1417:14 | x | semmle.label | x | | array_flow.rb:1417:14:1417:14 | x | semmle.label | x | -| array_flow.rb:1420:10:1420:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1420:10:1420:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1420:10:1420:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1420:10:1420:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1420:10:1420:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1420:10:1420:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1421:10:1421:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1421:10:1421:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1421:10:1421:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1421:10:1421:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1421:10:1421:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1421:10:1421:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1422:10:1422:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1422:10:1422:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1422:10:1422:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1422:10:1422:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1422:10:1422:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1422:10:1422:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1423:10:1423:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1423:10:1423:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1423:10:1423:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1423:10:1423:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1423:10:1423:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1423:10:1423:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1427:5:1427:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1427:5:1427:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1427:16:1427:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1427:16:1427:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1428:9:1428:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1428:9:1428:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1428:19:1428:19 | x : | semmle.label | x : | -| array_flow.rb:1428:19:1428:19 | x : | semmle.label | x : | +| array_flow.rb:1427:5:1427:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1427:5:1427:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1427:16:1427:26 | call to source | semmle.label | call to source | +| array_flow.rb:1427:16:1427:26 | call to source | semmle.label | call to source | +| array_flow.rb:1428:9:1428:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1428:9:1428:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1428:19:1428:19 | x | semmle.label | x | +| array_flow.rb:1428:19:1428:19 | x | semmle.label | x | | array_flow.rb:1429:14:1429:14 | x | semmle.label | x | | array_flow.rb:1429:14:1429:14 | x | semmle.label | x | -| array_flow.rb:1435:5:1435:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1435:5:1435:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1435:5:1435:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1435:5:1435:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1435:16:1435:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1435:16:1435:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1435:31:1435:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1435:31:1435:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1436:5:1436:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1436:5:1436:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1436:5:1436:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1436:5:1436:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1436:9:1436:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1436:9:1436:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1436:9:1436:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1436:9:1436:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 2] : | semmle.label | call to take [element 2] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 2] : | semmle.label | call to take [element 2] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 3] : | semmle.label | call to take [element 3] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 3] : | semmle.label | call to take [element 3] : | -| array_flow.rb:1439:10:1439:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1439:10:1439:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1435:5:1435:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1435:5:1435:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1435:5:1435:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1435:16:1435:28 | call to source | semmle.label | call to source | +| array_flow.rb:1435:16:1435:28 | call to source | semmle.label | call to source | +| array_flow.rb:1435:31:1435:43 | call to source | semmle.label | call to source | +| array_flow.rb:1435:31:1435:43 | call to source | semmle.label | call to source | +| array_flow.rb:1436:5:1436:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1436:5:1436:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1436:5:1436:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1436:5:1436:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1436:9:1436:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1436:9:1436:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1436:9:1436:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1436:9:1436:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1436:9:1436:17 | call to take [element 2] | semmle.label | call to take [element 2] | +| array_flow.rb:1436:9:1436:17 | call to take [element 2] | semmle.label | call to take [element 2] | +| array_flow.rb:1436:9:1436:17 | call to take [element 3] | semmle.label | call to take [element 3] | +| array_flow.rb:1436:9:1436:17 | call to take [element 3] | semmle.label | call to take [element 3] | +| array_flow.rb:1439:10:1439:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1439:10:1439:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1439:10:1439:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1439:10:1439:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1440:10:1440:10 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1440:10:1440:10 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1440:10:1440:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1440:10:1440:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1440:10:1440:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1440:10:1440:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1441:5:1441:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1441:5:1441:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1441:9:1441:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1441:9:1441:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | semmle.label | call to take [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | semmle.label | call to take [element 2] : | -| array_flow.rb:1444:10:1444:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1444:10:1444:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1441:5:1441:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1441:5:1441:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1441:9:1441:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1441:9:1441:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1441:9:1441:17 | call to take [element 2] | semmle.label | call to take [element 2] | +| array_flow.rb:1441:9:1441:17 | call to take [element 2] | semmle.label | call to take [element 2] | +| array_flow.rb:1444:10:1444:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1444:10:1444:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1444:10:1444:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1444:10:1444:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1446:10:1446:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1446:10:1446:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1446:10:1446:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1446:10:1446:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1446:10:1446:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1446:10:1446:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1447:5:1447:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1447:5:1447:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1447:5:1447:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1447:5:1447:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1447:9:1447:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1447:9:1447:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1447:9:1447:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1447:9:1447:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | semmle.label | call to take [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | semmle.label | call to take [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | semmle.label | call to take [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | semmle.label | call to take [element 3] : | -| array_flow.rb:1450:10:1450:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1450:10:1450:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1447:5:1447:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1447:5:1447:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1447:5:1447:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1447:5:1447:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1447:9:1447:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1447:9:1447:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1447:9:1447:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1447:9:1447:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1447:9:1447:19 | call to take [element 2] | semmle.label | call to take [element 2] | +| array_flow.rb:1447:9:1447:19 | call to take [element 2] | semmle.label | call to take [element 2] | +| array_flow.rb:1447:9:1447:19 | call to take [element 3] | semmle.label | call to take [element 3] | +| array_flow.rb:1447:9:1447:19 | call to take [element 3] | semmle.label | call to take [element 3] | +| array_flow.rb:1450:10:1450:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1450:10:1450:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1450:10:1450:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1450:10:1450:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1451:10:1451:10 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1451:10:1451:10 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1451:10:1451:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1451:10:1451:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1451:10:1451:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1451:10:1451:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1452:10:1452:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1452:10:1452:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1452:10:1452:10 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1452:10:1452:10 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1452:10:1452:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1452:10:1452:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1452:10:1452:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1452:10:1452:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1452:10:1452:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1452:10:1452:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1453:5:1453:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1453:5:1453:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1453:12:1453:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:1453:12:1453:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:1454:5:1454:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1454:5:1454:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1454:5:1454:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1454:5:1454:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1454:9:1454:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1454:9:1454:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1454:9:1454:9 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1454:9:1454:9 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1454:9:1454:17 | call to take [element 2] : | semmle.label | call to take [element 2] : | -| array_flow.rb:1454:9:1454:17 | call to take [element 2] : | semmle.label | call to take [element 2] : | -| array_flow.rb:1454:9:1454:17 | call to take [element] : | semmle.label | call to take [element] : | -| array_flow.rb:1454:9:1454:17 | call to take [element] : | semmle.label | call to take [element] : | -| array_flow.rb:1455:10:1455:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1455:10:1455:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1455:10:1455:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1455:10:1455:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1453:5:1453:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1453:5:1453:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1453:12:1453:24 | call to source | semmle.label | call to source | +| array_flow.rb:1453:12:1453:24 | call to source | semmle.label | call to source | +| array_flow.rb:1454:5:1454:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1454:5:1454:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1454:5:1454:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1454:5:1454:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1454:9:1454:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1454:9:1454:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1454:9:1454:9 | a [element] | semmle.label | a [element] | +| array_flow.rb:1454:9:1454:9 | a [element] | semmle.label | a [element] | +| array_flow.rb:1454:9:1454:17 | call to take [element 2] | semmle.label | call to take [element 2] | +| array_flow.rb:1454:9:1454:17 | call to take [element 2] | semmle.label | call to take [element 2] | +| array_flow.rb:1454:9:1454:17 | call to take [element] | semmle.label | call to take [element] | +| array_flow.rb:1454:9:1454:17 | call to take [element] | semmle.label | call to take [element] | +| array_flow.rb:1455:10:1455:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1455:10:1455:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1455:10:1455:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1455:10:1455:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1455:10:1455:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1455:10:1455:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1459:5:1459:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1459:5:1459:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1459:16:1459:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1459:16:1459:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1460:5:1460:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1460:5:1460:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1460:9:1460:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1460:9:1460:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | semmle.label | call to take_while [element 2] : | -| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | semmle.label | call to take_while [element 2] : | -| array_flow.rb:1460:26:1460:26 | x : | semmle.label | x : | -| array_flow.rb:1460:26:1460:26 | x : | semmle.label | x : | +| array_flow.rb:1459:5:1459:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1459:5:1459:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1459:16:1459:26 | call to source | semmle.label | call to source | +| array_flow.rb:1459:16:1459:26 | call to source | semmle.label | call to source | +| array_flow.rb:1460:5:1460:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1460:5:1460:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1460:9:1460:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1460:9:1460:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] | semmle.label | call to take_while [element 2] | +| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] | semmle.label | call to take_while [element 2] | +| array_flow.rb:1460:26:1460:26 | x | semmle.label | x | +| array_flow.rb:1460:26:1460:26 | x | semmle.label | x | | array_flow.rb:1461:14:1461:14 | x | semmle.label | x | | array_flow.rb:1461:14:1461:14 | x | semmle.label | x | -| array_flow.rb:1466:10:1466:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1466:10:1466:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1466:10:1466:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1466:10:1466:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1466:10:1466:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1466:10:1466:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1472:5:1472:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1472:5:1472:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1472:19:1472:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:1472:19:1472:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:1473:5:1473:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1473:5:1473:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1473:9:1473:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1473:9:1473:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | semmle.label | call to to_a [element 3] : | -| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | semmle.label | call to to_a [element 3] : | -| array_flow.rb:1474:10:1474:10 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1474:10:1474:10 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1472:5:1472:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1472:5:1472:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1472:19:1472:29 | call to source | semmle.label | call to source | +| array_flow.rb:1472:19:1472:29 | call to source | semmle.label | call to source | +| array_flow.rb:1473:5:1473:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1473:5:1473:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1473:9:1473:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1473:9:1473:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] | semmle.label | call to to_a [element 3] | +| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] | semmle.label | call to to_a [element 3] | +| array_flow.rb:1474:10:1474:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1474:10:1474:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1474:10:1474:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1474:10:1474:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1478:5:1478:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1478:5:1478:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1478:16:1478:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1478:16:1478:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1479:5:1479:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1479:5:1479:5 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1479:9:1479:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1479:9:1479:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | semmle.label | call to to_ary [element 2] : | -| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | semmle.label | call to to_ary [element 2] : | -| array_flow.rb:1482:10:1482:10 | b [element 2] : | semmle.label | b [element 2] : | -| array_flow.rb:1482:10:1482:10 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1478:5:1478:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1478:5:1478:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1478:16:1478:26 | call to source | semmle.label | call to source | +| array_flow.rb:1478:16:1478:26 | call to source | semmle.label | call to source | +| array_flow.rb:1479:5:1479:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1479:5:1479:5 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1479:9:1479:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1479:9:1479:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] | semmle.label | call to to_ary [element 2] | +| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] | semmle.label | call to to_ary [element 2] | +| array_flow.rb:1482:10:1482:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1482:10:1482:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1482:10:1482:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1482:10:1482:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | semmle.label | a [element 0, element 1] : | -| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | semmle.label | a [element 0, element 1] : | -| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | semmle.label | a [element 1, element 1] : | -| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | semmle.label | a [element 1, element 1] : | -| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:1495:14:1495:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1495:14:1495:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1495:34:1495:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1495:34:1495:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1495:54:1495:66 | call to source : | semmle.label | call to source : | -| array_flow.rb:1495:54:1495:66 | call to source : | semmle.label | call to source : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | semmle.label | b [element 1, element 0] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | semmle.label | b [element 1, element 0] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | semmle.label | b [element 1, element 1] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | semmle.label | b [element 1, element 1] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | semmle.label | b [element 1, element 2] : | -| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | semmle.label | b [element 1, element 2] : | -| array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | semmle.label | a [element 0, element 1] : | -| array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | semmle.label | a [element 0, element 1] : | -| array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | semmle.label | a [element 1, element 1] : | -| array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | semmle.label | a [element 1, element 1] : | -| array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | semmle.label | call to transpose [element 1, element 0] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | semmle.label | call to transpose [element 1, element 0] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | semmle.label | call to transpose [element 1, element 1] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | semmle.label | call to transpose [element 1, element 1] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | semmle.label | call to transpose [element 1, element 2] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | semmle.label | call to transpose [element 1, element 2] : | -| array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | semmle.label | b [element 1, element 0] : | -| array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | semmle.label | b [element 1, element 0] : | -| array_flow.rb:1500:10:1500:13 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | -| array_flow.rb:1500:10:1500:13 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | +| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | +| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | +| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | +| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | +| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:1495:14:1495:26 | call to source | semmle.label | call to source | +| array_flow.rb:1495:14:1495:26 | call to source | semmle.label | call to source | +| array_flow.rb:1495:34:1495:46 | call to source | semmle.label | call to source | +| array_flow.rb:1495:34:1495:46 | call to source | semmle.label | call to source | +| array_flow.rb:1495:54:1495:66 | call to source | semmle.label | call to source | +| array_flow.rb:1495:54:1495:66 | call to source | semmle.label | call to source | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] | semmle.label | b [element 1, element 2] | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] | semmle.label | b [element 1, element 2] | +| array_flow.rb:1496:9:1496:9 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | +| array_flow.rb:1496:9:1496:9 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | +| array_flow.rb:1496:9:1496:9 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | +| array_flow.rb:1496:9:1496:9 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | +| array_flow.rb:1496:9:1496:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:1496:9:1496:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] | semmle.label | call to transpose [element 1, element 0] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] | semmle.label | call to transpose [element 1, element 0] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] | semmle.label | call to transpose [element 1, element 1] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] | semmle.label | call to transpose [element 1, element 1] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] | semmle.label | call to transpose [element 1, element 2] | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] | semmle.label | call to transpose [element 1, element 2] | +| array_flow.rb:1500:10:1500:10 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | +| array_flow.rb:1500:10:1500:10 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | +| array_flow.rb:1500:10:1500:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | +| array_flow.rb:1500:10:1500:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1500:10:1500:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1500:10:1500:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | semmle.label | b [element 1, element 1] : | -| array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | semmle.label | b [element 1, element 1] : | -| array_flow.rb:1501:10:1501:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:1501:10:1501:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | +| array_flow.rb:1501:10:1501:10 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | +| array_flow.rb:1501:10:1501:10 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | +| array_flow.rb:1501:10:1501:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:1501:10:1501:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:1501:10:1501:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1501:10:1501:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | semmle.label | b [element 1, element 2] : | -| array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | semmle.label | b [element 1, element 2] : | -| array_flow.rb:1502:10:1502:13 | ...[...] [element 2] : | semmle.label | ...[...] [element 2] : | -| array_flow.rb:1502:10:1502:13 | ...[...] [element 2] : | semmle.label | ...[...] [element 2] : | +| array_flow.rb:1502:10:1502:10 | b [element 1, element 2] | semmle.label | b [element 1, element 2] | +| array_flow.rb:1502:10:1502:10 | b [element 1, element 2] | semmle.label | b [element 1, element 2] | +| array_flow.rb:1502:10:1502:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | +| array_flow.rb:1502:10:1502:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | | array_flow.rb:1502:10:1502:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1502:10:1502:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1506:5:1506:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1506:5:1506:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1506:16:1506:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1506:16:1506:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1507:5:1507:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1507:5:1507:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1507:13:1507:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:1507:13:1507:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:1508:5:1508:5 | c [element 1] : | semmle.label | c [element 1] : | -| array_flow.rb:1508:5:1508:5 | c [element 1] : | semmle.label | c [element 1] : | -| array_flow.rb:1508:13:1508:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:1508:13:1508:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:1509:5:1509:5 | d [element] : | semmle.label | d [element] : | -| array_flow.rb:1509:5:1509:5 | d [element] : | semmle.label | d [element] : | -| array_flow.rb:1509:9:1509:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1509:9:1509:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | semmle.label | call to union [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | semmle.label | call to union [element] : | -| array_flow.rb:1509:17:1509:17 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1509:17:1509:17 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1509:20:1509:20 | c [element 1] : | semmle.label | c [element 1] : | -| array_flow.rb:1509:20:1509:20 | c [element 1] : | semmle.label | c [element 1] : | -| array_flow.rb:1510:10:1510:10 | d [element] : | semmle.label | d [element] : | -| array_flow.rb:1510:10:1510:10 | d [element] : | semmle.label | d [element] : | +| array_flow.rb:1506:5:1506:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1506:5:1506:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1506:16:1506:28 | call to source | semmle.label | call to source | +| array_flow.rb:1506:16:1506:28 | call to source | semmle.label | call to source | +| array_flow.rb:1507:5:1507:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1507:5:1507:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1507:13:1507:25 | call to source | semmle.label | call to source | +| array_flow.rb:1507:13:1507:25 | call to source | semmle.label | call to source | +| array_flow.rb:1508:5:1508:5 | c [element 1] | semmle.label | c [element 1] | +| array_flow.rb:1508:5:1508:5 | c [element 1] | semmle.label | c [element 1] | +| array_flow.rb:1508:13:1508:25 | call to source | semmle.label | call to source | +| array_flow.rb:1508:13:1508:25 | call to source | semmle.label | call to source | +| array_flow.rb:1509:5:1509:5 | d [element] | semmle.label | d [element] | +| array_flow.rb:1509:5:1509:5 | d [element] | semmle.label | d [element] | +| array_flow.rb:1509:9:1509:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1509:9:1509:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1509:9:1509:21 | call to union [element] | semmle.label | call to union [element] | +| array_flow.rb:1509:9:1509:21 | call to union [element] | semmle.label | call to union [element] | +| array_flow.rb:1509:17:1509:17 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1509:17:1509:17 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1509:20:1509:20 | c [element 1] | semmle.label | c [element 1] | +| array_flow.rb:1509:20:1509:20 | c [element 1] | semmle.label | c [element 1] | +| array_flow.rb:1510:10:1510:10 | d [element] | semmle.label | d [element] | +| array_flow.rb:1510:10:1510:10 | d [element] | semmle.label | d [element] | | array_flow.rb:1510:10:1510:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1510:10:1510:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1511:10:1511:10 | d [element] : | semmle.label | d [element] : | -| array_flow.rb:1511:10:1511:10 | d [element] : | semmle.label | d [element] : | +| array_flow.rb:1511:10:1511:10 | d [element] | semmle.label | d [element] | +| array_flow.rb:1511:10:1511:10 | d [element] | semmle.label | d [element] | | array_flow.rb:1511:10:1511:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1511:10:1511:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1512:10:1512:10 | d [element] : | semmle.label | d [element] : | -| array_flow.rb:1512:10:1512:10 | d [element] : | semmle.label | d [element] : | +| array_flow.rb:1512:10:1512:10 | d [element] | semmle.label | d [element] | +| array_flow.rb:1512:10:1512:10 | d [element] | semmle.label | d [element] | | array_flow.rb:1512:10:1512:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1512:10:1512:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1516:5:1516:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1516:5:1516:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1516:5:1516:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1516:5:1516:5 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1516:19:1516:31 | call to source : | semmle.label | call to source : | -| array_flow.rb:1516:19:1516:31 | call to source : | semmle.label | call to source : | -| array_flow.rb:1516:34:1516:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1516:34:1516:46 | call to source : | semmle.label | call to source : | -| array_flow.rb:1518:5:1518:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1518:5:1518:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1518:9:1518:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1518:9:1518:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1518:9:1518:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1518:9:1518:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | semmle.label | call to uniq [element] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | semmle.label | call to uniq [element] : | -| array_flow.rb:1519:10:1519:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1519:10:1519:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1516:5:1516:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1516:5:1516:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1516:5:1516:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1516:5:1516:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1516:19:1516:31 | call to source | semmle.label | call to source | +| array_flow.rb:1516:19:1516:31 | call to source | semmle.label | call to source | +| array_flow.rb:1516:34:1516:46 | call to source | semmle.label | call to source | +| array_flow.rb:1516:34:1516:46 | call to source | semmle.label | call to source | +| array_flow.rb:1518:5:1518:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1518:5:1518:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1518:9:1518:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1518:9:1518:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1518:9:1518:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1518:9:1518:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1518:9:1518:14 | call to uniq [element] | semmle.label | call to uniq [element] | +| array_flow.rb:1518:9:1518:14 | call to uniq [element] | semmle.label | call to uniq [element] | +| array_flow.rb:1519:10:1519:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1519:10:1519:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1519:10:1519:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1519:10:1519:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1520:10:1520:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1520:10:1520:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1520:10:1520:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1520:10:1520:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1520:10:1520:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1520:10:1520:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1522:5:1522:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1522:5:1522:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1522:9:1522:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1522:9:1522:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1522:9:1522:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1522:9:1522:9 | a [element 4] : | semmle.label | a [element 4] : | -| array_flow.rb:1522:9:1525:7 | call to uniq [element] : | semmle.label | call to uniq [element] : | -| array_flow.rb:1522:9:1525:7 | call to uniq [element] : | semmle.label | call to uniq [element] : | -| array_flow.rb:1522:20:1522:20 | x : | semmle.label | x : | -| array_flow.rb:1522:20:1522:20 | x : | semmle.label | x : | +| array_flow.rb:1522:5:1522:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:1522:5:1522:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:1522:9:1522:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1522:9:1522:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1522:9:1522:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1522:9:1522:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1522:9:1525:7 | call to uniq [element] | semmle.label | call to uniq [element] | +| array_flow.rb:1522:9:1525:7 | call to uniq [element] | semmle.label | call to uniq [element] | +| array_flow.rb:1522:20:1522:20 | x | semmle.label | x | +| array_flow.rb:1522:20:1522:20 | x | semmle.label | x | | array_flow.rb:1523:14:1523:14 | x | semmle.label | x | | array_flow.rb:1523:14:1523:14 | x | semmle.label | x | -| array_flow.rb:1526:10:1526:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1526:10:1526:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:1526:10:1526:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1526:10:1526:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1526:10:1526:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1526:10:1526:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1530:5:1530:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1530:5:1530:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1530:5:1530:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1530:5:1530:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1530:16:1530:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1530:16:1530:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1530:31:1530:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1530:31:1530:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1531:5:1531:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1531:5:1531:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1531:9:1531:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1531:9:1531:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1531:9:1531:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1531:9:1531:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1531:9:1531:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1531:9:1531:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | semmle.label | call to uniq! [element] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | semmle.label | call to uniq! [element] : | -| array_flow.rb:1532:10:1532:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1532:10:1532:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1530:5:1530:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1530:5:1530:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1530:5:1530:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1530:5:1530:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1530:16:1530:28 | call to source | semmle.label | call to source | +| array_flow.rb:1530:16:1530:28 | call to source | semmle.label | call to source | +| array_flow.rb:1530:31:1530:43 | call to source | semmle.label | call to source | +| array_flow.rb:1530:31:1530:43 | call to source | semmle.label | call to source | +| array_flow.rb:1531:5:1531:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1531:5:1531:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1531:9:1531:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1531:9:1531:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1531:9:1531:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1531:9:1531:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1531:9:1531:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1531:9:1531:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1531:9:1531:15 | call to uniq! [element] | semmle.label | call to uniq! [element] | +| array_flow.rb:1531:9:1531:15 | call to uniq! [element] | semmle.label | call to uniq! [element] | +| array_flow.rb:1532:10:1532:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1532:10:1532:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1532:10:1532:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1532:10:1532:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1533:10:1533:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1533:10:1533:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1533:10:1533:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1533:10:1533:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1533:10:1533:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1533:10:1533:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1534:10:1534:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1534:10:1534:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1534:10:1534:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1534:10:1534:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1534:10:1534:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1534:10:1534:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1535:10:1535:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1535:10:1535:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1535:10:1535:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1535:10:1535:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1535:10:1535:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1535:10:1535:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1537:5:1537:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1537:5:1537:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1537:5:1537:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1537:5:1537:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1537:16:1537:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1537:16:1537:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1537:31:1537:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1537:31:1537:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1538:5:1538:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1538:5:1538:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1538:9:1538:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1538:9:1538:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1538:9:1538:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1538:9:1538:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1538:9:1538:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1538:9:1538:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | semmle.label | call to uniq! [element] : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | semmle.label | call to uniq! [element] : | -| array_flow.rb:1538:21:1538:21 | x : | semmle.label | x : | -| array_flow.rb:1538:21:1538:21 | x : | semmle.label | x : | +| array_flow.rb:1537:5:1537:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1537:5:1537:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1537:5:1537:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1537:5:1537:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1537:16:1537:28 | call to source | semmle.label | call to source | +| array_flow.rb:1537:16:1537:28 | call to source | semmle.label | call to source | +| array_flow.rb:1537:31:1537:43 | call to source | semmle.label | call to source | +| array_flow.rb:1537:31:1537:43 | call to source | semmle.label | call to source | +| array_flow.rb:1538:5:1538:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1538:5:1538:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1538:9:1538:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1538:9:1538:9 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1538:9:1538:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1538:9:1538:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1538:9:1538:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1538:9:1538:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1538:9:1541:7 | call to uniq! [element] | semmle.label | call to uniq! [element] | +| array_flow.rb:1538:9:1541:7 | call to uniq! [element] | semmle.label | call to uniq! [element] | +| array_flow.rb:1538:21:1538:21 | x | semmle.label | x | +| array_flow.rb:1538:21:1538:21 | x | semmle.label | x | | array_flow.rb:1539:14:1539:14 | x | semmle.label | x | | array_flow.rb:1539:14:1539:14 | x | semmle.label | x | -| array_flow.rb:1542:10:1542:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1542:10:1542:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1542:10:1542:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1542:10:1542:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1542:10:1542:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1542:10:1542:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1543:10:1543:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1543:10:1543:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1543:10:1543:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1543:10:1543:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1543:10:1543:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1543:10:1543:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1544:10:1544:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1544:10:1544:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1544:10:1544:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1544:10:1544:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1544:10:1544:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1544:10:1544:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1545:10:1545:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1545:10:1545:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1545:10:1545:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1545:10:1545:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1545:10:1545:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1545:10:1545:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1549:5:1549:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1549:5:1549:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1549:16:1549:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1549:16:1549:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1550:5:1550:5 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:1550:5:1550:5 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| array_flow.rb:1550:5:1550:5 | [post] a [element 5] : | semmle.label | [post] a [element 5] : | -| array_flow.rb:1550:5:1550:5 | [post] a [element 5] : | semmle.label | [post] a [element 5] : | -| array_flow.rb:1550:5:1550:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1550:5:1550:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1550:21:1550:33 | call to source : | semmle.label | call to source : | -| array_flow.rb:1550:21:1550:33 | call to source : | semmle.label | call to source : | -| array_flow.rb:1553:10:1553:10 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1553:10:1553:10 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1549:5:1549:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1549:5:1549:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1549:16:1549:28 | call to source | semmle.label | call to source | +| array_flow.rb:1549:16:1549:28 | call to source | semmle.label | call to source | +| array_flow.rb:1550:5:1550:5 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:1550:5:1550:5 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| array_flow.rb:1550:5:1550:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | +| array_flow.rb:1550:5:1550:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | +| array_flow.rb:1550:5:1550:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1550:5:1550:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1550:21:1550:33 | call to source | semmle.label | call to source | +| array_flow.rb:1550:21:1550:33 | call to source | semmle.label | call to source | +| array_flow.rb:1553:10:1553:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1553:10:1553:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1553:10:1553:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1553:10:1553:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1556:10:1556:10 | a [element 5] : | semmle.label | a [element 5] : | -| array_flow.rb:1556:10:1556:10 | a [element 5] : | semmle.label | a [element 5] : | +| array_flow.rb:1556:10:1556:10 | a [element 5] | semmle.label | a [element 5] | +| array_flow.rb:1556:10:1556:10 | a [element 5] | semmle.label | a [element 5] | | array_flow.rb:1556:10:1556:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1556:10:1556:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1560:5:1560:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1560:5:1560:5 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1560:5:1560:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1560:5:1560:5 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1560:13:1560:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:1560:13:1560:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:1560:31:1560:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1560:31:1560:43 | call to source : | semmle.label | call to source : | -| array_flow.rb:1562:5:1562:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1562:5:1562:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1562:5:1562:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1562:5:1562:5 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1562:9:1562:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1562:9:1562:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | semmle.label | call to values_at [element 1] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | semmle.label | call to values_at [element 1] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | semmle.label | call to values_at [element 3] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | semmle.label | call to values_at [element 3] : | -| array_flow.rb:1564:10:1564:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1564:10:1564:10 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1560:5:1560:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1560:5:1560:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1560:5:1560:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1560:13:1560:25 | call to source | semmle.label | call to source | +| array_flow.rb:1560:13:1560:25 | call to source | semmle.label | call to source | +| array_flow.rb:1560:31:1560:43 | call to source | semmle.label | call to source | +| array_flow.rb:1560:31:1560:43 | call to source | semmle.label | call to source | +| array_flow.rb:1562:5:1562:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1562:5:1562:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1562:5:1562:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1562:5:1562:5 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1562:9:1562:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1562:9:1562:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] | semmle.label | call to values_at [element 1] | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] | semmle.label | call to values_at [element 1] | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] | semmle.label | call to values_at [element 3] | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] | semmle.label | call to values_at [element 3] | +| array_flow.rb:1564:10:1564:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1564:10:1564:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1564:10:1564:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1564:10:1564:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1566:10:1566:10 | b [element 3] : | semmle.label | b [element 3] : | -| array_flow.rb:1566:10:1566:10 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1566:10:1566:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1566:10:1566:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1566:10:1566:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1566:10:1566:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1568:5:1568:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1568:5:1568:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1568:9:1568:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1568:9:1568:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1568:9:1568:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1568:9:1568:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | semmle.label | call to values_at [element] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | semmle.label | call to values_at [element] : | -| array_flow.rb:1569:10:1569:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1569:10:1569:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1568:5:1568:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1568:5:1568:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1568:9:1568:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1568:9:1568:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1568:9:1568:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1568:9:1568:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1568:9:1568:25 | call to values_at [element] | semmle.label | call to values_at [element] | +| array_flow.rb:1568:9:1568:25 | call to values_at [element] | semmle.label | call to values_at [element] | +| array_flow.rb:1569:10:1569:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1569:10:1569:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1569:10:1569:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1569:10:1569:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1570:10:1570:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1570:10:1570:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1570:10:1570:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1570:10:1570:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1570:10:1570:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1570:10:1570:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1572:5:1572:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1572:5:1572:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1572:9:1572:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1572:9:1572:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1572:9:1572:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1572:9:1572:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | semmle.label | call to values_at [element] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | semmle.label | call to values_at [element] : | -| array_flow.rb:1573:10:1573:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1573:10:1573:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1572:5:1572:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1572:5:1572:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1572:9:1572:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1572:9:1572:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1572:9:1572:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1572:9:1572:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1572:9:1572:26 | call to values_at [element] | semmle.label | call to values_at [element] | +| array_flow.rb:1572:9:1572:26 | call to values_at [element] | semmle.label | call to values_at [element] | +| array_flow.rb:1573:10:1573:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1573:10:1573:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1573:10:1573:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1573:10:1573:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1574:10:1574:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1574:10:1574:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1574:10:1574:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1574:10:1574:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1574:10:1574:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1574:10:1574:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1576:5:1576:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1576:5:1576:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1576:5:1576:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1576:5:1576:5 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1576:9:1576:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1576:9:1576:9 | a [element 1] : | semmle.label | a [element 1] : | -| array_flow.rb:1576:9:1576:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1576:9:1576:9 | a [element 3] : | semmle.label | a [element 3] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | semmle.label | call to values_at [element 1] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | semmle.label | call to values_at [element 1] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | semmle.label | call to values_at [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | semmle.label | call to values_at [element] : | -| array_flow.rb:1577:10:1577:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1577:10:1577:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1576:5:1576:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1576:5:1576:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1576:5:1576:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1576:5:1576:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1576:9:1576:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1576:9:1576:9 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1576:9:1576:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1576:9:1576:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] | semmle.label | call to values_at [element 1] | +| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] | semmle.label | call to values_at [element 1] | +| array_flow.rb:1576:9:1576:28 | call to values_at [element] | semmle.label | call to values_at [element] | +| array_flow.rb:1576:9:1576:28 | call to values_at [element] | semmle.label | call to values_at [element] | +| array_flow.rb:1577:10:1577:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1577:10:1577:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1577:10:1577:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1577:10:1577:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1578:10:1578:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1578:10:1578:10 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1578:10:1578:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1578:10:1578:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1578:10:1578:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1578:10:1578:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1578:10:1578:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1578:10:1578:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1578:10:1578:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1578:10:1578:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1579:10:1579:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1579:10:1579:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1579:10:1579:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1579:10:1579:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1579:10:1579:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1579:10:1579:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1580:10:1580:10 | b [element] : | semmle.label | b [element] : | -| array_flow.rb:1580:10:1580:10 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1580:10:1580:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1580:10:1580:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1580:10:1580:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1580:10:1580:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1584:5:1584:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1584:5:1584:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1584:16:1584:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1584:16:1584:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1585:5:1585:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1585:5:1585:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1585:13:1585:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:1585:13:1585:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:1586:5:1586:5 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:1586:5:1586:5 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:1586:10:1586:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1586:10:1586:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | semmle.label | d [element 0, element 2] : | -| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | semmle.label | d [element 0, element 2] : | -| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | semmle.label | d [element 1, element 1] : | -| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | semmle.label | d [element 1, element 1] : | -| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | -| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | -| array_flow.rb:1587:9:1587:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1587:9:1587:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | semmle.label | call to zip [element 0, element 2] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | semmle.label | call to zip [element 0, element 2] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | semmle.label | call to zip [element 1, element 1] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | semmle.label | call to zip [element 1, element 1] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | semmle.label | call to zip [element 2, element 0] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | semmle.label | call to zip [element 2, element 0] : | -| array_flow.rb:1587:15:1587:15 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1587:15:1587:15 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1587:18:1587:18 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:1587:18:1587:18 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:1589:10:1589:10 | d [element 0, element 2] : | semmle.label | d [element 0, element 2] : | -| array_flow.rb:1589:10:1589:10 | d [element 0, element 2] : | semmle.label | d [element 0, element 2] : | -| array_flow.rb:1589:10:1589:13 | ...[...] [element 2] : | semmle.label | ...[...] [element 2] : | -| array_flow.rb:1589:10:1589:13 | ...[...] [element 2] : | semmle.label | ...[...] [element 2] : | +| array_flow.rb:1584:5:1584:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1584:5:1584:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1584:16:1584:28 | call to source | semmle.label | call to source | +| array_flow.rb:1584:16:1584:28 | call to source | semmle.label | call to source | +| array_flow.rb:1585:5:1585:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1585:5:1585:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1585:13:1585:25 | call to source | semmle.label | call to source | +| array_flow.rb:1585:13:1585:25 | call to source | semmle.label | call to source | +| array_flow.rb:1586:5:1586:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:1586:5:1586:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:1586:10:1586:22 | call to source | semmle.label | call to source | +| array_flow.rb:1586:10:1586:22 | call to source | semmle.label | call to source | +| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | +| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | +| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | +| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | +| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:1587:9:1587:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1587:9:1587:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] | semmle.label | call to zip [element 0, element 2] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] | semmle.label | call to zip [element 0, element 2] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] | semmle.label | call to zip [element 1, element 1] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] | semmle.label | call to zip [element 1, element 1] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] | semmle.label | call to zip [element 2, element 0] | +| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] | semmle.label | call to zip [element 2, element 0] | +| array_flow.rb:1587:15:1587:15 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1587:15:1587:15 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1587:18:1587:18 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:1587:18:1587:18 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:1589:10:1589:10 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | +| array_flow.rb:1589:10:1589:10 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | +| array_flow.rb:1589:10:1589:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | +| array_flow.rb:1589:10:1589:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | | array_flow.rb:1589:10:1589:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1589:10:1589:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | semmle.label | d [element 1, element 1] : | -| array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | semmle.label | d [element 1, element 1] : | -| array_flow.rb:1590:10:1590:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| array_flow.rb:1590:10:1590:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | +| array_flow.rb:1590:10:1590:10 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | +| array_flow.rb:1590:10:1590:10 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | +| array_flow.rb:1590:10:1590:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:1590:10:1590:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:1590:10:1590:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1590:10:1590:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | -| array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | -| array_flow.rb:1591:10:1591:13 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | -| array_flow.rb:1591:10:1591:13 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | +| array_flow.rb:1591:10:1591:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:1591:10:1591:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:1591:10:1591:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | +| array_flow.rb:1591:10:1591:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1591:10:1591:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1591:10:1591:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1592:5:1592:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1592:5:1592:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1592:11:1592:11 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1592:11:1592:11 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1592:14:1592:14 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:1592:14:1592:14 | c [element 0] : | semmle.label | c [element 0] : | -| array_flow.rb:1592:21:1592:21 | x [element 0] : | semmle.label | x [element 0] : | -| array_flow.rb:1592:21:1592:21 | x [element 0] : | semmle.label | x [element 0] : | -| array_flow.rb:1592:21:1592:21 | x [element 1] : | semmle.label | x [element 1] : | -| array_flow.rb:1592:21:1592:21 | x [element 1] : | semmle.label | x [element 1] : | -| array_flow.rb:1592:21:1592:21 | x [element 2] : | semmle.label | x [element 2] : | -| array_flow.rb:1592:21:1592:21 | x [element 2] : | semmle.label | x [element 2] : | -| array_flow.rb:1593:14:1593:14 | x [element 0] : | semmle.label | x [element 0] : | -| array_flow.rb:1593:14:1593:14 | x [element 0] : | semmle.label | x [element 0] : | +| array_flow.rb:1592:5:1592:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1592:5:1592:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1592:11:1592:11 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1592:11:1592:11 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1592:14:1592:14 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:1592:14:1592:14 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:1592:21:1592:21 | x [element 0] | semmle.label | x [element 0] | +| array_flow.rb:1592:21:1592:21 | x [element 0] | semmle.label | x [element 0] | +| array_flow.rb:1592:21:1592:21 | x [element 1] | semmle.label | x [element 1] | +| array_flow.rb:1592:21:1592:21 | x [element 1] | semmle.label | x [element 1] | +| array_flow.rb:1592:21:1592:21 | x [element 2] | semmle.label | x [element 2] | +| array_flow.rb:1592:21:1592:21 | x [element 2] | semmle.label | x [element 2] | +| array_flow.rb:1593:14:1593:14 | x [element 0] | semmle.label | x [element 0] | +| array_flow.rb:1593:14:1593:14 | x [element 0] | semmle.label | x [element 0] | | array_flow.rb:1593:14:1593:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1593:14:1593:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1594:14:1594:14 | x [element 1] : | semmle.label | x [element 1] : | -| array_flow.rb:1594:14:1594:14 | x [element 1] : | semmle.label | x [element 1] : | +| array_flow.rb:1594:14:1594:14 | x [element 1] | semmle.label | x [element 1] | +| array_flow.rb:1594:14:1594:14 | x [element 1] | semmle.label | x [element 1] | | array_flow.rb:1594:14:1594:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1594:14:1594:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1595:14:1595:14 | x [element 2] : | semmle.label | x [element 2] : | -| array_flow.rb:1595:14:1595:14 | x [element 2] : | semmle.label | x [element 2] : | +| array_flow.rb:1595:14:1595:14 | x [element 2] | semmle.label | x [element 2] | +| array_flow.rb:1595:14:1595:14 | x [element 2] | semmle.label | x [element 2] | | array_flow.rb:1595:14:1595:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1595:14:1595:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1600:5:1600:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1600:5:1600:5 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1600:16:1600:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1600:16:1600:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1601:5:1601:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1601:5:1601:5 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1601:13:1601:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:1601:13:1601:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:1602:5:1602:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1602:5:1602:5 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1602:9:1602:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1602:9:1602:9 | a [element 2] : | semmle.label | a [element 2] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | semmle.label | ... \| ... [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | semmle.label | ... \| ... [element] : | -| array_flow.rb:1602:13:1602:13 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1602:13:1602:13 | b [element 1] : | semmle.label | b [element 1] : | -| array_flow.rb:1603:10:1603:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1603:10:1603:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:1600:5:1600:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1600:5:1600:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1600:16:1600:28 | call to source | semmle.label | call to source | +| array_flow.rb:1600:16:1600:28 | call to source | semmle.label | call to source | +| array_flow.rb:1601:5:1601:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1601:5:1601:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1601:13:1601:25 | call to source | semmle.label | call to source | +| array_flow.rb:1601:13:1601:25 | call to source | semmle.label | call to source | +| array_flow.rb:1602:5:1602:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:1602:5:1602:5 | c [element] | semmle.label | c [element] | +| array_flow.rb:1602:9:1602:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1602:9:1602:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1602:9:1602:13 | ... \| ... [element] | semmle.label | ... \| ... [element] | +| array_flow.rb:1602:9:1602:13 | ... \| ... [element] | semmle.label | ... \| ... [element] | +| array_flow.rb:1602:13:1602:13 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1602:13:1602:13 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1603:10:1603:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1603:10:1603:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1603:10:1603:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1603:10:1603:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1604:10:1604:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1604:10:1604:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:1604:10:1604:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1604:10:1604:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1604:10:1604:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1604:10:1604:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1605:10:1605:10 | c [element] : | semmle.label | c [element] : | -| array_flow.rb:1605:10:1605:10 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:1605:10:1605:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1605:10:1605:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1605:10:1605:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1605:10:1605:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] : | semmle.label | [post] a [element, element 0] : | -| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] : | semmle.label | [post] a [element, element 0] : | -| array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] : | semmle.label | [post] ...[...] [element 0] : | -| array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] : | semmle.label | [post] ...[...] [element 0] : | -| array_flow.rb:1610:15:1610:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:1610:15:1610:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:1611:10:1611:10 | a [element, element 0] : | semmle.label | a [element, element 0] : | -| array_flow.rb:1611:10:1611:10 | a [element, element 0] : | semmle.label | a [element, element 0] : | -| array_flow.rb:1611:10:1611:13 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | -| array_flow.rb:1611:10:1611:13 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | +| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] | semmle.label | [post] a [element, element 0] | +| array_flow.rb:1610:5:1610:5 | [post] a [element, element 0] | semmle.label | [post] a [element, element 0] | +| array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] | semmle.label | [post] ...[...] [element 0] | +| array_flow.rb:1610:5:1610:8 | [post] ...[...] [element 0] | semmle.label | [post] ...[...] [element 0] | +| array_flow.rb:1610:15:1610:27 | call to source | semmle.label | call to source | +| array_flow.rb:1610:15:1610:27 | call to source | semmle.label | call to source | +| array_flow.rb:1611:10:1611:10 | a [element, element 0] | semmle.label | a [element, element 0] | +| array_flow.rb:1611:10:1611:10 | a [element, element 0] | semmle.label | a [element, element 0] | +| array_flow.rb:1611:10:1611:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | +| array_flow.rb:1611:10:1611:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1611:10:1611:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1611:10:1611:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] : | semmle.label | [post] a [element 1, element 0] : | -| array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] : | semmle.label | [post] a [element 1, element 0] : | -| array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] : | semmle.label | [post] ...[...] [element 0] : | -| array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] : | semmle.label | [post] ...[...] [element 0] : | -| array_flow.rb:1613:15:1613:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:1613:15:1613:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:1614:10:1614:10 | a [element 1, element 0] : | semmle.label | a [element 1, element 0] : | -| array_flow.rb:1614:10:1614:10 | a [element 1, element 0] : | semmle.label | a [element 1, element 0] : | -| array_flow.rb:1614:10:1614:10 | a [element, element 0] : | semmle.label | a [element, element 0] : | -| array_flow.rb:1614:10:1614:10 | a [element, element 0] : | semmle.label | a [element, element 0] : | -| array_flow.rb:1614:10:1614:13 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | -| array_flow.rb:1614:10:1614:13 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | +| array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] | semmle.label | [post] a [element 1, element 0] | +| array_flow.rb:1613:5:1613:5 | [post] a [element 1, element 0] | semmle.label | [post] a [element 1, element 0] | +| array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] | semmle.label | [post] ...[...] [element 0] | +| array_flow.rb:1613:5:1613:8 | [post] ...[...] [element 0] | semmle.label | [post] ...[...] [element 0] | +| array_flow.rb:1613:15:1613:27 | call to source | semmle.label | call to source | +| array_flow.rb:1613:15:1613:27 | call to source | semmle.label | call to source | +| array_flow.rb:1614:10:1614:10 | a [element 1, element 0] | semmle.label | a [element 1, element 0] | +| array_flow.rb:1614:10:1614:10 | a [element 1, element 0] | semmle.label | a [element 1, element 0] | +| array_flow.rb:1614:10:1614:10 | a [element, element 0] | semmle.label | a [element, element 0] | +| array_flow.rb:1614:10:1614:10 | a [element, element 0] | semmle.label | a [element, element 0] | +| array_flow.rb:1614:10:1614:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | +| array_flow.rb:1614:10:1614:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1614:10:1614:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1614:10:1614:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1615:10:1615:10 | a [element, element 0] : | semmle.label | a [element, element 0] : | -| array_flow.rb:1615:10:1615:10 | a [element, element 0] : | semmle.label | a [element, element 0] : | -| array_flow.rb:1615:10:1615:13 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | -| array_flow.rb:1615:10:1615:13 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | +| array_flow.rb:1615:10:1615:10 | a [element, element 0] | semmle.label | a [element, element 0] | +| array_flow.rb:1615:10:1615:10 | a [element, element 0] | semmle.label | a [element, element 0] | +| array_flow.rb:1615:10:1615:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | +| array_flow.rb:1615:10:1615:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1615:10:1615:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1615:10:1615:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1620:5:1620:5 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| array_flow.rb:1620:5:1620:5 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| array_flow.rb:1620:12:1620:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:1620:12:1620:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:1622:5:1622:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1622:5:1622:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1622:16:1622:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1622:16:1622:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1624:5:1624:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1624:5:1624:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1624:14:1624:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1624:14:1624:26 | call to source : | semmle.label | call to source : | -| array_flow.rb:1626:5:1626:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1626:5:1626:5 | [post] a [element] : | semmle.label | [post] a [element] : | -| array_flow.rb:1626:16:1626:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1626:16:1626:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:1627:10:1627:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1627:10:1627:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1620:5:1620:5 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1620:5:1620:5 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1620:12:1620:24 | call to source | semmle.label | call to source | +| array_flow.rb:1620:12:1620:24 | call to source | semmle.label | call to source | +| array_flow.rb:1622:5:1622:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1622:5:1622:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1622:16:1622:28 | call to source | semmle.label | call to source | +| array_flow.rb:1622:16:1622:28 | call to source | semmle.label | call to source | +| array_flow.rb:1624:5:1624:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1624:5:1624:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1624:14:1624:26 | call to source | semmle.label | call to source | +| array_flow.rb:1624:14:1624:26 | call to source | semmle.label | call to source | +| array_flow.rb:1626:5:1626:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1626:5:1626:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1626:16:1626:28 | call to source | semmle.label | call to source | +| array_flow.rb:1626:16:1626:28 | call to source | semmle.label | call to source | +| array_flow.rb:1627:10:1627:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1627:10:1627:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1627:10:1627:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1627:10:1627:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1629:10:1629:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1629:10:1629:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1629:10:1629:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1629:10:1629:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1629:10:1629:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1629:10:1629:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1629:10:1629:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1629:10:1629:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1629:10:1629:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1629:10:1629:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1631:10:1631:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1631:10:1631:10 | a [element 0] : | semmle.label | a [element 0] : | -| array_flow.rb:1631:10:1631:10 | a [element] : | semmle.label | a [element] : | -| array_flow.rb:1631:10:1631:10 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:1631:10:1631:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1631:10:1631:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1631:10:1631:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1631:10:1631:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1631:10:1631:15 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1631:10:1631:15 | ...[...] | semmle.label | ...[...] | subpaths #select -| array_flow.rb:3:10:3:13 | ...[...] | array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:3:10:3:13 | ...[...] | $@ | array_flow.rb:2:10:2:20 | call to source : | call to source : | -| array_flow.rb:5:10:5:13 | ...[...] | array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:5:10:5:13 | ...[...] | $@ | array_flow.rb:2:10:2:20 | call to source : | call to source : | -| array_flow.rb:11:10:11:13 | ...[...] | array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:11:10:11:13 | ...[...] | $@ | array_flow.rb:9:13:9:21 | call to source : | call to source : | -| array_flow.rb:13:10:13:13 | ...[...] | array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:13:10:13:13 | ...[...] | $@ | array_flow.rb:9:13:9:21 | call to source : | call to source : | -| array_flow.rb:18:10:18:13 | ...[...] | array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:18:10:18:13 | ...[...] | $@ | array_flow.rb:17:22:17:32 | call to source : | call to source : | -| array_flow.rb:19:10:19:13 | ...[...] | array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:19:10:19:13 | ...[...] | $@ | array_flow.rb:17:22:17:32 | call to source : | call to source : | -| array_flow.rb:22:10:22:13 | ...[...] | array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:22:10:22:13 | ...[...] | $@ | array_flow.rb:17:22:17:32 | call to source : | call to source : | -| array_flow.rb:23:10:23:13 | ...[...] | array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:23:10:23:13 | ...[...] | $@ | array_flow.rb:17:22:17:32 | call to source : | call to source : | -| array_flow.rb:28:10:28:13 | ...[...] | array_flow.rb:26:9:26:19 | call to source : | array_flow.rb:28:10:28:13 | ...[...] | $@ | array_flow.rb:26:9:26:19 | call to source : | call to source : | -| array_flow.rb:29:10:29:13 | ...[...] | array_flow.rb:26:9:26:19 | call to source : | array_flow.rb:29:10:29:13 | ...[...] | $@ | array_flow.rb:26:9:26:19 | call to source : | call to source : | -| array_flow.rb:35:10:35:13 | ...[...] | array_flow.rb:33:10:33:18 | call to source : | array_flow.rb:35:10:35:13 | ...[...] | $@ | array_flow.rb:33:10:33:18 | call to source : | call to source : | -| array_flow.rb:43:10:43:13 | ...[...] | array_flow.rb:40:10:40:20 | call to source : | array_flow.rb:43:10:43:13 | ...[...] | $@ | array_flow.rb:40:10:40:20 | call to source : | call to source : | -| array_flow.rb:43:10:43:13 | ...[...] | array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:43:10:43:13 | ...[...] | $@ | array_flow.rb:41:16:41:26 | call to source : | call to source : | -| array_flow.rb:44:10:44:13 | ...[...] | array_flow.rb:40:10:40:20 | call to source : | array_flow.rb:44:10:44:13 | ...[...] | $@ | array_flow.rb:40:10:40:20 | call to source : | call to source : | -| array_flow.rb:44:10:44:13 | ...[...] | array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:44:10:44:13 | ...[...] | $@ | array_flow.rb:41:16:41:26 | call to source : | call to source : | -| array_flow.rb:50:10:50:13 | ...[...] | array_flow.rb:48:10:48:18 | call to source : | array_flow.rb:50:10:50:13 | ...[...] | $@ | array_flow.rb:48:10:48:18 | call to source : | call to source : | -| array_flow.rb:51:10:51:13 | ...[...] | array_flow.rb:48:10:48:18 | call to source : | array_flow.rb:51:10:51:13 | ...[...] | $@ | array_flow.rb:48:10:48:18 | call to source : | call to source : | -| array_flow.rb:58:10:58:13 | ...[...] | array_flow.rb:55:10:55:20 | call to source : | array_flow.rb:58:10:58:13 | ...[...] | $@ | array_flow.rb:55:10:55:20 | call to source : | call to source : | -| array_flow.rb:58:10:58:13 | ...[...] | array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:58:10:58:13 | ...[...] | $@ | array_flow.rb:56:13:56:23 | call to source : | call to source : | -| array_flow.rb:59:10:59:13 | ...[...] | array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:59:10:59:13 | ...[...] | $@ | array_flow.rb:56:13:56:23 | call to source : | call to source : | -| array_flow.rb:66:10:66:13 | ...[...] | array_flow.rb:63:10:63:20 | call to source : | array_flow.rb:66:10:66:13 | ...[...] | $@ | array_flow.rb:63:10:63:20 | call to source : | call to source : | -| array_flow.rb:67:10:67:13 | ...[...] | array_flow.rb:63:10:63:20 | call to source : | array_flow.rb:67:10:67:13 | ...[...] | $@ | array_flow.rb:63:10:63:20 | call to source : | call to source : | -| array_flow.rb:73:10:73:13 | ...[...] | array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:73:10:73:13 | ...[...] | $@ | array_flow.rb:71:10:71:20 | call to source : | call to source : | -| array_flow.rb:73:10:73:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:73:10:73:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source : | call to source : | -| array_flow.rb:74:10:74:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:74:10:74:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source : | call to source : | -| array_flow.rb:75:10:75:13 | ...[...] | array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:75:10:75:13 | ...[...] | $@ | array_flow.rb:71:10:71:20 | call to source : | call to source : | -| array_flow.rb:75:10:75:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:75:10:75:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source : | call to source : | -| array_flow.rb:76:10:76:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:76:10:76:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source : | call to source : | -| array_flow.rb:83:10:83:10 | c | array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:83:10:83:10 | c | $@ | array_flow.rb:80:13:80:21 | call to source : | call to source : | -| array_flow.rb:91:10:91:13 | ...[...] | array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:91:10:91:13 | ...[...] | $@ | array_flow.rb:88:13:88:22 | call to source : | call to source : | -| array_flow.rb:92:10:92:13 | ...[...] | array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:92:10:92:13 | ...[...] | $@ | array_flow.rb:88:13:88:22 | call to source : | call to source : | -| array_flow.rb:99:10:99:13 | ...[...] | array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:99:10:99:13 | ...[...] | $@ | array_flow.rb:96:13:96:22 | call to source : | call to source : | -| array_flow.rb:101:10:101:13 | ...[...] | array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:101:10:101:13 | ...[...] | $@ | array_flow.rb:96:13:96:22 | call to source : | call to source : | -| array_flow.rb:106:10:106:13 | ...[...] | array_flow.rb:103:13:103:24 | call to source : | array_flow.rb:106:10:106:13 | ...[...] | $@ | array_flow.rb:103:13:103:24 | call to source : | call to source : | -| array_flow.rb:111:10:111:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:111:10:111:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source : | call to source : | -| array_flow.rb:111:10:111:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:111:10:111:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source : | call to source : | -| array_flow.rb:112:10:112:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:112:10:112:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source : | call to source : | -| array_flow.rb:112:10:112:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:112:10:112:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source : | call to source : | -| array_flow.rb:115:10:115:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:115:10:115:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source : | call to source : | -| array_flow.rb:115:10:115:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:115:10:115:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source : | call to source : | -| array_flow.rb:116:10:116:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:116:10:116:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source : | call to source : | -| array_flow.rb:116:10:116:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:116:10:116:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source : | call to source : | -| array_flow.rb:122:10:122:13 | ...[...] | array_flow.rb:121:15:121:24 | call to source : | array_flow.rb:122:10:122:13 | ...[...] | $@ | array_flow.rb:121:15:121:24 | call to source : | call to source : | -| array_flow.rb:123:10:123:13 | ...[...] | array_flow.rb:121:15:121:24 | call to source : | array_flow.rb:123:10:123:13 | ...[...] | $@ | array_flow.rb:121:15:121:24 | call to source : | call to source : | -| array_flow.rb:124:10:124:13 | ...[...] | array_flow.rb:121:15:121:24 | call to source : | array_flow.rb:124:10:124:13 | ...[...] | $@ | array_flow.rb:121:15:121:24 | call to source : | call to source : | -| array_flow.rb:130:10:130:13 | ...[...] | array_flow.rb:129:19:129:28 | call to source : | array_flow.rb:130:10:130:13 | ...[...] | $@ | array_flow.rb:129:19:129:28 | call to source : | call to source : | -| array_flow.rb:131:10:131:13 | ...[...] | array_flow.rb:129:19:129:28 | call to source : | array_flow.rb:131:10:131:13 | ...[...] | $@ | array_flow.rb:129:19:129:28 | call to source : | call to source : | -| array_flow.rb:132:10:132:13 | ...[...] | array_flow.rb:129:19:129:28 | call to source : | array_flow.rb:132:10:132:13 | ...[...] | $@ | array_flow.rb:129:19:129:28 | call to source : | call to source : | -| array_flow.rb:138:10:138:13 | ...[...] | array_flow.rb:137:15:137:24 | call to source : | array_flow.rb:138:10:138:13 | ...[...] | $@ | array_flow.rb:137:15:137:24 | call to source : | call to source : | -| array_flow.rb:139:10:139:13 | ...[...] | array_flow.rb:137:15:137:24 | call to source : | array_flow.rb:139:10:139:13 | ...[...] | $@ | array_flow.rb:137:15:137:24 | call to source : | call to source : | -| array_flow.rb:140:10:140:13 | ...[...] | array_flow.rb:137:15:137:24 | call to source : | array_flow.rb:140:10:140:13 | ...[...] | $@ | array_flow.rb:137:15:137:24 | call to source : | call to source : | -| array_flow.rb:146:10:146:13 | ...[...] | array_flow.rb:145:19:145:28 | call to source : | array_flow.rb:146:10:146:13 | ...[...] | $@ | array_flow.rb:145:19:145:28 | call to source : | call to source : | -| array_flow.rb:147:10:147:13 | ...[...] | array_flow.rb:145:19:145:28 | call to source : | array_flow.rb:147:10:147:13 | ...[...] | $@ | array_flow.rb:145:19:145:28 | call to source : | call to source : | -| array_flow.rb:148:10:148:13 | ...[...] | array_flow.rb:145:19:145:28 | call to source : | array_flow.rb:148:10:148:13 | ...[...] | $@ | array_flow.rb:145:19:145:28 | call to source : | call to source : | -| array_flow.rb:154:14:154:14 | x | array_flow.rb:152:16:152:25 | call to source : | array_flow.rb:154:14:154:14 | x | $@ | array_flow.rb:152:16:152:25 | call to source : | call to source : | -| array_flow.rb:161:14:161:14 | x | array_flow.rb:159:16:159:25 | call to source : | array_flow.rb:161:14:161:14 | x | $@ | array_flow.rb:159:16:159:25 | call to source : | call to source : | -| array_flow.rb:168:10:168:13 | ...[...] | array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:168:10:168:13 | ...[...] | $@ | array_flow.rb:166:10:166:21 | call to source : | call to source : | -| array_flow.rb:168:10:168:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:168:10:168:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source : | call to source : | -| array_flow.rb:168:10:168:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:168:10:168:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source : | call to source : | -| array_flow.rb:169:10:169:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:169:10:169:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source : | call to source : | -| array_flow.rb:169:10:169:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:169:10:169:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source : | call to source : | -| array_flow.rb:170:10:170:13 | ...[...] | array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:170:10:170:13 | ...[...] | $@ | array_flow.rb:166:10:166:21 | call to source : | call to source : | -| array_flow.rb:170:10:170:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:170:10:170:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source : | call to source : | -| array_flow.rb:170:10:170:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:170:10:170:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source : | call to source : | -| array_flow.rb:171:10:171:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:171:10:171:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source : | call to source : | -| array_flow.rb:171:10:171:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:171:10:171:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source : | call to source : | -| array_flow.rb:179:10:179:26 | ( ... ) | array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:179:10:179:26 | ( ... ) | $@ | array_flow.rb:177:15:177:24 | call to source : | call to source : | -| array_flow.rb:180:10:180:26 | ( ... ) | array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:180:10:180:26 | ( ... ) | $@ | array_flow.rb:177:15:177:24 | call to source : | call to source : | -| array_flow.rb:186:10:186:16 | call to at | array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:186:10:186:16 | call to at | $@ | array_flow.rb:184:13:184:22 | call to source : | call to source : | -| array_flow.rb:188:10:188:16 | call to at | array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:188:10:188:16 | call to at | $@ | array_flow.rb:184:13:184:22 | call to source : | call to source : | -| array_flow.rb:194:14:194:14 | x | array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:194:14:194:14 | x | $@ | array_flow.rb:192:16:192:25 | call to source : | call to source : | -| array_flow.rb:196:10:196:10 | b | array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:196:10:196:10 | b | $@ | array_flow.rb:192:16:192:25 | call to source : | call to source : | -| array_flow.rb:202:14:202:14 | x | array_flow.rb:200:16:200:25 | call to source : | array_flow.rb:202:14:202:14 | x | $@ | array_flow.rb:200:16:200:25 | call to source : | call to source : | -| array_flow.rb:210:14:210:14 | x | array_flow.rb:208:16:208:25 | call to source : | array_flow.rb:210:14:210:14 | x | $@ | array_flow.rb:208:16:208:25 | call to source : | call to source : | -| array_flow.rb:217:14:217:14 | x | array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:217:14:217:14 | x | $@ | array_flow.rb:215:16:215:27 | call to source : | call to source : | -| array_flow.rb:217:14:217:14 | x | array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:217:14:217:14 | x | $@ | array_flow.rb:215:30:215:41 | call to source : | call to source : | -| array_flow.rb:218:14:218:14 | y | array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:218:14:218:14 | y | $@ | array_flow.rb:215:16:215:27 | call to source : | call to source : | -| array_flow.rb:218:14:218:14 | y | array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:218:14:218:14 | y | $@ | array_flow.rb:215:30:215:41 | call to source : | call to source : | -| array_flow.rb:233:14:233:14 | x | array_flow.rb:231:16:231:27 | call to source : | array_flow.rb:233:14:233:14 | x | $@ | array_flow.rb:231:16:231:27 | call to source : | call to source : | -| array_flow.rb:236:10:236:13 | ...[...] | array_flow.rb:234:9:234:19 | call to source : | array_flow.rb:236:10:236:13 | ...[...] | $@ | array_flow.rb:234:9:234:19 | call to source : | call to source : | -| array_flow.rb:242:14:242:14 | x | array_flow.rb:240:16:240:27 | call to source : | array_flow.rb:242:14:242:14 | x | $@ | array_flow.rb:240:16:240:27 | call to source : | call to source : | -| array_flow.rb:245:10:245:13 | ...[...] | array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:245:10:245:13 | ...[...] | $@ | array_flow.rb:243:9:243:19 | call to source : | call to source : | -| array_flow.rb:246:10:246:13 | ...[...] | array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:246:10:246:13 | ...[...] | $@ | array_flow.rb:243:9:243:19 | call to source : | call to source : | -| array_flow.rb:252:14:252:14 | x | array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:252:14:252:14 | x | $@ | array_flow.rb:250:16:250:27 | call to source : | call to source : | -| array_flow.rb:255:10:255:13 | ...[...] | array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:255:10:255:13 | ...[...] | $@ | array_flow.rb:250:16:250:27 | call to source : | call to source : | -| array_flow.rb:255:10:255:13 | ...[...] | array_flow.rb:253:13:253:24 | call to source : | array_flow.rb:255:10:255:13 | ...[...] | $@ | array_flow.rb:253:13:253:24 | call to source : | call to source : | -| array_flow.rb:257:14:257:14 | x | array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:257:14:257:14 | x | $@ | array_flow.rb:250:16:250:27 | call to source : | call to source : | -| array_flow.rb:260:10:260:13 | ...[...] | array_flow.rb:258:9:258:20 | call to source : | array_flow.rb:260:10:260:13 | ...[...] | $@ | array_flow.rb:258:9:258:20 | call to source : | call to source : | -| array_flow.rb:266:14:266:17 | ...[...] | array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:266:14:266:17 | ...[...] | $@ | array_flow.rb:264:16:264:25 | call to source : | call to source : | -| array_flow.rb:269:10:269:13 | ...[...] | array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:269:10:269:13 | ...[...] | $@ | array_flow.rb:264:16:264:25 | call to source : | call to source : | -| array_flow.rb:275:10:275:13 | ...[...] | array_flow.rb:273:16:273:25 | call to source : | array_flow.rb:275:10:275:13 | ...[...] | $@ | array_flow.rb:273:16:273:25 | call to source : | call to source : | -| array_flow.rb:281:10:281:13 | ...[...] | array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:281:10:281:13 | ...[...] | $@ | array_flow.rb:279:16:279:25 | call to source : | call to source : | -| array_flow.rb:282:10:282:13 | ...[...] | array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:282:10:282:13 | ...[...] | $@ | array_flow.rb:279:16:279:25 | call to source : | call to source : | -| array_flow.rb:289:10:289:13 | ...[...] | array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:289:10:289:13 | ...[...] | $@ | array_flow.rb:287:16:287:27 | call to source : | call to source : | -| array_flow.rb:290:10:290:13 | ...[...] | array_flow.rb:286:16:286:27 | call to source : | array_flow.rb:290:10:290:13 | ...[...] | $@ | array_flow.rb:286:16:286:27 | call to source : | call to source : | -| array_flow.rb:290:10:290:13 | ...[...] | array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:290:10:290:13 | ...[...] | $@ | array_flow.rb:287:16:287:27 | call to source : | call to source : | -| array_flow.rb:296:14:296:14 | x | array_flow.rb:294:16:294:25 | call to source : | array_flow.rb:296:14:296:14 | x | $@ | array_flow.rb:294:16:294:25 | call to source : | call to source : | -| array_flow.rb:303:14:303:14 | x | array_flow.rb:301:16:301:25 | call to source : | array_flow.rb:303:14:303:14 | x | $@ | array_flow.rb:301:16:301:25 | call to source : | call to source : | -| array_flow.rb:312:10:312:13 | ...[...] | array_flow.rb:308:16:308:25 | call to source : | array_flow.rb:312:10:312:13 | ...[...] | $@ | array_flow.rb:308:16:308:25 | call to source : | call to source : | -| array_flow.rb:318:10:318:10 | b | array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:318:10:318:10 | b | $@ | array_flow.rb:316:16:316:27 | call to source : | call to source : | -| array_flow.rb:318:10:318:10 | b | array_flow.rb:317:23:317:34 | call to source : | array_flow.rb:318:10:318:10 | b | $@ | array_flow.rb:317:23:317:34 | call to source : | call to source : | -| array_flow.rb:327:10:327:10 | b | array_flow.rb:325:16:325:27 | call to source : | array_flow.rb:327:10:327:10 | b | $@ | array_flow.rb:325:16:325:27 | call to source : | call to source : | -| array_flow.rb:328:10:328:13 | ...[...] | array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:328:10:328:13 | ...[...] | $@ | array_flow.rb:325:30:325:41 | call to source : | call to source : | -| array_flow.rb:332:10:332:10 | b | array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:332:10:332:10 | b | $@ | array_flow.rb:330:16:330:27 | call to source : | call to source : | -| array_flow.rb:332:10:332:10 | b | array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:332:10:332:10 | b | $@ | array_flow.rb:330:30:330:41 | call to source : | call to source : | -| array_flow.rb:333:10:333:13 | ...[...] | array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:333:10:333:13 | ...[...] | $@ | array_flow.rb:330:16:330:27 | call to source : | call to source : | -| array_flow.rb:333:10:333:13 | ...[...] | array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:333:10:333:13 | ...[...] | $@ | array_flow.rb:330:30:330:41 | call to source : | call to source : | -| array_flow.rb:334:10:334:13 | ...[...] | array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:334:10:334:13 | ...[...] | $@ | array_flow.rb:330:16:330:27 | call to source : | call to source : | -| array_flow.rb:334:10:334:13 | ...[...] | array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:334:10:334:13 | ...[...] | $@ | array_flow.rb:330:30:330:41 | call to source : | call to source : | -| array_flow.rb:340:14:340:14 | x | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:340:14:340:14 | x | $@ | array_flow.rb:338:16:338:25 | call to source : | call to source : | -| array_flow.rb:342:10:342:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:342:10:342:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source : | call to source : | -| array_flow.rb:343:10:343:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:343:10:343:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source : | call to source : | -| array_flow.rb:344:10:344:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:344:10:344:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source : | call to source : | -| array_flow.rb:345:10:345:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:345:10:345:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source : | call to source : | -| array_flow.rb:351:10:351:13 | ...[...] | array_flow.rb:349:16:349:25 | call to source : | array_flow.rb:351:10:351:13 | ...[...] | $@ | array_flow.rb:349:16:349:25 | call to source : | call to source : | -| array_flow.rb:357:10:357:17 | call to dig | array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:357:10:357:17 | call to dig | $@ | array_flow.rb:355:16:355:27 | call to source : | call to source : | -| array_flow.rb:358:10:358:17 | call to dig | array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:358:10:358:17 | call to dig | $@ | array_flow.rb:355:16:355:27 | call to source : | call to source : | -| array_flow.rb:360:10:360:19 | call to dig | array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:360:10:360:19 | call to dig | $@ | array_flow.rb:355:34:355:45 | call to source : | call to source : | -| array_flow.rb:366:14:366:14 | x | array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:366:14:366:14 | x | $@ | array_flow.rb:364:16:364:27 | call to source : | call to source : | -| array_flow.rb:368:10:368:10 | b | array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:368:10:368:10 | b | $@ | array_flow.rb:364:16:364:27 | call to source : | call to source : | -| array_flow.rb:368:10:368:10 | b | array_flow.rb:365:23:365:34 | call to source : | array_flow.rb:368:10:368:10 | b | $@ | array_flow.rb:365:23:365:34 | call to source : | call to source : | -| array_flow.rb:374:10:374:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:374:10:374:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source : | call to source : | -| array_flow.rb:374:10:374:13 | ...[...] | array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:374:10:374:13 | ...[...] | $@ | array_flow.rb:372:30:372:41 | call to source : | call to source : | -| array_flow.rb:377:10:377:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:377:10:377:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source : | call to source : | -| array_flow.rb:378:10:378:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:378:10:378:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source : | call to source : | -| array_flow.rb:378:10:378:13 | ...[...] | array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:378:10:378:13 | ...[...] | $@ | array_flow.rb:372:30:372:41 | call to source : | call to source : | -| array_flow.rb:381:10:381:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:381:10:381:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source : | call to source : | -| array_flow.rb:381:10:381:13 | ...[...] | array_flow.rb:379:12:379:23 | call to source : | array_flow.rb:381:10:381:13 | ...[...] | $@ | array_flow.rb:379:12:379:23 | call to source : | call to source : | -| array_flow.rb:383:10:383:13 | ...[...] | array_flow.rb:379:12:379:23 | call to source : | array_flow.rb:383:10:383:13 | ...[...] | $@ | array_flow.rb:379:12:379:23 | call to source : | call to source : | -| array_flow.rb:389:14:389:14 | x | array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:389:14:389:14 | x | $@ | array_flow.rb:387:16:387:27 | call to source : | call to source : | -| array_flow.rb:389:14:389:14 | x | array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:389:14:389:14 | x | $@ | array_flow.rb:387:30:387:41 | call to source : | call to source : | -| array_flow.rb:391:10:391:13 | ...[...] | array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:391:10:391:13 | ...[...] | $@ | array_flow.rb:387:16:387:27 | call to source : | call to source : | -| array_flow.rb:391:10:391:13 | ...[...] | array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:391:10:391:13 | ...[...] | $@ | array_flow.rb:387:30:387:41 | call to source : | call to source : | -| array_flow.rb:397:14:397:14 | x | array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:397:14:397:14 | x | $@ | array_flow.rb:395:16:395:25 | call to source : | call to source : | -| array_flow.rb:399:10:399:13 | ...[...] | array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:399:10:399:13 | ...[...] | $@ | array_flow.rb:395:16:395:25 | call to source : | call to source : | -| array_flow.rb:405:14:405:14 | x | array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:405:14:405:14 | x | $@ | array_flow.rb:403:16:403:25 | call to source : | call to source : | -| array_flow.rb:407:10:407:10 | x | array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:407:10:407:10 | x | $@ | array_flow.rb:403:16:403:25 | call to source : | call to source : | -| array_flow.rb:408:10:408:13 | ...[...] | array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:408:10:408:13 | ...[...] | $@ | array_flow.rb:403:16:403:25 | call to source : | call to source : | -| array_flow.rb:414:14:414:19 | ( ... ) | array_flow.rb:412:16:412:25 | call to source : | array_flow.rb:414:14:414:19 | ( ... ) | $@ | array_flow.rb:412:16:412:25 | call to source : | call to source : | -| array_flow.rb:421:14:421:14 | x | array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:421:14:421:14 | x | $@ | array_flow.rb:419:16:419:25 | call to source : | call to source : | -| array_flow.rb:423:10:423:13 | ...[...] | array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:423:10:423:13 | ...[...] | $@ | array_flow.rb:419:16:419:25 | call to source : | call to source : | -| array_flow.rb:431:10:431:13 | ...[...] | array_flow.rb:427:16:427:25 | call to source : | array_flow.rb:431:10:431:13 | ...[...] | $@ | array_flow.rb:427:16:427:25 | call to source : | call to source : | -| array_flow.rb:437:14:437:17 | ...[...] | array_flow.rb:435:19:435:28 | call to source : | array_flow.rb:437:14:437:17 | ...[...] | $@ | array_flow.rb:435:19:435:28 | call to source : | call to source : | -| array_flow.rb:444:14:444:14 | x | array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:444:14:444:14 | x | $@ | array_flow.rb:442:19:442:28 | call to source : | call to source : | -| array_flow.rb:447:10:447:13 | ...[...] | array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:447:10:447:13 | ...[...] | $@ | array_flow.rb:442:19:442:28 | call to source : | call to source : | -| array_flow.rb:453:14:453:14 | x | array_flow.rb:451:19:451:30 | call to source : | array_flow.rb:453:14:453:14 | x | $@ | array_flow.rb:451:19:451:30 | call to source : | call to source : | -| array_flow.rb:454:14:454:14 | a | array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:454:14:454:14 | a | $@ | array_flow.rb:452:28:452:39 | call to source : | call to source : | -| array_flow.rb:456:10:456:10 | b | array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:456:10:456:10 | b | $@ | array_flow.rb:452:28:452:39 | call to source : | call to source : | -| array_flow.rb:462:10:462:13 | ...[...] | array_flow.rb:460:19:460:28 | call to source : | array_flow.rb:462:10:462:13 | ...[...] | $@ | array_flow.rb:460:19:460:28 | call to source : | call to source : | -| array_flow.rb:468:14:468:14 | x | array_flow.rb:467:17:467:28 | call to source : | array_flow.rb:468:14:468:14 | x | $@ | array_flow.rb:467:17:467:28 | call to source : | call to source : | -| array_flow.rb:470:10:470:10 | b | array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:470:10:470:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source : | call to source : | -| array_flow.rb:470:10:470:10 | b | array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:470:10:470:10 | b | $@ | array_flow.rb:466:33:466:44 | call to source : | call to source : | -| array_flow.rb:472:10:472:10 | b | array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:472:10:472:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source : | call to source : | -| array_flow.rb:474:10:474:10 | b | array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:474:10:474:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source : | call to source : | -| array_flow.rb:474:10:474:10 | b | array_flow.rb:473:20:473:31 | call to source : | array_flow.rb:474:10:474:10 | b | $@ | array_flow.rb:473:20:473:31 | call to source : | call to source : | -| array_flow.rb:476:10:476:10 | b | array_flow.rb:475:22:475:33 | call to source : | array_flow.rb:476:10:476:10 | b | $@ | array_flow.rb:475:22:475:33 | call to source : | call to source : | -| array_flow.rb:478:10:478:10 | b | array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:478:10:478:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source : | call to source : | -| array_flow.rb:478:10:478:10 | b | array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:478:10:478:10 | b | $@ | array_flow.rb:466:33:466:44 | call to source : | call to source : | -| array_flow.rb:478:10:478:10 | b | array_flow.rb:477:20:477:31 | call to source : | array_flow.rb:478:10:478:10 | b | $@ | array_flow.rb:477:20:477:31 | call to source : | call to source : | -| array_flow.rb:484:10:484:13 | ...[...] | array_flow.rb:482:19:482:30 | call to source : | array_flow.rb:484:10:484:13 | ...[...] | $@ | array_flow.rb:482:19:482:30 | call to source : | call to source : | -| array_flow.rb:484:10:484:13 | ...[...] | array_flow.rb:483:12:483:23 | call to source : | array_flow.rb:484:10:484:13 | ...[...] | $@ | array_flow.rb:483:12:483:23 | call to source : | call to source : | -| array_flow.rb:486:10:486:13 | ...[...] | array_flow.rb:485:12:485:23 | call to source : | array_flow.rb:486:10:486:13 | ...[...] | $@ | array_flow.rb:485:12:485:23 | call to source : | call to source : | -| array_flow.rb:490:10:490:13 | ...[...] | array_flow.rb:488:9:488:20 | call to source : | array_flow.rb:490:10:490:13 | ...[...] | $@ | array_flow.rb:488:9:488:20 | call to source : | call to source : | -| array_flow.rb:494:10:494:13 | ...[...] | array_flow.rb:488:9:488:20 | call to source : | array_flow.rb:494:10:494:13 | ...[...] | $@ | array_flow.rb:488:9:488:20 | call to source : | call to source : | -| array_flow.rb:494:10:494:13 | ...[...] | array_flow.rb:492:9:492:20 | call to source : | array_flow.rb:494:10:494:13 | ...[...] | $@ | array_flow.rb:492:9:492:20 | call to source : | call to source : | -| array_flow.rb:500:14:500:14 | x | array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:500:14:500:14 | x | $@ | array_flow.rb:498:19:498:28 | call to source : | call to source : | -| array_flow.rb:502:10:502:13 | ...[...] | array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:502:10:502:13 | ...[...] | $@ | array_flow.rb:498:19:498:28 | call to source : | call to source : | -| array_flow.rb:508:14:508:14 | x | array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:508:14:508:14 | x | $@ | array_flow.rb:506:19:506:28 | call to source : | call to source : | -| array_flow.rb:510:10:510:13 | ...[...] | array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:510:10:510:13 | ...[...] | $@ | array_flow.rb:506:19:506:28 | call to source : | call to source : | -| array_flow.rb:516:14:516:14 | x | array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:516:14:516:14 | x | $@ | array_flow.rb:514:19:514:28 | call to source : | call to source : | -| array_flow.rb:519:10:519:13 | ...[...] | array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:519:10:519:13 | ...[...] | $@ | array_flow.rb:514:19:514:28 | call to source : | call to source : | -| array_flow.rb:520:10:520:13 | ...[...] | array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:520:10:520:13 | ...[...] | $@ | array_flow.rb:514:19:514:28 | call to source : | call to source : | -| array_flow.rb:526:14:526:14 | x | array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:526:14:526:14 | x | $@ | array_flow.rb:524:19:524:30 | call to source : | call to source : | -| array_flow.rb:528:10:528:10 | b | array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:528:10:528:10 | b | $@ | array_flow.rb:524:19:524:30 | call to source : | call to source : | -| array_flow.rb:528:10:528:10 | b | array_flow.rb:525:21:525:32 | call to source : | array_flow.rb:528:10:528:10 | b | $@ | array_flow.rb:525:21:525:32 | call to source : | call to source : | -| array_flow.rb:534:14:534:14 | x | array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:534:14:534:14 | x | $@ | array_flow.rb:532:19:532:28 | call to source : | call to source : | -| array_flow.rb:536:10:536:13 | ...[...] | array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:536:10:536:13 | ...[...] | $@ | array_flow.rb:532:19:532:28 | call to source : | call to source : | -| array_flow.rb:542:14:542:14 | x | array_flow.rb:540:19:540:28 | call to source : | array_flow.rb:542:14:542:14 | x | $@ | array_flow.rb:540:19:540:28 | call to source : | call to source : | -| array_flow.rb:549:10:549:16 | call to first | array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:549:10:549:16 | call to first | $@ | array_flow.rb:547:10:547:21 | call to source : | call to source : | -| array_flow.rb:549:10:549:16 | call to first | array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:549:10:549:16 | call to first | $@ | array_flow.rb:548:12:548:23 | call to source : | call to source : | -| array_flow.rb:551:10:551:13 | ...[...] | array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:551:10:551:13 | ...[...] | $@ | array_flow.rb:547:10:547:21 | call to source : | call to source : | -| array_flow.rb:551:10:551:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:551:10:551:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source : | call to source : | -| array_flow.rb:552:10:552:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:552:10:552:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source : | call to source : | -| array_flow.rb:554:10:554:13 | ...[...] | array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:554:10:554:13 | ...[...] | $@ | array_flow.rb:547:10:547:21 | call to source : | call to source : | -| array_flow.rb:554:10:554:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:554:10:554:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source : | call to source : | -| array_flow.rb:555:10:555:13 | ...[...] | array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:555:10:555:13 | ...[...] | $@ | array_flow.rb:547:30:547:41 | call to source : | call to source : | -| array_flow.rb:555:10:555:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:555:10:555:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source : | call to source : | -| array_flow.rb:561:14:561:14 | x | array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:561:14:561:14 | x | $@ | array_flow.rb:559:16:559:27 | call to source : | call to source : | -| array_flow.rb:564:10:564:13 | ...[...] | array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:564:10:564:13 | ...[...] | $@ | array_flow.rb:559:16:559:27 | call to source : | call to source : | -| array_flow.rb:564:10:564:13 | ...[...] | array_flow.rb:562:13:562:24 | call to source : | array_flow.rb:564:10:564:13 | ...[...] | $@ | array_flow.rb:562:13:562:24 | call to source : | call to source : | -| array_flow.rb:566:14:566:14 | x | array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:566:14:566:14 | x | $@ | array_flow.rb:559:16:559:27 | call to source : | call to source : | -| array_flow.rb:569:10:569:13 | ...[...] | array_flow.rb:567:9:567:20 | call to source : | array_flow.rb:569:10:569:13 | ...[...] | $@ | array_flow.rb:567:9:567:20 | call to source : | call to source : | -| array_flow.rb:575:10:575:13 | ...[...] | array_flow.rb:573:20:573:29 | call to source : | array_flow.rb:575:10:575:13 | ...[...] | $@ | array_flow.rb:573:20:573:29 | call to source : | call to source : | -| array_flow.rb:580:10:580:16 | ...[...] | array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:580:10:580:16 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source : | call to source : | -| array_flow.rb:582:10:582:13 | ...[...] | array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:582:10:582:13 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source : | call to source : | -| array_flow.rb:583:10:583:16 | ...[...] | array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:583:10:583:16 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source : | call to source : | -| array_flow.rb:584:10:584:13 | ...[...] | array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:584:10:584:13 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source : | call to source : | -| array_flow.rb:585:10:585:16 | ...[...] | array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:585:10:585:16 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source : | call to source : | -| array_flow.rb:591:10:591:13 | ...[...] | array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:591:10:591:13 | ...[...] | $@ | array_flow.rb:589:19:589:30 | call to source : | call to source : | -| array_flow.rb:593:14:593:14 | x | array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:593:14:593:14 | x | $@ | array_flow.rb:589:19:589:30 | call to source : | call to source : | -| array_flow.rb:596:10:596:13 | ...[...] | array_flow.rb:594:9:594:20 | call to source : | array_flow.rb:596:10:596:13 | ...[...] | $@ | array_flow.rb:594:9:594:20 | call to source : | call to source : | -| array_flow.rb:602:10:602:13 | ...[...] | array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:602:10:602:13 | ...[...] | $@ | array_flow.rb:600:19:600:30 | call to source : | call to source : | -| array_flow.rb:604:14:604:14 | x | array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:604:14:604:14 | x | $@ | array_flow.rb:600:19:600:30 | call to source : | call to source : | -| array_flow.rb:607:10:607:13 | ...[...] | array_flow.rb:605:9:605:20 | call to source : | array_flow.rb:607:10:607:13 | ...[...] | $@ | array_flow.rb:605:9:605:20 | call to source : | call to source : | -| array_flow.rb:613:14:613:14 | x | array_flow.rb:611:19:611:30 | call to source : | array_flow.rb:613:14:613:14 | x | $@ | array_flow.rb:611:19:611:30 | call to source : | call to source : | -| array_flow.rb:622:14:622:14 | x | array_flow.rb:620:19:620:28 | call to source : | array_flow.rb:622:14:622:14 | x | $@ | array_flow.rb:620:19:620:28 | call to source : | call to source : | -| array_flow.rb:629:14:629:14 | x | array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:629:14:629:14 | x | $@ | array_flow.rb:627:10:627:21 | call to source : | call to source : | -| array_flow.rb:630:14:630:14 | y | array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:630:14:630:14 | y | $@ | array_flow.rb:627:27:627:38 | call to source : | call to source : | -| array_flow.rb:633:10:633:10 | b | array_flow.rb:631:9:631:19 | call to source : | array_flow.rb:633:10:633:10 | b | $@ | array_flow.rb:631:9:631:19 | call to source : | call to source : | -| array_flow.rb:636:14:636:14 | y | array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:636:14:636:14 | y | $@ | array_flow.rb:627:10:627:21 | call to source : | call to source : | -| array_flow.rb:636:14:636:14 | y | array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:636:14:636:14 | y | $@ | array_flow.rb:627:27:627:38 | call to source : | call to source : | -| array_flow.rb:639:10:639:10 | c | array_flow.rb:637:9:637:19 | call to source : | array_flow.rb:639:10:639:10 | c | $@ | array_flow.rb:637:9:637:19 | call to source : | call to source : | -| array_flow.rb:647:10:647:13 | ...[...] | array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:647:10:647:13 | ...[...] | $@ | array_flow.rb:645:21:645:32 | call to source : | call to source : | -| array_flow.rb:648:10:648:13 | ...[...] | array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:648:10:648:13 | ...[...] | $@ | array_flow.rb:645:35:645:46 | call to source : | call to source : | -| array_flow.rb:650:10:650:13 | ...[...] | array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:650:10:650:13 | ...[...] | $@ | array_flow.rb:644:16:644:27 | call to source : | call to source : | -| array_flow.rb:652:10:652:13 | ...[...] | array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:652:10:652:13 | ...[...] | $@ | array_flow.rb:645:21:645:32 | call to source : | call to source : | -| array_flow.rb:653:10:653:13 | ...[...] | array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:653:10:653:13 | ...[...] | $@ | array_flow.rb:645:35:645:46 | call to source : | call to source : | -| array_flow.rb:655:10:655:13 | ...[...] | array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:655:10:655:13 | ...[...] | $@ | array_flow.rb:644:16:644:27 | call to source : | call to source : | -| array_flow.rb:660:10:660:13 | ...[...] | array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:660:10:660:13 | ...[...] | $@ | array_flow.rb:658:16:658:27 | call to source : | call to source : | -| array_flow.rb:660:10:660:13 | ...[...] | array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:660:10:660:13 | ...[...] | $@ | array_flow.rb:659:21:659:32 | call to source : | call to source : | -| array_flow.rb:660:10:660:13 | ...[...] | array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:660:10:660:13 | ...[...] | $@ | array_flow.rb:659:35:659:46 | call to source : | call to source : | -| array_flow.rb:661:10:661:13 | ...[...] | array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:661:10:661:13 | ...[...] | $@ | array_flow.rb:658:16:658:27 | call to source : | call to source : | -| array_flow.rb:661:10:661:13 | ...[...] | array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:661:10:661:13 | ...[...] | $@ | array_flow.rb:659:21:659:32 | call to source : | call to source : | -| array_flow.rb:661:10:661:13 | ...[...] | array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:661:10:661:13 | ...[...] | $@ | array_flow.rb:659:35:659:46 | call to source : | call to source : | -| array_flow.rb:674:10:674:13 | ...[...] | array_flow.rb:672:16:672:27 | call to source : | array_flow.rb:674:10:674:13 | ...[...] | $@ | array_flow.rb:672:16:672:27 | call to source : | call to source : | -| array_flow.rb:674:10:674:13 | ...[...] | array_flow.rb:673:31:673:42 | call to source : | array_flow.rb:674:10:674:13 | ...[...] | $@ | array_flow.rb:673:31:673:42 | call to source : | call to source : | -| array_flow.rb:674:10:674:13 | ...[...] | array_flow.rb:673:47:673:58 | call to source : | array_flow.rb:674:10:674:13 | ...[...] | $@ | array_flow.rb:673:47:673:58 | call to source : | call to source : | -| array_flow.rb:680:14:680:14 | x | array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:680:14:680:14 | x | $@ | array_flow.rb:678:16:678:25 | call to source : | call to source : | -| array_flow.rb:683:10:683:13 | ...[...] | array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:683:10:683:13 | ...[...] | $@ | array_flow.rb:678:16:678:25 | call to source : | call to source : | -| array_flow.rb:684:10:684:13 | ...[...] | array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:684:10:684:13 | ...[...] | $@ | array_flow.rb:678:16:678:25 | call to source : | call to source : | -| array_flow.rb:690:10:690:15 | call to last | array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:690:10:690:15 | call to last | $@ | array_flow.rb:688:16:688:27 | call to source : | call to source : | -| array_flow.rb:690:10:690:15 | call to last | array_flow.rb:689:12:689:23 | call to source : | array_flow.rb:690:10:690:15 | call to last | $@ | array_flow.rb:689:12:689:23 | call to source : | call to source : | -| array_flow.rb:692:10:692:13 | ...[...] | array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:692:10:692:13 | ...[...] | $@ | array_flow.rb:688:16:688:27 | call to source : | call to source : | -| array_flow.rb:692:10:692:13 | ...[...] | array_flow.rb:689:12:689:23 | call to source : | array_flow.rb:692:10:692:13 | ...[...] | $@ | array_flow.rb:689:12:689:23 | call to source : | call to source : | -| array_flow.rb:693:10:693:13 | ...[...] | array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:693:10:693:13 | ...[...] | $@ | array_flow.rb:688:16:688:27 | call to source : | call to source : | -| array_flow.rb:693:10:693:13 | ...[...] | array_flow.rb:689:12:689:23 | call to source : | array_flow.rb:693:10:693:13 | ...[...] | $@ | array_flow.rb:689:12:689:23 | call to source : | call to source : | -| array_flow.rb:699:14:699:14 | x | array_flow.rb:697:16:697:27 | call to source : | array_flow.rb:699:14:699:14 | x | $@ | array_flow.rb:697:16:697:27 | call to source : | call to source : | -| array_flow.rb:702:10:702:13 | ...[...] | array_flow.rb:700:9:700:19 | call to source : | array_flow.rb:702:10:702:13 | ...[...] | $@ | array_flow.rb:700:9:700:19 | call to source : | call to source : | -| array_flow.rb:708:14:708:14 | x | array_flow.rb:706:16:706:27 | call to source : | array_flow.rb:708:14:708:14 | x | $@ | array_flow.rb:706:16:706:27 | call to source : | call to source : | -| array_flow.rb:711:10:711:13 | ...[...] | array_flow.rb:709:9:709:19 | call to source : | array_flow.rb:711:10:711:13 | ...[...] | $@ | array_flow.rb:709:9:709:19 | call to source : | call to source : | -| array_flow.rb:719:10:719:10 | b | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:719:10:719:10 | b | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | -| array_flow.rb:723:10:723:13 | ...[...] | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:723:10:723:13 | ...[...] | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | -| array_flow.rb:727:14:727:14 | x | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:727:14:727:14 | x | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | -| array_flow.rb:728:14:728:14 | y | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:728:14:728:14 | y | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | -| array_flow.rb:731:10:731:10 | d | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:731:10:731:10 | d | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | -| array_flow.rb:735:14:735:14 | x | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:735:14:735:14 | x | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | -| array_flow.rb:736:14:736:14 | y | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:736:14:736:14 | y | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | -| array_flow.rb:739:10:739:13 | ...[...] | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:739:10:739:13 | ...[...] | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | -| array_flow.rb:747:14:747:14 | x | array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:747:14:747:14 | x | $@ | array_flow.rb:743:16:743:25 | call to source : | call to source : | -| array_flow.rb:750:10:750:10 | b | array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:750:10:750:10 | b | $@ | array_flow.rb:743:16:743:25 | call to source : | call to source : | -| array_flow.rb:754:14:754:14 | x | array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:754:14:754:14 | x | $@ | array_flow.rb:743:16:743:25 | call to source : | call to source : | -| array_flow.rb:757:10:757:13 | ...[...] | array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:757:10:757:13 | ...[...] | $@ | array_flow.rb:743:16:743:25 | call to source : | call to source : | -| array_flow.rb:765:10:765:10 | b | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:765:10:765:10 | b | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | -| array_flow.rb:769:10:769:13 | ...[...] | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:769:10:769:13 | ...[...] | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | -| array_flow.rb:773:14:773:14 | x | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:773:14:773:14 | x | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | -| array_flow.rb:774:14:774:14 | y | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:774:14:774:14 | y | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | -| array_flow.rb:777:10:777:10 | d | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:777:10:777:10 | d | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | -| array_flow.rb:781:14:781:14 | x | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:781:14:781:14 | x | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | -| array_flow.rb:782:14:782:14 | y | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:782:14:782:14 | y | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | -| array_flow.rb:785:10:785:13 | ...[...] | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:785:10:785:13 | ...[...] | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | -| array_flow.rb:793:14:793:14 | x | array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:793:14:793:14 | x | $@ | array_flow.rb:789:16:789:25 | call to source : | call to source : | -| array_flow.rb:796:10:796:10 | b | array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:796:10:796:10 | b | $@ | array_flow.rb:789:16:789:25 | call to source : | call to source : | -| array_flow.rb:800:14:800:14 | x | array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:800:14:800:14 | x | $@ | array_flow.rb:789:16:789:25 | call to source : | call to source : | -| array_flow.rb:803:10:803:13 | ...[...] | array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:803:10:803:13 | ...[...] | $@ | array_flow.rb:789:16:789:25 | call to source : | call to source : | -| array_flow.rb:810:10:810:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:810:10:810:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | -| array_flow.rb:811:10:811:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:811:10:811:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | -| array_flow.rb:814:14:814:14 | x | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:814:14:814:14 | x | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | -| array_flow.rb:815:14:815:14 | y | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:815:14:815:14 | y | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | -| array_flow.rb:818:10:818:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:818:10:818:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | -| array_flow.rb:819:10:819:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:819:10:819:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | -| array_flow.rb:825:14:825:14 | x | array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:825:14:825:14 | x | $@ | array_flow.rb:823:16:823:25 | call to source : | call to source : | -| array_flow.rb:828:10:828:13 | ...[...] | array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:828:10:828:13 | ...[...] | $@ | array_flow.rb:823:16:823:25 | call to source : | call to source : | -| array_flow.rb:829:10:829:13 | ...[...] | array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:829:10:829:13 | ...[...] | $@ | array_flow.rb:823:16:823:25 | call to source : | call to source : | -| array_flow.rb:835:14:835:14 | x | array_flow.rb:833:16:833:25 | call to source : | array_flow.rb:835:14:835:14 | x | $@ | array_flow.rb:833:16:833:25 | call to source : | call to source : | -| array_flow.rb:844:14:844:14 | x | array_flow.rb:842:16:842:25 | call to source : | array_flow.rb:844:14:844:14 | x | $@ | array_flow.rb:842:16:842:25 | call to source : | call to source : | -| array_flow.rb:857:14:857:14 | x | array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:857:14:857:14 | x | $@ | array_flow.rb:855:16:855:25 | call to source : | call to source : | -| array_flow.rb:860:10:860:16 | ...[...] | array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:860:10:860:16 | ...[...] | $@ | array_flow.rb:855:16:855:25 | call to source : | call to source : | -| array_flow.rb:861:10:861:16 | ...[...] | array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:861:10:861:16 | ...[...] | $@ | array_flow.rb:855:16:855:25 | call to source : | call to source : | -| array_flow.rb:868:14:868:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:868:14:868:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | -| array_flow.rb:869:14:869:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:869:14:869:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | -| array_flow.rb:870:14:870:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:870:14:870:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | -| array_flow.rb:873:10:873:13 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:873:10:873:13 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | -| array_flow.rb:876:14:876:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:876:14:876:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | -| array_flow.rb:877:14:877:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:877:14:877:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | -| array_flow.rb:880:10:880:13 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:880:10:880:13 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | -| array_flow.rb:883:14:883:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:883:14:883:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | -| array_flow.rb:884:14:884:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:884:14:884:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | -| array_flow.rb:887:10:887:13 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:887:10:887:13 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | -| array_flow.rb:896:10:896:10 | b | array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:896:10:896:10 | b | $@ | array_flow.rb:894:13:894:24 | call to source : | call to source : | -| array_flow.rb:896:10:896:10 | b | array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:896:10:896:10 | b | $@ | array_flow.rb:894:30:894:41 | call to source : | call to source : | -| array_flow.rb:898:10:898:13 | ...[...] | array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:898:10:898:13 | ...[...] | $@ | array_flow.rb:894:13:894:24 | call to source : | call to source : | -| array_flow.rb:900:10:900:13 | ...[...] | array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:900:10:900:13 | ...[...] | $@ | array_flow.rb:894:30:894:41 | call to source : | call to source : | -| array_flow.rb:904:10:904:13 | ...[...] | array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:904:10:904:13 | ...[...] | $@ | array_flow.rb:902:13:902:24 | call to source : | call to source : | -| array_flow.rb:904:10:904:13 | ...[...] | array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:904:10:904:13 | ...[...] | $@ | array_flow.rb:902:30:902:41 | call to source : | call to source : | -| array_flow.rb:905:10:905:13 | ...[...] | array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:905:10:905:13 | ...[...] | $@ | array_flow.rb:902:13:902:24 | call to source : | call to source : | -| array_flow.rb:905:10:905:13 | ...[...] | array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:905:10:905:13 | ...[...] | $@ | array_flow.rb:902:30:902:41 | call to source : | call to source : | -| array_flow.rb:907:10:907:13 | ...[...] | array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:907:10:907:13 | ...[...] | $@ | array_flow.rb:902:13:902:24 | call to source : | call to source : | -| array_flow.rb:909:10:909:13 | ...[...] | array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:909:10:909:13 | ...[...] | $@ | array_flow.rb:902:30:902:41 | call to source : | call to source : | -| array_flow.rb:917:10:917:13 | ...[...] | array_flow.rb:914:21:914:32 | call to source : | array_flow.rb:917:10:917:13 | ...[...] | $@ | array_flow.rb:914:21:914:32 | call to source : | call to source : | -| array_flow.rb:920:10:920:13 | ...[...] | array_flow.rb:913:16:913:27 | call to source : | array_flow.rb:920:10:920:13 | ...[...] | $@ | array_flow.rb:913:16:913:27 | call to source : | call to source : | -| array_flow.rb:928:10:928:16 | ...[...] | array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:928:10:928:16 | ...[...] | $@ | array_flow.rb:924:16:924:27 | call to source : | call to source : | -| array_flow.rb:928:10:928:16 | ...[...] | array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:928:10:928:16 | ...[...] | $@ | array_flow.rb:925:13:925:24 | call to source : | call to source : | -| array_flow.rb:928:10:928:16 | ...[...] | array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:928:10:928:16 | ...[...] | $@ | array_flow.rb:926:10:926:21 | call to source : | call to source : | -| array_flow.rb:929:10:929:16 | ...[...] | array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:929:10:929:16 | ...[...] | $@ | array_flow.rb:924:16:924:27 | call to source : | call to source : | -| array_flow.rb:929:10:929:16 | ...[...] | array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:929:10:929:16 | ...[...] | $@ | array_flow.rb:925:13:925:24 | call to source : | call to source : | -| array_flow.rb:929:10:929:16 | ...[...] | array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:929:10:929:16 | ...[...] | $@ | array_flow.rb:926:10:926:21 | call to source : | call to source : | -| array_flow.rb:935:10:935:13 | ...[...] | array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:935:10:935:13 | ...[...] | $@ | array_flow.rb:933:10:933:21 | call to source : | call to source : | -| array_flow.rb:935:10:935:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:935:10:935:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source : | call to source : | -| array_flow.rb:935:10:935:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:935:10:935:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source : | call to source : | -| array_flow.rb:936:10:936:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:936:10:936:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source : | call to source : | -| array_flow.rb:936:10:936:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:936:10:936:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source : | call to source : | -| array_flow.rb:937:10:937:13 | ...[...] | array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:937:10:937:13 | ...[...] | $@ | array_flow.rb:933:10:933:21 | call to source : | call to source : | -| array_flow.rb:937:10:937:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:937:10:937:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source : | call to source : | -| array_flow.rb:937:10:937:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:937:10:937:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source : | call to source : | -| array_flow.rb:938:10:938:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:938:10:938:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source : | call to source : | -| array_flow.rb:938:10:938:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:938:10:938:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source : | call to source : | -| array_flow.rb:946:10:946:25 | ...[...] | array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:946:10:946:25 | ...[...] | $@ | array_flow.rb:944:10:944:19 | call to source : | call to source : | -| array_flow.rb:947:10:947:25 | ...[...] | array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:947:10:947:25 | ...[...] | $@ | array_flow.rb:944:10:944:19 | call to source : | call to source : | -| array_flow.rb:953:14:953:14 | x | array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:953:14:953:14 | x | $@ | array_flow.rb:951:10:951:21 | call to source : | call to source : | -| array_flow.rb:954:14:954:14 | y | array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:954:14:954:14 | y | $@ | array_flow.rb:951:27:951:38 | call to source : | call to source : | -| array_flow.rb:959:14:959:14 | y | array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:959:14:959:14 | y | $@ | array_flow.rb:951:10:951:21 | call to source : | call to source : | -| array_flow.rb:959:14:959:14 | y | array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:959:14:959:14 | y | $@ | array_flow.rb:951:27:951:38 | call to source : | call to source : | -| array_flow.rb:967:14:967:14 | x | array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:967:14:967:14 | x | $@ | array_flow.rb:965:16:965:25 | call to source : | call to source : | -| array_flow.rb:970:10:970:13 | ...[...] | array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:970:10:970:13 | ...[...] | $@ | array_flow.rb:965:16:965:25 | call to source : | call to source : | -| array_flow.rb:976:14:976:14 | x | array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:976:14:976:14 | x | $@ | array_flow.rb:974:16:974:25 | call to source : | call to source : | -| array_flow.rb:979:10:979:13 | ...[...] | array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:979:10:979:13 | ...[...] | $@ | array_flow.rb:974:16:974:25 | call to source : | call to source : | -| array_flow.rb:980:10:980:13 | ...[...] | array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:980:10:980:13 | ...[...] | $@ | array_flow.rb:974:16:974:25 | call to source : | call to source : | -| array_flow.rb:986:14:986:17 | ...[...] | array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:986:14:986:17 | ...[...] | $@ | array_flow.rb:984:16:984:25 | call to source : | call to source : | -| array_flow.rb:987:14:987:17 | ...[...] | array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:987:14:987:17 | ...[...] | $@ | array_flow.rb:984:16:984:25 | call to source : | call to source : | -| array_flow.rb:990:10:990:13 | ...[...] | array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:990:10:990:13 | ...[...] | $@ | array_flow.rb:984:16:984:25 | call to source : | call to source : | -| array_flow.rb:996:14:996:17 | ...[...] | array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:996:14:996:17 | ...[...] | $@ | array_flow.rb:994:16:994:25 | call to source : | call to source : | -| array_flow.rb:997:14:997:17 | ...[...] | array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:997:14:997:17 | ...[...] | $@ | array_flow.rb:994:16:994:25 | call to source : | call to source : | -| array_flow.rb:1000:10:1000:13 | ...[...] | array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:1000:10:1000:13 | ...[...] | $@ | array_flow.rb:994:16:994:25 | call to source : | call to source : | -| array_flow.rb:1007:10:1007:13 | ...[...] | array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1007:10:1007:13 | ...[...] | $@ | array_flow.rb:1006:20:1006:31 | call to source : | call to source : | -| array_flow.rb:1008:10:1008:13 | ...[...] | array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1008:10:1008:13 | ...[...] | $@ | array_flow.rb:1006:20:1006:31 | call to source : | call to source : | -| array_flow.rb:1014:10:1014:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1014:10:1014:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source : | call to source : | -| array_flow.rb:1014:10:1014:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1014:10:1014:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source : | call to source : | -| array_flow.rb:1015:10:1015:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1015:10:1015:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source : | call to source : | -| array_flow.rb:1015:10:1015:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1015:10:1015:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source : | call to source : | -| array_flow.rb:1016:10:1016:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1016:10:1016:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source : | call to source : | -| array_flow.rb:1016:10:1016:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1016:10:1016:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source : | call to source : | -| array_flow.rb:1018:10:1018:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1018:10:1018:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source : | call to source : | -| array_flow.rb:1019:10:1019:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1019:10:1019:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source : | call to source : | -| array_flow.rb:1025:10:1025:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1025:10:1025:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | -| array_flow.rb:1025:10:1025:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1025:10:1025:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | -| array_flow.rb:1026:10:1026:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1026:10:1026:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | -| array_flow.rb:1026:10:1026:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1026:10:1026:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | -| array_flow.rb:1027:10:1027:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1027:10:1027:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | -| array_flow.rb:1027:10:1027:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1027:10:1027:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | -| array_flow.rb:1028:10:1028:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1028:10:1028:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | -| array_flow.rb:1028:10:1028:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1028:10:1028:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | -| array_flow.rb:1029:10:1029:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1029:10:1029:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | -| array_flow.rb:1029:10:1029:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1029:10:1029:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | -| array_flow.rb:1030:10:1030:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1030:10:1030:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | -| array_flow.rb:1030:10:1030:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1030:10:1030:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | -| array_flow.rb:1036:14:1036:14 | x | array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1036:14:1036:14 | x | $@ | array_flow.rb:1034:16:1034:26 | call to source : | call to source : | -| array_flow.rb:1038:10:1038:13 | ...[...] | array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1038:10:1038:13 | ...[...] | $@ | array_flow.rb:1034:16:1034:26 | call to source : | call to source : | -| array_flow.rb:1044:14:1044:14 | x | array_flow.rb:1042:16:1042:26 | call to source : | array_flow.rb:1044:14:1044:14 | x | $@ | array_flow.rb:1042:16:1042:26 | call to source : | call to source : | -| array_flow.rb:1055:10:1055:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1055:10:1055:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1056:10:1056:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1056:10:1056:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1056:10:1056:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1056:10:1056:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | -| array_flow.rb:1057:10:1057:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1057:10:1057:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1057:10:1057:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1057:10:1057:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | -| array_flow.rb:1058:10:1058:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1058:10:1058:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1061:10:1061:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1061:10:1061:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1061:10:1061:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1061:10:1061:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | -| array_flow.rb:1062:10:1062:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1062:10:1062:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1062:10:1062:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1062:10:1062:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | -| array_flow.rb:1063:10:1063:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1063:10:1063:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1064:10:1064:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1064:10:1064:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1067:10:1067:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1067:10:1067:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1069:10:1069:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1069:10:1069:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | -| array_flow.rb:1070:10:1070:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1070:10:1070:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | -| array_flow.rb:1073:10:1073:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1073:10:1073:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1073:10:1073:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1073:10:1073:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | -| array_flow.rb:1073:10:1073:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1073:10:1073:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | -| array_flow.rb:1074:10:1074:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1074:10:1074:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1074:10:1074:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1074:10:1074:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | -| array_flow.rb:1074:10:1074:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1074:10:1074:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | -| array_flow.rb:1075:10:1075:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1075:10:1075:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1075:10:1075:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1075:10:1075:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | -| array_flow.rb:1075:10:1075:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1075:10:1075:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | -| array_flow.rb:1076:10:1076:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1076:10:1076:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | -| array_flow.rb:1076:10:1076:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1076:10:1076:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | -| array_flow.rb:1076:10:1076:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1076:10:1076:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | -| array_flow.rb:1086:10:1086:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1086:10:1086:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | -| array_flow.rb:1087:10:1087:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1087:10:1087:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | -| array_flow.rb:1087:10:1087:13 | ...[...] | array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1087:10:1087:13 | ...[...] | $@ | array_flow.rb:1084:28:1084:40 | call to source : | call to source : | -| array_flow.rb:1088:10:1088:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1088:10:1088:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | -| array_flow.rb:1088:10:1088:13 | ...[...] | array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1088:10:1088:13 | ...[...] | $@ | array_flow.rb:1084:43:1084:55 | call to source : | call to source : | -| array_flow.rb:1089:10:1089:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1089:10:1089:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | -| array_flow.rb:1090:10:1090:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1090:10:1090:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | -| array_flow.rb:1091:10:1091:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1091:10:1091:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | -| array_flow.rb:1091:10:1091:13 | ...[...] | array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1091:10:1091:13 | ...[...] | $@ | array_flow.rb:1084:28:1084:40 | call to source : | call to source : | -| array_flow.rb:1092:10:1092:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1092:10:1092:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | -| array_flow.rb:1092:10:1092:13 | ...[...] | array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1092:10:1092:13 | ...[...] | $@ | array_flow.rb:1084:43:1084:55 | call to source : | call to source : | -| array_flow.rb:1093:10:1093:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1093:10:1093:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | -| array_flow.rb:1097:10:1097:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1097:10:1097:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | -| array_flow.rb:1097:10:1097:13 | ...[...] | array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1097:10:1097:13 | ...[...] | $@ | array_flow.rb:1095:28:1095:40 | call to source : | call to source : | -| array_flow.rb:1098:10:1098:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1098:10:1098:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | -| array_flow.rb:1098:10:1098:13 | ...[...] | array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1098:10:1098:13 | ...[...] | $@ | array_flow.rb:1095:43:1095:55 | call to source : | call to source : | -| array_flow.rb:1099:10:1099:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1099:10:1099:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | -| array_flow.rb:1100:10:1100:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1100:10:1100:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | -| array_flow.rb:1101:10:1101:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1101:10:1101:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | -| array_flow.rb:1101:10:1101:13 | ...[...] | array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1101:10:1101:13 | ...[...] | $@ | array_flow.rb:1095:28:1095:40 | call to source : | call to source : | -| array_flow.rb:1102:10:1102:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1102:10:1102:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | -| array_flow.rb:1102:10:1102:13 | ...[...] | array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1102:10:1102:13 | ...[...] | $@ | array_flow.rb:1095:43:1095:55 | call to source : | call to source : | -| array_flow.rb:1103:10:1103:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1103:10:1103:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | -| array_flow.rb:1104:10:1104:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1104:10:1104:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | -| array_flow.rb:1108:10:1108:13 | ...[...] | array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1108:10:1108:13 | ...[...] | $@ | array_flow.rb:1106:10:1106:22 | call to source : | call to source : | -| array_flow.rb:1110:10:1110:13 | ...[...] | array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1110:10:1110:13 | ...[...] | $@ | array_flow.rb:1106:28:1106:40 | call to source : | call to source : | -| array_flow.rb:1111:10:1111:13 | ...[...] | array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1111:10:1111:13 | ...[...] | $@ | array_flow.rb:1106:43:1106:55 | call to source : | call to source : | -| array_flow.rb:1112:10:1112:13 | ...[...] | array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1112:10:1112:13 | ...[...] | $@ | array_flow.rb:1106:10:1106:22 | call to source : | call to source : | -| array_flow.rb:1114:10:1114:13 | ...[...] | array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1114:10:1114:13 | ...[...] | $@ | array_flow.rb:1106:28:1106:40 | call to source : | call to source : | -| array_flow.rb:1115:10:1115:13 | ...[...] | array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1115:10:1115:13 | ...[...] | $@ | array_flow.rb:1106:43:1106:55 | call to source : | call to source : | -| array_flow.rb:1119:10:1119:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1119:10:1119:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | -| array_flow.rb:1119:10:1119:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1119:10:1119:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | -| array_flow.rb:1119:10:1119:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1119:10:1119:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | -| array_flow.rb:1120:10:1120:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1120:10:1120:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | -| array_flow.rb:1120:10:1120:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1120:10:1120:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | -| array_flow.rb:1120:10:1120:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1120:10:1120:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | -| array_flow.rb:1121:10:1121:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1121:10:1121:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | -| array_flow.rb:1121:10:1121:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1121:10:1121:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | -| array_flow.rb:1121:10:1121:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1121:10:1121:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | -| array_flow.rb:1122:10:1122:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1122:10:1122:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | -| array_flow.rb:1122:10:1122:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1122:10:1122:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | -| array_flow.rb:1122:10:1122:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1122:10:1122:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | -| array_flow.rb:1123:10:1123:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1123:10:1123:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | -| array_flow.rb:1123:10:1123:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1123:10:1123:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | -| array_flow.rb:1123:10:1123:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1123:10:1123:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | -| array_flow.rb:1124:10:1124:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1124:10:1124:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | -| array_flow.rb:1124:10:1124:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1124:10:1124:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | -| array_flow.rb:1124:10:1124:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1124:10:1124:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | -| array_flow.rb:1125:10:1125:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1125:10:1125:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | -| array_flow.rb:1125:10:1125:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1125:10:1125:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | -| array_flow.rb:1125:10:1125:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1125:10:1125:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | -| array_flow.rb:1126:10:1126:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1126:10:1126:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | -| array_flow.rb:1126:10:1126:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1126:10:1126:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | -| array_flow.rb:1126:10:1126:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1126:10:1126:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | -| array_flow.rb:1132:14:1132:14 | x | array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1132:14:1132:14 | x | $@ | array_flow.rb:1130:19:1130:29 | call to source : | call to source : | -| array_flow.rb:1134:10:1134:13 | ...[...] | array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1134:10:1134:13 | ...[...] | $@ | array_flow.rb:1130:19:1130:29 | call to source : | call to source : | -| array_flow.rb:1140:14:1140:14 | x | array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1140:14:1140:14 | x | $@ | array_flow.rb:1138:16:1138:26 | call to source : | call to source : | -| array_flow.rb:1143:10:1143:13 | ...[...] | array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1143:10:1143:13 | ...[...] | $@ | array_flow.rb:1138:16:1138:26 | call to source : | call to source : | -| array_flow.rb:1144:10:1144:13 | ...[...] | array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1144:10:1144:13 | ...[...] | $@ | array_flow.rb:1138:16:1138:26 | call to source : | call to source : | -| array_flow.rb:1150:10:1150:10 | b | array_flow.rb:1148:10:1148:22 | call to source : | array_flow.rb:1150:10:1150:10 | b | $@ | array_flow.rb:1148:10:1148:22 | call to source : | call to source : | -| array_flow.rb:1152:10:1152:13 | ...[...] | array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1152:10:1152:13 | ...[...] | $@ | array_flow.rb:1148:28:1148:40 | call to source : | call to source : | -| array_flow.rb:1157:10:1157:13 | ...[...] | array_flow.rb:1155:10:1155:22 | call to source : | array_flow.rb:1157:10:1157:13 | ...[...] | $@ | array_flow.rb:1155:10:1155:22 | call to source : | call to source : | -| array_flow.rb:1159:10:1159:13 | ...[...] | array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1159:10:1159:13 | ...[...] | $@ | array_flow.rb:1155:28:1155:40 | call to source : | call to source : | -| array_flow.rb:1165:10:1165:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1165:10:1165:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source : | call to source : | -| array_flow.rb:1165:10:1165:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1165:10:1165:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source : | call to source : | -| array_flow.rb:1166:10:1166:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1166:10:1166:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source : | call to source : | -| array_flow.rb:1166:10:1166:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1166:10:1166:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source : | call to source : | -| array_flow.rb:1167:10:1167:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1167:10:1167:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source : | call to source : | -| array_flow.rb:1167:10:1167:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1167:10:1167:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source : | call to source : | -| array_flow.rb:1168:10:1168:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1168:10:1168:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source : | call to source : | -| array_flow.rb:1168:10:1168:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1168:10:1168:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source : | call to source : | -| array_flow.rb:1169:10:1169:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1169:10:1169:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source : | call to source : | -| array_flow.rb:1169:10:1169:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1169:10:1169:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source : | call to source : | -| array_flow.rb:1177:10:1177:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1177:10:1177:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source : | call to source : | -| array_flow.rb:1178:10:1178:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1178:10:1178:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source : | call to source : | -| array_flow.rb:1179:10:1179:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1179:10:1179:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source : | call to source : | -| array_flow.rb:1180:10:1180:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1180:10:1180:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source : | call to source : | -| array_flow.rb:1186:10:1186:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1186:10:1186:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | -| array_flow.rb:1187:10:1187:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1187:10:1187:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | -| array_flow.rb:1188:10:1188:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1188:10:1188:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | -| array_flow.rb:1189:10:1189:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1189:10:1189:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | -| array_flow.rb:1190:10:1190:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1190:10:1190:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | -| array_flow.rb:1191:10:1191:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1191:10:1191:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | -| array_flow.rb:1198:10:1198:10 | b | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1198:10:1198:10 | b | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1201:10:1201:10 | b | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1201:10:1201:10 | b | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1201:10:1201:10 | b | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1201:10:1201:10 | b | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1205:10:1205:10 | b | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1205:10:1205:10 | b | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1205:10:1205:10 | b | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1205:10:1205:10 | b | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1207:10:1207:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1207:10:1207:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1207:10:1207:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1207:10:1207:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1210:10:1210:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1210:10:1210:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1212:10:1212:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1212:10:1212:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1215:10:1215:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1215:10:1215:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1215:10:1215:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1215:10:1215:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1216:10:1216:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1216:10:1216:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1216:10:1216:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1216:10:1216:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1219:10:1219:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1219:10:1219:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1224:10:1224:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1224:10:1224:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1229:10:1229:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1229:10:1229:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1229:10:1229:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1229:10:1229:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1230:10:1230:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1230:10:1230:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1230:10:1230:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1230:10:1230:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1233:10:1233:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1233:10:1233:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1233:10:1233:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1233:10:1233:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1234:10:1234:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1234:10:1234:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1234:10:1234:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1234:10:1234:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1239:10:1239:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1239:10:1239:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1242:10:1242:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1242:10:1242:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1242:10:1242:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1242:10:1242:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1243:10:1243:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1243:10:1243:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1243:10:1243:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1243:10:1243:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1244:10:1244:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1244:10:1244:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | -| array_flow.rb:1244:10:1244:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1244:10:1244:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | -| array_flow.rb:1250:10:1250:10 | b | array_flow.rb:1248:16:1248:28 | call to source : | array_flow.rb:1250:10:1250:10 | b | $@ | array_flow.rb:1248:16:1248:28 | call to source : | call to source : | -| array_flow.rb:1254:10:1254:13 | ...[...] | array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1254:10:1254:13 | ...[...] | $@ | array_flow.rb:1248:34:1248:46 | call to source : | call to source : | -| array_flow.rb:1258:10:1258:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1258:10:1258:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | -| array_flow.rb:1258:10:1258:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1258:10:1258:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | -| array_flow.rb:1259:10:1259:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1259:10:1259:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | -| array_flow.rb:1259:10:1259:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1259:10:1259:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | -| array_flow.rb:1260:10:1260:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1260:10:1260:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | -| array_flow.rb:1260:10:1260:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1260:10:1260:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | -| array_flow.rb:1261:10:1261:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1261:10:1261:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | -| array_flow.rb:1261:10:1261:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1261:10:1261:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | -| array_flow.rb:1263:10:1263:10 | b | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1263:10:1263:10 | b | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | -| array_flow.rb:1263:10:1263:10 | b | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1263:10:1263:10 | b | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | -| array_flow.rb:1265:10:1265:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1265:10:1265:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | -| array_flow.rb:1265:10:1265:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1265:10:1265:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | -| array_flow.rb:1269:10:1269:13 | ...[...] | array_flow.rb:1267:16:1267:28 | call to source : | array_flow.rb:1269:10:1269:13 | ...[...] | $@ | array_flow.rb:1267:16:1267:28 | call to source : | call to source : | -| array_flow.rb:1271:10:1271:13 | ...[...] | array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1271:10:1271:13 | ...[...] | $@ | array_flow.rb:1267:34:1267:46 | call to source : | call to source : | -| array_flow.rb:1280:10:1280:13 | ...[...] | array_flow.rb:1278:16:1278:28 | call to source : | array_flow.rb:1280:10:1280:13 | ...[...] | $@ | array_flow.rb:1278:16:1278:28 | call to source : | call to source : | -| array_flow.rb:1285:10:1285:13 | ...[...] | array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1285:10:1285:13 | ...[...] | $@ | array_flow.rb:1278:34:1278:46 | call to source : | call to source : | -| array_flow.rb:1291:10:1291:13 | ...[...] | array_flow.rb:1289:16:1289:28 | call to source : | array_flow.rb:1291:10:1291:13 | ...[...] | $@ | array_flow.rb:1289:16:1289:28 | call to source : | call to source : | -| array_flow.rb:1296:10:1296:13 | ...[...] | array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1296:10:1296:13 | ...[...] | $@ | array_flow.rb:1289:34:1289:46 | call to source : | call to source : | -| array_flow.rb:1302:10:1302:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1302:10:1302:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | -| array_flow.rb:1302:10:1302:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1302:10:1302:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | -| array_flow.rb:1303:10:1303:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1303:10:1303:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | -| array_flow.rb:1303:10:1303:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1303:10:1303:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | -| array_flow.rb:1304:10:1304:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1304:10:1304:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | -| array_flow.rb:1304:10:1304:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1304:10:1304:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | -| array_flow.rb:1305:10:1305:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1305:10:1305:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | -| array_flow.rb:1305:10:1305:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1305:10:1305:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | -| array_flow.rb:1306:10:1306:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1306:10:1306:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | -| array_flow.rb:1306:10:1306:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1306:10:1306:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | -| array_flow.rb:1307:10:1307:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1307:10:1307:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | -| array_flow.rb:1307:10:1307:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1307:10:1307:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | -| array_flow.rb:1311:10:1311:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1311:10:1311:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | -| array_flow.rb:1311:10:1311:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1311:10:1311:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | -| array_flow.rb:1312:10:1312:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1312:10:1312:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | -| array_flow.rb:1312:10:1312:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1312:10:1312:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | -| array_flow.rb:1313:10:1313:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1313:10:1313:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | -| array_flow.rb:1313:10:1313:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1313:10:1313:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | -| array_flow.rb:1314:10:1314:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1314:10:1314:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | -| array_flow.rb:1314:10:1314:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1314:10:1314:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | -| array_flow.rb:1315:10:1315:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1315:10:1315:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | -| array_flow.rb:1315:10:1315:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1315:10:1315:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | -| array_flow.rb:1316:10:1316:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1316:10:1316:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | -| array_flow.rb:1316:10:1316:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1316:10:1316:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | -| array_flow.rb:1320:10:1320:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1320:10:1320:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | -| array_flow.rb:1320:10:1320:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1320:10:1320:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | -| array_flow.rb:1321:10:1321:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1321:10:1321:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | -| array_flow.rb:1321:10:1321:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1321:10:1321:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | -| array_flow.rb:1322:10:1322:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1322:10:1322:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | -| array_flow.rb:1322:10:1322:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1322:10:1322:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | -| array_flow.rb:1323:10:1323:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1323:10:1323:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | -| array_flow.rb:1323:10:1323:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1323:10:1323:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | -| array_flow.rb:1324:10:1324:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1324:10:1324:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | -| array_flow.rb:1324:10:1324:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1324:10:1324:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | -| array_flow.rb:1325:10:1325:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1325:10:1325:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | -| array_flow.rb:1325:10:1325:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1325:10:1325:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | -| array_flow.rb:1331:10:1331:13 | ...[...] | array_flow.rb:1327:16:1327:28 | call to source : | array_flow.rb:1331:10:1331:13 | ...[...] | $@ | array_flow.rb:1327:16:1327:28 | call to source : | call to source : | -| array_flow.rb:1333:10:1333:13 | ...[...] | array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1333:10:1333:13 | ...[...] | $@ | array_flow.rb:1327:34:1327:46 | call to source : | call to source : | -| array_flow.rb:1338:10:1338:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1338:10:1338:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | -| array_flow.rb:1338:10:1338:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1338:10:1338:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | -| array_flow.rb:1339:10:1339:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1339:10:1339:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | -| array_flow.rb:1339:10:1339:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1339:10:1339:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | -| array_flow.rb:1340:10:1340:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1340:10:1340:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | -| array_flow.rb:1340:10:1340:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1340:10:1340:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | -| array_flow.rb:1341:10:1341:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1341:10:1341:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | -| array_flow.rb:1341:10:1341:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1341:10:1341:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | -| array_flow.rb:1342:10:1342:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1342:10:1342:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | -| array_flow.rb:1342:10:1342:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1342:10:1342:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | -| array_flow.rb:1343:10:1343:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1343:10:1343:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | -| array_flow.rb:1343:10:1343:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1343:10:1343:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | -| array_flow.rb:1349:14:1349:14 | x | array_flow.rb:1347:16:1347:26 | call to source : | array_flow.rb:1349:14:1349:14 | x | $@ | array_flow.rb:1347:16:1347:26 | call to source : | call to source : | -| array_flow.rb:1357:14:1357:14 | x | array_flow.rb:1355:16:1355:26 | call to source : | array_flow.rb:1357:14:1357:14 | x | $@ | array_flow.rb:1355:16:1355:26 | call to source : | call to source : | -| array_flow.rb:1365:14:1365:14 | x | array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1365:14:1365:14 | x | $@ | array_flow.rb:1363:16:1363:26 | call to source : | call to source : | -| array_flow.rb:1366:14:1366:14 | y | array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1366:14:1366:14 | y | $@ | array_flow.rb:1363:16:1363:26 | call to source : | call to source : | -| array_flow.rb:1373:10:1373:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1373:10:1373:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | -| array_flow.rb:1374:10:1374:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1374:10:1374:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | -| array_flow.rb:1376:14:1376:14 | x | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1376:14:1376:14 | x | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | -| array_flow.rb:1377:14:1377:14 | y | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1377:14:1377:14 | y | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | -| array_flow.rb:1380:10:1380:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1380:10:1380:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | -| array_flow.rb:1381:10:1381:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1381:10:1381:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | -| array_flow.rb:1387:10:1387:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1387:10:1387:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source : | call to source : | -| array_flow.rb:1388:10:1388:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1388:10:1388:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source : | call to source : | -| array_flow.rb:1389:10:1389:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1389:10:1389:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source : | call to source : | -| array_flow.rb:1390:10:1390:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1390:10:1390:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source : | call to source : | -| array_flow.rb:1394:14:1394:14 | x | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1394:14:1394:14 | x | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | -| array_flow.rb:1395:14:1395:14 | y | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1395:14:1395:14 | y | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | -| array_flow.rb:1398:10:1398:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1398:10:1398:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | -| array_flow.rb:1399:10:1399:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1399:10:1399:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | -| array_flow.rb:1400:10:1400:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1400:10:1400:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | -| array_flow.rb:1401:10:1401:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1401:10:1401:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | -| array_flow.rb:1407:14:1407:14 | x | array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1407:14:1407:14 | x | $@ | array_flow.rb:1405:16:1405:26 | call to source : | call to source : | -| array_flow.rb:1410:10:1410:13 | ...[...] | array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1410:10:1410:13 | ...[...] | $@ | array_flow.rb:1405:16:1405:26 | call to source : | call to source : | -| array_flow.rb:1411:10:1411:13 | ...[...] | array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1411:10:1411:13 | ...[...] | $@ | array_flow.rb:1405:16:1405:26 | call to source : | call to source : | -| array_flow.rb:1417:14:1417:14 | x | array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1417:14:1417:14 | x | $@ | array_flow.rb:1415:16:1415:26 | call to source : | call to source : | -| array_flow.rb:1420:10:1420:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1420:10:1420:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source : | call to source : | -| array_flow.rb:1421:10:1421:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1421:10:1421:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source : | call to source : | -| array_flow.rb:1422:10:1422:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1422:10:1422:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source : | call to source : | -| array_flow.rb:1423:10:1423:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1423:10:1423:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source : | call to source : | -| array_flow.rb:1429:14:1429:14 | x | array_flow.rb:1427:16:1427:26 | call to source : | array_flow.rb:1429:14:1429:14 | x | $@ | array_flow.rb:1427:16:1427:26 | call to source : | call to source : | -| array_flow.rb:1439:10:1439:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1439:10:1439:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | -| array_flow.rb:1440:10:1440:13 | ...[...] | array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1440:10:1440:13 | ...[...] | $@ | array_flow.rb:1435:31:1435:43 | call to source : | call to source : | -| array_flow.rb:1444:10:1444:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1444:10:1444:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | -| array_flow.rb:1446:10:1446:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1446:10:1446:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | -| array_flow.rb:1450:10:1450:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1450:10:1450:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | -| array_flow.rb:1451:10:1451:13 | ...[...] | array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1451:10:1451:13 | ...[...] | $@ | array_flow.rb:1435:31:1435:43 | call to source : | call to source : | -| array_flow.rb:1452:10:1452:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1452:10:1452:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | -| array_flow.rb:1452:10:1452:13 | ...[...] | array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1452:10:1452:13 | ...[...] | $@ | array_flow.rb:1435:31:1435:43 | call to source : | call to source : | -| array_flow.rb:1455:10:1455:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1455:10:1455:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | -| array_flow.rb:1455:10:1455:13 | ...[...] | array_flow.rb:1453:12:1453:24 | call to source : | array_flow.rb:1455:10:1455:13 | ...[...] | $@ | array_flow.rb:1453:12:1453:24 | call to source : | call to source : | -| array_flow.rb:1461:14:1461:14 | x | array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1461:14:1461:14 | x | $@ | array_flow.rb:1459:16:1459:26 | call to source : | call to source : | -| array_flow.rb:1466:10:1466:13 | ...[...] | array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1466:10:1466:13 | ...[...] | $@ | array_flow.rb:1459:16:1459:26 | call to source : | call to source : | -| array_flow.rb:1474:10:1474:13 | ...[...] | array_flow.rb:1472:19:1472:29 | call to source : | array_flow.rb:1474:10:1474:13 | ...[...] | $@ | array_flow.rb:1472:19:1472:29 | call to source : | call to source : | -| array_flow.rb:1482:10:1482:13 | ...[...] | array_flow.rb:1478:16:1478:26 | call to source : | array_flow.rb:1482:10:1482:13 | ...[...] | $@ | array_flow.rb:1478:16:1478:26 | call to source : | call to source : | -| array_flow.rb:1500:10:1500:16 | ...[...] | array_flow.rb:1495:14:1495:26 | call to source : | array_flow.rb:1500:10:1500:16 | ...[...] | $@ | array_flow.rb:1495:14:1495:26 | call to source : | call to source : | -| array_flow.rb:1501:10:1501:16 | ...[...] | array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1501:10:1501:16 | ...[...] | $@ | array_flow.rb:1495:34:1495:46 | call to source : | call to source : | -| array_flow.rb:1502:10:1502:16 | ...[...] | array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1502:10:1502:16 | ...[...] | $@ | array_flow.rb:1495:54:1495:66 | call to source : | call to source : | -| array_flow.rb:1510:10:1510:13 | ...[...] | array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1510:10:1510:13 | ...[...] | $@ | array_flow.rb:1506:16:1506:28 | call to source : | call to source : | -| array_flow.rb:1510:10:1510:13 | ...[...] | array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1510:10:1510:13 | ...[...] | $@ | array_flow.rb:1507:13:1507:25 | call to source : | call to source : | -| array_flow.rb:1510:10:1510:13 | ...[...] | array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1510:10:1510:13 | ...[...] | $@ | array_flow.rb:1508:13:1508:25 | call to source : | call to source : | -| array_flow.rb:1511:10:1511:13 | ...[...] | array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1511:10:1511:13 | ...[...] | $@ | array_flow.rb:1506:16:1506:28 | call to source : | call to source : | -| array_flow.rb:1511:10:1511:13 | ...[...] | array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1511:10:1511:13 | ...[...] | $@ | array_flow.rb:1507:13:1507:25 | call to source : | call to source : | -| array_flow.rb:1511:10:1511:13 | ...[...] | array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1511:10:1511:13 | ...[...] | $@ | array_flow.rb:1508:13:1508:25 | call to source : | call to source : | -| array_flow.rb:1512:10:1512:13 | ...[...] | array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1512:10:1512:13 | ...[...] | $@ | array_flow.rb:1506:16:1506:28 | call to source : | call to source : | -| array_flow.rb:1512:10:1512:13 | ...[...] | array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1512:10:1512:13 | ...[...] | $@ | array_flow.rb:1507:13:1507:25 | call to source : | call to source : | -| array_flow.rb:1512:10:1512:13 | ...[...] | array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1512:10:1512:13 | ...[...] | $@ | array_flow.rb:1508:13:1508:25 | call to source : | call to source : | -| array_flow.rb:1519:10:1519:13 | ...[...] | array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1519:10:1519:13 | ...[...] | $@ | array_flow.rb:1516:19:1516:31 | call to source : | call to source : | -| array_flow.rb:1519:10:1519:13 | ...[...] | array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1519:10:1519:13 | ...[...] | $@ | array_flow.rb:1516:34:1516:46 | call to source : | call to source : | -| array_flow.rb:1520:10:1520:13 | ...[...] | array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1520:10:1520:13 | ...[...] | $@ | array_flow.rb:1516:19:1516:31 | call to source : | call to source : | -| array_flow.rb:1520:10:1520:13 | ...[...] | array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1520:10:1520:13 | ...[...] | $@ | array_flow.rb:1516:34:1516:46 | call to source : | call to source : | -| array_flow.rb:1523:14:1523:14 | x | array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1523:14:1523:14 | x | $@ | array_flow.rb:1516:19:1516:31 | call to source : | call to source : | -| array_flow.rb:1523:14:1523:14 | x | array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1523:14:1523:14 | x | $@ | array_flow.rb:1516:34:1516:46 | call to source : | call to source : | -| array_flow.rb:1526:10:1526:13 | ...[...] | array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1526:10:1526:13 | ...[...] | $@ | array_flow.rb:1516:19:1516:31 | call to source : | call to source : | -| array_flow.rb:1526:10:1526:13 | ...[...] | array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1526:10:1526:13 | ...[...] | $@ | array_flow.rb:1516:34:1516:46 | call to source : | call to source : | -| array_flow.rb:1532:10:1532:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1532:10:1532:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source : | call to source : | -| array_flow.rb:1532:10:1532:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1532:10:1532:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source : | call to source : | -| array_flow.rb:1533:10:1533:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1533:10:1533:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source : | call to source : | -| array_flow.rb:1533:10:1533:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1533:10:1533:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source : | call to source : | -| array_flow.rb:1534:10:1534:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1534:10:1534:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source : | call to source : | -| array_flow.rb:1534:10:1534:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1534:10:1534:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source : | call to source : | -| array_flow.rb:1535:10:1535:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1535:10:1535:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source : | call to source : | -| array_flow.rb:1535:10:1535:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1535:10:1535:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source : | call to source : | -| array_flow.rb:1539:14:1539:14 | x | array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1539:14:1539:14 | x | $@ | array_flow.rb:1537:16:1537:28 | call to source : | call to source : | -| array_flow.rb:1539:14:1539:14 | x | array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1539:14:1539:14 | x | $@ | array_flow.rb:1537:31:1537:43 | call to source : | call to source : | -| array_flow.rb:1542:10:1542:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1542:10:1542:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source : | call to source : | -| array_flow.rb:1542:10:1542:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1542:10:1542:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source : | call to source : | -| array_flow.rb:1543:10:1543:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1543:10:1543:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source : | call to source : | -| array_flow.rb:1543:10:1543:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1543:10:1543:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source : | call to source : | -| array_flow.rb:1544:10:1544:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1544:10:1544:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source : | call to source : | -| array_flow.rb:1544:10:1544:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1544:10:1544:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source : | call to source : | -| array_flow.rb:1545:10:1545:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1545:10:1545:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source : | call to source : | -| array_flow.rb:1545:10:1545:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1545:10:1545:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source : | call to source : | -| array_flow.rb:1553:10:1553:13 | ...[...] | array_flow.rb:1550:21:1550:33 | call to source : | array_flow.rb:1553:10:1553:13 | ...[...] | $@ | array_flow.rb:1550:21:1550:33 | call to source : | call to source : | -| array_flow.rb:1556:10:1556:13 | ...[...] | array_flow.rb:1549:16:1549:28 | call to source : | array_flow.rb:1556:10:1556:13 | ...[...] | $@ | array_flow.rb:1549:16:1549:28 | call to source : | call to source : | -| array_flow.rb:1564:10:1564:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1564:10:1564:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | -| array_flow.rb:1566:10:1566:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1566:10:1566:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | -| array_flow.rb:1569:10:1569:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1569:10:1569:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | -| array_flow.rb:1569:10:1569:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1569:10:1569:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | -| array_flow.rb:1570:10:1570:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1570:10:1570:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | -| array_flow.rb:1570:10:1570:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1570:10:1570:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | -| array_flow.rb:1573:10:1573:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1573:10:1573:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | -| array_flow.rb:1573:10:1573:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1573:10:1573:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | -| array_flow.rb:1574:10:1574:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1574:10:1574:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | -| array_flow.rb:1574:10:1574:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1574:10:1574:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | -| array_flow.rb:1577:10:1577:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1577:10:1577:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | -| array_flow.rb:1577:10:1577:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1577:10:1577:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | -| array_flow.rb:1578:10:1578:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1578:10:1578:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | -| array_flow.rb:1578:10:1578:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1578:10:1578:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | -| array_flow.rb:1579:10:1579:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1579:10:1579:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | -| array_flow.rb:1579:10:1579:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1579:10:1579:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | -| array_flow.rb:1580:10:1580:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1580:10:1580:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | -| array_flow.rb:1580:10:1580:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1580:10:1580:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | -| array_flow.rb:1589:10:1589:16 | ...[...] | array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1589:10:1589:16 | ...[...] | $@ | array_flow.rb:1586:10:1586:22 | call to source : | call to source : | -| array_flow.rb:1590:10:1590:16 | ...[...] | array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1590:10:1590:16 | ...[...] | $@ | array_flow.rb:1585:13:1585:25 | call to source : | call to source : | -| array_flow.rb:1591:10:1591:16 | ...[...] | array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1591:10:1591:16 | ...[...] | $@ | array_flow.rb:1584:16:1584:28 | call to source : | call to source : | -| array_flow.rb:1593:14:1593:17 | ...[...] | array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1593:14:1593:17 | ...[...] | $@ | array_flow.rb:1584:16:1584:28 | call to source : | call to source : | -| array_flow.rb:1594:14:1594:17 | ...[...] | array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1594:14:1594:17 | ...[...] | $@ | array_flow.rb:1585:13:1585:25 | call to source : | call to source : | -| array_flow.rb:1595:14:1595:17 | ...[...] | array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1595:14:1595:17 | ...[...] | $@ | array_flow.rb:1586:10:1586:22 | call to source : | call to source : | -| array_flow.rb:1603:10:1603:13 | ...[...] | array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1603:10:1603:13 | ...[...] | $@ | array_flow.rb:1600:16:1600:28 | call to source : | call to source : | -| array_flow.rb:1603:10:1603:13 | ...[...] | array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1603:10:1603:13 | ...[...] | $@ | array_flow.rb:1601:13:1601:25 | call to source : | call to source : | -| array_flow.rb:1604:10:1604:13 | ...[...] | array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1604:10:1604:13 | ...[...] | $@ | array_flow.rb:1600:16:1600:28 | call to source : | call to source : | -| array_flow.rb:1604:10:1604:13 | ...[...] | array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1604:10:1604:13 | ...[...] | $@ | array_flow.rb:1601:13:1601:25 | call to source : | call to source : | -| array_flow.rb:1605:10:1605:13 | ...[...] | array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1605:10:1605:13 | ...[...] | $@ | array_flow.rb:1600:16:1600:28 | call to source : | call to source : | -| array_flow.rb:1605:10:1605:13 | ...[...] | array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1605:10:1605:13 | ...[...] | $@ | array_flow.rb:1601:13:1601:25 | call to source : | call to source : | -| array_flow.rb:1611:10:1611:16 | ...[...] | array_flow.rb:1610:15:1610:27 | call to source : | array_flow.rb:1611:10:1611:16 | ...[...] | $@ | array_flow.rb:1610:15:1610:27 | call to source : | call to source : | -| array_flow.rb:1614:10:1614:16 | ...[...] | array_flow.rb:1610:15:1610:27 | call to source : | array_flow.rb:1614:10:1614:16 | ...[...] | $@ | array_flow.rb:1610:15:1610:27 | call to source : | call to source : | -| array_flow.rb:1614:10:1614:16 | ...[...] | array_flow.rb:1613:15:1613:27 | call to source : | array_flow.rb:1614:10:1614:16 | ...[...] | $@ | array_flow.rb:1613:15:1613:27 | call to source : | call to source : | -| array_flow.rb:1615:10:1615:16 | ...[...] | array_flow.rb:1610:15:1610:27 | call to source : | array_flow.rb:1615:10:1615:16 | ...[...] | $@ | array_flow.rb:1610:15:1610:27 | call to source : | call to source : | -| array_flow.rb:1627:10:1627:13 | ...[...] | array_flow.rb:1622:16:1622:28 | call to source : | array_flow.rb:1627:10:1627:13 | ...[...] | $@ | array_flow.rb:1622:16:1622:28 | call to source : | call to source : | -| array_flow.rb:1627:10:1627:13 | ...[...] | array_flow.rb:1624:14:1624:26 | call to source : | array_flow.rb:1627:10:1627:13 | ...[...] | $@ | array_flow.rb:1624:14:1624:26 | call to source : | call to source : | -| array_flow.rb:1627:10:1627:13 | ...[...] | array_flow.rb:1626:16:1626:28 | call to source : | array_flow.rb:1627:10:1627:13 | ...[...] | $@ | array_flow.rb:1626:16:1626:28 | call to source : | call to source : | -| array_flow.rb:1629:10:1629:17 | ...[...] | array_flow.rb:1620:12:1620:24 | call to source : | array_flow.rb:1629:10:1629:17 | ...[...] | $@ | array_flow.rb:1620:12:1620:24 | call to source : | call to source : | -| array_flow.rb:1629:10:1629:17 | ...[...] | array_flow.rb:1622:16:1622:28 | call to source : | array_flow.rb:1629:10:1629:17 | ...[...] | $@ | array_flow.rb:1622:16:1622:28 | call to source : | call to source : | -| array_flow.rb:1629:10:1629:17 | ...[...] | array_flow.rb:1624:14:1624:26 | call to source : | array_flow.rb:1629:10:1629:17 | ...[...] | $@ | array_flow.rb:1624:14:1624:26 | call to source : | call to source : | -| array_flow.rb:1629:10:1629:17 | ...[...] | array_flow.rb:1626:16:1626:28 | call to source : | array_flow.rb:1629:10:1629:17 | ...[...] | $@ | array_flow.rb:1626:16:1626:28 | call to source : | call to source : | -| array_flow.rb:1631:10:1631:15 | ...[...] | array_flow.rb:1620:12:1620:24 | call to source : | array_flow.rb:1631:10:1631:15 | ...[...] | $@ | array_flow.rb:1620:12:1620:24 | call to source : | call to source : | -| array_flow.rb:1631:10:1631:15 | ...[...] | array_flow.rb:1622:16:1622:28 | call to source : | array_flow.rb:1631:10:1631:15 | ...[...] | $@ | array_flow.rb:1622:16:1622:28 | call to source : | call to source : | -| array_flow.rb:1631:10:1631:15 | ...[...] | array_flow.rb:1624:14:1624:26 | call to source : | array_flow.rb:1631:10:1631:15 | ...[...] | $@ | array_flow.rb:1624:14:1624:26 | call to source : | call to source : | -| array_flow.rb:1631:10:1631:15 | ...[...] | array_flow.rb:1626:16:1626:28 | call to source : | array_flow.rb:1631:10:1631:15 | ...[...] | $@ | array_flow.rb:1626:16:1626:28 | call to source : | call to source : | +| array_flow.rb:3:10:3:13 | ...[...] | array_flow.rb:2:10:2:20 | call to source | array_flow.rb:3:10:3:13 | ...[...] | $@ | array_flow.rb:2:10:2:20 | call to source | call to source | +| array_flow.rb:5:10:5:13 | ...[...] | array_flow.rb:2:10:2:20 | call to source | array_flow.rb:5:10:5:13 | ...[...] | $@ | array_flow.rb:2:10:2:20 | call to source | call to source | +| array_flow.rb:11:10:11:13 | ...[...] | array_flow.rb:9:13:9:21 | call to source | array_flow.rb:11:10:11:13 | ...[...] | $@ | array_flow.rb:9:13:9:21 | call to source | call to source | +| array_flow.rb:13:10:13:13 | ...[...] | array_flow.rb:9:13:9:21 | call to source | array_flow.rb:13:10:13:13 | ...[...] | $@ | array_flow.rb:9:13:9:21 | call to source | call to source | +| array_flow.rb:18:10:18:13 | ...[...] | array_flow.rb:17:22:17:32 | call to source | array_flow.rb:18:10:18:13 | ...[...] | $@ | array_flow.rb:17:22:17:32 | call to source | call to source | +| array_flow.rb:19:10:19:13 | ...[...] | array_flow.rb:17:22:17:32 | call to source | array_flow.rb:19:10:19:13 | ...[...] | $@ | array_flow.rb:17:22:17:32 | call to source | call to source | +| array_flow.rb:22:10:22:13 | ...[...] | array_flow.rb:17:22:17:32 | call to source | array_flow.rb:22:10:22:13 | ...[...] | $@ | array_flow.rb:17:22:17:32 | call to source | call to source | +| array_flow.rb:23:10:23:13 | ...[...] | array_flow.rb:17:22:17:32 | call to source | array_flow.rb:23:10:23:13 | ...[...] | $@ | array_flow.rb:17:22:17:32 | call to source | call to source | +| array_flow.rb:28:10:28:13 | ...[...] | array_flow.rb:26:9:26:19 | call to source | array_flow.rb:28:10:28:13 | ...[...] | $@ | array_flow.rb:26:9:26:19 | call to source | call to source | +| array_flow.rb:29:10:29:13 | ...[...] | array_flow.rb:26:9:26:19 | call to source | array_flow.rb:29:10:29:13 | ...[...] | $@ | array_flow.rb:26:9:26:19 | call to source | call to source | +| array_flow.rb:35:10:35:13 | ...[...] | array_flow.rb:33:10:33:18 | call to source | array_flow.rb:35:10:35:13 | ...[...] | $@ | array_flow.rb:33:10:33:18 | call to source | call to source | +| array_flow.rb:43:10:43:13 | ...[...] | array_flow.rb:40:10:40:20 | call to source | array_flow.rb:43:10:43:13 | ...[...] | $@ | array_flow.rb:40:10:40:20 | call to source | call to source | +| array_flow.rb:43:10:43:13 | ...[...] | array_flow.rb:41:16:41:26 | call to source | array_flow.rb:43:10:43:13 | ...[...] | $@ | array_flow.rb:41:16:41:26 | call to source | call to source | +| array_flow.rb:44:10:44:13 | ...[...] | array_flow.rb:40:10:40:20 | call to source | array_flow.rb:44:10:44:13 | ...[...] | $@ | array_flow.rb:40:10:40:20 | call to source | call to source | +| array_flow.rb:44:10:44:13 | ...[...] | array_flow.rb:41:16:41:26 | call to source | array_flow.rb:44:10:44:13 | ...[...] | $@ | array_flow.rb:41:16:41:26 | call to source | call to source | +| array_flow.rb:50:10:50:13 | ...[...] | array_flow.rb:48:10:48:18 | call to source | array_flow.rb:50:10:50:13 | ...[...] | $@ | array_flow.rb:48:10:48:18 | call to source | call to source | +| array_flow.rb:51:10:51:13 | ...[...] | array_flow.rb:48:10:48:18 | call to source | array_flow.rb:51:10:51:13 | ...[...] | $@ | array_flow.rb:48:10:48:18 | call to source | call to source | +| array_flow.rb:58:10:58:13 | ...[...] | array_flow.rb:55:10:55:20 | call to source | array_flow.rb:58:10:58:13 | ...[...] | $@ | array_flow.rb:55:10:55:20 | call to source | call to source | +| array_flow.rb:58:10:58:13 | ...[...] | array_flow.rb:56:13:56:23 | call to source | array_flow.rb:58:10:58:13 | ...[...] | $@ | array_flow.rb:56:13:56:23 | call to source | call to source | +| array_flow.rb:59:10:59:13 | ...[...] | array_flow.rb:56:13:56:23 | call to source | array_flow.rb:59:10:59:13 | ...[...] | $@ | array_flow.rb:56:13:56:23 | call to source | call to source | +| array_flow.rb:66:10:66:13 | ...[...] | array_flow.rb:63:10:63:20 | call to source | array_flow.rb:66:10:66:13 | ...[...] | $@ | array_flow.rb:63:10:63:20 | call to source | call to source | +| array_flow.rb:67:10:67:13 | ...[...] | array_flow.rb:63:10:63:20 | call to source | array_flow.rb:67:10:67:13 | ...[...] | $@ | array_flow.rb:63:10:63:20 | call to source | call to source | +| array_flow.rb:73:10:73:13 | ...[...] | array_flow.rb:71:10:71:20 | call to source | array_flow.rb:73:10:73:13 | ...[...] | $@ | array_flow.rb:71:10:71:20 | call to source | call to source | +| array_flow.rb:73:10:73:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source | array_flow.rb:73:10:73:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source | call to source | +| array_flow.rb:74:10:74:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source | array_flow.rb:74:10:74:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source | call to source | +| array_flow.rb:75:10:75:13 | ...[...] | array_flow.rb:71:10:71:20 | call to source | array_flow.rb:75:10:75:13 | ...[...] | $@ | array_flow.rb:71:10:71:20 | call to source | call to source | +| array_flow.rb:75:10:75:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source | array_flow.rb:75:10:75:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source | call to source | +| array_flow.rb:76:10:76:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source | array_flow.rb:76:10:76:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source | call to source | +| array_flow.rb:83:10:83:10 | c | array_flow.rb:80:13:80:21 | call to source | array_flow.rb:83:10:83:10 | c | $@ | array_flow.rb:80:13:80:21 | call to source | call to source | +| array_flow.rb:91:10:91:13 | ...[...] | array_flow.rb:88:13:88:22 | call to source | array_flow.rb:91:10:91:13 | ...[...] | $@ | array_flow.rb:88:13:88:22 | call to source | call to source | +| array_flow.rb:92:10:92:13 | ...[...] | array_flow.rb:88:13:88:22 | call to source | array_flow.rb:92:10:92:13 | ...[...] | $@ | array_flow.rb:88:13:88:22 | call to source | call to source | +| array_flow.rb:99:10:99:13 | ...[...] | array_flow.rb:96:13:96:22 | call to source | array_flow.rb:99:10:99:13 | ...[...] | $@ | array_flow.rb:96:13:96:22 | call to source | call to source | +| array_flow.rb:101:10:101:13 | ...[...] | array_flow.rb:96:13:96:22 | call to source | array_flow.rb:101:10:101:13 | ...[...] | $@ | array_flow.rb:96:13:96:22 | call to source | call to source | +| array_flow.rb:106:10:106:13 | ...[...] | array_flow.rb:103:13:103:24 | call to source | array_flow.rb:106:10:106:13 | ...[...] | $@ | array_flow.rb:103:13:103:24 | call to source | call to source | +| array_flow.rb:111:10:111:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source | array_flow.rb:111:10:111:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source | call to source | +| array_flow.rb:111:10:111:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source | array_flow.rb:111:10:111:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source | call to source | +| array_flow.rb:112:10:112:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source | array_flow.rb:112:10:112:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source | call to source | +| array_flow.rb:112:10:112:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source | array_flow.rb:112:10:112:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source | call to source | +| array_flow.rb:115:10:115:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source | array_flow.rb:115:10:115:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source | call to source | +| array_flow.rb:115:10:115:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source | array_flow.rb:115:10:115:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source | call to source | +| array_flow.rb:116:10:116:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source | array_flow.rb:116:10:116:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source | call to source | +| array_flow.rb:116:10:116:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source | array_flow.rb:116:10:116:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source | call to source | +| array_flow.rb:122:10:122:13 | ...[...] | array_flow.rb:121:15:121:24 | call to source | array_flow.rb:122:10:122:13 | ...[...] | $@ | array_flow.rb:121:15:121:24 | call to source | call to source | +| array_flow.rb:123:10:123:13 | ...[...] | array_flow.rb:121:15:121:24 | call to source | array_flow.rb:123:10:123:13 | ...[...] | $@ | array_flow.rb:121:15:121:24 | call to source | call to source | +| array_flow.rb:124:10:124:13 | ...[...] | array_flow.rb:121:15:121:24 | call to source | array_flow.rb:124:10:124:13 | ...[...] | $@ | array_flow.rb:121:15:121:24 | call to source | call to source | +| array_flow.rb:130:10:130:13 | ...[...] | array_flow.rb:129:19:129:28 | call to source | array_flow.rb:130:10:130:13 | ...[...] | $@ | array_flow.rb:129:19:129:28 | call to source | call to source | +| array_flow.rb:131:10:131:13 | ...[...] | array_flow.rb:129:19:129:28 | call to source | array_flow.rb:131:10:131:13 | ...[...] | $@ | array_flow.rb:129:19:129:28 | call to source | call to source | +| array_flow.rb:132:10:132:13 | ...[...] | array_flow.rb:129:19:129:28 | call to source | array_flow.rb:132:10:132:13 | ...[...] | $@ | array_flow.rb:129:19:129:28 | call to source | call to source | +| array_flow.rb:138:10:138:13 | ...[...] | array_flow.rb:137:15:137:24 | call to source | array_flow.rb:138:10:138:13 | ...[...] | $@ | array_flow.rb:137:15:137:24 | call to source | call to source | +| array_flow.rb:139:10:139:13 | ...[...] | array_flow.rb:137:15:137:24 | call to source | array_flow.rb:139:10:139:13 | ...[...] | $@ | array_flow.rb:137:15:137:24 | call to source | call to source | +| array_flow.rb:140:10:140:13 | ...[...] | array_flow.rb:137:15:137:24 | call to source | array_flow.rb:140:10:140:13 | ...[...] | $@ | array_flow.rb:137:15:137:24 | call to source | call to source | +| array_flow.rb:146:10:146:13 | ...[...] | array_flow.rb:145:19:145:28 | call to source | array_flow.rb:146:10:146:13 | ...[...] | $@ | array_flow.rb:145:19:145:28 | call to source | call to source | +| array_flow.rb:147:10:147:13 | ...[...] | array_flow.rb:145:19:145:28 | call to source | array_flow.rb:147:10:147:13 | ...[...] | $@ | array_flow.rb:145:19:145:28 | call to source | call to source | +| array_flow.rb:148:10:148:13 | ...[...] | array_flow.rb:145:19:145:28 | call to source | array_flow.rb:148:10:148:13 | ...[...] | $@ | array_flow.rb:145:19:145:28 | call to source | call to source | +| array_flow.rb:154:14:154:14 | x | array_flow.rb:152:16:152:25 | call to source | array_flow.rb:154:14:154:14 | x | $@ | array_flow.rb:152:16:152:25 | call to source | call to source | +| array_flow.rb:161:14:161:14 | x | array_flow.rb:159:16:159:25 | call to source | array_flow.rb:161:14:161:14 | x | $@ | array_flow.rb:159:16:159:25 | call to source | call to source | +| array_flow.rb:168:10:168:13 | ...[...] | array_flow.rb:166:10:166:21 | call to source | array_flow.rb:168:10:168:13 | ...[...] | $@ | array_flow.rb:166:10:166:21 | call to source | call to source | +| array_flow.rb:168:10:168:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source | array_flow.rb:168:10:168:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source | call to source | +| array_flow.rb:168:10:168:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source | array_flow.rb:168:10:168:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source | call to source | +| array_flow.rb:169:10:169:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source | array_flow.rb:169:10:169:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source | call to source | +| array_flow.rb:169:10:169:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source | array_flow.rb:169:10:169:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source | call to source | +| array_flow.rb:170:10:170:13 | ...[...] | array_flow.rb:166:10:166:21 | call to source | array_flow.rb:170:10:170:13 | ...[...] | $@ | array_flow.rb:166:10:166:21 | call to source | call to source | +| array_flow.rb:170:10:170:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source | array_flow.rb:170:10:170:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source | call to source | +| array_flow.rb:170:10:170:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source | array_flow.rb:170:10:170:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source | call to source | +| array_flow.rb:171:10:171:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source | array_flow.rb:171:10:171:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source | call to source | +| array_flow.rb:171:10:171:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source | array_flow.rb:171:10:171:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source | call to source | +| array_flow.rb:179:10:179:26 | ( ... ) | array_flow.rb:177:15:177:24 | call to source | array_flow.rb:179:10:179:26 | ( ... ) | $@ | array_flow.rb:177:15:177:24 | call to source | call to source | +| array_flow.rb:180:10:180:26 | ( ... ) | array_flow.rb:177:15:177:24 | call to source | array_flow.rb:180:10:180:26 | ( ... ) | $@ | array_flow.rb:177:15:177:24 | call to source | call to source | +| array_flow.rb:186:10:186:16 | call to at | array_flow.rb:184:13:184:22 | call to source | array_flow.rb:186:10:186:16 | call to at | $@ | array_flow.rb:184:13:184:22 | call to source | call to source | +| array_flow.rb:188:10:188:16 | call to at | array_flow.rb:184:13:184:22 | call to source | array_flow.rb:188:10:188:16 | call to at | $@ | array_flow.rb:184:13:184:22 | call to source | call to source | +| array_flow.rb:194:14:194:14 | x | array_flow.rb:192:16:192:25 | call to source | array_flow.rb:194:14:194:14 | x | $@ | array_flow.rb:192:16:192:25 | call to source | call to source | +| array_flow.rb:196:10:196:10 | b | array_flow.rb:192:16:192:25 | call to source | array_flow.rb:196:10:196:10 | b | $@ | array_flow.rb:192:16:192:25 | call to source | call to source | +| array_flow.rb:202:14:202:14 | x | array_flow.rb:200:16:200:25 | call to source | array_flow.rb:202:14:202:14 | x | $@ | array_flow.rb:200:16:200:25 | call to source | call to source | +| array_flow.rb:210:14:210:14 | x | array_flow.rb:208:16:208:25 | call to source | array_flow.rb:210:14:210:14 | x | $@ | array_flow.rb:208:16:208:25 | call to source | call to source | +| array_flow.rb:217:14:217:14 | x | array_flow.rb:215:16:215:27 | call to source | array_flow.rb:217:14:217:14 | x | $@ | array_flow.rb:215:16:215:27 | call to source | call to source | +| array_flow.rb:217:14:217:14 | x | array_flow.rb:215:30:215:41 | call to source | array_flow.rb:217:14:217:14 | x | $@ | array_flow.rb:215:30:215:41 | call to source | call to source | +| array_flow.rb:218:14:218:14 | y | array_flow.rb:215:16:215:27 | call to source | array_flow.rb:218:14:218:14 | y | $@ | array_flow.rb:215:16:215:27 | call to source | call to source | +| array_flow.rb:218:14:218:14 | y | array_flow.rb:215:30:215:41 | call to source | array_flow.rb:218:14:218:14 | y | $@ | array_flow.rb:215:30:215:41 | call to source | call to source | +| array_flow.rb:233:14:233:14 | x | array_flow.rb:231:16:231:27 | call to source | array_flow.rb:233:14:233:14 | x | $@ | array_flow.rb:231:16:231:27 | call to source | call to source | +| array_flow.rb:236:10:236:13 | ...[...] | array_flow.rb:234:9:234:19 | call to source | array_flow.rb:236:10:236:13 | ...[...] | $@ | array_flow.rb:234:9:234:19 | call to source | call to source | +| array_flow.rb:242:14:242:14 | x | array_flow.rb:240:16:240:27 | call to source | array_flow.rb:242:14:242:14 | x | $@ | array_flow.rb:240:16:240:27 | call to source | call to source | +| array_flow.rb:245:10:245:13 | ...[...] | array_flow.rb:243:9:243:19 | call to source | array_flow.rb:245:10:245:13 | ...[...] | $@ | array_flow.rb:243:9:243:19 | call to source | call to source | +| array_flow.rb:246:10:246:13 | ...[...] | array_flow.rb:243:9:243:19 | call to source | array_flow.rb:246:10:246:13 | ...[...] | $@ | array_flow.rb:243:9:243:19 | call to source | call to source | +| array_flow.rb:252:14:252:14 | x | array_flow.rb:250:16:250:27 | call to source | array_flow.rb:252:14:252:14 | x | $@ | array_flow.rb:250:16:250:27 | call to source | call to source | +| array_flow.rb:255:10:255:13 | ...[...] | array_flow.rb:250:16:250:27 | call to source | array_flow.rb:255:10:255:13 | ...[...] | $@ | array_flow.rb:250:16:250:27 | call to source | call to source | +| array_flow.rb:255:10:255:13 | ...[...] | array_flow.rb:253:13:253:24 | call to source | array_flow.rb:255:10:255:13 | ...[...] | $@ | array_flow.rb:253:13:253:24 | call to source | call to source | +| array_flow.rb:257:14:257:14 | x | array_flow.rb:250:16:250:27 | call to source | array_flow.rb:257:14:257:14 | x | $@ | array_flow.rb:250:16:250:27 | call to source | call to source | +| array_flow.rb:260:10:260:13 | ...[...] | array_flow.rb:258:9:258:20 | call to source | array_flow.rb:260:10:260:13 | ...[...] | $@ | array_flow.rb:258:9:258:20 | call to source | call to source | +| array_flow.rb:266:14:266:17 | ...[...] | array_flow.rb:264:16:264:25 | call to source | array_flow.rb:266:14:266:17 | ...[...] | $@ | array_flow.rb:264:16:264:25 | call to source | call to source | +| array_flow.rb:269:10:269:13 | ...[...] | array_flow.rb:264:16:264:25 | call to source | array_flow.rb:269:10:269:13 | ...[...] | $@ | array_flow.rb:264:16:264:25 | call to source | call to source | +| array_flow.rb:275:10:275:13 | ...[...] | array_flow.rb:273:16:273:25 | call to source | array_flow.rb:275:10:275:13 | ...[...] | $@ | array_flow.rb:273:16:273:25 | call to source | call to source | +| array_flow.rb:281:10:281:13 | ...[...] | array_flow.rb:279:16:279:25 | call to source | array_flow.rb:281:10:281:13 | ...[...] | $@ | array_flow.rb:279:16:279:25 | call to source | call to source | +| array_flow.rb:282:10:282:13 | ...[...] | array_flow.rb:279:16:279:25 | call to source | array_flow.rb:282:10:282:13 | ...[...] | $@ | array_flow.rb:279:16:279:25 | call to source | call to source | +| array_flow.rb:289:10:289:13 | ...[...] | array_flow.rb:287:16:287:27 | call to source | array_flow.rb:289:10:289:13 | ...[...] | $@ | array_flow.rb:287:16:287:27 | call to source | call to source | +| array_flow.rb:290:10:290:13 | ...[...] | array_flow.rb:286:16:286:27 | call to source | array_flow.rb:290:10:290:13 | ...[...] | $@ | array_flow.rb:286:16:286:27 | call to source | call to source | +| array_flow.rb:290:10:290:13 | ...[...] | array_flow.rb:287:16:287:27 | call to source | array_flow.rb:290:10:290:13 | ...[...] | $@ | array_flow.rb:287:16:287:27 | call to source | call to source | +| array_flow.rb:296:14:296:14 | x | array_flow.rb:294:16:294:25 | call to source | array_flow.rb:296:14:296:14 | x | $@ | array_flow.rb:294:16:294:25 | call to source | call to source | +| array_flow.rb:303:14:303:14 | x | array_flow.rb:301:16:301:25 | call to source | array_flow.rb:303:14:303:14 | x | $@ | array_flow.rb:301:16:301:25 | call to source | call to source | +| array_flow.rb:312:10:312:13 | ...[...] | array_flow.rb:308:16:308:25 | call to source | array_flow.rb:312:10:312:13 | ...[...] | $@ | array_flow.rb:308:16:308:25 | call to source | call to source | +| array_flow.rb:318:10:318:10 | b | array_flow.rb:316:16:316:27 | call to source | array_flow.rb:318:10:318:10 | b | $@ | array_flow.rb:316:16:316:27 | call to source | call to source | +| array_flow.rb:318:10:318:10 | b | array_flow.rb:317:23:317:34 | call to source | array_flow.rb:318:10:318:10 | b | $@ | array_flow.rb:317:23:317:34 | call to source | call to source | +| array_flow.rb:327:10:327:10 | b | array_flow.rb:325:16:325:27 | call to source | array_flow.rb:327:10:327:10 | b | $@ | array_flow.rb:325:16:325:27 | call to source | call to source | +| array_flow.rb:328:10:328:13 | ...[...] | array_flow.rb:325:30:325:41 | call to source | array_flow.rb:328:10:328:13 | ...[...] | $@ | array_flow.rb:325:30:325:41 | call to source | call to source | +| array_flow.rb:332:10:332:10 | b | array_flow.rb:330:16:330:27 | call to source | array_flow.rb:332:10:332:10 | b | $@ | array_flow.rb:330:16:330:27 | call to source | call to source | +| array_flow.rb:332:10:332:10 | b | array_flow.rb:330:30:330:41 | call to source | array_flow.rb:332:10:332:10 | b | $@ | array_flow.rb:330:30:330:41 | call to source | call to source | +| array_flow.rb:333:10:333:13 | ...[...] | array_flow.rb:330:16:330:27 | call to source | array_flow.rb:333:10:333:13 | ...[...] | $@ | array_flow.rb:330:16:330:27 | call to source | call to source | +| array_flow.rb:333:10:333:13 | ...[...] | array_flow.rb:330:30:330:41 | call to source | array_flow.rb:333:10:333:13 | ...[...] | $@ | array_flow.rb:330:30:330:41 | call to source | call to source | +| array_flow.rb:334:10:334:13 | ...[...] | array_flow.rb:330:16:330:27 | call to source | array_flow.rb:334:10:334:13 | ...[...] | $@ | array_flow.rb:330:16:330:27 | call to source | call to source | +| array_flow.rb:334:10:334:13 | ...[...] | array_flow.rb:330:30:330:41 | call to source | array_flow.rb:334:10:334:13 | ...[...] | $@ | array_flow.rb:330:30:330:41 | call to source | call to source | +| array_flow.rb:340:14:340:14 | x | array_flow.rb:338:16:338:25 | call to source | array_flow.rb:340:14:340:14 | x | $@ | array_flow.rb:338:16:338:25 | call to source | call to source | +| array_flow.rb:342:10:342:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source | array_flow.rb:342:10:342:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source | call to source | +| array_flow.rb:343:10:343:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source | array_flow.rb:343:10:343:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source | call to source | +| array_flow.rb:344:10:344:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source | array_flow.rb:344:10:344:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source | call to source | +| array_flow.rb:345:10:345:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source | array_flow.rb:345:10:345:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source | call to source | +| array_flow.rb:351:10:351:13 | ...[...] | array_flow.rb:349:16:349:25 | call to source | array_flow.rb:351:10:351:13 | ...[...] | $@ | array_flow.rb:349:16:349:25 | call to source | call to source | +| array_flow.rb:357:10:357:17 | call to dig | array_flow.rb:355:16:355:27 | call to source | array_flow.rb:357:10:357:17 | call to dig | $@ | array_flow.rb:355:16:355:27 | call to source | call to source | +| array_flow.rb:358:10:358:17 | call to dig | array_flow.rb:355:16:355:27 | call to source | array_flow.rb:358:10:358:17 | call to dig | $@ | array_flow.rb:355:16:355:27 | call to source | call to source | +| array_flow.rb:360:10:360:19 | call to dig | array_flow.rb:355:34:355:45 | call to source | array_flow.rb:360:10:360:19 | call to dig | $@ | array_flow.rb:355:34:355:45 | call to source | call to source | +| array_flow.rb:366:14:366:14 | x | array_flow.rb:364:16:364:27 | call to source | array_flow.rb:366:14:366:14 | x | $@ | array_flow.rb:364:16:364:27 | call to source | call to source | +| array_flow.rb:368:10:368:10 | b | array_flow.rb:364:16:364:27 | call to source | array_flow.rb:368:10:368:10 | b | $@ | array_flow.rb:364:16:364:27 | call to source | call to source | +| array_flow.rb:368:10:368:10 | b | array_flow.rb:365:23:365:34 | call to source | array_flow.rb:368:10:368:10 | b | $@ | array_flow.rb:365:23:365:34 | call to source | call to source | +| array_flow.rb:374:10:374:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source | array_flow.rb:374:10:374:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source | call to source | +| array_flow.rb:374:10:374:13 | ...[...] | array_flow.rb:372:30:372:41 | call to source | array_flow.rb:374:10:374:13 | ...[...] | $@ | array_flow.rb:372:30:372:41 | call to source | call to source | +| array_flow.rb:377:10:377:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source | array_flow.rb:377:10:377:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source | call to source | +| array_flow.rb:378:10:378:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source | array_flow.rb:378:10:378:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source | call to source | +| array_flow.rb:378:10:378:13 | ...[...] | array_flow.rb:372:30:372:41 | call to source | array_flow.rb:378:10:378:13 | ...[...] | $@ | array_flow.rb:372:30:372:41 | call to source | call to source | +| array_flow.rb:381:10:381:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source | array_flow.rb:381:10:381:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source | call to source | +| array_flow.rb:381:10:381:13 | ...[...] | array_flow.rb:379:12:379:23 | call to source | array_flow.rb:381:10:381:13 | ...[...] | $@ | array_flow.rb:379:12:379:23 | call to source | call to source | +| array_flow.rb:383:10:383:13 | ...[...] | array_flow.rb:379:12:379:23 | call to source | array_flow.rb:383:10:383:13 | ...[...] | $@ | array_flow.rb:379:12:379:23 | call to source | call to source | +| array_flow.rb:389:14:389:14 | x | array_flow.rb:387:16:387:27 | call to source | array_flow.rb:389:14:389:14 | x | $@ | array_flow.rb:387:16:387:27 | call to source | call to source | +| array_flow.rb:389:14:389:14 | x | array_flow.rb:387:30:387:41 | call to source | array_flow.rb:389:14:389:14 | x | $@ | array_flow.rb:387:30:387:41 | call to source | call to source | +| array_flow.rb:391:10:391:13 | ...[...] | array_flow.rb:387:16:387:27 | call to source | array_flow.rb:391:10:391:13 | ...[...] | $@ | array_flow.rb:387:16:387:27 | call to source | call to source | +| array_flow.rb:391:10:391:13 | ...[...] | array_flow.rb:387:30:387:41 | call to source | array_flow.rb:391:10:391:13 | ...[...] | $@ | array_flow.rb:387:30:387:41 | call to source | call to source | +| array_flow.rb:397:14:397:14 | x | array_flow.rb:395:16:395:25 | call to source | array_flow.rb:397:14:397:14 | x | $@ | array_flow.rb:395:16:395:25 | call to source | call to source | +| array_flow.rb:399:10:399:13 | ...[...] | array_flow.rb:395:16:395:25 | call to source | array_flow.rb:399:10:399:13 | ...[...] | $@ | array_flow.rb:395:16:395:25 | call to source | call to source | +| array_flow.rb:405:14:405:14 | x | array_flow.rb:403:16:403:25 | call to source | array_flow.rb:405:14:405:14 | x | $@ | array_flow.rb:403:16:403:25 | call to source | call to source | +| array_flow.rb:407:10:407:10 | x | array_flow.rb:403:16:403:25 | call to source | array_flow.rb:407:10:407:10 | x | $@ | array_flow.rb:403:16:403:25 | call to source | call to source | +| array_flow.rb:408:10:408:13 | ...[...] | array_flow.rb:403:16:403:25 | call to source | array_flow.rb:408:10:408:13 | ...[...] | $@ | array_flow.rb:403:16:403:25 | call to source | call to source | +| array_flow.rb:414:14:414:19 | ( ... ) | array_flow.rb:412:16:412:25 | call to source | array_flow.rb:414:14:414:19 | ( ... ) | $@ | array_flow.rb:412:16:412:25 | call to source | call to source | +| array_flow.rb:421:14:421:14 | x | array_flow.rb:419:16:419:25 | call to source | array_flow.rb:421:14:421:14 | x | $@ | array_flow.rb:419:16:419:25 | call to source | call to source | +| array_flow.rb:423:10:423:13 | ...[...] | array_flow.rb:419:16:419:25 | call to source | array_flow.rb:423:10:423:13 | ...[...] | $@ | array_flow.rb:419:16:419:25 | call to source | call to source | +| array_flow.rb:431:10:431:13 | ...[...] | array_flow.rb:427:16:427:25 | call to source | array_flow.rb:431:10:431:13 | ...[...] | $@ | array_flow.rb:427:16:427:25 | call to source | call to source | +| array_flow.rb:437:14:437:17 | ...[...] | array_flow.rb:435:19:435:28 | call to source | array_flow.rb:437:14:437:17 | ...[...] | $@ | array_flow.rb:435:19:435:28 | call to source | call to source | +| array_flow.rb:444:14:444:14 | x | array_flow.rb:442:19:442:28 | call to source | array_flow.rb:444:14:444:14 | x | $@ | array_flow.rb:442:19:442:28 | call to source | call to source | +| array_flow.rb:447:10:447:13 | ...[...] | array_flow.rb:442:19:442:28 | call to source | array_flow.rb:447:10:447:13 | ...[...] | $@ | array_flow.rb:442:19:442:28 | call to source | call to source | +| array_flow.rb:453:14:453:14 | x | array_flow.rb:451:19:451:30 | call to source | array_flow.rb:453:14:453:14 | x | $@ | array_flow.rb:451:19:451:30 | call to source | call to source | +| array_flow.rb:454:14:454:14 | a | array_flow.rb:452:28:452:39 | call to source | array_flow.rb:454:14:454:14 | a | $@ | array_flow.rb:452:28:452:39 | call to source | call to source | +| array_flow.rb:456:10:456:10 | b | array_flow.rb:452:28:452:39 | call to source | array_flow.rb:456:10:456:10 | b | $@ | array_flow.rb:452:28:452:39 | call to source | call to source | +| array_flow.rb:462:10:462:13 | ...[...] | array_flow.rb:460:19:460:28 | call to source | array_flow.rb:462:10:462:13 | ...[...] | $@ | array_flow.rb:460:19:460:28 | call to source | call to source | +| array_flow.rb:468:14:468:14 | x | array_flow.rb:467:17:467:28 | call to source | array_flow.rb:468:14:468:14 | x | $@ | array_flow.rb:467:17:467:28 | call to source | call to source | +| array_flow.rb:470:10:470:10 | b | array_flow.rb:466:19:466:30 | call to source | array_flow.rb:470:10:470:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source | call to source | +| array_flow.rb:470:10:470:10 | b | array_flow.rb:466:33:466:44 | call to source | array_flow.rb:470:10:470:10 | b | $@ | array_flow.rb:466:33:466:44 | call to source | call to source | +| array_flow.rb:472:10:472:10 | b | array_flow.rb:466:19:466:30 | call to source | array_flow.rb:472:10:472:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source | call to source | +| array_flow.rb:474:10:474:10 | b | array_flow.rb:466:19:466:30 | call to source | array_flow.rb:474:10:474:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source | call to source | +| array_flow.rb:474:10:474:10 | b | array_flow.rb:473:20:473:31 | call to source | array_flow.rb:474:10:474:10 | b | $@ | array_flow.rb:473:20:473:31 | call to source | call to source | +| array_flow.rb:476:10:476:10 | b | array_flow.rb:475:22:475:33 | call to source | array_flow.rb:476:10:476:10 | b | $@ | array_flow.rb:475:22:475:33 | call to source | call to source | +| array_flow.rb:478:10:478:10 | b | array_flow.rb:466:19:466:30 | call to source | array_flow.rb:478:10:478:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source | call to source | +| array_flow.rb:478:10:478:10 | b | array_flow.rb:466:33:466:44 | call to source | array_flow.rb:478:10:478:10 | b | $@ | array_flow.rb:466:33:466:44 | call to source | call to source | +| array_flow.rb:478:10:478:10 | b | array_flow.rb:477:20:477:31 | call to source | array_flow.rb:478:10:478:10 | b | $@ | array_flow.rb:477:20:477:31 | call to source | call to source | +| array_flow.rb:484:10:484:13 | ...[...] | array_flow.rb:482:19:482:30 | call to source | array_flow.rb:484:10:484:13 | ...[...] | $@ | array_flow.rb:482:19:482:30 | call to source | call to source | +| array_flow.rb:484:10:484:13 | ...[...] | array_flow.rb:483:12:483:23 | call to source | array_flow.rb:484:10:484:13 | ...[...] | $@ | array_flow.rb:483:12:483:23 | call to source | call to source | +| array_flow.rb:486:10:486:13 | ...[...] | array_flow.rb:485:12:485:23 | call to source | array_flow.rb:486:10:486:13 | ...[...] | $@ | array_flow.rb:485:12:485:23 | call to source | call to source | +| array_flow.rb:490:10:490:13 | ...[...] | array_flow.rb:488:9:488:20 | call to source | array_flow.rb:490:10:490:13 | ...[...] | $@ | array_flow.rb:488:9:488:20 | call to source | call to source | +| array_flow.rb:494:10:494:13 | ...[...] | array_flow.rb:488:9:488:20 | call to source | array_flow.rb:494:10:494:13 | ...[...] | $@ | array_flow.rb:488:9:488:20 | call to source | call to source | +| array_flow.rb:494:10:494:13 | ...[...] | array_flow.rb:492:9:492:20 | call to source | array_flow.rb:494:10:494:13 | ...[...] | $@ | array_flow.rb:492:9:492:20 | call to source | call to source | +| array_flow.rb:500:14:500:14 | x | array_flow.rb:498:19:498:28 | call to source | array_flow.rb:500:14:500:14 | x | $@ | array_flow.rb:498:19:498:28 | call to source | call to source | +| array_flow.rb:502:10:502:13 | ...[...] | array_flow.rb:498:19:498:28 | call to source | array_flow.rb:502:10:502:13 | ...[...] | $@ | array_flow.rb:498:19:498:28 | call to source | call to source | +| array_flow.rb:508:14:508:14 | x | array_flow.rb:506:19:506:28 | call to source | array_flow.rb:508:14:508:14 | x | $@ | array_flow.rb:506:19:506:28 | call to source | call to source | +| array_flow.rb:510:10:510:13 | ...[...] | array_flow.rb:506:19:506:28 | call to source | array_flow.rb:510:10:510:13 | ...[...] | $@ | array_flow.rb:506:19:506:28 | call to source | call to source | +| array_flow.rb:516:14:516:14 | x | array_flow.rb:514:19:514:28 | call to source | array_flow.rb:516:14:516:14 | x | $@ | array_flow.rb:514:19:514:28 | call to source | call to source | +| array_flow.rb:519:10:519:13 | ...[...] | array_flow.rb:514:19:514:28 | call to source | array_flow.rb:519:10:519:13 | ...[...] | $@ | array_flow.rb:514:19:514:28 | call to source | call to source | +| array_flow.rb:520:10:520:13 | ...[...] | array_flow.rb:514:19:514:28 | call to source | array_flow.rb:520:10:520:13 | ...[...] | $@ | array_flow.rb:514:19:514:28 | call to source | call to source | +| array_flow.rb:526:14:526:14 | x | array_flow.rb:524:19:524:30 | call to source | array_flow.rb:526:14:526:14 | x | $@ | array_flow.rb:524:19:524:30 | call to source | call to source | +| array_flow.rb:528:10:528:10 | b | array_flow.rb:524:19:524:30 | call to source | array_flow.rb:528:10:528:10 | b | $@ | array_flow.rb:524:19:524:30 | call to source | call to source | +| array_flow.rb:528:10:528:10 | b | array_flow.rb:525:21:525:32 | call to source | array_flow.rb:528:10:528:10 | b | $@ | array_flow.rb:525:21:525:32 | call to source | call to source | +| array_flow.rb:534:14:534:14 | x | array_flow.rb:532:19:532:28 | call to source | array_flow.rb:534:14:534:14 | x | $@ | array_flow.rb:532:19:532:28 | call to source | call to source | +| array_flow.rb:536:10:536:13 | ...[...] | array_flow.rb:532:19:532:28 | call to source | array_flow.rb:536:10:536:13 | ...[...] | $@ | array_flow.rb:532:19:532:28 | call to source | call to source | +| array_flow.rb:542:14:542:14 | x | array_flow.rb:540:19:540:28 | call to source | array_flow.rb:542:14:542:14 | x | $@ | array_flow.rb:540:19:540:28 | call to source | call to source | +| array_flow.rb:549:10:549:16 | call to first | array_flow.rb:547:10:547:21 | call to source | array_flow.rb:549:10:549:16 | call to first | $@ | array_flow.rb:547:10:547:21 | call to source | call to source | +| array_flow.rb:549:10:549:16 | call to first | array_flow.rb:548:12:548:23 | call to source | array_flow.rb:549:10:549:16 | call to first | $@ | array_flow.rb:548:12:548:23 | call to source | call to source | +| array_flow.rb:551:10:551:13 | ...[...] | array_flow.rb:547:10:547:21 | call to source | array_flow.rb:551:10:551:13 | ...[...] | $@ | array_flow.rb:547:10:547:21 | call to source | call to source | +| array_flow.rb:551:10:551:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source | array_flow.rb:551:10:551:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source | call to source | +| array_flow.rb:552:10:552:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source | array_flow.rb:552:10:552:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source | call to source | +| array_flow.rb:554:10:554:13 | ...[...] | array_flow.rb:547:10:547:21 | call to source | array_flow.rb:554:10:554:13 | ...[...] | $@ | array_flow.rb:547:10:547:21 | call to source | call to source | +| array_flow.rb:554:10:554:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source | array_flow.rb:554:10:554:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source | call to source | +| array_flow.rb:555:10:555:13 | ...[...] | array_flow.rb:547:30:547:41 | call to source | array_flow.rb:555:10:555:13 | ...[...] | $@ | array_flow.rb:547:30:547:41 | call to source | call to source | +| array_flow.rb:555:10:555:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source | array_flow.rb:555:10:555:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source | call to source | +| array_flow.rb:561:14:561:14 | x | array_flow.rb:559:16:559:27 | call to source | array_flow.rb:561:14:561:14 | x | $@ | array_flow.rb:559:16:559:27 | call to source | call to source | +| array_flow.rb:564:10:564:13 | ...[...] | array_flow.rb:559:16:559:27 | call to source | array_flow.rb:564:10:564:13 | ...[...] | $@ | array_flow.rb:559:16:559:27 | call to source | call to source | +| array_flow.rb:564:10:564:13 | ...[...] | array_flow.rb:562:13:562:24 | call to source | array_flow.rb:564:10:564:13 | ...[...] | $@ | array_flow.rb:562:13:562:24 | call to source | call to source | +| array_flow.rb:566:14:566:14 | x | array_flow.rb:559:16:559:27 | call to source | array_flow.rb:566:14:566:14 | x | $@ | array_flow.rb:559:16:559:27 | call to source | call to source | +| array_flow.rb:569:10:569:13 | ...[...] | array_flow.rb:567:9:567:20 | call to source | array_flow.rb:569:10:569:13 | ...[...] | $@ | array_flow.rb:567:9:567:20 | call to source | call to source | +| array_flow.rb:575:10:575:13 | ...[...] | array_flow.rb:573:20:573:29 | call to source | array_flow.rb:575:10:575:13 | ...[...] | $@ | array_flow.rb:573:20:573:29 | call to source | call to source | +| array_flow.rb:580:10:580:16 | ...[...] | array_flow.rb:579:20:579:29 | call to source | array_flow.rb:580:10:580:16 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source | call to source | +| array_flow.rb:582:10:582:13 | ...[...] | array_flow.rb:579:20:579:29 | call to source | array_flow.rb:582:10:582:13 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source | call to source | +| array_flow.rb:583:10:583:16 | ...[...] | array_flow.rb:579:20:579:29 | call to source | array_flow.rb:583:10:583:16 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source | call to source | +| array_flow.rb:584:10:584:13 | ...[...] | array_flow.rb:579:20:579:29 | call to source | array_flow.rb:584:10:584:13 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source | call to source | +| array_flow.rb:585:10:585:16 | ...[...] | array_flow.rb:579:20:579:29 | call to source | array_flow.rb:585:10:585:16 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source | call to source | +| array_flow.rb:591:10:591:13 | ...[...] | array_flow.rb:589:19:589:30 | call to source | array_flow.rb:591:10:591:13 | ...[...] | $@ | array_flow.rb:589:19:589:30 | call to source | call to source | +| array_flow.rb:593:14:593:14 | x | array_flow.rb:589:19:589:30 | call to source | array_flow.rb:593:14:593:14 | x | $@ | array_flow.rb:589:19:589:30 | call to source | call to source | +| array_flow.rb:596:10:596:13 | ...[...] | array_flow.rb:594:9:594:20 | call to source | array_flow.rb:596:10:596:13 | ...[...] | $@ | array_flow.rb:594:9:594:20 | call to source | call to source | +| array_flow.rb:602:10:602:13 | ...[...] | array_flow.rb:600:19:600:30 | call to source | array_flow.rb:602:10:602:13 | ...[...] | $@ | array_flow.rb:600:19:600:30 | call to source | call to source | +| array_flow.rb:604:14:604:14 | x | array_flow.rb:600:19:600:30 | call to source | array_flow.rb:604:14:604:14 | x | $@ | array_flow.rb:600:19:600:30 | call to source | call to source | +| array_flow.rb:607:10:607:13 | ...[...] | array_flow.rb:605:9:605:20 | call to source | array_flow.rb:607:10:607:13 | ...[...] | $@ | array_flow.rb:605:9:605:20 | call to source | call to source | +| array_flow.rb:613:14:613:14 | x | array_flow.rb:611:19:611:30 | call to source | array_flow.rb:613:14:613:14 | x | $@ | array_flow.rb:611:19:611:30 | call to source | call to source | +| array_flow.rb:622:14:622:14 | x | array_flow.rb:620:19:620:28 | call to source | array_flow.rb:622:14:622:14 | x | $@ | array_flow.rb:620:19:620:28 | call to source | call to source | +| array_flow.rb:629:14:629:14 | x | array_flow.rb:627:10:627:21 | call to source | array_flow.rb:629:14:629:14 | x | $@ | array_flow.rb:627:10:627:21 | call to source | call to source | +| array_flow.rb:630:14:630:14 | y | array_flow.rb:627:27:627:38 | call to source | array_flow.rb:630:14:630:14 | y | $@ | array_flow.rb:627:27:627:38 | call to source | call to source | +| array_flow.rb:633:10:633:10 | b | array_flow.rb:631:9:631:19 | call to source | array_flow.rb:633:10:633:10 | b | $@ | array_flow.rb:631:9:631:19 | call to source | call to source | +| array_flow.rb:636:14:636:14 | y | array_flow.rb:627:10:627:21 | call to source | array_flow.rb:636:14:636:14 | y | $@ | array_flow.rb:627:10:627:21 | call to source | call to source | +| array_flow.rb:636:14:636:14 | y | array_flow.rb:627:27:627:38 | call to source | array_flow.rb:636:14:636:14 | y | $@ | array_flow.rb:627:27:627:38 | call to source | call to source | +| array_flow.rb:639:10:639:10 | c | array_flow.rb:637:9:637:19 | call to source | array_flow.rb:639:10:639:10 | c | $@ | array_flow.rb:637:9:637:19 | call to source | call to source | +| array_flow.rb:647:10:647:13 | ...[...] | array_flow.rb:645:21:645:32 | call to source | array_flow.rb:647:10:647:13 | ...[...] | $@ | array_flow.rb:645:21:645:32 | call to source | call to source | +| array_flow.rb:648:10:648:13 | ...[...] | array_flow.rb:645:35:645:46 | call to source | array_flow.rb:648:10:648:13 | ...[...] | $@ | array_flow.rb:645:35:645:46 | call to source | call to source | +| array_flow.rb:650:10:650:13 | ...[...] | array_flow.rb:644:16:644:27 | call to source | array_flow.rb:650:10:650:13 | ...[...] | $@ | array_flow.rb:644:16:644:27 | call to source | call to source | +| array_flow.rb:652:10:652:13 | ...[...] | array_flow.rb:645:21:645:32 | call to source | array_flow.rb:652:10:652:13 | ...[...] | $@ | array_flow.rb:645:21:645:32 | call to source | call to source | +| array_flow.rb:653:10:653:13 | ...[...] | array_flow.rb:645:35:645:46 | call to source | array_flow.rb:653:10:653:13 | ...[...] | $@ | array_flow.rb:645:35:645:46 | call to source | call to source | +| array_flow.rb:655:10:655:13 | ...[...] | array_flow.rb:644:16:644:27 | call to source | array_flow.rb:655:10:655:13 | ...[...] | $@ | array_flow.rb:644:16:644:27 | call to source | call to source | +| array_flow.rb:660:10:660:13 | ...[...] | array_flow.rb:658:16:658:27 | call to source | array_flow.rb:660:10:660:13 | ...[...] | $@ | array_flow.rb:658:16:658:27 | call to source | call to source | +| array_flow.rb:660:10:660:13 | ...[...] | array_flow.rb:659:21:659:32 | call to source | array_flow.rb:660:10:660:13 | ...[...] | $@ | array_flow.rb:659:21:659:32 | call to source | call to source | +| array_flow.rb:660:10:660:13 | ...[...] | array_flow.rb:659:35:659:46 | call to source | array_flow.rb:660:10:660:13 | ...[...] | $@ | array_flow.rb:659:35:659:46 | call to source | call to source | +| array_flow.rb:661:10:661:13 | ...[...] | array_flow.rb:658:16:658:27 | call to source | array_flow.rb:661:10:661:13 | ...[...] | $@ | array_flow.rb:658:16:658:27 | call to source | call to source | +| array_flow.rb:661:10:661:13 | ...[...] | array_flow.rb:659:21:659:32 | call to source | array_flow.rb:661:10:661:13 | ...[...] | $@ | array_flow.rb:659:21:659:32 | call to source | call to source | +| array_flow.rb:661:10:661:13 | ...[...] | array_flow.rb:659:35:659:46 | call to source | array_flow.rb:661:10:661:13 | ...[...] | $@ | array_flow.rb:659:35:659:46 | call to source | call to source | +| array_flow.rb:674:10:674:13 | ...[...] | array_flow.rb:672:16:672:27 | call to source | array_flow.rb:674:10:674:13 | ...[...] | $@ | array_flow.rb:672:16:672:27 | call to source | call to source | +| array_flow.rb:674:10:674:13 | ...[...] | array_flow.rb:673:31:673:42 | call to source | array_flow.rb:674:10:674:13 | ...[...] | $@ | array_flow.rb:673:31:673:42 | call to source | call to source | +| array_flow.rb:674:10:674:13 | ...[...] | array_flow.rb:673:47:673:58 | call to source | array_flow.rb:674:10:674:13 | ...[...] | $@ | array_flow.rb:673:47:673:58 | call to source | call to source | +| array_flow.rb:680:14:680:14 | x | array_flow.rb:678:16:678:25 | call to source | array_flow.rb:680:14:680:14 | x | $@ | array_flow.rb:678:16:678:25 | call to source | call to source | +| array_flow.rb:683:10:683:13 | ...[...] | array_flow.rb:678:16:678:25 | call to source | array_flow.rb:683:10:683:13 | ...[...] | $@ | array_flow.rb:678:16:678:25 | call to source | call to source | +| array_flow.rb:684:10:684:13 | ...[...] | array_flow.rb:678:16:678:25 | call to source | array_flow.rb:684:10:684:13 | ...[...] | $@ | array_flow.rb:678:16:678:25 | call to source | call to source | +| array_flow.rb:690:10:690:15 | call to last | array_flow.rb:688:16:688:27 | call to source | array_flow.rb:690:10:690:15 | call to last | $@ | array_flow.rb:688:16:688:27 | call to source | call to source | +| array_flow.rb:690:10:690:15 | call to last | array_flow.rb:689:12:689:23 | call to source | array_flow.rb:690:10:690:15 | call to last | $@ | array_flow.rb:689:12:689:23 | call to source | call to source | +| array_flow.rb:692:10:692:13 | ...[...] | array_flow.rb:688:16:688:27 | call to source | array_flow.rb:692:10:692:13 | ...[...] | $@ | array_flow.rb:688:16:688:27 | call to source | call to source | +| array_flow.rb:692:10:692:13 | ...[...] | array_flow.rb:689:12:689:23 | call to source | array_flow.rb:692:10:692:13 | ...[...] | $@ | array_flow.rb:689:12:689:23 | call to source | call to source | +| array_flow.rb:693:10:693:13 | ...[...] | array_flow.rb:688:16:688:27 | call to source | array_flow.rb:693:10:693:13 | ...[...] | $@ | array_flow.rb:688:16:688:27 | call to source | call to source | +| array_flow.rb:693:10:693:13 | ...[...] | array_flow.rb:689:12:689:23 | call to source | array_flow.rb:693:10:693:13 | ...[...] | $@ | array_flow.rb:689:12:689:23 | call to source | call to source | +| array_flow.rb:699:14:699:14 | x | array_flow.rb:697:16:697:27 | call to source | array_flow.rb:699:14:699:14 | x | $@ | array_flow.rb:697:16:697:27 | call to source | call to source | +| array_flow.rb:702:10:702:13 | ...[...] | array_flow.rb:700:9:700:19 | call to source | array_flow.rb:702:10:702:13 | ...[...] | $@ | array_flow.rb:700:9:700:19 | call to source | call to source | +| array_flow.rb:708:14:708:14 | x | array_flow.rb:706:16:706:27 | call to source | array_flow.rb:708:14:708:14 | x | $@ | array_flow.rb:706:16:706:27 | call to source | call to source | +| array_flow.rb:711:10:711:13 | ...[...] | array_flow.rb:709:9:709:19 | call to source | array_flow.rb:711:10:711:13 | ...[...] | $@ | array_flow.rb:709:9:709:19 | call to source | call to source | +| array_flow.rb:719:10:719:10 | b | array_flow.rb:715:16:715:25 | call to source | array_flow.rb:719:10:719:10 | b | $@ | array_flow.rb:715:16:715:25 | call to source | call to source | +| array_flow.rb:723:10:723:13 | ...[...] | array_flow.rb:715:16:715:25 | call to source | array_flow.rb:723:10:723:13 | ...[...] | $@ | array_flow.rb:715:16:715:25 | call to source | call to source | +| array_flow.rb:727:14:727:14 | x | array_flow.rb:715:16:715:25 | call to source | array_flow.rb:727:14:727:14 | x | $@ | array_flow.rb:715:16:715:25 | call to source | call to source | +| array_flow.rb:728:14:728:14 | y | array_flow.rb:715:16:715:25 | call to source | array_flow.rb:728:14:728:14 | y | $@ | array_flow.rb:715:16:715:25 | call to source | call to source | +| array_flow.rb:731:10:731:10 | d | array_flow.rb:715:16:715:25 | call to source | array_flow.rb:731:10:731:10 | d | $@ | array_flow.rb:715:16:715:25 | call to source | call to source | +| array_flow.rb:735:14:735:14 | x | array_flow.rb:715:16:715:25 | call to source | array_flow.rb:735:14:735:14 | x | $@ | array_flow.rb:715:16:715:25 | call to source | call to source | +| array_flow.rb:736:14:736:14 | y | array_flow.rb:715:16:715:25 | call to source | array_flow.rb:736:14:736:14 | y | $@ | array_flow.rb:715:16:715:25 | call to source | call to source | +| array_flow.rb:739:10:739:13 | ...[...] | array_flow.rb:715:16:715:25 | call to source | array_flow.rb:739:10:739:13 | ...[...] | $@ | array_flow.rb:715:16:715:25 | call to source | call to source | +| array_flow.rb:747:14:747:14 | x | array_flow.rb:743:16:743:25 | call to source | array_flow.rb:747:14:747:14 | x | $@ | array_flow.rb:743:16:743:25 | call to source | call to source | +| array_flow.rb:750:10:750:10 | b | array_flow.rb:743:16:743:25 | call to source | array_flow.rb:750:10:750:10 | b | $@ | array_flow.rb:743:16:743:25 | call to source | call to source | +| array_flow.rb:754:14:754:14 | x | array_flow.rb:743:16:743:25 | call to source | array_flow.rb:754:14:754:14 | x | $@ | array_flow.rb:743:16:743:25 | call to source | call to source | +| array_flow.rb:757:10:757:13 | ...[...] | array_flow.rb:743:16:743:25 | call to source | array_flow.rb:757:10:757:13 | ...[...] | $@ | array_flow.rb:743:16:743:25 | call to source | call to source | +| array_flow.rb:765:10:765:10 | b | array_flow.rb:761:16:761:25 | call to source | array_flow.rb:765:10:765:10 | b | $@ | array_flow.rb:761:16:761:25 | call to source | call to source | +| array_flow.rb:769:10:769:13 | ...[...] | array_flow.rb:761:16:761:25 | call to source | array_flow.rb:769:10:769:13 | ...[...] | $@ | array_flow.rb:761:16:761:25 | call to source | call to source | +| array_flow.rb:773:14:773:14 | x | array_flow.rb:761:16:761:25 | call to source | array_flow.rb:773:14:773:14 | x | $@ | array_flow.rb:761:16:761:25 | call to source | call to source | +| array_flow.rb:774:14:774:14 | y | array_flow.rb:761:16:761:25 | call to source | array_flow.rb:774:14:774:14 | y | $@ | array_flow.rb:761:16:761:25 | call to source | call to source | +| array_flow.rb:777:10:777:10 | d | array_flow.rb:761:16:761:25 | call to source | array_flow.rb:777:10:777:10 | d | $@ | array_flow.rb:761:16:761:25 | call to source | call to source | +| array_flow.rb:781:14:781:14 | x | array_flow.rb:761:16:761:25 | call to source | array_flow.rb:781:14:781:14 | x | $@ | array_flow.rb:761:16:761:25 | call to source | call to source | +| array_flow.rb:782:14:782:14 | y | array_flow.rb:761:16:761:25 | call to source | array_flow.rb:782:14:782:14 | y | $@ | array_flow.rb:761:16:761:25 | call to source | call to source | +| array_flow.rb:785:10:785:13 | ...[...] | array_flow.rb:761:16:761:25 | call to source | array_flow.rb:785:10:785:13 | ...[...] | $@ | array_flow.rb:761:16:761:25 | call to source | call to source | +| array_flow.rb:793:14:793:14 | x | array_flow.rb:789:16:789:25 | call to source | array_flow.rb:793:14:793:14 | x | $@ | array_flow.rb:789:16:789:25 | call to source | call to source | +| array_flow.rb:796:10:796:10 | b | array_flow.rb:789:16:789:25 | call to source | array_flow.rb:796:10:796:10 | b | $@ | array_flow.rb:789:16:789:25 | call to source | call to source | +| array_flow.rb:800:14:800:14 | x | array_flow.rb:789:16:789:25 | call to source | array_flow.rb:800:14:800:14 | x | $@ | array_flow.rb:789:16:789:25 | call to source | call to source | +| array_flow.rb:803:10:803:13 | ...[...] | array_flow.rb:789:16:789:25 | call to source | array_flow.rb:803:10:803:13 | ...[...] | $@ | array_flow.rb:789:16:789:25 | call to source | call to source | +| array_flow.rb:810:10:810:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source | array_flow.rb:810:10:810:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source | call to source | +| array_flow.rb:811:10:811:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source | array_flow.rb:811:10:811:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source | call to source | +| array_flow.rb:814:14:814:14 | x | array_flow.rb:807:16:807:25 | call to source | array_flow.rb:814:14:814:14 | x | $@ | array_flow.rb:807:16:807:25 | call to source | call to source | +| array_flow.rb:815:14:815:14 | y | array_flow.rb:807:16:807:25 | call to source | array_flow.rb:815:14:815:14 | y | $@ | array_flow.rb:807:16:807:25 | call to source | call to source | +| array_flow.rb:818:10:818:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source | array_flow.rb:818:10:818:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source | call to source | +| array_flow.rb:819:10:819:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source | array_flow.rb:819:10:819:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source | call to source | +| array_flow.rb:825:14:825:14 | x | array_flow.rb:823:16:823:25 | call to source | array_flow.rb:825:14:825:14 | x | $@ | array_flow.rb:823:16:823:25 | call to source | call to source | +| array_flow.rb:828:10:828:13 | ...[...] | array_flow.rb:823:16:823:25 | call to source | array_flow.rb:828:10:828:13 | ...[...] | $@ | array_flow.rb:823:16:823:25 | call to source | call to source | +| array_flow.rb:829:10:829:13 | ...[...] | array_flow.rb:823:16:823:25 | call to source | array_flow.rb:829:10:829:13 | ...[...] | $@ | array_flow.rb:823:16:823:25 | call to source | call to source | +| array_flow.rb:835:14:835:14 | x | array_flow.rb:833:16:833:25 | call to source | array_flow.rb:835:14:835:14 | x | $@ | array_flow.rb:833:16:833:25 | call to source | call to source | +| array_flow.rb:844:14:844:14 | x | array_flow.rb:842:16:842:25 | call to source | array_flow.rb:844:14:844:14 | x | $@ | array_flow.rb:842:16:842:25 | call to source | call to source | +| array_flow.rb:857:14:857:14 | x | array_flow.rb:855:16:855:25 | call to source | array_flow.rb:857:14:857:14 | x | $@ | array_flow.rb:855:16:855:25 | call to source | call to source | +| array_flow.rb:860:10:860:16 | ...[...] | array_flow.rb:855:16:855:25 | call to source | array_flow.rb:860:10:860:16 | ...[...] | $@ | array_flow.rb:855:16:855:25 | call to source | call to source | +| array_flow.rb:861:10:861:16 | ...[...] | array_flow.rb:855:16:855:25 | call to source | array_flow.rb:861:10:861:16 | ...[...] | $@ | array_flow.rb:855:16:855:25 | call to source | call to source | +| array_flow.rb:868:14:868:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source | array_flow.rb:868:14:868:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source | call to source | +| array_flow.rb:869:14:869:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source | array_flow.rb:869:14:869:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source | call to source | +| array_flow.rb:870:14:870:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source | array_flow.rb:870:14:870:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source | call to source | +| array_flow.rb:873:10:873:13 | ...[...] | array_flow.rb:865:16:865:25 | call to source | array_flow.rb:873:10:873:13 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source | call to source | +| array_flow.rb:876:14:876:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source | array_flow.rb:876:14:876:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source | call to source | +| array_flow.rb:877:14:877:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source | array_flow.rb:877:14:877:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source | call to source | +| array_flow.rb:880:10:880:13 | ...[...] | array_flow.rb:865:16:865:25 | call to source | array_flow.rb:880:10:880:13 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source | call to source | +| array_flow.rb:883:14:883:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source | array_flow.rb:883:14:883:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source | call to source | +| array_flow.rb:884:14:884:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source | array_flow.rb:884:14:884:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source | call to source | +| array_flow.rb:887:10:887:13 | ...[...] | array_flow.rb:865:16:865:25 | call to source | array_flow.rb:887:10:887:13 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source | call to source | +| array_flow.rb:896:10:896:10 | b | array_flow.rb:894:13:894:24 | call to source | array_flow.rb:896:10:896:10 | b | $@ | array_flow.rb:894:13:894:24 | call to source | call to source | +| array_flow.rb:896:10:896:10 | b | array_flow.rb:894:30:894:41 | call to source | array_flow.rb:896:10:896:10 | b | $@ | array_flow.rb:894:30:894:41 | call to source | call to source | +| array_flow.rb:898:10:898:13 | ...[...] | array_flow.rb:894:13:894:24 | call to source | array_flow.rb:898:10:898:13 | ...[...] | $@ | array_flow.rb:894:13:894:24 | call to source | call to source | +| array_flow.rb:900:10:900:13 | ...[...] | array_flow.rb:894:30:894:41 | call to source | array_flow.rb:900:10:900:13 | ...[...] | $@ | array_flow.rb:894:30:894:41 | call to source | call to source | +| array_flow.rb:904:10:904:13 | ...[...] | array_flow.rb:902:13:902:24 | call to source | array_flow.rb:904:10:904:13 | ...[...] | $@ | array_flow.rb:902:13:902:24 | call to source | call to source | +| array_flow.rb:904:10:904:13 | ...[...] | array_flow.rb:902:30:902:41 | call to source | array_flow.rb:904:10:904:13 | ...[...] | $@ | array_flow.rb:902:30:902:41 | call to source | call to source | +| array_flow.rb:905:10:905:13 | ...[...] | array_flow.rb:902:13:902:24 | call to source | array_flow.rb:905:10:905:13 | ...[...] | $@ | array_flow.rb:902:13:902:24 | call to source | call to source | +| array_flow.rb:905:10:905:13 | ...[...] | array_flow.rb:902:30:902:41 | call to source | array_flow.rb:905:10:905:13 | ...[...] | $@ | array_flow.rb:902:30:902:41 | call to source | call to source | +| array_flow.rb:907:10:907:13 | ...[...] | array_flow.rb:902:13:902:24 | call to source | array_flow.rb:907:10:907:13 | ...[...] | $@ | array_flow.rb:902:13:902:24 | call to source | call to source | +| array_flow.rb:909:10:909:13 | ...[...] | array_flow.rb:902:30:902:41 | call to source | array_flow.rb:909:10:909:13 | ...[...] | $@ | array_flow.rb:902:30:902:41 | call to source | call to source | +| array_flow.rb:917:10:917:13 | ...[...] | array_flow.rb:914:21:914:32 | call to source | array_flow.rb:917:10:917:13 | ...[...] | $@ | array_flow.rb:914:21:914:32 | call to source | call to source | +| array_flow.rb:920:10:920:13 | ...[...] | array_flow.rb:913:16:913:27 | call to source | array_flow.rb:920:10:920:13 | ...[...] | $@ | array_flow.rb:913:16:913:27 | call to source | call to source | +| array_flow.rb:928:10:928:16 | ...[...] | array_flow.rb:924:16:924:27 | call to source | array_flow.rb:928:10:928:16 | ...[...] | $@ | array_flow.rb:924:16:924:27 | call to source | call to source | +| array_flow.rb:928:10:928:16 | ...[...] | array_flow.rb:925:13:925:24 | call to source | array_flow.rb:928:10:928:16 | ...[...] | $@ | array_flow.rb:925:13:925:24 | call to source | call to source | +| array_flow.rb:928:10:928:16 | ...[...] | array_flow.rb:926:10:926:21 | call to source | array_flow.rb:928:10:928:16 | ...[...] | $@ | array_flow.rb:926:10:926:21 | call to source | call to source | +| array_flow.rb:929:10:929:16 | ...[...] | array_flow.rb:924:16:924:27 | call to source | array_flow.rb:929:10:929:16 | ...[...] | $@ | array_flow.rb:924:16:924:27 | call to source | call to source | +| array_flow.rb:929:10:929:16 | ...[...] | array_flow.rb:925:13:925:24 | call to source | array_flow.rb:929:10:929:16 | ...[...] | $@ | array_flow.rb:925:13:925:24 | call to source | call to source | +| array_flow.rb:929:10:929:16 | ...[...] | array_flow.rb:926:10:926:21 | call to source | array_flow.rb:929:10:929:16 | ...[...] | $@ | array_flow.rb:926:10:926:21 | call to source | call to source | +| array_flow.rb:935:10:935:13 | ...[...] | array_flow.rb:933:10:933:21 | call to source | array_flow.rb:935:10:935:13 | ...[...] | $@ | array_flow.rb:933:10:933:21 | call to source | call to source | +| array_flow.rb:935:10:935:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source | array_flow.rb:935:10:935:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source | call to source | +| array_flow.rb:935:10:935:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source | array_flow.rb:935:10:935:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source | call to source | +| array_flow.rb:936:10:936:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source | array_flow.rb:936:10:936:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source | call to source | +| array_flow.rb:936:10:936:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source | array_flow.rb:936:10:936:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source | call to source | +| array_flow.rb:937:10:937:13 | ...[...] | array_flow.rb:933:10:933:21 | call to source | array_flow.rb:937:10:937:13 | ...[...] | $@ | array_flow.rb:933:10:933:21 | call to source | call to source | +| array_flow.rb:937:10:937:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source | array_flow.rb:937:10:937:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source | call to source | +| array_flow.rb:937:10:937:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source | array_flow.rb:937:10:937:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source | call to source | +| array_flow.rb:938:10:938:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source | array_flow.rb:938:10:938:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source | call to source | +| array_flow.rb:938:10:938:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source | array_flow.rb:938:10:938:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source | call to source | +| array_flow.rb:946:10:946:25 | ...[...] | array_flow.rb:944:10:944:19 | call to source | array_flow.rb:946:10:946:25 | ...[...] | $@ | array_flow.rb:944:10:944:19 | call to source | call to source | +| array_flow.rb:947:10:947:25 | ...[...] | array_flow.rb:944:10:944:19 | call to source | array_flow.rb:947:10:947:25 | ...[...] | $@ | array_flow.rb:944:10:944:19 | call to source | call to source | +| array_flow.rb:953:14:953:14 | x | array_flow.rb:951:10:951:21 | call to source | array_flow.rb:953:14:953:14 | x | $@ | array_flow.rb:951:10:951:21 | call to source | call to source | +| array_flow.rb:954:14:954:14 | y | array_flow.rb:951:27:951:38 | call to source | array_flow.rb:954:14:954:14 | y | $@ | array_flow.rb:951:27:951:38 | call to source | call to source | +| array_flow.rb:959:14:959:14 | y | array_flow.rb:951:10:951:21 | call to source | array_flow.rb:959:14:959:14 | y | $@ | array_flow.rb:951:10:951:21 | call to source | call to source | +| array_flow.rb:959:14:959:14 | y | array_flow.rb:951:27:951:38 | call to source | array_flow.rb:959:14:959:14 | y | $@ | array_flow.rb:951:27:951:38 | call to source | call to source | +| array_flow.rb:967:14:967:14 | x | array_flow.rb:965:16:965:25 | call to source | array_flow.rb:967:14:967:14 | x | $@ | array_flow.rb:965:16:965:25 | call to source | call to source | +| array_flow.rb:970:10:970:13 | ...[...] | array_flow.rb:965:16:965:25 | call to source | array_flow.rb:970:10:970:13 | ...[...] | $@ | array_flow.rb:965:16:965:25 | call to source | call to source | +| array_flow.rb:976:14:976:14 | x | array_flow.rb:974:16:974:25 | call to source | array_flow.rb:976:14:976:14 | x | $@ | array_flow.rb:974:16:974:25 | call to source | call to source | +| array_flow.rb:979:10:979:13 | ...[...] | array_flow.rb:974:16:974:25 | call to source | array_flow.rb:979:10:979:13 | ...[...] | $@ | array_flow.rb:974:16:974:25 | call to source | call to source | +| array_flow.rb:980:10:980:13 | ...[...] | array_flow.rb:974:16:974:25 | call to source | array_flow.rb:980:10:980:13 | ...[...] | $@ | array_flow.rb:974:16:974:25 | call to source | call to source | +| array_flow.rb:986:14:986:17 | ...[...] | array_flow.rb:984:16:984:25 | call to source | array_flow.rb:986:14:986:17 | ...[...] | $@ | array_flow.rb:984:16:984:25 | call to source | call to source | +| array_flow.rb:987:14:987:17 | ...[...] | array_flow.rb:984:16:984:25 | call to source | array_flow.rb:987:14:987:17 | ...[...] | $@ | array_flow.rb:984:16:984:25 | call to source | call to source | +| array_flow.rb:990:10:990:13 | ...[...] | array_flow.rb:984:16:984:25 | call to source | array_flow.rb:990:10:990:13 | ...[...] | $@ | array_flow.rb:984:16:984:25 | call to source | call to source | +| array_flow.rb:996:14:996:17 | ...[...] | array_flow.rb:994:16:994:25 | call to source | array_flow.rb:996:14:996:17 | ...[...] | $@ | array_flow.rb:994:16:994:25 | call to source | call to source | +| array_flow.rb:997:14:997:17 | ...[...] | array_flow.rb:994:16:994:25 | call to source | array_flow.rb:997:14:997:17 | ...[...] | $@ | array_flow.rb:994:16:994:25 | call to source | call to source | +| array_flow.rb:1000:10:1000:13 | ...[...] | array_flow.rb:994:16:994:25 | call to source | array_flow.rb:1000:10:1000:13 | ...[...] | $@ | array_flow.rb:994:16:994:25 | call to source | call to source | +| array_flow.rb:1007:10:1007:13 | ...[...] | array_flow.rb:1006:20:1006:31 | call to source | array_flow.rb:1007:10:1007:13 | ...[...] | $@ | array_flow.rb:1006:20:1006:31 | call to source | call to source | +| array_flow.rb:1008:10:1008:13 | ...[...] | array_flow.rb:1006:20:1006:31 | call to source | array_flow.rb:1008:10:1008:13 | ...[...] | $@ | array_flow.rb:1006:20:1006:31 | call to source | call to source | +| array_flow.rb:1014:10:1014:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source | array_flow.rb:1014:10:1014:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source | call to source | +| array_flow.rb:1014:10:1014:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source | array_flow.rb:1014:10:1014:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source | call to source | +| array_flow.rb:1015:10:1015:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source | array_flow.rb:1015:10:1015:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source | call to source | +| array_flow.rb:1015:10:1015:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source | array_flow.rb:1015:10:1015:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source | call to source | +| array_flow.rb:1016:10:1016:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source | array_flow.rb:1016:10:1016:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source | call to source | +| array_flow.rb:1016:10:1016:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source | array_flow.rb:1016:10:1016:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source | call to source | +| array_flow.rb:1018:10:1018:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source | array_flow.rb:1018:10:1018:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source | call to source | +| array_flow.rb:1019:10:1019:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source | array_flow.rb:1019:10:1019:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source | call to source | +| array_flow.rb:1025:10:1025:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1025:10:1025:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source | call to source | +| array_flow.rb:1025:10:1025:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1025:10:1025:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source | call to source | +| array_flow.rb:1026:10:1026:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1026:10:1026:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source | call to source | +| array_flow.rb:1026:10:1026:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1026:10:1026:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source | call to source | +| array_flow.rb:1027:10:1027:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1027:10:1027:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source | call to source | +| array_flow.rb:1027:10:1027:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1027:10:1027:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source | call to source | +| array_flow.rb:1028:10:1028:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1028:10:1028:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source | call to source | +| array_flow.rb:1028:10:1028:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1028:10:1028:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source | call to source | +| array_flow.rb:1029:10:1029:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1029:10:1029:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source | call to source | +| array_flow.rb:1029:10:1029:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1029:10:1029:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source | call to source | +| array_flow.rb:1030:10:1030:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1030:10:1030:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source | call to source | +| array_flow.rb:1030:10:1030:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1030:10:1030:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source | call to source | +| array_flow.rb:1036:14:1036:14 | x | array_flow.rb:1034:16:1034:26 | call to source | array_flow.rb:1036:14:1036:14 | x | $@ | array_flow.rb:1034:16:1034:26 | call to source | call to source | +| array_flow.rb:1038:10:1038:13 | ...[...] | array_flow.rb:1034:16:1034:26 | call to source | array_flow.rb:1038:10:1038:13 | ...[...] | $@ | array_flow.rb:1034:16:1034:26 | call to source | call to source | +| array_flow.rb:1044:14:1044:14 | x | array_flow.rb:1042:16:1042:26 | call to source | array_flow.rb:1044:14:1044:14 | x | $@ | array_flow.rb:1042:16:1042:26 | call to source | call to source | +| array_flow.rb:1055:10:1055:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1055:10:1055:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1056:10:1056:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1056:10:1056:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1056:10:1056:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source | array_flow.rb:1056:10:1056:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source | call to source | +| array_flow.rb:1057:10:1057:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1057:10:1057:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1057:10:1057:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source | array_flow.rb:1057:10:1057:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source | call to source | +| array_flow.rb:1058:10:1058:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1058:10:1058:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1061:10:1061:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1061:10:1061:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1061:10:1061:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source | array_flow.rb:1061:10:1061:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source | call to source | +| array_flow.rb:1062:10:1062:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1062:10:1062:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1062:10:1062:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source | array_flow.rb:1062:10:1062:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source | call to source | +| array_flow.rb:1063:10:1063:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1063:10:1063:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1064:10:1064:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1064:10:1064:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1067:10:1067:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1067:10:1067:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1069:10:1069:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source | array_flow.rb:1069:10:1069:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source | call to source | +| array_flow.rb:1070:10:1070:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source | array_flow.rb:1070:10:1070:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source | call to source | +| array_flow.rb:1073:10:1073:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1073:10:1073:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1073:10:1073:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source | array_flow.rb:1073:10:1073:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source | call to source | +| array_flow.rb:1073:10:1073:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source | array_flow.rb:1073:10:1073:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source | call to source | +| array_flow.rb:1074:10:1074:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1074:10:1074:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1074:10:1074:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source | array_flow.rb:1074:10:1074:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source | call to source | +| array_flow.rb:1074:10:1074:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source | array_flow.rb:1074:10:1074:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source | call to source | +| array_flow.rb:1075:10:1075:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1075:10:1075:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1075:10:1075:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source | array_flow.rb:1075:10:1075:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source | call to source | +| array_flow.rb:1075:10:1075:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source | array_flow.rb:1075:10:1075:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source | call to source | +| array_flow.rb:1076:10:1076:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source | array_flow.rb:1076:10:1076:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source | call to source | +| array_flow.rb:1076:10:1076:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source | array_flow.rb:1076:10:1076:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source | call to source | +| array_flow.rb:1076:10:1076:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source | array_flow.rb:1076:10:1076:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source | call to source | +| array_flow.rb:1086:10:1086:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source | array_flow.rb:1086:10:1086:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source | call to source | +| array_flow.rb:1087:10:1087:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source | array_flow.rb:1087:10:1087:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source | call to source | +| array_flow.rb:1087:10:1087:13 | ...[...] | array_flow.rb:1084:28:1084:40 | call to source | array_flow.rb:1087:10:1087:13 | ...[...] | $@ | array_flow.rb:1084:28:1084:40 | call to source | call to source | +| array_flow.rb:1088:10:1088:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source | array_flow.rb:1088:10:1088:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source | call to source | +| array_flow.rb:1088:10:1088:13 | ...[...] | array_flow.rb:1084:43:1084:55 | call to source | array_flow.rb:1088:10:1088:13 | ...[...] | $@ | array_flow.rb:1084:43:1084:55 | call to source | call to source | +| array_flow.rb:1089:10:1089:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source | array_flow.rb:1089:10:1089:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source | call to source | +| array_flow.rb:1090:10:1090:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source | array_flow.rb:1090:10:1090:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source | call to source | +| array_flow.rb:1091:10:1091:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source | array_flow.rb:1091:10:1091:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source | call to source | +| array_flow.rb:1091:10:1091:13 | ...[...] | array_flow.rb:1084:28:1084:40 | call to source | array_flow.rb:1091:10:1091:13 | ...[...] | $@ | array_flow.rb:1084:28:1084:40 | call to source | call to source | +| array_flow.rb:1092:10:1092:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source | array_flow.rb:1092:10:1092:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source | call to source | +| array_flow.rb:1092:10:1092:13 | ...[...] | array_flow.rb:1084:43:1084:55 | call to source | array_flow.rb:1092:10:1092:13 | ...[...] | $@ | array_flow.rb:1084:43:1084:55 | call to source | call to source | +| array_flow.rb:1093:10:1093:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source | array_flow.rb:1093:10:1093:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source | call to source | +| array_flow.rb:1097:10:1097:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1097:10:1097:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source | call to source | +| array_flow.rb:1097:10:1097:13 | ...[...] | array_flow.rb:1095:28:1095:40 | call to source | array_flow.rb:1097:10:1097:13 | ...[...] | $@ | array_flow.rb:1095:28:1095:40 | call to source | call to source | +| array_flow.rb:1098:10:1098:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1098:10:1098:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source | call to source | +| array_flow.rb:1098:10:1098:13 | ...[...] | array_flow.rb:1095:43:1095:55 | call to source | array_flow.rb:1098:10:1098:13 | ...[...] | $@ | array_flow.rb:1095:43:1095:55 | call to source | call to source | +| array_flow.rb:1099:10:1099:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1099:10:1099:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source | call to source | +| array_flow.rb:1100:10:1100:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1100:10:1100:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source | call to source | +| array_flow.rb:1101:10:1101:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1101:10:1101:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source | call to source | +| array_flow.rb:1101:10:1101:13 | ...[...] | array_flow.rb:1095:28:1095:40 | call to source | array_flow.rb:1101:10:1101:13 | ...[...] | $@ | array_flow.rb:1095:28:1095:40 | call to source | call to source | +| array_flow.rb:1102:10:1102:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1102:10:1102:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source | call to source | +| array_flow.rb:1102:10:1102:13 | ...[...] | array_flow.rb:1095:43:1095:55 | call to source | array_flow.rb:1102:10:1102:13 | ...[...] | $@ | array_flow.rb:1095:43:1095:55 | call to source | call to source | +| array_flow.rb:1103:10:1103:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1103:10:1103:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source | call to source | +| array_flow.rb:1104:10:1104:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1104:10:1104:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source | call to source | +| array_flow.rb:1108:10:1108:13 | ...[...] | array_flow.rb:1106:10:1106:22 | call to source | array_flow.rb:1108:10:1108:13 | ...[...] | $@ | array_flow.rb:1106:10:1106:22 | call to source | call to source | +| array_flow.rb:1110:10:1110:13 | ...[...] | array_flow.rb:1106:28:1106:40 | call to source | array_flow.rb:1110:10:1110:13 | ...[...] | $@ | array_flow.rb:1106:28:1106:40 | call to source | call to source | +| array_flow.rb:1111:10:1111:13 | ...[...] | array_flow.rb:1106:43:1106:55 | call to source | array_flow.rb:1111:10:1111:13 | ...[...] | $@ | array_flow.rb:1106:43:1106:55 | call to source | call to source | +| array_flow.rb:1112:10:1112:13 | ...[...] | array_flow.rb:1106:10:1106:22 | call to source | array_flow.rb:1112:10:1112:13 | ...[...] | $@ | array_flow.rb:1106:10:1106:22 | call to source | call to source | +| array_flow.rb:1114:10:1114:13 | ...[...] | array_flow.rb:1106:28:1106:40 | call to source | array_flow.rb:1114:10:1114:13 | ...[...] | $@ | array_flow.rb:1106:28:1106:40 | call to source | call to source | +| array_flow.rb:1115:10:1115:13 | ...[...] | array_flow.rb:1106:43:1106:55 | call to source | array_flow.rb:1115:10:1115:13 | ...[...] | $@ | array_flow.rb:1106:43:1106:55 | call to source | call to source | +| array_flow.rb:1119:10:1119:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1119:10:1119:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source | call to source | +| array_flow.rb:1119:10:1119:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1119:10:1119:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source | call to source | +| array_flow.rb:1119:10:1119:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1119:10:1119:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source | call to source | +| array_flow.rb:1120:10:1120:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1120:10:1120:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source | call to source | +| array_flow.rb:1120:10:1120:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1120:10:1120:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source | call to source | +| array_flow.rb:1120:10:1120:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1120:10:1120:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source | call to source | +| array_flow.rb:1121:10:1121:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1121:10:1121:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source | call to source | +| array_flow.rb:1121:10:1121:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1121:10:1121:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source | call to source | +| array_flow.rb:1121:10:1121:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1121:10:1121:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source | call to source | +| array_flow.rb:1122:10:1122:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1122:10:1122:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source | call to source | +| array_flow.rb:1122:10:1122:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1122:10:1122:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source | call to source | +| array_flow.rb:1122:10:1122:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1122:10:1122:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source | call to source | +| array_flow.rb:1123:10:1123:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1123:10:1123:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source | call to source | +| array_flow.rb:1123:10:1123:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1123:10:1123:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source | call to source | +| array_flow.rb:1123:10:1123:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1123:10:1123:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source | call to source | +| array_flow.rb:1124:10:1124:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1124:10:1124:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source | call to source | +| array_flow.rb:1124:10:1124:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1124:10:1124:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source | call to source | +| array_flow.rb:1124:10:1124:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1124:10:1124:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source | call to source | +| array_flow.rb:1125:10:1125:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1125:10:1125:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source | call to source | +| array_flow.rb:1125:10:1125:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1125:10:1125:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source | call to source | +| array_flow.rb:1125:10:1125:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1125:10:1125:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source | call to source | +| array_flow.rb:1126:10:1126:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1126:10:1126:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source | call to source | +| array_flow.rb:1126:10:1126:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1126:10:1126:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source | call to source | +| array_flow.rb:1126:10:1126:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1126:10:1126:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source | call to source | +| array_flow.rb:1132:14:1132:14 | x | array_flow.rb:1130:19:1130:29 | call to source | array_flow.rb:1132:14:1132:14 | x | $@ | array_flow.rb:1130:19:1130:29 | call to source | call to source | +| array_flow.rb:1134:10:1134:13 | ...[...] | array_flow.rb:1130:19:1130:29 | call to source | array_flow.rb:1134:10:1134:13 | ...[...] | $@ | array_flow.rb:1130:19:1130:29 | call to source | call to source | +| array_flow.rb:1140:14:1140:14 | x | array_flow.rb:1138:16:1138:26 | call to source | array_flow.rb:1140:14:1140:14 | x | $@ | array_flow.rb:1138:16:1138:26 | call to source | call to source | +| array_flow.rb:1143:10:1143:13 | ...[...] | array_flow.rb:1138:16:1138:26 | call to source | array_flow.rb:1143:10:1143:13 | ...[...] | $@ | array_flow.rb:1138:16:1138:26 | call to source | call to source | +| array_flow.rb:1144:10:1144:13 | ...[...] | array_flow.rb:1138:16:1138:26 | call to source | array_flow.rb:1144:10:1144:13 | ...[...] | $@ | array_flow.rb:1138:16:1138:26 | call to source | call to source | +| array_flow.rb:1150:10:1150:10 | b | array_flow.rb:1148:10:1148:22 | call to source | array_flow.rb:1150:10:1150:10 | b | $@ | array_flow.rb:1148:10:1148:22 | call to source | call to source | +| array_flow.rb:1152:10:1152:13 | ...[...] | array_flow.rb:1148:28:1148:40 | call to source | array_flow.rb:1152:10:1152:13 | ...[...] | $@ | array_flow.rb:1148:28:1148:40 | call to source | call to source | +| array_flow.rb:1157:10:1157:13 | ...[...] | array_flow.rb:1155:10:1155:22 | call to source | array_flow.rb:1157:10:1157:13 | ...[...] | $@ | array_flow.rb:1155:10:1155:22 | call to source | call to source | +| array_flow.rb:1159:10:1159:13 | ...[...] | array_flow.rb:1155:28:1155:40 | call to source | array_flow.rb:1159:10:1159:13 | ...[...] | $@ | array_flow.rb:1155:28:1155:40 | call to source | call to source | +| array_flow.rb:1165:10:1165:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source | array_flow.rb:1165:10:1165:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source | call to source | +| array_flow.rb:1165:10:1165:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source | array_flow.rb:1165:10:1165:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source | call to source | +| array_flow.rb:1166:10:1166:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source | array_flow.rb:1166:10:1166:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source | call to source | +| array_flow.rb:1166:10:1166:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source | array_flow.rb:1166:10:1166:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source | call to source | +| array_flow.rb:1167:10:1167:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source | array_flow.rb:1167:10:1167:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source | call to source | +| array_flow.rb:1167:10:1167:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source | array_flow.rb:1167:10:1167:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source | call to source | +| array_flow.rb:1168:10:1168:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source | array_flow.rb:1168:10:1168:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source | call to source | +| array_flow.rb:1168:10:1168:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source | array_flow.rb:1168:10:1168:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source | call to source | +| array_flow.rb:1169:10:1169:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source | array_flow.rb:1169:10:1169:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source | call to source | +| array_flow.rb:1169:10:1169:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source | array_flow.rb:1169:10:1169:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source | call to source | +| array_flow.rb:1177:10:1177:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source | array_flow.rb:1177:10:1177:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source | call to source | +| array_flow.rb:1178:10:1178:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source | array_flow.rb:1178:10:1178:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source | call to source | +| array_flow.rb:1179:10:1179:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source | array_flow.rb:1179:10:1179:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source | call to source | +| array_flow.rb:1180:10:1180:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source | array_flow.rb:1180:10:1180:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source | call to source | +| array_flow.rb:1186:10:1186:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1186:10:1186:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source | call to source | +| array_flow.rb:1187:10:1187:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1187:10:1187:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source | call to source | +| array_flow.rb:1188:10:1188:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1188:10:1188:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source | call to source | +| array_flow.rb:1189:10:1189:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1189:10:1189:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source | call to source | +| array_flow.rb:1190:10:1190:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1190:10:1190:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source | call to source | +| array_flow.rb:1191:10:1191:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1191:10:1191:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source | call to source | +| array_flow.rb:1198:10:1198:10 | b | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1198:10:1198:10 | b | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1201:10:1201:10 | b | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1201:10:1201:10 | b | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1201:10:1201:10 | b | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1201:10:1201:10 | b | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1205:10:1205:10 | b | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1205:10:1205:10 | b | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1205:10:1205:10 | b | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1205:10:1205:10 | b | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1207:10:1207:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1207:10:1207:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1207:10:1207:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1207:10:1207:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1210:10:1210:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1210:10:1210:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1212:10:1212:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1212:10:1212:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1215:10:1215:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1215:10:1215:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1215:10:1215:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1215:10:1215:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1216:10:1216:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1216:10:1216:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1216:10:1216:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1216:10:1216:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1219:10:1219:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1219:10:1219:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1224:10:1224:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1224:10:1224:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1229:10:1229:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1229:10:1229:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1229:10:1229:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1229:10:1229:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1230:10:1230:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1230:10:1230:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1230:10:1230:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1230:10:1230:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1233:10:1233:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1233:10:1233:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1233:10:1233:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1233:10:1233:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1234:10:1234:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1234:10:1234:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1234:10:1234:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1234:10:1234:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1239:10:1239:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1239:10:1239:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1242:10:1242:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1242:10:1242:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1242:10:1242:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1242:10:1242:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1243:10:1243:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1243:10:1243:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1243:10:1243:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1243:10:1243:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1244:10:1244:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source | array_flow.rb:1244:10:1244:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source | call to source | +| array_flow.rb:1244:10:1244:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source | array_flow.rb:1244:10:1244:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source | call to source | +| array_flow.rb:1250:10:1250:10 | b | array_flow.rb:1248:16:1248:28 | call to source | array_flow.rb:1250:10:1250:10 | b | $@ | array_flow.rb:1248:16:1248:28 | call to source | call to source | +| array_flow.rb:1254:10:1254:13 | ...[...] | array_flow.rb:1248:34:1248:46 | call to source | array_flow.rb:1254:10:1254:13 | ...[...] | $@ | array_flow.rb:1248:34:1248:46 | call to source | call to source | +| array_flow.rb:1258:10:1258:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source | array_flow.rb:1258:10:1258:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source | call to source | +| array_flow.rb:1258:10:1258:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source | array_flow.rb:1258:10:1258:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source | call to source | +| array_flow.rb:1259:10:1259:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source | array_flow.rb:1259:10:1259:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source | call to source | +| array_flow.rb:1259:10:1259:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source | array_flow.rb:1259:10:1259:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source | call to source | +| array_flow.rb:1260:10:1260:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source | array_flow.rb:1260:10:1260:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source | call to source | +| array_flow.rb:1260:10:1260:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source | array_flow.rb:1260:10:1260:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source | call to source | +| array_flow.rb:1261:10:1261:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source | array_flow.rb:1261:10:1261:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source | call to source | +| array_flow.rb:1261:10:1261:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source | array_flow.rb:1261:10:1261:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source | call to source | +| array_flow.rb:1263:10:1263:10 | b | array_flow.rb:1256:16:1256:28 | call to source | array_flow.rb:1263:10:1263:10 | b | $@ | array_flow.rb:1256:16:1256:28 | call to source | call to source | +| array_flow.rb:1263:10:1263:10 | b | array_flow.rb:1256:34:1256:46 | call to source | array_flow.rb:1263:10:1263:10 | b | $@ | array_flow.rb:1256:34:1256:46 | call to source | call to source | +| array_flow.rb:1265:10:1265:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source | array_flow.rb:1265:10:1265:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source | call to source | +| array_flow.rb:1265:10:1265:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source | array_flow.rb:1265:10:1265:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source | call to source | +| array_flow.rb:1269:10:1269:13 | ...[...] | array_flow.rb:1267:16:1267:28 | call to source | array_flow.rb:1269:10:1269:13 | ...[...] | $@ | array_flow.rb:1267:16:1267:28 | call to source | call to source | +| array_flow.rb:1271:10:1271:13 | ...[...] | array_flow.rb:1267:34:1267:46 | call to source | array_flow.rb:1271:10:1271:13 | ...[...] | $@ | array_flow.rb:1267:34:1267:46 | call to source | call to source | +| array_flow.rb:1280:10:1280:13 | ...[...] | array_flow.rb:1278:16:1278:28 | call to source | array_flow.rb:1280:10:1280:13 | ...[...] | $@ | array_flow.rb:1278:16:1278:28 | call to source | call to source | +| array_flow.rb:1285:10:1285:13 | ...[...] | array_flow.rb:1278:34:1278:46 | call to source | array_flow.rb:1285:10:1285:13 | ...[...] | $@ | array_flow.rb:1278:34:1278:46 | call to source | call to source | +| array_flow.rb:1291:10:1291:13 | ...[...] | array_flow.rb:1289:16:1289:28 | call to source | array_flow.rb:1291:10:1291:13 | ...[...] | $@ | array_flow.rb:1289:16:1289:28 | call to source | call to source | +| array_flow.rb:1296:10:1296:13 | ...[...] | array_flow.rb:1289:34:1289:46 | call to source | array_flow.rb:1296:10:1296:13 | ...[...] | $@ | array_flow.rb:1289:34:1289:46 | call to source | call to source | +| array_flow.rb:1302:10:1302:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source | array_flow.rb:1302:10:1302:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source | call to source | +| array_flow.rb:1302:10:1302:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source | array_flow.rb:1302:10:1302:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source | call to source | +| array_flow.rb:1303:10:1303:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source | array_flow.rb:1303:10:1303:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source | call to source | +| array_flow.rb:1303:10:1303:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source | array_flow.rb:1303:10:1303:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source | call to source | +| array_flow.rb:1304:10:1304:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source | array_flow.rb:1304:10:1304:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source | call to source | +| array_flow.rb:1304:10:1304:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source | array_flow.rb:1304:10:1304:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source | call to source | +| array_flow.rb:1305:10:1305:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source | array_flow.rb:1305:10:1305:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source | call to source | +| array_flow.rb:1305:10:1305:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source | array_flow.rb:1305:10:1305:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source | call to source | +| array_flow.rb:1306:10:1306:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source | array_flow.rb:1306:10:1306:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source | call to source | +| array_flow.rb:1306:10:1306:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source | array_flow.rb:1306:10:1306:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source | call to source | +| array_flow.rb:1307:10:1307:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source | array_flow.rb:1307:10:1307:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source | call to source | +| array_flow.rb:1307:10:1307:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source | array_flow.rb:1307:10:1307:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source | call to source | +| array_flow.rb:1311:10:1311:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source | array_flow.rb:1311:10:1311:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source | call to source | +| array_flow.rb:1311:10:1311:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source | array_flow.rb:1311:10:1311:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source | call to source | +| array_flow.rb:1312:10:1312:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source | array_flow.rb:1312:10:1312:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source | call to source | +| array_flow.rb:1312:10:1312:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source | array_flow.rb:1312:10:1312:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source | call to source | +| array_flow.rb:1313:10:1313:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source | array_flow.rb:1313:10:1313:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source | call to source | +| array_flow.rb:1313:10:1313:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source | array_flow.rb:1313:10:1313:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source | call to source | +| array_flow.rb:1314:10:1314:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source | array_flow.rb:1314:10:1314:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source | call to source | +| array_flow.rb:1314:10:1314:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source | array_flow.rb:1314:10:1314:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source | call to source | +| array_flow.rb:1315:10:1315:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source | array_flow.rb:1315:10:1315:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source | call to source | +| array_flow.rb:1315:10:1315:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source | array_flow.rb:1315:10:1315:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source | call to source | +| array_flow.rb:1316:10:1316:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source | array_flow.rb:1316:10:1316:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source | call to source | +| array_flow.rb:1316:10:1316:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source | array_flow.rb:1316:10:1316:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source | call to source | +| array_flow.rb:1320:10:1320:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source | array_flow.rb:1320:10:1320:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source | call to source | +| array_flow.rb:1320:10:1320:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source | array_flow.rb:1320:10:1320:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source | call to source | +| array_flow.rb:1321:10:1321:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source | array_flow.rb:1321:10:1321:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source | call to source | +| array_flow.rb:1321:10:1321:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source | array_flow.rb:1321:10:1321:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source | call to source | +| array_flow.rb:1322:10:1322:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source | array_flow.rb:1322:10:1322:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source | call to source | +| array_flow.rb:1322:10:1322:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source | array_flow.rb:1322:10:1322:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source | call to source | +| array_flow.rb:1323:10:1323:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source | array_flow.rb:1323:10:1323:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source | call to source | +| array_flow.rb:1323:10:1323:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source | array_flow.rb:1323:10:1323:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source | call to source | +| array_flow.rb:1324:10:1324:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source | array_flow.rb:1324:10:1324:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source | call to source | +| array_flow.rb:1324:10:1324:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source | array_flow.rb:1324:10:1324:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source | call to source | +| array_flow.rb:1325:10:1325:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source | array_flow.rb:1325:10:1325:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source | call to source | +| array_flow.rb:1325:10:1325:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source | array_flow.rb:1325:10:1325:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source | call to source | +| array_flow.rb:1331:10:1331:13 | ...[...] | array_flow.rb:1327:16:1327:28 | call to source | array_flow.rb:1331:10:1331:13 | ...[...] | $@ | array_flow.rb:1327:16:1327:28 | call to source | call to source | +| array_flow.rb:1333:10:1333:13 | ...[...] | array_flow.rb:1327:34:1327:46 | call to source | array_flow.rb:1333:10:1333:13 | ...[...] | $@ | array_flow.rb:1327:34:1327:46 | call to source | call to source | +| array_flow.rb:1338:10:1338:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source | array_flow.rb:1338:10:1338:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source | call to source | +| array_flow.rb:1338:10:1338:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source | array_flow.rb:1338:10:1338:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source | call to source | +| array_flow.rb:1339:10:1339:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source | array_flow.rb:1339:10:1339:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source | call to source | +| array_flow.rb:1339:10:1339:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source | array_flow.rb:1339:10:1339:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source | call to source | +| array_flow.rb:1340:10:1340:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source | array_flow.rb:1340:10:1340:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source | call to source | +| array_flow.rb:1340:10:1340:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source | array_flow.rb:1340:10:1340:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source | call to source | +| array_flow.rb:1341:10:1341:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source | array_flow.rb:1341:10:1341:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source | call to source | +| array_flow.rb:1341:10:1341:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source | array_flow.rb:1341:10:1341:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source | call to source | +| array_flow.rb:1342:10:1342:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source | array_flow.rb:1342:10:1342:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source | call to source | +| array_flow.rb:1342:10:1342:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source | array_flow.rb:1342:10:1342:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source | call to source | +| array_flow.rb:1343:10:1343:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source | array_flow.rb:1343:10:1343:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source | call to source | +| array_flow.rb:1343:10:1343:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source | array_flow.rb:1343:10:1343:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source | call to source | +| array_flow.rb:1349:14:1349:14 | x | array_flow.rb:1347:16:1347:26 | call to source | array_flow.rb:1349:14:1349:14 | x | $@ | array_flow.rb:1347:16:1347:26 | call to source | call to source | +| array_flow.rb:1357:14:1357:14 | x | array_flow.rb:1355:16:1355:26 | call to source | array_flow.rb:1357:14:1357:14 | x | $@ | array_flow.rb:1355:16:1355:26 | call to source | call to source | +| array_flow.rb:1365:14:1365:14 | x | array_flow.rb:1363:16:1363:26 | call to source | array_flow.rb:1365:14:1365:14 | x | $@ | array_flow.rb:1363:16:1363:26 | call to source | call to source | +| array_flow.rb:1366:14:1366:14 | y | array_flow.rb:1363:16:1363:26 | call to source | array_flow.rb:1366:14:1366:14 | y | $@ | array_flow.rb:1363:16:1363:26 | call to source | call to source | +| array_flow.rb:1373:10:1373:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source | array_flow.rb:1373:10:1373:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source | call to source | +| array_flow.rb:1374:10:1374:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source | array_flow.rb:1374:10:1374:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source | call to source | +| array_flow.rb:1376:14:1376:14 | x | array_flow.rb:1371:16:1371:26 | call to source | array_flow.rb:1376:14:1376:14 | x | $@ | array_flow.rb:1371:16:1371:26 | call to source | call to source | +| array_flow.rb:1377:14:1377:14 | y | array_flow.rb:1371:16:1371:26 | call to source | array_flow.rb:1377:14:1377:14 | y | $@ | array_flow.rb:1371:16:1371:26 | call to source | call to source | +| array_flow.rb:1380:10:1380:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source | array_flow.rb:1380:10:1380:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source | call to source | +| array_flow.rb:1381:10:1381:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source | array_flow.rb:1381:10:1381:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source | call to source | +| array_flow.rb:1387:10:1387:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source | array_flow.rb:1387:10:1387:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source | call to source | +| array_flow.rb:1388:10:1388:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source | array_flow.rb:1388:10:1388:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source | call to source | +| array_flow.rb:1389:10:1389:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source | array_flow.rb:1389:10:1389:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source | call to source | +| array_flow.rb:1390:10:1390:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source | array_flow.rb:1390:10:1390:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source | call to source | +| array_flow.rb:1394:14:1394:14 | x | array_flow.rb:1392:16:1392:26 | call to source | array_flow.rb:1394:14:1394:14 | x | $@ | array_flow.rb:1392:16:1392:26 | call to source | call to source | +| array_flow.rb:1395:14:1395:14 | y | array_flow.rb:1392:16:1392:26 | call to source | array_flow.rb:1395:14:1395:14 | y | $@ | array_flow.rb:1392:16:1392:26 | call to source | call to source | +| array_flow.rb:1398:10:1398:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source | array_flow.rb:1398:10:1398:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source | call to source | +| array_flow.rb:1399:10:1399:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source | array_flow.rb:1399:10:1399:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source | call to source | +| array_flow.rb:1400:10:1400:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source | array_flow.rb:1400:10:1400:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source | call to source | +| array_flow.rb:1401:10:1401:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source | array_flow.rb:1401:10:1401:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source | call to source | +| array_flow.rb:1407:14:1407:14 | x | array_flow.rb:1405:16:1405:26 | call to source | array_flow.rb:1407:14:1407:14 | x | $@ | array_flow.rb:1405:16:1405:26 | call to source | call to source | +| array_flow.rb:1410:10:1410:13 | ...[...] | array_flow.rb:1405:16:1405:26 | call to source | array_flow.rb:1410:10:1410:13 | ...[...] | $@ | array_flow.rb:1405:16:1405:26 | call to source | call to source | +| array_flow.rb:1411:10:1411:13 | ...[...] | array_flow.rb:1405:16:1405:26 | call to source | array_flow.rb:1411:10:1411:13 | ...[...] | $@ | array_flow.rb:1405:16:1405:26 | call to source | call to source | +| array_flow.rb:1417:14:1417:14 | x | array_flow.rb:1415:16:1415:26 | call to source | array_flow.rb:1417:14:1417:14 | x | $@ | array_flow.rb:1415:16:1415:26 | call to source | call to source | +| array_flow.rb:1420:10:1420:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source | array_flow.rb:1420:10:1420:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source | call to source | +| array_flow.rb:1421:10:1421:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source | array_flow.rb:1421:10:1421:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source | call to source | +| array_flow.rb:1422:10:1422:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source | array_flow.rb:1422:10:1422:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source | call to source | +| array_flow.rb:1423:10:1423:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source | array_flow.rb:1423:10:1423:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source | call to source | +| array_flow.rb:1429:14:1429:14 | x | array_flow.rb:1427:16:1427:26 | call to source | array_flow.rb:1429:14:1429:14 | x | $@ | array_flow.rb:1427:16:1427:26 | call to source | call to source | +| array_flow.rb:1439:10:1439:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source | array_flow.rb:1439:10:1439:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source | call to source | +| array_flow.rb:1440:10:1440:13 | ...[...] | array_flow.rb:1435:31:1435:43 | call to source | array_flow.rb:1440:10:1440:13 | ...[...] | $@ | array_flow.rb:1435:31:1435:43 | call to source | call to source | +| array_flow.rb:1444:10:1444:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source | array_flow.rb:1444:10:1444:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source | call to source | +| array_flow.rb:1446:10:1446:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source | array_flow.rb:1446:10:1446:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source | call to source | +| array_flow.rb:1450:10:1450:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source | array_flow.rb:1450:10:1450:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source | call to source | +| array_flow.rb:1451:10:1451:13 | ...[...] | array_flow.rb:1435:31:1435:43 | call to source | array_flow.rb:1451:10:1451:13 | ...[...] | $@ | array_flow.rb:1435:31:1435:43 | call to source | call to source | +| array_flow.rb:1452:10:1452:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source | array_flow.rb:1452:10:1452:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source | call to source | +| array_flow.rb:1452:10:1452:13 | ...[...] | array_flow.rb:1435:31:1435:43 | call to source | array_flow.rb:1452:10:1452:13 | ...[...] | $@ | array_flow.rb:1435:31:1435:43 | call to source | call to source | +| array_flow.rb:1455:10:1455:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source | array_flow.rb:1455:10:1455:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source | call to source | +| array_flow.rb:1455:10:1455:13 | ...[...] | array_flow.rb:1453:12:1453:24 | call to source | array_flow.rb:1455:10:1455:13 | ...[...] | $@ | array_flow.rb:1453:12:1453:24 | call to source | call to source | +| array_flow.rb:1461:14:1461:14 | x | array_flow.rb:1459:16:1459:26 | call to source | array_flow.rb:1461:14:1461:14 | x | $@ | array_flow.rb:1459:16:1459:26 | call to source | call to source | +| array_flow.rb:1466:10:1466:13 | ...[...] | array_flow.rb:1459:16:1459:26 | call to source | array_flow.rb:1466:10:1466:13 | ...[...] | $@ | array_flow.rb:1459:16:1459:26 | call to source | call to source | +| array_flow.rb:1474:10:1474:13 | ...[...] | array_flow.rb:1472:19:1472:29 | call to source | array_flow.rb:1474:10:1474:13 | ...[...] | $@ | array_flow.rb:1472:19:1472:29 | call to source | call to source | +| array_flow.rb:1482:10:1482:13 | ...[...] | array_flow.rb:1478:16:1478:26 | call to source | array_flow.rb:1482:10:1482:13 | ...[...] | $@ | array_flow.rb:1478:16:1478:26 | call to source | call to source | +| array_flow.rb:1500:10:1500:16 | ...[...] | array_flow.rb:1495:14:1495:26 | call to source | array_flow.rb:1500:10:1500:16 | ...[...] | $@ | array_flow.rb:1495:14:1495:26 | call to source | call to source | +| array_flow.rb:1501:10:1501:16 | ...[...] | array_flow.rb:1495:34:1495:46 | call to source | array_flow.rb:1501:10:1501:16 | ...[...] | $@ | array_flow.rb:1495:34:1495:46 | call to source | call to source | +| array_flow.rb:1502:10:1502:16 | ...[...] | array_flow.rb:1495:54:1495:66 | call to source | array_flow.rb:1502:10:1502:16 | ...[...] | $@ | array_flow.rb:1495:54:1495:66 | call to source | call to source | +| array_flow.rb:1510:10:1510:13 | ...[...] | array_flow.rb:1506:16:1506:28 | call to source | array_flow.rb:1510:10:1510:13 | ...[...] | $@ | array_flow.rb:1506:16:1506:28 | call to source | call to source | +| array_flow.rb:1510:10:1510:13 | ...[...] | array_flow.rb:1507:13:1507:25 | call to source | array_flow.rb:1510:10:1510:13 | ...[...] | $@ | array_flow.rb:1507:13:1507:25 | call to source | call to source | +| array_flow.rb:1510:10:1510:13 | ...[...] | array_flow.rb:1508:13:1508:25 | call to source | array_flow.rb:1510:10:1510:13 | ...[...] | $@ | array_flow.rb:1508:13:1508:25 | call to source | call to source | +| array_flow.rb:1511:10:1511:13 | ...[...] | array_flow.rb:1506:16:1506:28 | call to source | array_flow.rb:1511:10:1511:13 | ...[...] | $@ | array_flow.rb:1506:16:1506:28 | call to source | call to source | +| array_flow.rb:1511:10:1511:13 | ...[...] | array_flow.rb:1507:13:1507:25 | call to source | array_flow.rb:1511:10:1511:13 | ...[...] | $@ | array_flow.rb:1507:13:1507:25 | call to source | call to source | +| array_flow.rb:1511:10:1511:13 | ...[...] | array_flow.rb:1508:13:1508:25 | call to source | array_flow.rb:1511:10:1511:13 | ...[...] | $@ | array_flow.rb:1508:13:1508:25 | call to source | call to source | +| array_flow.rb:1512:10:1512:13 | ...[...] | array_flow.rb:1506:16:1506:28 | call to source | array_flow.rb:1512:10:1512:13 | ...[...] | $@ | array_flow.rb:1506:16:1506:28 | call to source | call to source | +| array_flow.rb:1512:10:1512:13 | ...[...] | array_flow.rb:1507:13:1507:25 | call to source | array_flow.rb:1512:10:1512:13 | ...[...] | $@ | array_flow.rb:1507:13:1507:25 | call to source | call to source | +| array_flow.rb:1512:10:1512:13 | ...[...] | array_flow.rb:1508:13:1508:25 | call to source | array_flow.rb:1512:10:1512:13 | ...[...] | $@ | array_flow.rb:1508:13:1508:25 | call to source | call to source | +| array_flow.rb:1519:10:1519:13 | ...[...] | array_flow.rb:1516:19:1516:31 | call to source | array_flow.rb:1519:10:1519:13 | ...[...] | $@ | array_flow.rb:1516:19:1516:31 | call to source | call to source | +| array_flow.rb:1519:10:1519:13 | ...[...] | array_flow.rb:1516:34:1516:46 | call to source | array_flow.rb:1519:10:1519:13 | ...[...] | $@ | array_flow.rb:1516:34:1516:46 | call to source | call to source | +| array_flow.rb:1520:10:1520:13 | ...[...] | array_flow.rb:1516:19:1516:31 | call to source | array_flow.rb:1520:10:1520:13 | ...[...] | $@ | array_flow.rb:1516:19:1516:31 | call to source | call to source | +| array_flow.rb:1520:10:1520:13 | ...[...] | array_flow.rb:1516:34:1516:46 | call to source | array_flow.rb:1520:10:1520:13 | ...[...] | $@ | array_flow.rb:1516:34:1516:46 | call to source | call to source | +| array_flow.rb:1523:14:1523:14 | x | array_flow.rb:1516:19:1516:31 | call to source | array_flow.rb:1523:14:1523:14 | x | $@ | array_flow.rb:1516:19:1516:31 | call to source | call to source | +| array_flow.rb:1523:14:1523:14 | x | array_flow.rb:1516:34:1516:46 | call to source | array_flow.rb:1523:14:1523:14 | x | $@ | array_flow.rb:1516:34:1516:46 | call to source | call to source | +| array_flow.rb:1526:10:1526:13 | ...[...] | array_flow.rb:1516:19:1516:31 | call to source | array_flow.rb:1526:10:1526:13 | ...[...] | $@ | array_flow.rb:1516:19:1516:31 | call to source | call to source | +| array_flow.rb:1526:10:1526:13 | ...[...] | array_flow.rb:1516:34:1516:46 | call to source | array_flow.rb:1526:10:1526:13 | ...[...] | $@ | array_flow.rb:1516:34:1516:46 | call to source | call to source | +| array_flow.rb:1532:10:1532:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source | array_flow.rb:1532:10:1532:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source | call to source | +| array_flow.rb:1532:10:1532:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source | array_flow.rb:1532:10:1532:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source | call to source | +| array_flow.rb:1533:10:1533:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source | array_flow.rb:1533:10:1533:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source | call to source | +| array_flow.rb:1533:10:1533:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source | array_flow.rb:1533:10:1533:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source | call to source | +| array_flow.rb:1534:10:1534:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source | array_flow.rb:1534:10:1534:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source | call to source | +| array_flow.rb:1534:10:1534:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source | array_flow.rb:1534:10:1534:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source | call to source | +| array_flow.rb:1535:10:1535:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source | array_flow.rb:1535:10:1535:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source | call to source | +| array_flow.rb:1535:10:1535:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source | array_flow.rb:1535:10:1535:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source | call to source | +| array_flow.rb:1539:14:1539:14 | x | array_flow.rb:1537:16:1537:28 | call to source | array_flow.rb:1539:14:1539:14 | x | $@ | array_flow.rb:1537:16:1537:28 | call to source | call to source | +| array_flow.rb:1539:14:1539:14 | x | array_flow.rb:1537:31:1537:43 | call to source | array_flow.rb:1539:14:1539:14 | x | $@ | array_flow.rb:1537:31:1537:43 | call to source | call to source | +| array_flow.rb:1542:10:1542:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source | array_flow.rb:1542:10:1542:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source | call to source | +| array_flow.rb:1542:10:1542:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source | array_flow.rb:1542:10:1542:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source | call to source | +| array_flow.rb:1543:10:1543:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source | array_flow.rb:1543:10:1543:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source | call to source | +| array_flow.rb:1543:10:1543:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source | array_flow.rb:1543:10:1543:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source | call to source | +| array_flow.rb:1544:10:1544:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source | array_flow.rb:1544:10:1544:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source | call to source | +| array_flow.rb:1544:10:1544:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source | array_flow.rb:1544:10:1544:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source | call to source | +| array_flow.rb:1545:10:1545:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source | array_flow.rb:1545:10:1545:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source | call to source | +| array_flow.rb:1545:10:1545:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source | array_flow.rb:1545:10:1545:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source | call to source | +| array_flow.rb:1553:10:1553:13 | ...[...] | array_flow.rb:1550:21:1550:33 | call to source | array_flow.rb:1553:10:1553:13 | ...[...] | $@ | array_flow.rb:1550:21:1550:33 | call to source | call to source | +| array_flow.rb:1556:10:1556:13 | ...[...] | array_flow.rb:1549:16:1549:28 | call to source | array_flow.rb:1556:10:1556:13 | ...[...] | $@ | array_flow.rb:1549:16:1549:28 | call to source | call to source | +| array_flow.rb:1564:10:1564:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1564:10:1564:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source | call to source | +| array_flow.rb:1566:10:1566:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1566:10:1566:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source | call to source | +| array_flow.rb:1569:10:1569:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1569:10:1569:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source | call to source | +| array_flow.rb:1569:10:1569:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source | array_flow.rb:1569:10:1569:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source | call to source | +| array_flow.rb:1570:10:1570:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1570:10:1570:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source | call to source | +| array_flow.rb:1570:10:1570:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source | array_flow.rb:1570:10:1570:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source | call to source | +| array_flow.rb:1573:10:1573:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1573:10:1573:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source | call to source | +| array_flow.rb:1573:10:1573:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source | array_flow.rb:1573:10:1573:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source | call to source | +| array_flow.rb:1574:10:1574:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1574:10:1574:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source | call to source | +| array_flow.rb:1574:10:1574:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source | array_flow.rb:1574:10:1574:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source | call to source | +| array_flow.rb:1577:10:1577:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1577:10:1577:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source | call to source | +| array_flow.rb:1577:10:1577:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source | array_flow.rb:1577:10:1577:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source | call to source | +| array_flow.rb:1578:10:1578:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1578:10:1578:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source | call to source | +| array_flow.rb:1578:10:1578:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source | array_flow.rb:1578:10:1578:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source | call to source | +| array_flow.rb:1579:10:1579:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1579:10:1579:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source | call to source | +| array_flow.rb:1579:10:1579:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source | array_flow.rb:1579:10:1579:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source | call to source | +| array_flow.rb:1580:10:1580:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source | array_flow.rb:1580:10:1580:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source | call to source | +| array_flow.rb:1580:10:1580:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source | array_flow.rb:1580:10:1580:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source | call to source | +| array_flow.rb:1589:10:1589:16 | ...[...] | array_flow.rb:1586:10:1586:22 | call to source | array_flow.rb:1589:10:1589:16 | ...[...] | $@ | array_flow.rb:1586:10:1586:22 | call to source | call to source | +| array_flow.rb:1590:10:1590:16 | ...[...] | array_flow.rb:1585:13:1585:25 | call to source | array_flow.rb:1590:10:1590:16 | ...[...] | $@ | array_flow.rb:1585:13:1585:25 | call to source | call to source | +| array_flow.rb:1591:10:1591:16 | ...[...] | array_flow.rb:1584:16:1584:28 | call to source | array_flow.rb:1591:10:1591:16 | ...[...] | $@ | array_flow.rb:1584:16:1584:28 | call to source | call to source | +| array_flow.rb:1593:14:1593:17 | ...[...] | array_flow.rb:1584:16:1584:28 | call to source | array_flow.rb:1593:14:1593:17 | ...[...] | $@ | array_flow.rb:1584:16:1584:28 | call to source | call to source | +| array_flow.rb:1594:14:1594:17 | ...[...] | array_flow.rb:1585:13:1585:25 | call to source | array_flow.rb:1594:14:1594:17 | ...[...] | $@ | array_flow.rb:1585:13:1585:25 | call to source | call to source | +| array_flow.rb:1595:14:1595:17 | ...[...] | array_flow.rb:1586:10:1586:22 | call to source | array_flow.rb:1595:14:1595:17 | ...[...] | $@ | array_flow.rb:1586:10:1586:22 | call to source | call to source | +| array_flow.rb:1603:10:1603:13 | ...[...] | array_flow.rb:1600:16:1600:28 | call to source | array_flow.rb:1603:10:1603:13 | ...[...] | $@ | array_flow.rb:1600:16:1600:28 | call to source | call to source | +| array_flow.rb:1603:10:1603:13 | ...[...] | array_flow.rb:1601:13:1601:25 | call to source | array_flow.rb:1603:10:1603:13 | ...[...] | $@ | array_flow.rb:1601:13:1601:25 | call to source | call to source | +| array_flow.rb:1604:10:1604:13 | ...[...] | array_flow.rb:1600:16:1600:28 | call to source | array_flow.rb:1604:10:1604:13 | ...[...] | $@ | array_flow.rb:1600:16:1600:28 | call to source | call to source | +| array_flow.rb:1604:10:1604:13 | ...[...] | array_flow.rb:1601:13:1601:25 | call to source | array_flow.rb:1604:10:1604:13 | ...[...] | $@ | array_flow.rb:1601:13:1601:25 | call to source | call to source | +| array_flow.rb:1605:10:1605:13 | ...[...] | array_flow.rb:1600:16:1600:28 | call to source | array_flow.rb:1605:10:1605:13 | ...[...] | $@ | array_flow.rb:1600:16:1600:28 | call to source | call to source | +| array_flow.rb:1605:10:1605:13 | ...[...] | array_flow.rb:1601:13:1601:25 | call to source | array_flow.rb:1605:10:1605:13 | ...[...] | $@ | array_flow.rb:1601:13:1601:25 | call to source | call to source | +| array_flow.rb:1611:10:1611:16 | ...[...] | array_flow.rb:1610:15:1610:27 | call to source | array_flow.rb:1611:10:1611:16 | ...[...] | $@ | array_flow.rb:1610:15:1610:27 | call to source | call to source | +| array_flow.rb:1614:10:1614:16 | ...[...] | array_flow.rb:1610:15:1610:27 | call to source | array_flow.rb:1614:10:1614:16 | ...[...] | $@ | array_flow.rb:1610:15:1610:27 | call to source | call to source | +| array_flow.rb:1614:10:1614:16 | ...[...] | array_flow.rb:1613:15:1613:27 | call to source | array_flow.rb:1614:10:1614:16 | ...[...] | $@ | array_flow.rb:1613:15:1613:27 | call to source | call to source | +| array_flow.rb:1615:10:1615:16 | ...[...] | array_flow.rb:1610:15:1610:27 | call to source | array_flow.rb:1615:10:1615:16 | ...[...] | $@ | array_flow.rb:1610:15:1610:27 | call to source | call to source | +| array_flow.rb:1627:10:1627:13 | ...[...] | array_flow.rb:1622:16:1622:28 | call to source | array_flow.rb:1627:10:1627:13 | ...[...] | $@ | array_flow.rb:1622:16:1622:28 | call to source | call to source | +| array_flow.rb:1627:10:1627:13 | ...[...] | array_flow.rb:1624:14:1624:26 | call to source | array_flow.rb:1627:10:1627:13 | ...[...] | $@ | array_flow.rb:1624:14:1624:26 | call to source | call to source | +| array_flow.rb:1627:10:1627:13 | ...[...] | array_flow.rb:1626:16:1626:28 | call to source | array_flow.rb:1627:10:1627:13 | ...[...] | $@ | array_flow.rb:1626:16:1626:28 | call to source | call to source | +| array_flow.rb:1629:10:1629:17 | ...[...] | array_flow.rb:1620:12:1620:24 | call to source | array_flow.rb:1629:10:1629:17 | ...[...] | $@ | array_flow.rb:1620:12:1620:24 | call to source | call to source | +| array_flow.rb:1629:10:1629:17 | ...[...] | array_flow.rb:1622:16:1622:28 | call to source | array_flow.rb:1629:10:1629:17 | ...[...] | $@ | array_flow.rb:1622:16:1622:28 | call to source | call to source | +| array_flow.rb:1629:10:1629:17 | ...[...] | array_flow.rb:1624:14:1624:26 | call to source | array_flow.rb:1629:10:1629:17 | ...[...] | $@ | array_flow.rb:1624:14:1624:26 | call to source | call to source | +| array_flow.rb:1629:10:1629:17 | ...[...] | array_flow.rb:1626:16:1626:28 | call to source | array_flow.rb:1629:10:1629:17 | ...[...] | $@ | array_flow.rb:1626:16:1626:28 | call to source | call to source | +| array_flow.rb:1631:10:1631:15 | ...[...] | array_flow.rb:1620:12:1620:24 | call to source | array_flow.rb:1631:10:1631:15 | ...[...] | $@ | array_flow.rb:1620:12:1620:24 | call to source | call to source | +| array_flow.rb:1631:10:1631:15 | ...[...] | array_flow.rb:1622:16:1622:28 | call to source | array_flow.rb:1631:10:1631:15 | ...[...] | $@ | array_flow.rb:1622:16:1622:28 | call to source | call to source | +| array_flow.rb:1631:10:1631:15 | ...[...] | array_flow.rb:1624:14:1624:26 | call to source | array_flow.rb:1631:10:1631:15 | ...[...] | $@ | array_flow.rb:1624:14:1624:26 | call to source | call to source | +| array_flow.rb:1631:10:1631:15 | ...[...] | array_flow.rb:1626:16:1626:28 | call to source | array_flow.rb:1631:10:1631:15 | ...[...] | $@ | array_flow.rb:1626:16:1626:28 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected b/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected index df04162531c..58d5861bae9 100644 --- a/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected +++ b/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected @@ -1,361 +1,361 @@ failures edges -| call_sensitivity.rb:9:7:9:13 | call to taint : | call_sensitivity.rb:9:6:9:14 | ( ... ) | -| call_sensitivity.rb:9:7:9:13 | call to taint : | call_sensitivity.rb:9:6:9:14 | ( ... ) | -| call_sensitivity.rb:11:13:11:13 | x : | call_sensitivity.rb:12:11:12:11 | x : | -| call_sensitivity.rb:11:13:11:13 | x : | call_sensitivity.rb:12:11:12:11 | x : | -| call_sensitivity.rb:12:11:12:11 | x : | call_sensitivity.rb:19:22:19:22 | x : | -| call_sensitivity.rb:12:11:12:11 | x : | call_sensitivity.rb:19:22:19:22 | x : | -| call_sensitivity.rb:19:9:19:17 | ( ... ) : | call_sensitivity.rb:11:13:11:13 | x : | -| call_sensitivity.rb:19:9:19:17 | ( ... ) : | call_sensitivity.rb:11:13:11:13 | x : | -| call_sensitivity.rb:19:10:19:16 | call to taint : | call_sensitivity.rb:19:9:19:17 | ( ... ) : | -| call_sensitivity.rb:19:10:19:16 | call to taint : | call_sensitivity.rb:19:9:19:17 | ( ... ) : | -| call_sensitivity.rb:19:22:19:22 | x : | call_sensitivity.rb:19:30:19:30 | x | -| call_sensitivity.rb:19:22:19:22 | x : | call_sensitivity.rb:19:30:19:30 | x | -| call_sensitivity.rb:21:27:21:27 | x : | call_sensitivity.rb:22:17:22:17 | x : | -| call_sensitivity.rb:21:27:21:27 | x : | call_sensitivity.rb:22:17:22:17 | x : | -| call_sensitivity.rb:21:27:21:27 | x : | call_sensitivity.rb:22:17:22:17 | x : | -| call_sensitivity.rb:21:27:21:27 | x : | call_sensitivity.rb:22:17:22:17 | x : | -| call_sensitivity.rb:21:27:21:27 | x : | call_sensitivity.rb:22:17:22:17 | x : | -| call_sensitivity.rb:21:27:21:27 | x : | call_sensitivity.rb:22:17:22:17 | x : | -| call_sensitivity.rb:22:17:22:17 | x : | call_sensitivity.rb:31:17:31:17 | x : | -| call_sensitivity.rb:22:17:22:17 | x : | call_sensitivity.rb:31:17:31:17 | x : | -| call_sensitivity.rb:22:17:22:17 | x : | call_sensitivity.rb:40:23:40:23 | x : | -| call_sensitivity.rb:22:17:22:17 | x : | call_sensitivity.rb:40:23:40:23 | x : | -| call_sensitivity.rb:22:17:22:17 | x : | call_sensitivity.rb:43:24:43:24 | x : | -| call_sensitivity.rb:22:17:22:17 | x : | call_sensitivity.rb:43:24:43:24 | x : | -| call_sensitivity.rb:31:17:31:17 | x : | call_sensitivity.rb:31:27:31:27 | x | -| call_sensitivity.rb:31:17:31:17 | x : | call_sensitivity.rb:31:27:31:27 | x | -| call_sensitivity.rb:32:25:32:32 | call to taint : | call_sensitivity.rb:21:27:21:27 | x : | -| call_sensitivity.rb:32:25:32:32 | call to taint : | call_sensitivity.rb:21:27:21:27 | x : | -| call_sensitivity.rb:40:23:40:23 | x : | call_sensitivity.rb:40:31:40:31 | x | -| call_sensitivity.rb:40:23:40:23 | x : | call_sensitivity.rb:40:31:40:31 | x | -| call_sensitivity.rb:41:25:41:32 | call to taint : | call_sensitivity.rb:21:27:21:27 | x : | -| call_sensitivity.rb:41:25:41:32 | call to taint : | call_sensitivity.rb:21:27:21:27 | x : | -| call_sensitivity.rb:43:24:43:24 | x : | call_sensitivity.rb:43:32:43:32 | x | -| call_sensitivity.rb:43:24:43:24 | x : | call_sensitivity.rb:43:32:43:32 | x | -| call_sensitivity.rb:44:26:44:33 | call to taint : | call_sensitivity.rb:21:27:21:27 | x : | -| call_sensitivity.rb:44:26:44:33 | call to taint : | call_sensitivity.rb:21:27:21:27 | x : | -| call_sensitivity.rb:50:15:50:15 | x : | call_sensitivity.rb:51:10:51:10 | x | -| call_sensitivity.rb:50:15:50:15 | x : | call_sensitivity.rb:51:10:51:10 | x | -| call_sensitivity.rb:54:15:54:15 | x : | call_sensitivity.rb:55:13:55:13 | x : | -| call_sensitivity.rb:54:15:54:15 | x : | call_sensitivity.rb:55:13:55:13 | x : | -| call_sensitivity.rb:54:15:54:15 | x : | call_sensitivity.rb:55:13:55:13 | x : | -| call_sensitivity.rb:54:15:54:15 | x : | call_sensitivity.rb:55:13:55:13 | x : | -| call_sensitivity.rb:55:13:55:13 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:55:13:55:13 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:55:13:55:13 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:55:13:55:13 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:58:20:58:20 | x : | call_sensitivity.rb:59:18:59:18 | x : | -| call_sensitivity.rb:58:20:58:20 | x : | call_sensitivity.rb:59:18:59:18 | x : | -| call_sensitivity.rb:59:18:59:18 | x : | call_sensitivity.rb:54:15:54:15 | x : | -| call_sensitivity.rb:59:18:59:18 | x : | call_sensitivity.rb:54:15:54:15 | x : | -| call_sensitivity.rb:62:18:62:18 | y : | call_sensitivity.rb:63:15:63:15 | y : | -| call_sensitivity.rb:62:18:62:18 | y : | call_sensitivity.rb:63:15:63:15 | y : | -| call_sensitivity.rb:62:18:62:18 | y : | call_sensitivity.rb:63:15:63:15 | y : | -| call_sensitivity.rb:62:18:62:18 | y : | call_sensitivity.rb:63:15:63:15 | y : | -| call_sensitivity.rb:63:15:63:15 | y : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:63:15:63:15 | y : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:63:15:63:15 | y : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:63:15:63:15 | y : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:66:20:66:20 | x : | call_sensitivity.rb:67:24:67:24 | x : | -| call_sensitivity.rb:66:20:66:20 | x : | call_sensitivity.rb:67:24:67:24 | x : | -| call_sensitivity.rb:67:24:67:24 | x : | call_sensitivity.rb:62:18:62:18 | y : | -| call_sensitivity.rb:67:24:67:24 | x : | call_sensitivity.rb:62:18:62:18 | y : | -| call_sensitivity.rb:70:30:70:30 | x : | call_sensitivity.rb:71:10:71:10 | x | -| call_sensitivity.rb:70:30:70:30 | x : | call_sensitivity.rb:71:10:71:10 | x | -| call_sensitivity.rb:74:18:74:18 | y : | call_sensitivity.rb:76:17:76:17 | y : | -| call_sensitivity.rb:74:18:74:18 | y : | call_sensitivity.rb:76:17:76:17 | y : | -| call_sensitivity.rb:76:17:76:17 | y : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:76:17:76:17 | y : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:80:15:80:15 | x : | call_sensitivity.rb:81:18:81:18 | x : | -| call_sensitivity.rb:80:15:80:15 | x : | call_sensitivity.rb:81:18:81:18 | x : | -| call_sensitivity.rb:81:18:81:18 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:81:18:81:18 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:85:18:85:27 | ( ... ) : | call_sensitivity.rb:80:15:80:15 | x : | -| call_sensitivity.rb:85:18:85:27 | ( ... ) : | call_sensitivity.rb:80:15:80:15 | x : | -| call_sensitivity.rb:85:19:85:26 | call to taint : | call_sensitivity.rb:85:18:85:27 | ( ... ) : | -| call_sensitivity.rb:85:19:85:26 | call to taint : | call_sensitivity.rb:85:18:85:27 | ( ... ) : | -| call_sensitivity.rb:88:30:88:30 | x : | call_sensitivity.rb:89:23:89:23 | x : | -| call_sensitivity.rb:88:30:88:30 | x : | call_sensitivity.rb:89:23:89:23 | x : | -| call_sensitivity.rb:88:30:88:30 | x : | call_sensitivity.rb:89:23:89:23 | x : | -| call_sensitivity.rb:88:30:88:30 | x : | call_sensitivity.rb:89:23:89:23 | x : | -| call_sensitivity.rb:89:23:89:23 | x : | call_sensitivity.rb:70:30:70:30 | x : | -| call_sensitivity.rb:89:23:89:23 | x : | call_sensitivity.rb:70:30:70:30 | x : | -| call_sensitivity.rb:89:23:89:23 | x : | call_sensitivity.rb:70:30:70:30 | x : | -| call_sensitivity.rb:89:23:89:23 | x : | call_sensitivity.rb:70:30:70:30 | x : | -| call_sensitivity.rb:92:35:92:35 | x : | call_sensitivity.rb:93:28:93:28 | x : | -| call_sensitivity.rb:92:35:92:35 | x : | call_sensitivity.rb:93:28:93:28 | x : | -| call_sensitivity.rb:93:28:93:28 | x : | call_sensitivity.rb:88:30:88:30 | x : | -| call_sensitivity.rb:93:28:93:28 | x : | call_sensitivity.rb:88:30:88:30 | x : | -| call_sensitivity.rb:96:33:96:33 | y : | call_sensitivity.rb:97:25:97:25 | y : | -| call_sensitivity.rb:96:33:96:33 | y : | call_sensitivity.rb:97:25:97:25 | y : | -| call_sensitivity.rb:96:33:96:33 | y : | call_sensitivity.rb:97:25:97:25 | y : | -| call_sensitivity.rb:96:33:96:33 | y : | call_sensitivity.rb:97:25:97:25 | y : | -| call_sensitivity.rb:97:25:97:25 | y : | call_sensitivity.rb:70:30:70:30 | x : | -| call_sensitivity.rb:97:25:97:25 | y : | call_sensitivity.rb:70:30:70:30 | x : | -| call_sensitivity.rb:97:25:97:25 | y : | call_sensitivity.rb:70:30:70:30 | x : | -| call_sensitivity.rb:97:25:97:25 | y : | call_sensitivity.rb:70:30:70:30 | x : | -| call_sensitivity.rb:100:35:100:35 | x : | call_sensitivity.rb:101:34:101:34 | x : | -| call_sensitivity.rb:100:35:100:35 | x : | call_sensitivity.rb:101:34:101:34 | x : | -| call_sensitivity.rb:101:34:101:34 | x : | call_sensitivity.rb:96:33:96:33 | y : | -| call_sensitivity.rb:101:34:101:34 | x : | call_sensitivity.rb:96:33:96:33 | y : | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:106:13:106:13 | x : | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:106:13:106:13 | x : | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:106:13:106:13 | x : | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:106:13:106:13 | x : | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:106:13:106:13 | x : | -| call_sensitivity.rb:104:18:104:18 | x : | call_sensitivity.rb:106:13:106:13 | x : | -| call_sensitivity.rb:106:13:106:13 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:106:13:106:13 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:106:13:106:13 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:106:13:106:13 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:106:13:106:13 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:106:13:106:13 | x : | call_sensitivity.rb:50:15:50:15 | x : | -| call_sensitivity.rb:109:21:109:21 | x : | call_sensitivity.rb:110:9:110:9 | x : | -| call_sensitivity.rb:109:21:109:21 | x : | call_sensitivity.rb:110:9:110:9 | x : | -| call_sensitivity.rb:110:9:110:9 | x : | call_sensitivity.rb:104:18:104:18 | x : | -| call_sensitivity.rb:110:9:110:9 | x : | call_sensitivity.rb:104:18:104:18 | x : | -| call_sensitivity.rb:114:11:114:20 | ( ... ) : | call_sensitivity.rb:104:18:104:18 | x : | -| call_sensitivity.rb:114:11:114:20 | ( ... ) : | call_sensitivity.rb:104:18:104:18 | x : | -| call_sensitivity.rb:114:12:114:19 | call to taint : | call_sensitivity.rb:114:11:114:20 | ( ... ) : | -| call_sensitivity.rb:114:12:114:19 | call to taint : | call_sensitivity.rb:114:11:114:20 | ( ... ) : | -| call_sensitivity.rb:115:11:115:18 | call to taint : | call_sensitivity.rb:54:15:54:15 | x : | -| call_sensitivity.rb:115:11:115:18 | call to taint : | call_sensitivity.rb:54:15:54:15 | x : | -| call_sensitivity.rb:116:16:116:23 | call to taint : | call_sensitivity.rb:58:20:58:20 | x : | -| call_sensitivity.rb:116:16:116:23 | call to taint : | call_sensitivity.rb:58:20:58:20 | x : | -| call_sensitivity.rb:117:14:117:22 | call to taint : | call_sensitivity.rb:62:18:62:18 | y : | -| call_sensitivity.rb:117:14:117:22 | call to taint : | call_sensitivity.rb:62:18:62:18 | y : | -| call_sensitivity.rb:118:16:118:24 | call to taint : | call_sensitivity.rb:66:20:66:20 | x : | -| call_sensitivity.rb:118:16:118:24 | call to taint : | call_sensitivity.rb:66:20:66:20 | x : | -| call_sensitivity.rb:119:14:119:22 | call to taint : | call_sensitivity.rb:74:18:74:18 | y : | -| call_sensitivity.rb:119:14:119:22 | call to taint : | call_sensitivity.rb:74:18:74:18 | y : | -| call_sensitivity.rb:121:21:121:28 | call to taint : | call_sensitivity.rb:88:30:88:30 | x : | -| call_sensitivity.rb:121:21:121:28 | call to taint : | call_sensitivity.rb:88:30:88:30 | x : | -| call_sensitivity.rb:122:26:122:33 | call to taint : | call_sensitivity.rb:92:35:92:35 | x : | -| call_sensitivity.rb:122:26:122:33 | call to taint : | call_sensitivity.rb:92:35:92:35 | x : | -| call_sensitivity.rb:123:24:123:32 | call to taint : | call_sensitivity.rb:96:33:96:33 | y : | -| call_sensitivity.rb:123:24:123:32 | call to taint : | call_sensitivity.rb:96:33:96:33 | y : | -| call_sensitivity.rb:124:26:124:33 | call to taint : | call_sensitivity.rb:100:35:100:35 | x : | -| call_sensitivity.rb:124:26:124:33 | call to taint : | call_sensitivity.rb:100:35:100:35 | x : | -| call_sensitivity.rb:125:12:125:19 | call to taint : | call_sensitivity.rb:109:21:109:21 | x : | -| call_sensitivity.rb:125:12:125:19 | call to taint : | call_sensitivity.rb:109:21:109:21 | x : | -| call_sensitivity.rb:166:14:166:22 | call to taint : | call_sensitivity.rb:74:18:74:18 | y : | -| call_sensitivity.rb:166:14:166:22 | call to taint : | call_sensitivity.rb:74:18:74:18 | y : | -| call_sensitivity.rb:174:19:174:19 | x : | call_sensitivity.rb:175:12:175:12 | x : | -| call_sensitivity.rb:174:19:174:19 | x : | call_sensitivity.rb:175:12:175:12 | x : | -| call_sensitivity.rb:175:12:175:12 | x : | call_sensitivity.rb:104:18:104:18 | x : | -| call_sensitivity.rb:175:12:175:12 | x : | call_sensitivity.rb:104:18:104:18 | x : | -| call_sensitivity.rb:178:11:178:19 | call to taint : | call_sensitivity.rb:174:19:174:19 | x : | -| call_sensitivity.rb:178:11:178:19 | call to taint : | call_sensitivity.rb:174:19:174:19 | x : | -| call_sensitivity.rb:187:11:187:20 | ( ... ) : | call_sensitivity.rb:104:18:104:18 | x : | -| call_sensitivity.rb:187:11:187:20 | ( ... ) : | call_sensitivity.rb:104:18:104:18 | x : | -| call_sensitivity.rb:187:12:187:19 | call to taint : | call_sensitivity.rb:187:11:187:20 | ( ... ) : | -| call_sensitivity.rb:187:12:187:19 | call to taint : | call_sensitivity.rb:187:11:187:20 | ( ... ) : | +| call_sensitivity.rb:9:7:9:13 | call to taint | call_sensitivity.rb:9:6:9:14 | ( ... ) | +| call_sensitivity.rb:9:7:9:13 | call to taint | call_sensitivity.rb:9:6:9:14 | ( ... ) | +| call_sensitivity.rb:11:13:11:13 | x | call_sensitivity.rb:12:11:12:11 | x | +| call_sensitivity.rb:11:13:11:13 | x | call_sensitivity.rb:12:11:12:11 | x | +| call_sensitivity.rb:12:11:12:11 | x | call_sensitivity.rb:19:22:19:22 | x | +| call_sensitivity.rb:12:11:12:11 | x | call_sensitivity.rb:19:22:19:22 | x | +| call_sensitivity.rb:19:9:19:17 | ( ... ) | call_sensitivity.rb:11:13:11:13 | x | +| call_sensitivity.rb:19:9:19:17 | ( ... ) | call_sensitivity.rb:11:13:11:13 | x | +| call_sensitivity.rb:19:10:19:16 | call to taint | call_sensitivity.rb:19:9:19:17 | ( ... ) | +| call_sensitivity.rb:19:10:19:16 | call to taint | call_sensitivity.rb:19:9:19:17 | ( ... ) | +| call_sensitivity.rb:19:22:19:22 | x | call_sensitivity.rb:19:30:19:30 | x | +| call_sensitivity.rb:19:22:19:22 | x | call_sensitivity.rb:19:30:19:30 | x | +| call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | +| call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | +| call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | +| call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | +| call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | +| call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | +| call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:31:17:31:17 | x | +| call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:31:17:31:17 | x | +| call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:40:23:40:23 | x | +| call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:40:23:40:23 | x | +| call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:43:24:43:24 | x | +| call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:43:24:43:24 | x | +| call_sensitivity.rb:31:17:31:17 | x | call_sensitivity.rb:31:27:31:27 | x | +| call_sensitivity.rb:31:17:31:17 | x | call_sensitivity.rb:31:27:31:27 | x | +| call_sensitivity.rb:32:25:32:32 | call to taint | call_sensitivity.rb:21:27:21:27 | x | +| call_sensitivity.rb:32:25:32:32 | call to taint | call_sensitivity.rb:21:27:21:27 | x | +| call_sensitivity.rb:40:23:40:23 | x | call_sensitivity.rb:40:31:40:31 | x | +| call_sensitivity.rb:40:23:40:23 | x | call_sensitivity.rb:40:31:40:31 | x | +| call_sensitivity.rb:41:25:41:32 | call to taint | call_sensitivity.rb:21:27:21:27 | x | +| call_sensitivity.rb:41:25:41:32 | call to taint | call_sensitivity.rb:21:27:21:27 | x | +| call_sensitivity.rb:43:24:43:24 | x | call_sensitivity.rb:43:32:43:32 | x | +| call_sensitivity.rb:43:24:43:24 | x | call_sensitivity.rb:43:32:43:32 | x | +| call_sensitivity.rb:44:26:44:33 | call to taint | call_sensitivity.rb:21:27:21:27 | x | +| call_sensitivity.rb:44:26:44:33 | call to taint | call_sensitivity.rb:21:27:21:27 | x | +| call_sensitivity.rb:50:15:50:15 | x | call_sensitivity.rb:51:10:51:10 | x | +| call_sensitivity.rb:50:15:50:15 | x | call_sensitivity.rb:51:10:51:10 | x | +| call_sensitivity.rb:54:15:54:15 | x | call_sensitivity.rb:55:13:55:13 | x | +| call_sensitivity.rb:54:15:54:15 | x | call_sensitivity.rb:55:13:55:13 | x | +| call_sensitivity.rb:54:15:54:15 | x | call_sensitivity.rb:55:13:55:13 | x | +| call_sensitivity.rb:54:15:54:15 | x | call_sensitivity.rb:55:13:55:13 | x | +| call_sensitivity.rb:55:13:55:13 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:55:13:55:13 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:55:13:55:13 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:55:13:55:13 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:58:20:58:20 | x | call_sensitivity.rb:59:18:59:18 | x | +| call_sensitivity.rb:58:20:58:20 | x | call_sensitivity.rb:59:18:59:18 | x | +| call_sensitivity.rb:59:18:59:18 | x | call_sensitivity.rb:54:15:54:15 | x | +| call_sensitivity.rb:59:18:59:18 | x | call_sensitivity.rb:54:15:54:15 | x | +| call_sensitivity.rb:62:18:62:18 | y | call_sensitivity.rb:63:15:63:15 | y | +| call_sensitivity.rb:62:18:62:18 | y | call_sensitivity.rb:63:15:63:15 | y | +| call_sensitivity.rb:62:18:62:18 | y | call_sensitivity.rb:63:15:63:15 | y | +| call_sensitivity.rb:62:18:62:18 | y | call_sensitivity.rb:63:15:63:15 | y | +| call_sensitivity.rb:63:15:63:15 | y | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:63:15:63:15 | y | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:63:15:63:15 | y | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:63:15:63:15 | y | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:66:20:66:20 | x | call_sensitivity.rb:67:24:67:24 | x | +| call_sensitivity.rb:66:20:66:20 | x | call_sensitivity.rb:67:24:67:24 | x | +| call_sensitivity.rb:67:24:67:24 | x | call_sensitivity.rb:62:18:62:18 | y | +| call_sensitivity.rb:67:24:67:24 | x | call_sensitivity.rb:62:18:62:18 | y | +| call_sensitivity.rb:70:30:70:30 | x | call_sensitivity.rb:71:10:71:10 | x | +| call_sensitivity.rb:70:30:70:30 | x | call_sensitivity.rb:71:10:71:10 | x | +| call_sensitivity.rb:74:18:74:18 | y | call_sensitivity.rb:76:17:76:17 | y | +| call_sensitivity.rb:74:18:74:18 | y | call_sensitivity.rb:76:17:76:17 | y | +| call_sensitivity.rb:76:17:76:17 | y | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:76:17:76:17 | y | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:80:15:80:15 | x | call_sensitivity.rb:81:18:81:18 | x | +| call_sensitivity.rb:80:15:80:15 | x | call_sensitivity.rb:81:18:81:18 | x | +| call_sensitivity.rb:81:18:81:18 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:81:18:81:18 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:85:18:85:27 | ( ... ) | call_sensitivity.rb:80:15:80:15 | x | +| call_sensitivity.rb:85:18:85:27 | ( ... ) | call_sensitivity.rb:80:15:80:15 | x | +| call_sensitivity.rb:85:19:85:26 | call to taint | call_sensitivity.rb:85:18:85:27 | ( ... ) | +| call_sensitivity.rb:85:19:85:26 | call to taint | call_sensitivity.rb:85:18:85:27 | ( ... ) | +| call_sensitivity.rb:88:30:88:30 | x | call_sensitivity.rb:89:23:89:23 | x | +| call_sensitivity.rb:88:30:88:30 | x | call_sensitivity.rb:89:23:89:23 | x | +| call_sensitivity.rb:88:30:88:30 | x | call_sensitivity.rb:89:23:89:23 | x | +| call_sensitivity.rb:88:30:88:30 | x | call_sensitivity.rb:89:23:89:23 | x | +| call_sensitivity.rb:89:23:89:23 | x | call_sensitivity.rb:70:30:70:30 | x | +| call_sensitivity.rb:89:23:89:23 | x | call_sensitivity.rb:70:30:70:30 | x | +| call_sensitivity.rb:89:23:89:23 | x | call_sensitivity.rb:70:30:70:30 | x | +| call_sensitivity.rb:89:23:89:23 | x | call_sensitivity.rb:70:30:70:30 | x | +| call_sensitivity.rb:92:35:92:35 | x | call_sensitivity.rb:93:28:93:28 | x | +| call_sensitivity.rb:92:35:92:35 | x | call_sensitivity.rb:93:28:93:28 | x | +| call_sensitivity.rb:93:28:93:28 | x | call_sensitivity.rb:88:30:88:30 | x | +| call_sensitivity.rb:93:28:93:28 | x | call_sensitivity.rb:88:30:88:30 | x | +| call_sensitivity.rb:96:33:96:33 | y | call_sensitivity.rb:97:25:97:25 | y | +| call_sensitivity.rb:96:33:96:33 | y | call_sensitivity.rb:97:25:97:25 | y | +| call_sensitivity.rb:96:33:96:33 | y | call_sensitivity.rb:97:25:97:25 | y | +| call_sensitivity.rb:96:33:96:33 | y | call_sensitivity.rb:97:25:97:25 | y | +| call_sensitivity.rb:97:25:97:25 | y | call_sensitivity.rb:70:30:70:30 | x | +| call_sensitivity.rb:97:25:97:25 | y | call_sensitivity.rb:70:30:70:30 | x | +| call_sensitivity.rb:97:25:97:25 | y | call_sensitivity.rb:70:30:70:30 | x | +| call_sensitivity.rb:97:25:97:25 | y | call_sensitivity.rb:70:30:70:30 | x | +| call_sensitivity.rb:100:35:100:35 | x | call_sensitivity.rb:101:34:101:34 | x | +| call_sensitivity.rb:100:35:100:35 | x | call_sensitivity.rb:101:34:101:34 | x | +| call_sensitivity.rb:101:34:101:34 | x | call_sensitivity.rb:96:33:96:33 | y | +| call_sensitivity.rb:101:34:101:34 | x | call_sensitivity.rb:96:33:96:33 | y | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | +| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | +| call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | +| call_sensitivity.rb:109:21:109:21 | x | call_sensitivity.rb:110:9:110:9 | x | +| call_sensitivity.rb:109:21:109:21 | x | call_sensitivity.rb:110:9:110:9 | x | +| call_sensitivity.rb:110:9:110:9 | x | call_sensitivity.rb:104:18:104:18 | x | +| call_sensitivity.rb:110:9:110:9 | x | call_sensitivity.rb:104:18:104:18 | x | +| call_sensitivity.rb:114:11:114:20 | ( ... ) | call_sensitivity.rb:104:18:104:18 | x | +| call_sensitivity.rb:114:11:114:20 | ( ... ) | call_sensitivity.rb:104:18:104:18 | x | +| call_sensitivity.rb:114:12:114:19 | call to taint | call_sensitivity.rb:114:11:114:20 | ( ... ) | +| call_sensitivity.rb:114:12:114:19 | call to taint | call_sensitivity.rb:114:11:114:20 | ( ... ) | +| call_sensitivity.rb:115:11:115:18 | call to taint | call_sensitivity.rb:54:15:54:15 | x | +| call_sensitivity.rb:115:11:115:18 | call to taint | call_sensitivity.rb:54:15:54:15 | x | +| call_sensitivity.rb:116:16:116:23 | call to taint | call_sensitivity.rb:58:20:58:20 | x | +| call_sensitivity.rb:116:16:116:23 | call to taint | call_sensitivity.rb:58:20:58:20 | x | +| call_sensitivity.rb:117:14:117:22 | call to taint | call_sensitivity.rb:62:18:62:18 | y | +| call_sensitivity.rb:117:14:117:22 | call to taint | call_sensitivity.rb:62:18:62:18 | y | +| call_sensitivity.rb:118:16:118:24 | call to taint | call_sensitivity.rb:66:20:66:20 | x | +| call_sensitivity.rb:118:16:118:24 | call to taint | call_sensitivity.rb:66:20:66:20 | x | +| call_sensitivity.rb:119:14:119:22 | call to taint | call_sensitivity.rb:74:18:74:18 | y | +| call_sensitivity.rb:119:14:119:22 | call to taint | call_sensitivity.rb:74:18:74:18 | y | +| call_sensitivity.rb:121:21:121:28 | call to taint | call_sensitivity.rb:88:30:88:30 | x | +| call_sensitivity.rb:121:21:121:28 | call to taint | call_sensitivity.rb:88:30:88:30 | x | +| call_sensitivity.rb:122:26:122:33 | call to taint | call_sensitivity.rb:92:35:92:35 | x | +| call_sensitivity.rb:122:26:122:33 | call to taint | call_sensitivity.rb:92:35:92:35 | x | +| call_sensitivity.rb:123:24:123:32 | call to taint | call_sensitivity.rb:96:33:96:33 | y | +| call_sensitivity.rb:123:24:123:32 | call to taint | call_sensitivity.rb:96:33:96:33 | y | +| call_sensitivity.rb:124:26:124:33 | call to taint | call_sensitivity.rb:100:35:100:35 | x | +| call_sensitivity.rb:124:26:124:33 | call to taint | call_sensitivity.rb:100:35:100:35 | x | +| call_sensitivity.rb:125:12:125:19 | call to taint | call_sensitivity.rb:109:21:109:21 | x | +| call_sensitivity.rb:125:12:125:19 | call to taint | call_sensitivity.rb:109:21:109:21 | x | +| call_sensitivity.rb:166:14:166:22 | call to taint | call_sensitivity.rb:74:18:74:18 | y | +| call_sensitivity.rb:166:14:166:22 | call to taint | call_sensitivity.rb:74:18:74:18 | y | +| call_sensitivity.rb:174:19:174:19 | x | call_sensitivity.rb:175:12:175:12 | x | +| call_sensitivity.rb:174:19:174:19 | x | call_sensitivity.rb:175:12:175:12 | x | +| call_sensitivity.rb:175:12:175:12 | x | call_sensitivity.rb:104:18:104:18 | x | +| call_sensitivity.rb:175:12:175:12 | x | call_sensitivity.rb:104:18:104:18 | x | +| call_sensitivity.rb:178:11:178:19 | call to taint | call_sensitivity.rb:174:19:174:19 | x | +| call_sensitivity.rb:178:11:178:19 | call to taint | call_sensitivity.rb:174:19:174:19 | x | +| call_sensitivity.rb:187:11:187:20 | ( ... ) | call_sensitivity.rb:104:18:104:18 | x | +| call_sensitivity.rb:187:11:187:20 | ( ... ) | call_sensitivity.rb:104:18:104:18 | x | +| call_sensitivity.rb:187:12:187:19 | call to taint | call_sensitivity.rb:187:11:187:20 | ( ... ) | +| call_sensitivity.rb:187:12:187:19 | call to taint | call_sensitivity.rb:187:11:187:20 | ( ... ) | nodes | call_sensitivity.rb:9:6:9:14 | ( ... ) | semmle.label | ( ... ) | | call_sensitivity.rb:9:6:9:14 | ( ... ) | semmle.label | ( ... ) | -| call_sensitivity.rb:9:7:9:13 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:9:7:9:13 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:11:13:11:13 | x : | semmle.label | x : | -| call_sensitivity.rb:11:13:11:13 | x : | semmle.label | x : | -| call_sensitivity.rb:12:11:12:11 | x : | semmle.label | x : | -| call_sensitivity.rb:12:11:12:11 | x : | semmle.label | x : | -| call_sensitivity.rb:19:9:19:17 | ( ... ) : | semmle.label | ( ... ) : | -| call_sensitivity.rb:19:9:19:17 | ( ... ) : | semmle.label | ( ... ) : | -| call_sensitivity.rb:19:10:19:16 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:19:10:19:16 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:19:22:19:22 | x : | semmle.label | x : | -| call_sensitivity.rb:19:22:19:22 | x : | semmle.label | x : | +| call_sensitivity.rb:9:7:9:13 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:9:7:9:13 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:11:13:11:13 | x | semmle.label | x | +| call_sensitivity.rb:11:13:11:13 | x | semmle.label | x | +| call_sensitivity.rb:12:11:12:11 | x | semmle.label | x | +| call_sensitivity.rb:12:11:12:11 | x | semmle.label | x | +| call_sensitivity.rb:19:9:19:17 | ( ... ) | semmle.label | ( ... ) | +| call_sensitivity.rb:19:9:19:17 | ( ... ) | semmle.label | ( ... ) | +| call_sensitivity.rb:19:10:19:16 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:19:10:19:16 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:19:22:19:22 | x | semmle.label | x | +| call_sensitivity.rb:19:22:19:22 | x | semmle.label | x | | call_sensitivity.rb:19:30:19:30 | x | semmle.label | x | | call_sensitivity.rb:19:30:19:30 | x | semmle.label | x | -| call_sensitivity.rb:21:27:21:27 | x : | semmle.label | x : | -| call_sensitivity.rb:21:27:21:27 | x : | semmle.label | x : | -| call_sensitivity.rb:21:27:21:27 | x : | semmle.label | x : | -| call_sensitivity.rb:21:27:21:27 | x : | semmle.label | x : | -| call_sensitivity.rb:21:27:21:27 | x : | semmle.label | x : | -| call_sensitivity.rb:21:27:21:27 | x : | semmle.label | x : | -| call_sensitivity.rb:22:17:22:17 | x : | semmle.label | x : | -| call_sensitivity.rb:22:17:22:17 | x : | semmle.label | x : | -| call_sensitivity.rb:22:17:22:17 | x : | semmle.label | x : | -| call_sensitivity.rb:22:17:22:17 | x : | semmle.label | x : | -| call_sensitivity.rb:22:17:22:17 | x : | semmle.label | x : | -| call_sensitivity.rb:22:17:22:17 | x : | semmle.label | x : | -| call_sensitivity.rb:31:17:31:17 | x : | semmle.label | x : | -| call_sensitivity.rb:31:17:31:17 | x : | semmle.label | x : | +| call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | +| call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | +| call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | +| call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | +| call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | +| call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | +| call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | +| call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | +| call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | +| call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | +| call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | +| call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | +| call_sensitivity.rb:31:17:31:17 | x | semmle.label | x | +| call_sensitivity.rb:31:17:31:17 | x | semmle.label | x | | call_sensitivity.rb:31:27:31:27 | x | semmle.label | x | | call_sensitivity.rb:31:27:31:27 | x | semmle.label | x | -| call_sensitivity.rb:32:25:32:32 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:32:25:32:32 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:40:23:40:23 | x : | semmle.label | x : | -| call_sensitivity.rb:40:23:40:23 | x : | semmle.label | x : | +| call_sensitivity.rb:32:25:32:32 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:32:25:32:32 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:40:23:40:23 | x | semmle.label | x | +| call_sensitivity.rb:40:23:40:23 | x | semmle.label | x | | call_sensitivity.rb:40:31:40:31 | x | semmle.label | x | | call_sensitivity.rb:40:31:40:31 | x | semmle.label | x | -| call_sensitivity.rb:41:25:41:32 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:41:25:41:32 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:43:24:43:24 | x : | semmle.label | x : | -| call_sensitivity.rb:43:24:43:24 | x : | semmle.label | x : | +| call_sensitivity.rb:41:25:41:32 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:41:25:41:32 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:43:24:43:24 | x | semmle.label | x | +| call_sensitivity.rb:43:24:43:24 | x | semmle.label | x | | call_sensitivity.rb:43:32:43:32 | x | semmle.label | x | | call_sensitivity.rb:43:32:43:32 | x | semmle.label | x | -| call_sensitivity.rb:44:26:44:33 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:44:26:44:33 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:50:15:50:15 | x : | semmle.label | x : | -| call_sensitivity.rb:50:15:50:15 | x : | semmle.label | x : | +| call_sensitivity.rb:44:26:44:33 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:44:26:44:33 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:50:15:50:15 | x | semmle.label | x | +| call_sensitivity.rb:50:15:50:15 | x | semmle.label | x | | call_sensitivity.rb:51:10:51:10 | x | semmle.label | x | | call_sensitivity.rb:51:10:51:10 | x | semmle.label | x | -| call_sensitivity.rb:54:15:54:15 | x : | semmle.label | x : | -| call_sensitivity.rb:54:15:54:15 | x : | semmle.label | x : | -| call_sensitivity.rb:54:15:54:15 | x : | semmle.label | x : | -| call_sensitivity.rb:54:15:54:15 | x : | semmle.label | x : | -| call_sensitivity.rb:55:13:55:13 | x : | semmle.label | x : | -| call_sensitivity.rb:55:13:55:13 | x : | semmle.label | x : | -| call_sensitivity.rb:55:13:55:13 | x : | semmle.label | x : | -| call_sensitivity.rb:55:13:55:13 | x : | semmle.label | x : | -| call_sensitivity.rb:58:20:58:20 | x : | semmle.label | x : | -| call_sensitivity.rb:58:20:58:20 | x : | semmle.label | x : | -| call_sensitivity.rb:59:18:59:18 | x : | semmle.label | x : | -| call_sensitivity.rb:59:18:59:18 | x : | semmle.label | x : | -| call_sensitivity.rb:62:18:62:18 | y : | semmle.label | y : | -| call_sensitivity.rb:62:18:62:18 | y : | semmle.label | y : | -| call_sensitivity.rb:62:18:62:18 | y : | semmle.label | y : | -| call_sensitivity.rb:62:18:62:18 | y : | semmle.label | y : | -| call_sensitivity.rb:63:15:63:15 | y : | semmle.label | y : | -| call_sensitivity.rb:63:15:63:15 | y : | semmle.label | y : | -| call_sensitivity.rb:63:15:63:15 | y : | semmle.label | y : | -| call_sensitivity.rb:63:15:63:15 | y : | semmle.label | y : | -| call_sensitivity.rb:66:20:66:20 | x : | semmle.label | x : | -| call_sensitivity.rb:66:20:66:20 | x : | semmle.label | x : | -| call_sensitivity.rb:67:24:67:24 | x : | semmle.label | x : | -| call_sensitivity.rb:67:24:67:24 | x : | semmle.label | x : | -| call_sensitivity.rb:70:30:70:30 | x : | semmle.label | x : | -| call_sensitivity.rb:70:30:70:30 | x : | semmle.label | x : | +| call_sensitivity.rb:54:15:54:15 | x | semmle.label | x | +| call_sensitivity.rb:54:15:54:15 | x | semmle.label | x | +| call_sensitivity.rb:54:15:54:15 | x | semmle.label | x | +| call_sensitivity.rb:54:15:54:15 | x | semmle.label | x | +| call_sensitivity.rb:55:13:55:13 | x | semmle.label | x | +| call_sensitivity.rb:55:13:55:13 | x | semmle.label | x | +| call_sensitivity.rb:55:13:55:13 | x | semmle.label | x | +| call_sensitivity.rb:55:13:55:13 | x | semmle.label | x | +| call_sensitivity.rb:58:20:58:20 | x | semmle.label | x | +| call_sensitivity.rb:58:20:58:20 | x | semmle.label | x | +| call_sensitivity.rb:59:18:59:18 | x | semmle.label | x | +| call_sensitivity.rb:59:18:59:18 | x | semmle.label | x | +| call_sensitivity.rb:62:18:62:18 | y | semmle.label | y | +| call_sensitivity.rb:62:18:62:18 | y | semmle.label | y | +| call_sensitivity.rb:62:18:62:18 | y | semmle.label | y | +| call_sensitivity.rb:62:18:62:18 | y | semmle.label | y | +| call_sensitivity.rb:63:15:63:15 | y | semmle.label | y | +| call_sensitivity.rb:63:15:63:15 | y | semmle.label | y | +| call_sensitivity.rb:63:15:63:15 | y | semmle.label | y | +| call_sensitivity.rb:63:15:63:15 | y | semmle.label | y | +| call_sensitivity.rb:66:20:66:20 | x | semmle.label | x | +| call_sensitivity.rb:66:20:66:20 | x | semmle.label | x | +| call_sensitivity.rb:67:24:67:24 | x | semmle.label | x | +| call_sensitivity.rb:67:24:67:24 | x | semmle.label | x | +| call_sensitivity.rb:70:30:70:30 | x | semmle.label | x | +| call_sensitivity.rb:70:30:70:30 | x | semmle.label | x | | call_sensitivity.rb:71:10:71:10 | x | semmle.label | x | | call_sensitivity.rb:71:10:71:10 | x | semmle.label | x | -| call_sensitivity.rb:74:18:74:18 | y : | semmle.label | y : | -| call_sensitivity.rb:74:18:74:18 | y : | semmle.label | y : | -| call_sensitivity.rb:76:17:76:17 | y : | semmle.label | y : | -| call_sensitivity.rb:76:17:76:17 | y : | semmle.label | y : | -| call_sensitivity.rb:80:15:80:15 | x : | semmle.label | x : | -| call_sensitivity.rb:80:15:80:15 | x : | semmle.label | x : | -| call_sensitivity.rb:81:18:81:18 | x : | semmle.label | x : | -| call_sensitivity.rb:81:18:81:18 | x : | semmle.label | x : | -| call_sensitivity.rb:85:18:85:27 | ( ... ) : | semmle.label | ( ... ) : | -| call_sensitivity.rb:85:18:85:27 | ( ... ) : | semmle.label | ( ... ) : | -| call_sensitivity.rb:85:19:85:26 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:85:19:85:26 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:88:30:88:30 | x : | semmle.label | x : | -| call_sensitivity.rb:88:30:88:30 | x : | semmle.label | x : | -| call_sensitivity.rb:88:30:88:30 | x : | semmle.label | x : | -| call_sensitivity.rb:88:30:88:30 | x : | semmle.label | x : | -| call_sensitivity.rb:89:23:89:23 | x : | semmle.label | x : | -| call_sensitivity.rb:89:23:89:23 | x : | semmle.label | x : | -| call_sensitivity.rb:89:23:89:23 | x : | semmle.label | x : | -| call_sensitivity.rb:89:23:89:23 | x : | semmle.label | x : | -| call_sensitivity.rb:92:35:92:35 | x : | semmle.label | x : | -| call_sensitivity.rb:92:35:92:35 | x : | semmle.label | x : | -| call_sensitivity.rb:93:28:93:28 | x : | semmle.label | x : | -| call_sensitivity.rb:93:28:93:28 | x : | semmle.label | x : | -| call_sensitivity.rb:96:33:96:33 | y : | semmle.label | y : | -| call_sensitivity.rb:96:33:96:33 | y : | semmle.label | y : | -| call_sensitivity.rb:96:33:96:33 | y : | semmle.label | y : | -| call_sensitivity.rb:96:33:96:33 | y : | semmle.label | y : | -| call_sensitivity.rb:97:25:97:25 | y : | semmle.label | y : | -| call_sensitivity.rb:97:25:97:25 | y : | semmle.label | y : | -| call_sensitivity.rb:97:25:97:25 | y : | semmle.label | y : | -| call_sensitivity.rb:97:25:97:25 | y : | semmle.label | y : | -| call_sensitivity.rb:100:35:100:35 | x : | semmle.label | x : | -| call_sensitivity.rb:100:35:100:35 | x : | semmle.label | x : | -| call_sensitivity.rb:101:34:101:34 | x : | semmle.label | x : | -| call_sensitivity.rb:101:34:101:34 | x : | semmle.label | x : | -| call_sensitivity.rb:104:18:104:18 | x : | semmle.label | x : | -| call_sensitivity.rb:104:18:104:18 | x : | semmle.label | x : | -| call_sensitivity.rb:104:18:104:18 | x : | semmle.label | x : | -| call_sensitivity.rb:104:18:104:18 | x : | semmle.label | x : | -| call_sensitivity.rb:104:18:104:18 | x : | semmle.label | x : | -| call_sensitivity.rb:104:18:104:18 | x : | semmle.label | x : | -| call_sensitivity.rb:104:18:104:18 | x : | semmle.label | x : | -| call_sensitivity.rb:104:18:104:18 | x : | semmle.label | x : | +| call_sensitivity.rb:74:18:74:18 | y | semmle.label | y | +| call_sensitivity.rb:74:18:74:18 | y | semmle.label | y | +| call_sensitivity.rb:76:17:76:17 | y | semmle.label | y | +| call_sensitivity.rb:76:17:76:17 | y | semmle.label | y | +| call_sensitivity.rb:80:15:80:15 | x | semmle.label | x | +| call_sensitivity.rb:80:15:80:15 | x | semmle.label | x | +| call_sensitivity.rb:81:18:81:18 | x | semmle.label | x | +| call_sensitivity.rb:81:18:81:18 | x | semmle.label | x | +| call_sensitivity.rb:85:18:85:27 | ( ... ) | semmle.label | ( ... ) | +| call_sensitivity.rb:85:18:85:27 | ( ... ) | semmle.label | ( ... ) | +| call_sensitivity.rb:85:19:85:26 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:85:19:85:26 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:88:30:88:30 | x | semmle.label | x | +| call_sensitivity.rb:88:30:88:30 | x | semmle.label | x | +| call_sensitivity.rb:88:30:88:30 | x | semmle.label | x | +| call_sensitivity.rb:88:30:88:30 | x | semmle.label | x | +| call_sensitivity.rb:89:23:89:23 | x | semmle.label | x | +| call_sensitivity.rb:89:23:89:23 | x | semmle.label | x | +| call_sensitivity.rb:89:23:89:23 | x | semmle.label | x | +| call_sensitivity.rb:89:23:89:23 | x | semmle.label | x | +| call_sensitivity.rb:92:35:92:35 | x | semmle.label | x | +| call_sensitivity.rb:92:35:92:35 | x | semmle.label | x | +| call_sensitivity.rb:93:28:93:28 | x | semmle.label | x | +| call_sensitivity.rb:93:28:93:28 | x | semmle.label | x | +| call_sensitivity.rb:96:33:96:33 | y | semmle.label | y | +| call_sensitivity.rb:96:33:96:33 | y | semmle.label | y | +| call_sensitivity.rb:96:33:96:33 | y | semmle.label | y | +| call_sensitivity.rb:96:33:96:33 | y | semmle.label | y | +| call_sensitivity.rb:97:25:97:25 | y | semmle.label | y | +| call_sensitivity.rb:97:25:97:25 | y | semmle.label | y | +| call_sensitivity.rb:97:25:97:25 | y | semmle.label | y | +| call_sensitivity.rb:97:25:97:25 | y | semmle.label | y | +| call_sensitivity.rb:100:35:100:35 | x | semmle.label | x | +| call_sensitivity.rb:100:35:100:35 | x | semmle.label | x | +| call_sensitivity.rb:101:34:101:34 | x | semmle.label | x | +| call_sensitivity.rb:101:34:101:34 | x | semmle.label | x | +| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | +| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | +| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | +| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | +| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | +| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | +| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | +| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | | call_sensitivity.rb:105:10:105:10 | x | semmle.label | x | | call_sensitivity.rb:105:10:105:10 | x | semmle.label | x | -| call_sensitivity.rb:106:13:106:13 | x : | semmle.label | x : | -| call_sensitivity.rb:106:13:106:13 | x : | semmle.label | x : | -| call_sensitivity.rb:106:13:106:13 | x : | semmle.label | x : | -| call_sensitivity.rb:106:13:106:13 | x : | semmle.label | x : | -| call_sensitivity.rb:106:13:106:13 | x : | semmle.label | x : | -| call_sensitivity.rb:106:13:106:13 | x : | semmle.label | x : | -| call_sensitivity.rb:109:21:109:21 | x : | semmle.label | x : | -| call_sensitivity.rb:109:21:109:21 | x : | semmle.label | x : | -| call_sensitivity.rb:110:9:110:9 | x : | semmle.label | x : | -| call_sensitivity.rb:110:9:110:9 | x : | semmle.label | x : | -| call_sensitivity.rb:114:11:114:20 | ( ... ) : | semmle.label | ( ... ) : | -| call_sensitivity.rb:114:11:114:20 | ( ... ) : | semmle.label | ( ... ) : | -| call_sensitivity.rb:114:12:114:19 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:114:12:114:19 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:115:11:115:18 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:115:11:115:18 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:116:16:116:23 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:116:16:116:23 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:117:14:117:22 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:117:14:117:22 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:118:16:118:24 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:118:16:118:24 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:119:14:119:22 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:119:14:119:22 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:121:21:121:28 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:121:21:121:28 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:122:26:122:33 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:122:26:122:33 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:123:24:123:32 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:123:24:123:32 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:124:26:124:33 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:124:26:124:33 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:125:12:125:19 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:125:12:125:19 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:166:14:166:22 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:166:14:166:22 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:174:19:174:19 | x : | semmle.label | x : | -| call_sensitivity.rb:174:19:174:19 | x : | semmle.label | x : | -| call_sensitivity.rb:175:12:175:12 | x : | semmle.label | x : | -| call_sensitivity.rb:175:12:175:12 | x : | semmle.label | x : | -| call_sensitivity.rb:178:11:178:19 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:178:11:178:19 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:187:11:187:20 | ( ... ) : | semmle.label | ( ... ) : | -| call_sensitivity.rb:187:11:187:20 | ( ... ) : | semmle.label | ( ... ) : | -| call_sensitivity.rb:187:12:187:19 | call to taint : | semmle.label | call to taint : | -| call_sensitivity.rb:187:12:187:19 | call to taint : | semmle.label | call to taint : | +| call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | +| call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | +| call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | +| call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | +| call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | +| call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | +| call_sensitivity.rb:109:21:109:21 | x | semmle.label | x | +| call_sensitivity.rb:109:21:109:21 | x | semmle.label | x | +| call_sensitivity.rb:110:9:110:9 | x | semmle.label | x | +| call_sensitivity.rb:110:9:110:9 | x | semmle.label | x | +| call_sensitivity.rb:114:11:114:20 | ( ... ) | semmle.label | ( ... ) | +| call_sensitivity.rb:114:11:114:20 | ( ... ) | semmle.label | ( ... ) | +| call_sensitivity.rb:114:12:114:19 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:114:12:114:19 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:115:11:115:18 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:115:11:115:18 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:116:16:116:23 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:116:16:116:23 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:117:14:117:22 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:117:14:117:22 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:118:16:118:24 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:118:16:118:24 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:119:14:119:22 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:119:14:119:22 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:121:21:121:28 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:121:21:121:28 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:122:26:122:33 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:122:26:122:33 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:123:24:123:32 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:123:24:123:32 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:124:26:124:33 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:124:26:124:33 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:125:12:125:19 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:125:12:125:19 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:166:14:166:22 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:166:14:166:22 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:174:19:174:19 | x | semmle.label | x | +| call_sensitivity.rb:174:19:174:19 | x | semmle.label | x | +| call_sensitivity.rb:175:12:175:12 | x | semmle.label | x | +| call_sensitivity.rb:175:12:175:12 | x | semmle.label | x | +| call_sensitivity.rb:178:11:178:19 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:178:11:178:19 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:187:11:187:20 | ( ... ) | semmle.label | ( ... ) | +| call_sensitivity.rb:187:11:187:20 | ( ... ) | semmle.label | ( ... ) | +| call_sensitivity.rb:187:12:187:19 | call to taint | semmle.label | call to taint | +| call_sensitivity.rb:187:12:187:19 | call to taint | semmle.label | call to taint | subpaths #select -| call_sensitivity.rb:9:6:9:14 | ( ... ) | call_sensitivity.rb:9:7:9:13 | call to taint : | call_sensitivity.rb:9:6:9:14 | ( ... ) | $@ | call_sensitivity.rb:9:7:9:13 | call to taint : | call to taint : | -| call_sensitivity.rb:19:30:19:30 | x | call_sensitivity.rb:19:10:19:16 | call to taint : | call_sensitivity.rb:19:30:19:30 | x | $@ | call_sensitivity.rb:19:10:19:16 | call to taint : | call to taint : | -| call_sensitivity.rb:31:27:31:27 | x | call_sensitivity.rb:32:25:32:32 | call to taint : | call_sensitivity.rb:31:27:31:27 | x | $@ | call_sensitivity.rb:32:25:32:32 | call to taint : | call to taint : | -| call_sensitivity.rb:40:31:40:31 | x | call_sensitivity.rb:41:25:41:32 | call to taint : | call_sensitivity.rb:40:31:40:31 | x | $@ | call_sensitivity.rb:41:25:41:32 | call to taint : | call to taint : | -| call_sensitivity.rb:43:32:43:32 | x | call_sensitivity.rb:44:26:44:33 | call to taint : | call_sensitivity.rb:43:32:43:32 | x | $@ | call_sensitivity.rb:44:26:44:33 | call to taint : | call to taint : | -| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:85:19:85:26 | call to taint : | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:85:19:85:26 | call to taint : | call to taint : | -| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:114:12:114:19 | call to taint : | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:114:12:114:19 | call to taint : | call to taint : | -| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:115:11:115:18 | call to taint : | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:115:11:115:18 | call to taint : | call to taint : | -| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:116:16:116:23 | call to taint : | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:116:16:116:23 | call to taint : | call to taint : | -| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:117:14:117:22 | call to taint : | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:117:14:117:22 | call to taint : | call to taint : | -| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:118:16:118:24 | call to taint : | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:118:16:118:24 | call to taint : | call to taint : | -| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:119:14:119:22 | call to taint : | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:119:14:119:22 | call to taint : | call to taint : | -| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:125:12:125:19 | call to taint : | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:125:12:125:19 | call to taint : | call to taint : | -| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:166:14:166:22 | call to taint : | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:166:14:166:22 | call to taint : | call to taint : | -| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:178:11:178:19 | call to taint : | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:178:11:178:19 | call to taint : | call to taint : | -| call_sensitivity.rb:71:10:71:10 | x | call_sensitivity.rb:121:21:121:28 | call to taint : | call_sensitivity.rb:71:10:71:10 | x | $@ | call_sensitivity.rb:121:21:121:28 | call to taint : | call to taint : | -| call_sensitivity.rb:71:10:71:10 | x | call_sensitivity.rb:122:26:122:33 | call to taint : | call_sensitivity.rb:71:10:71:10 | x | $@ | call_sensitivity.rb:122:26:122:33 | call to taint : | call to taint : | -| call_sensitivity.rb:71:10:71:10 | x | call_sensitivity.rb:123:24:123:32 | call to taint : | call_sensitivity.rb:71:10:71:10 | x | $@ | call_sensitivity.rb:123:24:123:32 | call to taint : | call to taint : | -| call_sensitivity.rb:71:10:71:10 | x | call_sensitivity.rb:124:26:124:33 | call to taint : | call_sensitivity.rb:71:10:71:10 | x | $@ | call_sensitivity.rb:124:26:124:33 | call to taint : | call to taint : | -| call_sensitivity.rb:105:10:105:10 | x | call_sensitivity.rb:114:12:114:19 | call to taint : | call_sensitivity.rb:105:10:105:10 | x | $@ | call_sensitivity.rb:114:12:114:19 | call to taint : | call to taint : | -| call_sensitivity.rb:105:10:105:10 | x | call_sensitivity.rb:125:12:125:19 | call to taint : | call_sensitivity.rb:105:10:105:10 | x | $@ | call_sensitivity.rb:125:12:125:19 | call to taint : | call to taint : | -| call_sensitivity.rb:105:10:105:10 | x | call_sensitivity.rb:178:11:178:19 | call to taint : | call_sensitivity.rb:105:10:105:10 | x | $@ | call_sensitivity.rb:178:11:178:19 | call to taint : | call to taint : | -| call_sensitivity.rb:105:10:105:10 | x | call_sensitivity.rb:187:12:187:19 | call to taint : | call_sensitivity.rb:105:10:105:10 | x | $@ | call_sensitivity.rb:187:12:187:19 | call to taint : | call to taint : | +| call_sensitivity.rb:9:6:9:14 | ( ... ) | call_sensitivity.rb:9:7:9:13 | call to taint | call_sensitivity.rb:9:6:9:14 | ( ... ) | $@ | call_sensitivity.rb:9:7:9:13 | call to taint | call to taint | +| call_sensitivity.rb:19:30:19:30 | x | call_sensitivity.rb:19:10:19:16 | call to taint | call_sensitivity.rb:19:30:19:30 | x | $@ | call_sensitivity.rb:19:10:19:16 | call to taint | call to taint | +| call_sensitivity.rb:31:27:31:27 | x | call_sensitivity.rb:32:25:32:32 | call to taint | call_sensitivity.rb:31:27:31:27 | x | $@ | call_sensitivity.rb:32:25:32:32 | call to taint | call to taint | +| call_sensitivity.rb:40:31:40:31 | x | call_sensitivity.rb:41:25:41:32 | call to taint | call_sensitivity.rb:40:31:40:31 | x | $@ | call_sensitivity.rb:41:25:41:32 | call to taint | call to taint | +| call_sensitivity.rb:43:32:43:32 | x | call_sensitivity.rb:44:26:44:33 | call to taint | call_sensitivity.rb:43:32:43:32 | x | $@ | call_sensitivity.rb:44:26:44:33 | call to taint | call to taint | +| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:85:19:85:26 | call to taint | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:85:19:85:26 | call to taint | call to taint | +| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:114:12:114:19 | call to taint | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:114:12:114:19 | call to taint | call to taint | +| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:115:11:115:18 | call to taint | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:115:11:115:18 | call to taint | call to taint | +| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:116:16:116:23 | call to taint | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:116:16:116:23 | call to taint | call to taint | +| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:117:14:117:22 | call to taint | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:117:14:117:22 | call to taint | call to taint | +| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:118:16:118:24 | call to taint | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:118:16:118:24 | call to taint | call to taint | +| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:119:14:119:22 | call to taint | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:119:14:119:22 | call to taint | call to taint | +| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:125:12:125:19 | call to taint | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:125:12:125:19 | call to taint | call to taint | +| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:166:14:166:22 | call to taint | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:166:14:166:22 | call to taint | call to taint | +| call_sensitivity.rb:51:10:51:10 | x | call_sensitivity.rb:178:11:178:19 | call to taint | call_sensitivity.rb:51:10:51:10 | x | $@ | call_sensitivity.rb:178:11:178:19 | call to taint | call to taint | +| call_sensitivity.rb:71:10:71:10 | x | call_sensitivity.rb:121:21:121:28 | call to taint | call_sensitivity.rb:71:10:71:10 | x | $@ | call_sensitivity.rb:121:21:121:28 | call to taint | call to taint | +| call_sensitivity.rb:71:10:71:10 | x | call_sensitivity.rb:122:26:122:33 | call to taint | call_sensitivity.rb:71:10:71:10 | x | $@ | call_sensitivity.rb:122:26:122:33 | call to taint | call to taint | +| call_sensitivity.rb:71:10:71:10 | x | call_sensitivity.rb:123:24:123:32 | call to taint | call_sensitivity.rb:71:10:71:10 | x | $@ | call_sensitivity.rb:123:24:123:32 | call to taint | call to taint | +| call_sensitivity.rb:71:10:71:10 | x | call_sensitivity.rb:124:26:124:33 | call to taint | call_sensitivity.rb:71:10:71:10 | x | $@ | call_sensitivity.rb:124:26:124:33 | call to taint | call to taint | +| call_sensitivity.rb:105:10:105:10 | x | call_sensitivity.rb:114:12:114:19 | call to taint | call_sensitivity.rb:105:10:105:10 | x | $@ | call_sensitivity.rb:114:12:114:19 | call to taint | call to taint | +| call_sensitivity.rb:105:10:105:10 | x | call_sensitivity.rb:125:12:125:19 | call to taint | call_sensitivity.rb:105:10:105:10 | x | $@ | call_sensitivity.rb:125:12:125:19 | call to taint | call to taint | +| call_sensitivity.rb:105:10:105:10 | x | call_sensitivity.rb:178:11:178:19 | call to taint | call_sensitivity.rb:105:10:105:10 | x | $@ | call_sensitivity.rb:178:11:178:19 | call to taint | call to taint | +| call_sensitivity.rb:105:10:105:10 | x | call_sensitivity.rb:187:12:187:19 | call to taint | call_sensitivity.rb:105:10:105:10 | x | $@ | call_sensitivity.rb:187:12:187:19 | call to taint | call to taint | mayBenefitFromCallContext | call_sensitivity.rb:51:5:51:10 | call to sink | call_sensitivity.rb:50:3:52:5 | method1 | | call_sensitivity.rb:55:5:55:13 | call to method1 | call_sensitivity.rb:54:3:56:5 | method2 | diff --git a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected index db759c1f86a..fc781f05d3c 100644 --- a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected +++ b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected @@ -1,2147 +1,2147 @@ failures edges -| semantics.rb:2:5:2:5 | a : | semantics.rb:3:9:3:9 | a : | -| semantics.rb:2:5:2:5 | a : | semantics.rb:3:9:3:9 | a : | -| semantics.rb:2:9:2:18 | call to source : | semantics.rb:2:5:2:5 | a : | -| semantics.rb:2:9:2:18 | call to source : | semantics.rb:2:5:2:5 | a : | -| semantics.rb:3:5:3:5 | x : | semantics.rb:4:10:4:10 | x | -| semantics.rb:3:5:3:5 | x : | semantics.rb:4:10:4:10 | x | -| semantics.rb:3:9:3:9 | a : | semantics.rb:3:9:3:14 | call to s1 : | -| semantics.rb:3:9:3:9 | a : | semantics.rb:3:9:3:14 | call to s1 : | -| semantics.rb:3:9:3:14 | call to s1 : | semantics.rb:3:5:3:5 | x : | -| semantics.rb:3:9:3:14 | call to s1 : | semantics.rb:3:5:3:5 | x : | -| semantics.rb:8:5:8:5 | a : | semantics.rb:9:10:9:10 | a : | -| semantics.rb:8:5:8:5 | a : | semantics.rb:9:10:9:10 | a : | -| semantics.rb:8:9:8:18 | call to source : | semantics.rb:8:5:8:5 | a : | -| semantics.rb:8:9:8:18 | call to source : | semantics.rb:8:5:8:5 | a : | -| semantics.rb:9:5:9:5 | [post] x : | semantics.rb:10:10:10:10 | x | -| semantics.rb:9:5:9:5 | [post] x : | semantics.rb:10:10:10:10 | x | -| semantics.rb:9:10:9:10 | a : | semantics.rb:9:5:9:5 | [post] x : | -| semantics.rb:9:10:9:10 | a : | semantics.rb:9:5:9:5 | [post] x : | -| semantics.rb:14:5:14:5 | a : | semantics.rb:15:8:15:8 | a : | -| semantics.rb:14:5:14:5 | a : | semantics.rb:15:8:15:8 | a : | -| semantics.rb:14:9:14:18 | call to source : | semantics.rb:14:5:14:5 | a : | -| semantics.rb:14:9:14:18 | call to source : | semantics.rb:14:5:14:5 | a : | -| semantics.rb:15:8:15:8 | a : | semantics.rb:15:11:15:11 | [post] x : | -| semantics.rb:15:8:15:8 | a : | semantics.rb:15:11:15:11 | [post] x : | -| semantics.rb:15:11:15:11 | [post] x : | semantics.rb:16:10:16:10 | x | -| semantics.rb:15:11:15:11 | [post] x : | semantics.rb:16:10:16:10 | x | -| semantics.rb:22:18:22:32 | call to source : | semantics.rb:22:10:22:33 | call to s4 | -| semantics.rb:22:18:22:32 | call to source : | semantics.rb:22:10:22:33 | call to s4 | -| semantics.rb:23:23:23:32 | call to source : | semantics.rb:23:10:23:33 | call to s4 | -| semantics.rb:23:23:23:32 | call to source : | semantics.rb:23:10:23:33 | call to s4 | -| semantics.rb:28:5:28:5 | a : | semantics.rb:29:8:29:8 | a : | -| semantics.rb:28:5:28:5 | a : | semantics.rb:29:8:29:8 | a : | -| semantics.rb:28:9:28:18 | call to source : | semantics.rb:28:5:28:5 | a : | -| semantics.rb:28:9:28:18 | call to source : | semantics.rb:28:5:28:5 | a : | -| semantics.rb:29:8:29:8 | a : | semantics.rb:29:14:29:14 | [post] y : | -| semantics.rb:29:8:29:8 | a : | semantics.rb:29:14:29:14 | [post] y : | -| semantics.rb:29:8:29:8 | a : | semantics.rb:29:17:29:17 | [post] z : | -| semantics.rb:29:8:29:8 | a : | semantics.rb:29:17:29:17 | [post] z : | -| semantics.rb:29:14:29:14 | [post] y : | semantics.rb:31:10:31:10 | y | -| semantics.rb:29:14:29:14 | [post] y : | semantics.rb:31:10:31:10 | y | -| semantics.rb:29:17:29:17 | [post] z : | semantics.rb:32:10:32:10 | z | -| semantics.rb:29:17:29:17 | [post] z : | semantics.rb:32:10:32:10 | z | -| semantics.rb:40:5:40:5 | a : | semantics.rb:41:8:41:8 | a : | -| semantics.rb:40:5:40:5 | a : | semantics.rb:41:8:41:8 | a : | -| semantics.rb:40:9:40:18 | call to source : | semantics.rb:40:5:40:5 | a : | -| semantics.rb:40:9:40:18 | call to source : | semantics.rb:40:5:40:5 | a : | -| semantics.rb:41:8:41:8 | a : | semantics.rb:41:16:41:16 | [post] x : | -| semantics.rb:41:8:41:8 | a : | semantics.rb:41:16:41:16 | [post] x : | -| semantics.rb:41:16:41:16 | [post] x : | semantics.rb:42:10:42:10 | x | -| semantics.rb:41:16:41:16 | [post] x : | semantics.rb:42:10:42:10 | x | -| semantics.rb:46:15:46:24 | call to source : | semantics.rb:46:10:46:26 | call to s8 | -| semantics.rb:46:15:46:24 | call to source : | semantics.rb:46:10:46:26 | call to s8 | -| semantics.rb:48:9:48:18 | call to source : | semantics.rb:47:10:49:7 | call to s8 | -| semantics.rb:48:9:48:18 | call to source : | semantics.rb:47:10:49:7 | call to s8 | -| semantics.rb:53:8:53:17 | call to source : | semantics.rb:53:23:53:23 | x : | -| semantics.rb:53:8:53:17 | call to source : | semantics.rb:53:23:53:23 | x : | -| semantics.rb:53:23:53:23 | x : | semantics.rb:53:31:53:31 | x | -| semantics.rb:53:23:53:23 | x : | semantics.rb:53:31:53:31 | x | -| semantics.rb:54:8:54:17 | call to source : | semantics.rb:54:24:54:24 | x : | -| semantics.rb:54:8:54:17 | call to source : | semantics.rb:54:24:54:24 | x : | -| semantics.rb:54:24:54:24 | x : | semantics.rb:55:14:55:14 | x | -| semantics.rb:54:24:54:24 | x : | semantics.rb:55:14:55:14 | x | -| semantics.rb:60:5:60:5 | a : | semantics.rb:61:14:61:14 | a : | -| semantics.rb:60:5:60:5 | a : | semantics.rb:61:14:61:14 | a : | -| semantics.rb:60:5:60:5 | a : | semantics.rb:62:17:62:17 | a : | -| semantics.rb:60:5:60:5 | a : | semantics.rb:62:17:62:17 | a : | -| semantics.rb:60:5:60:5 | a : | semantics.rb:63:19:63:19 | a : | -| semantics.rb:60:5:60:5 | a : | semantics.rb:63:19:63:19 | a : | -| semantics.rb:60:5:60:5 | a : | semantics.rb:64:27:64:27 | a : | -| semantics.rb:60:5:60:5 | a : | semantics.rb:64:27:64:27 | a : | -| semantics.rb:60:5:60:5 | a : | semantics.rb:66:14:66:15 | &... : | -| semantics.rb:60:5:60:5 | a : | semantics.rb:66:14:66:15 | &... : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:60:5:60:5 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:60:5:60:5 | a : | -| semantics.rb:61:14:61:14 | a : | semantics.rb:61:10:61:15 | call to s10 | -| semantics.rb:61:14:61:14 | a : | semantics.rb:61:10:61:15 | call to s10 | -| semantics.rb:62:17:62:17 | a : | semantics.rb:62:10:62:18 | call to s10 | -| semantics.rb:62:17:62:17 | a : | semantics.rb:62:10:62:18 | call to s10 | -| semantics.rb:63:19:63:19 | a : | semantics.rb:63:10:63:20 | call to s10 | -| semantics.rb:63:19:63:19 | a : | semantics.rb:63:10:63:20 | call to s10 | -| semantics.rb:64:27:64:27 | a : | semantics.rb:64:10:64:28 | call to s10 | -| semantics.rb:64:27:64:27 | a : | semantics.rb:64:10:64:28 | call to s10 | -| semantics.rb:66:14:66:15 | &... : | semantics.rb:66:10:66:16 | call to s10 | -| semantics.rb:66:14:66:15 | &... : | semantics.rb:66:10:66:16 | call to s10 | -| semantics.rb:80:5:80:5 | a : | semantics.rb:81:5:81:5 | a : | -| semantics.rb:80:5:80:5 | a : | semantics.rb:81:5:81:5 | a : | -| semantics.rb:80:9:80:18 | call to source : | semantics.rb:80:5:80:5 | a : | -| semantics.rb:80:9:80:18 | call to source : | semantics.rb:80:5:80:5 | a : | -| semantics.rb:81:5:81:5 | a : | semantics.rb:81:11:81:11 | [post] x : | -| semantics.rb:81:5:81:5 | a : | semantics.rb:81:11:81:11 | [post] x : | -| semantics.rb:81:5:81:5 | a : | semantics.rb:81:14:81:14 | [post] y : | -| semantics.rb:81:5:81:5 | a : | semantics.rb:81:14:81:14 | [post] y : | -| semantics.rb:81:5:81:5 | a : | semantics.rb:81:22:81:22 | [post] z : | -| semantics.rb:81:5:81:5 | a : | semantics.rb:81:22:81:22 | [post] z : | -| semantics.rb:81:11:81:11 | [post] x : | semantics.rb:82:10:82:10 | x | -| semantics.rb:81:11:81:11 | [post] x : | semantics.rb:82:10:82:10 | x | -| semantics.rb:81:14:81:14 | [post] y : | semantics.rb:83:10:83:10 | y | -| semantics.rb:81:14:81:14 | [post] y : | semantics.rb:83:10:83:10 | y | -| semantics.rb:81:22:81:22 | [post] z : | semantics.rb:84:10:84:10 | z | -| semantics.rb:81:22:81:22 | [post] z : | semantics.rb:84:10:84:10 | z | -| semantics.rb:89:5:89:5 | a : | semantics.rb:91:19:91:19 | a : | -| semantics.rb:89:5:89:5 | a : | semantics.rb:91:19:91:19 | a : | -| semantics.rb:89:5:89:5 | a : | semantics.rb:92:27:92:27 | a : | -| semantics.rb:89:5:89:5 | a : | semantics.rb:92:27:92:27 | a : | -| semantics.rb:89:9:89:18 | call to source : | semantics.rb:89:5:89:5 | a : | -| semantics.rb:89:9:89:18 | call to source : | semantics.rb:89:5:89:5 | a : | -| semantics.rb:91:19:91:19 | a : | semantics.rb:91:10:91:20 | call to s13 | -| semantics.rb:91:19:91:19 | a : | semantics.rb:91:10:91:20 | call to s13 | -| semantics.rb:92:27:92:27 | a : | semantics.rb:92:10:92:28 | call to s13 | -| semantics.rb:92:27:92:27 | a : | semantics.rb:92:10:92:28 | call to s13 | -| semantics.rb:97:5:97:5 | a : | semantics.rb:98:5:98:5 | a : | -| semantics.rb:97:5:97:5 | a : | semantics.rb:98:5:98:5 | a : | -| semantics.rb:97:5:97:5 | a : | semantics.rb:99:5:99:5 | a : | -| semantics.rb:97:5:97:5 | a : | semantics.rb:99:5:99:5 | a : | -| semantics.rb:97:9:97:18 | call to source : | semantics.rb:97:5:97:5 | a : | -| semantics.rb:97:9:97:18 | call to source : | semantics.rb:97:5:97:5 | a : | -| semantics.rb:98:5:98:5 | a : | semantics.rb:98:19:98:19 | [post] x : | -| semantics.rb:98:5:98:5 | a : | semantics.rb:98:19:98:19 | [post] x : | -| semantics.rb:98:19:98:19 | [post] x : | semantics.rb:101:10:101:10 | x | -| semantics.rb:98:19:98:19 | [post] x : | semantics.rb:101:10:101:10 | x | -| semantics.rb:99:5:99:5 | a : | semantics.rb:99:16:99:16 | [post] y : | -| semantics.rb:99:5:99:5 | a : | semantics.rb:99:16:99:16 | [post] y : | -| semantics.rb:99:5:99:5 | a : | semantics.rb:99:24:99:24 | [post] z : | -| semantics.rb:99:5:99:5 | a : | semantics.rb:99:24:99:24 | [post] z : | -| semantics.rb:99:16:99:16 | [post] y : | semantics.rb:102:10:102:10 | y | -| semantics.rb:99:16:99:16 | [post] y : | semantics.rb:102:10:102:10 | y | -| semantics.rb:99:24:99:24 | [post] z : | semantics.rb:103:10:103:10 | z | -| semantics.rb:99:24:99:24 | [post] z : | semantics.rb:103:10:103:10 | z | -| semantics.rb:107:5:107:5 | a : | semantics.rb:109:14:109:16 | ** ... : | -| semantics.rb:107:5:107:5 | a : | semantics.rb:110:28:110:30 | ** ... : | -| semantics.rb:107:9:107:18 | call to source : | semantics.rb:107:5:107:5 | a : | -| semantics.rb:109:14:109:16 | ** ... : | semantics.rb:109:10:109:17 | call to s15 | -| semantics.rb:110:28:110:30 | ** ... : | semantics.rb:110:10:110:31 | call to s15 | -| semantics.rb:114:5:114:5 | a : | semantics.rb:116:14:116:14 | a : | -| semantics.rb:114:5:114:5 | a : | semantics.rb:116:14:116:14 | a : | -| semantics.rb:114:5:114:5 | a : | semantics.rb:119:17:119:17 | a : | -| semantics.rb:114:5:114:5 | a : | semantics.rb:119:17:119:17 | a : | -| semantics.rb:114:9:114:18 | call to source : | semantics.rb:114:5:114:5 | a : | -| semantics.rb:114:9:114:18 | call to source : | semantics.rb:114:5:114:5 | a : | -| semantics.rb:115:5:115:5 | b : | semantics.rb:121:17:121:17 | b : | -| semantics.rb:115:5:115:5 | b : | semantics.rb:121:17:121:17 | b : | -| semantics.rb:115:9:115:18 | call to source : | semantics.rb:115:5:115:5 | b : | -| semantics.rb:115:9:115:18 | call to source : | semantics.rb:115:5:115:5 | b : | -| semantics.rb:116:5:116:5 | h [element :a] : | semantics.rb:117:16:117:16 | h [element :a] : | -| semantics.rb:116:5:116:5 | h [element :a] : | semantics.rb:117:16:117:16 | h [element :a] : | -| semantics.rb:116:5:116:5 | h [element :a] : | semantics.rb:121:22:121:22 | h [element :a] : | -| semantics.rb:116:5:116:5 | h [element :a] : | semantics.rb:121:22:121:22 | h [element :a] : | -| semantics.rb:116:14:116:14 | a : | semantics.rb:116:5:116:5 | h [element :a] : | -| semantics.rb:116:14:116:14 | a : | semantics.rb:116:5:116:5 | h [element :a] : | -| semantics.rb:117:14:117:16 | ** ... [element :a] : | semantics.rb:117:10:117:17 | call to s16 | -| semantics.rb:117:14:117:16 | ** ... [element :a] : | semantics.rb:117:10:117:17 | call to s16 | -| semantics.rb:117:16:117:16 | h [element :a] : | semantics.rb:117:14:117:16 | ** ... [element :a] : | -| semantics.rb:117:16:117:16 | h [element :a] : | semantics.rb:117:14:117:16 | ** ... [element :a] : | -| semantics.rb:119:17:119:17 | a : | semantics.rb:119:10:119:18 | call to s16 | -| semantics.rb:119:17:119:17 | a : | semantics.rb:119:10:119:18 | call to s16 | -| semantics.rb:121:17:121:17 | b : | semantics.rb:121:10:121:23 | call to s16 | -| semantics.rb:121:17:121:17 | b : | semantics.rb:121:10:121:23 | call to s16 | -| semantics.rb:121:20:121:22 | ** ... [element :a] : | semantics.rb:121:10:121:23 | call to s16 | -| semantics.rb:121:20:121:22 | ** ... [element :a] : | semantics.rb:121:10:121:23 | call to s16 | -| semantics.rb:121:22:121:22 | h [element :a] : | semantics.rb:121:20:121:22 | ** ... [element :a] : | -| semantics.rb:121:22:121:22 | h [element :a] : | semantics.rb:121:20:121:22 | ** ... [element :a] : | -| semantics.rb:125:5:125:5 | a : | semantics.rb:126:9:126:9 | a : | -| semantics.rb:125:5:125:5 | a : | semantics.rb:126:9:126:9 | a : | -| semantics.rb:125:9:125:18 | call to source : | semantics.rb:125:5:125:5 | a : | -| semantics.rb:125:9:125:18 | call to source : | semantics.rb:125:5:125:5 | a : | -| semantics.rb:126:9:126:9 | a : | semantics.rb:126:12:126:14 | [post] ** ... : | -| semantics.rb:126:9:126:9 | a : | semantics.rb:126:12:126:14 | [post] ** ... : | -| semantics.rb:126:12:126:14 | [post] ** ... : | semantics.rb:127:10:127:10 | h | -| semantics.rb:126:12:126:14 | [post] ** ... : | semantics.rb:127:10:127:10 | h | -| semantics.rb:141:5:141:5 | b : | semantics.rb:145:5:145:5 | [post] h [element] : | -| semantics.rb:141:5:141:5 | b : | semantics.rb:145:5:145:5 | [post] h [element] : | -| semantics.rb:141:9:141:18 | call to source : | semantics.rb:141:5:141:5 | b : | -| semantics.rb:141:9:141:18 | call to source : | semantics.rb:141:5:141:5 | b : | -| semantics.rb:145:5:145:5 | [post] h [element] : | semantics.rb:147:14:147:14 | h [element] : | -| semantics.rb:145:5:145:5 | [post] h [element] : | semantics.rb:147:14:147:14 | h [element] : | -| semantics.rb:147:14:147:14 | h [element] : | semantics.rb:147:10:147:15 | call to s19 | -| semantics.rb:147:14:147:14 | h [element] : | semantics.rb:147:10:147:15 | call to s19 | -| semantics.rb:151:5:151:5 | a : | semantics.rb:152:13:152:13 | a : | -| semantics.rb:151:5:151:5 | a : | semantics.rb:152:13:152:13 | a : | -| semantics.rb:151:9:151:18 | call to source : | semantics.rb:151:5:151:5 | a : | -| semantics.rb:151:9:151:18 | call to source : | semantics.rb:151:5:151:5 | a : | -| semantics.rb:152:5:152:5 | x [element] : | semantics.rb:153:10:153:10 | x [element] : | -| semantics.rb:152:5:152:5 | x [element] : | semantics.rb:153:10:153:10 | x [element] : | -| semantics.rb:152:5:152:5 | x [element] : | semantics.rb:154:10:154:10 | x [element] : | -| semantics.rb:152:5:152:5 | x [element] : | semantics.rb:154:10:154:10 | x [element] : | -| semantics.rb:152:9:152:14 | call to s20 [element] : | semantics.rb:152:5:152:5 | x [element] : | -| semantics.rb:152:9:152:14 | call to s20 [element] : | semantics.rb:152:5:152:5 | x [element] : | -| semantics.rb:152:13:152:13 | a : | semantics.rb:152:9:152:14 | call to s20 [element] : | -| semantics.rb:152:13:152:13 | a : | semantics.rb:152:9:152:14 | call to s20 [element] : | -| semantics.rb:153:10:153:10 | x [element] : | semantics.rb:153:10:153:13 | ...[...] | -| semantics.rb:153:10:153:10 | x [element] : | semantics.rb:153:10:153:13 | ...[...] | -| semantics.rb:154:10:154:10 | x [element] : | semantics.rb:154:10:154:13 | ...[...] | -| semantics.rb:154:10:154:10 | x [element] : | semantics.rb:154:10:154:13 | ...[...] | -| semantics.rb:158:5:158:5 | a : | semantics.rb:162:5:162:5 | [post] h [element 0] : | -| semantics.rb:158:5:158:5 | a : | semantics.rb:162:5:162:5 | [post] h [element 0] : | -| semantics.rb:158:9:158:18 | call to source : | semantics.rb:158:5:158:5 | a : | -| semantics.rb:158:9:158:18 | call to source : | semantics.rb:158:5:158:5 | a : | -| semantics.rb:159:5:159:5 | b : | semantics.rb:163:5:163:5 | [post] h [element] : | -| semantics.rb:159:5:159:5 | b : | semantics.rb:163:5:163:5 | [post] h [element] : | -| semantics.rb:159:9:159:18 | call to source : | semantics.rb:159:5:159:5 | b : | -| semantics.rb:159:9:159:18 | call to source : | semantics.rb:159:5:159:5 | b : | -| semantics.rb:162:5:162:5 | [post] h [element 0] : | semantics.rb:165:14:165:14 | h [element 0] : | -| semantics.rb:162:5:162:5 | [post] h [element 0] : | semantics.rb:165:14:165:14 | h [element 0] : | -| semantics.rb:163:5:163:5 | [post] h [element] : | semantics.rb:165:14:165:14 | h [element] : | -| semantics.rb:163:5:163:5 | [post] h [element] : | semantics.rb:165:14:165:14 | h [element] : | -| semantics.rb:165:14:165:14 | h [element 0] : | semantics.rb:165:10:165:15 | call to s21 | -| semantics.rb:165:14:165:14 | h [element 0] : | semantics.rb:165:10:165:15 | call to s21 | -| semantics.rb:165:14:165:14 | h [element] : | semantics.rb:165:10:165:15 | call to s21 | -| semantics.rb:165:14:165:14 | h [element] : | semantics.rb:165:10:165:15 | call to s21 | -| semantics.rb:169:5:169:5 | a : | semantics.rb:170:13:170:13 | a : | -| semantics.rb:169:5:169:5 | a : | semantics.rb:170:13:170:13 | a : | -| semantics.rb:169:9:169:18 | call to source : | semantics.rb:169:5:169:5 | a : | -| semantics.rb:169:9:169:18 | call to source : | semantics.rb:169:5:169:5 | a : | -| semantics.rb:170:5:170:5 | x [element] : | semantics.rb:171:10:171:10 | x [element] : | -| semantics.rb:170:5:170:5 | x [element] : | semantics.rb:171:10:171:10 | x [element] : | -| semantics.rb:170:5:170:5 | x [element] : | semantics.rb:172:10:172:10 | x [element] : | -| semantics.rb:170:5:170:5 | x [element] : | semantics.rb:172:10:172:10 | x [element] : | -| semantics.rb:170:9:170:14 | call to s22 [element] : | semantics.rb:170:5:170:5 | x [element] : | -| semantics.rb:170:9:170:14 | call to s22 [element] : | semantics.rb:170:5:170:5 | x [element] : | -| semantics.rb:170:13:170:13 | a : | semantics.rb:170:9:170:14 | call to s22 [element] : | -| semantics.rb:170:13:170:13 | a : | semantics.rb:170:9:170:14 | call to s22 [element] : | -| semantics.rb:171:10:171:10 | x [element] : | semantics.rb:171:10:171:13 | ...[...] | -| semantics.rb:171:10:171:10 | x [element] : | semantics.rb:171:10:171:13 | ...[...] | -| semantics.rb:172:10:172:10 | x [element] : | semantics.rb:172:10:172:13 | ...[...] | -| semantics.rb:172:10:172:10 | x [element] : | semantics.rb:172:10:172:13 | ...[...] | -| semantics.rb:176:5:176:5 | a : | semantics.rb:179:5:179:5 | [post] h [element 0] : | -| semantics.rb:176:5:176:5 | a : | semantics.rb:179:5:179:5 | [post] h [element 0] : | -| semantics.rb:176:9:176:18 | call to source : | semantics.rb:176:5:176:5 | a : | -| semantics.rb:176:9:176:18 | call to source : | semantics.rb:176:5:176:5 | a : | -| semantics.rb:179:5:179:5 | [post] h [element 0] : | semantics.rb:180:5:180:5 | h [element 0] : | -| semantics.rb:179:5:179:5 | [post] h [element 0] : | semantics.rb:180:5:180:5 | h [element 0] : | -| semantics.rb:180:5:180:5 | [post] h [element 0] : | semantics.rb:181:14:181:14 | h [element 0] : | -| semantics.rb:180:5:180:5 | [post] h [element 0] : | semantics.rb:181:14:181:14 | h [element 0] : | -| semantics.rb:180:5:180:5 | h [element 0] : | semantics.rb:180:5:180:5 | [post] h [element 0] : | -| semantics.rb:180:5:180:5 | h [element 0] : | semantics.rb:180:5:180:5 | [post] h [element 0] : | -| semantics.rb:181:14:181:14 | h [element 0] : | semantics.rb:181:10:181:15 | call to s23 | -| semantics.rb:181:14:181:14 | h [element 0] : | semantics.rb:181:10:181:15 | call to s23 | -| semantics.rb:185:5:185:5 | a : | semantics.rb:186:13:186:13 | a : | -| semantics.rb:185:5:185:5 | a : | semantics.rb:186:13:186:13 | a : | -| semantics.rb:185:9:185:18 | call to source : | semantics.rb:185:5:185:5 | a : | -| semantics.rb:185:9:185:18 | call to source : | semantics.rb:185:5:185:5 | a : | -| semantics.rb:186:5:186:5 | x [element 0] : | semantics.rb:187:10:187:10 | x [element 0] : | -| semantics.rb:186:5:186:5 | x [element 0] : | semantics.rb:187:10:187:10 | x [element 0] : | -| semantics.rb:186:5:186:5 | x [element 0] : | semantics.rb:189:10:189:10 | x [element 0] : | -| semantics.rb:186:5:186:5 | x [element 0] : | semantics.rb:189:10:189:10 | x [element 0] : | -| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semantics.rb:186:5:186:5 | x [element 0] : | -| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semantics.rb:186:5:186:5 | x [element 0] : | -| semantics.rb:186:13:186:13 | a : | semantics.rb:186:9:186:14 | call to s24 [element 0] : | -| semantics.rb:186:13:186:13 | a : | semantics.rb:186:9:186:14 | call to s24 [element 0] : | -| semantics.rb:187:10:187:10 | x [element 0] : | semantics.rb:187:10:187:13 | ...[...] | -| semantics.rb:187:10:187:10 | x [element 0] : | semantics.rb:187:10:187:13 | ...[...] | -| semantics.rb:189:10:189:10 | x [element 0] : | semantics.rb:189:10:189:13 | ...[...] | -| semantics.rb:189:10:189:10 | x [element 0] : | semantics.rb:189:10:189:13 | ...[...] | -| semantics.rb:193:5:193:5 | a : | semantics.rb:196:5:196:5 | [post] h [element 0] : | -| semantics.rb:193:5:193:5 | a : | semantics.rb:196:5:196:5 | [post] h [element 0] : | -| semantics.rb:193:9:193:18 | call to source : | semantics.rb:193:5:193:5 | a : | -| semantics.rb:193:9:193:18 | call to source : | semantics.rb:193:5:193:5 | a : | -| semantics.rb:196:5:196:5 | [post] h [element 0] : | semantics.rb:197:5:197:5 | h [element 0] : | -| semantics.rb:196:5:196:5 | [post] h [element 0] : | semantics.rb:197:5:197:5 | h [element 0] : | -| semantics.rb:197:5:197:5 | [post] h [element 0] : | semantics.rb:198:14:198:14 | h [element 0] : | -| semantics.rb:197:5:197:5 | [post] h [element 0] : | semantics.rb:198:14:198:14 | h [element 0] : | -| semantics.rb:197:5:197:5 | h [element 0] : | semantics.rb:197:5:197:5 | [post] h [element 0] : | -| semantics.rb:197:5:197:5 | h [element 0] : | semantics.rb:197:5:197:5 | [post] h [element 0] : | -| semantics.rb:198:14:198:14 | h [element 0] : | semantics.rb:198:10:198:15 | call to s25 | -| semantics.rb:198:14:198:14 | h [element 0] : | semantics.rb:198:10:198:15 | call to s25 | -| semantics.rb:202:5:202:5 | a : | semantics.rb:203:13:203:13 | a : | -| semantics.rb:202:5:202:5 | a : | semantics.rb:203:13:203:13 | a : | -| semantics.rb:202:9:202:18 | call to source : | semantics.rb:202:5:202:5 | a : | -| semantics.rb:202:9:202:18 | call to source : | semantics.rb:202:5:202:5 | a : | -| semantics.rb:203:5:203:5 | x [element 0] : | semantics.rb:204:10:204:10 | x [element 0] : | -| semantics.rb:203:5:203:5 | x [element 0] : | semantics.rb:204:10:204:10 | x [element 0] : | -| semantics.rb:203:5:203:5 | x [element 0] : | semantics.rb:206:10:206:10 | x [element 0] : | -| semantics.rb:203:5:203:5 | x [element 0] : | semantics.rb:206:10:206:10 | x [element 0] : | -| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semantics.rb:203:5:203:5 | x [element 0] : | -| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semantics.rb:203:5:203:5 | x [element 0] : | -| semantics.rb:203:13:203:13 | a : | semantics.rb:203:9:203:14 | call to s26 [element 0] : | -| semantics.rb:203:13:203:13 | a : | semantics.rb:203:9:203:14 | call to s26 [element 0] : | -| semantics.rb:204:10:204:10 | x [element 0] : | semantics.rb:204:10:204:13 | ...[...] | -| semantics.rb:204:10:204:10 | x [element 0] : | semantics.rb:204:10:204:13 | ...[...] | -| semantics.rb:206:10:206:10 | x [element 0] : | semantics.rb:206:10:206:13 | ...[...] | -| semantics.rb:206:10:206:10 | x [element 0] : | semantics.rb:206:10:206:13 | ...[...] | -| semantics.rb:211:5:211:5 | b : | semantics.rb:217:5:217:5 | [post] h [element 1] : | -| semantics.rb:211:5:211:5 | b : | semantics.rb:217:5:217:5 | [post] h [element 1] : | -| semantics.rb:211:9:211:18 | call to source : | semantics.rb:211:5:211:5 | b : | -| semantics.rb:211:9:211:18 | call to source : | semantics.rb:211:5:211:5 | b : | -| semantics.rb:212:5:212:5 | c : | semantics.rb:218:5:218:5 | [post] h [element 2] : | -| semantics.rb:212:5:212:5 | c : | semantics.rb:218:5:218:5 | [post] h [element 2] : | -| semantics.rb:212:9:212:18 | call to source : | semantics.rb:212:5:212:5 | c : | -| semantics.rb:212:9:212:18 | call to source : | semantics.rb:212:5:212:5 | c : | -| semantics.rb:213:5:213:5 | d : | semantics.rb:219:5:219:5 | [post] h [element] : | -| semantics.rb:213:5:213:5 | d : | semantics.rb:219:5:219:5 | [post] h [element] : | -| semantics.rb:213:9:213:18 | call to source : | semantics.rb:213:5:213:5 | d : | -| semantics.rb:213:9:213:18 | call to source : | semantics.rb:213:5:213:5 | d : | -| semantics.rb:217:5:217:5 | [post] h [element 1] : | semantics.rb:218:5:218:5 | h [element 1] : | -| semantics.rb:217:5:217:5 | [post] h [element 1] : | semantics.rb:218:5:218:5 | h [element 1] : | -| semantics.rb:218:5:218:5 | [post] h [element 1] : | semantics.rb:221:14:221:14 | h [element 1] : | -| semantics.rb:218:5:218:5 | [post] h [element 1] : | semantics.rb:221:14:221:14 | h [element 1] : | -| semantics.rb:218:5:218:5 | [post] h [element 2] : | semantics.rb:221:14:221:14 | h [element 2] : | -| semantics.rb:218:5:218:5 | [post] h [element 2] : | semantics.rb:221:14:221:14 | h [element 2] : | -| semantics.rb:218:5:218:5 | h [element 1] : | semantics.rb:218:5:218:5 | [post] h [element 1] : | -| semantics.rb:218:5:218:5 | h [element 1] : | semantics.rb:218:5:218:5 | [post] h [element 1] : | -| semantics.rb:219:5:219:5 | [post] h [element] : | semantics.rb:221:14:221:14 | h [element] : | -| semantics.rb:219:5:219:5 | [post] h [element] : | semantics.rb:221:14:221:14 | h [element] : | -| semantics.rb:221:14:221:14 | h [element 1] : | semantics.rb:221:10:221:15 | call to s27 | -| semantics.rb:221:14:221:14 | h [element 1] : | semantics.rb:221:10:221:15 | call to s27 | -| semantics.rb:221:14:221:14 | h [element 2] : | semantics.rb:221:10:221:15 | call to s27 | -| semantics.rb:221:14:221:14 | h [element 2] : | semantics.rb:221:10:221:15 | call to s27 | -| semantics.rb:221:14:221:14 | h [element] : | semantics.rb:221:10:221:15 | call to s27 | -| semantics.rb:221:14:221:14 | h [element] : | semantics.rb:221:10:221:15 | call to s27 | -| semantics.rb:225:5:225:5 | a : | semantics.rb:226:13:226:13 | a : | -| semantics.rb:225:5:225:5 | a : | semantics.rb:226:13:226:13 | a : | -| semantics.rb:225:9:225:18 | call to source : | semantics.rb:225:5:225:5 | a : | -| semantics.rb:225:9:225:18 | call to source : | semantics.rb:225:5:225:5 | a : | -| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:227:10:227:10 | x [element] : | -| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:227:10:227:10 | x [element] : | -| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:228:10:228:10 | x [element] : | -| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:228:10:228:10 | x [element] : | -| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:229:10:229:10 | x [element] : | -| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:229:10:229:10 | x [element] : | -| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:230:10:230:10 | x [element] : | -| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:230:10:230:10 | x [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:226:5:226:5 | x [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:226:5:226:5 | x [element] : | -| semantics.rb:226:13:226:13 | a : | semantics.rb:226:9:226:14 | call to s28 [element] : | -| semantics.rb:226:13:226:13 | a : | semantics.rb:226:9:226:14 | call to s28 [element] : | -| semantics.rb:227:10:227:10 | x [element] : | semantics.rb:227:10:227:13 | ...[...] | -| semantics.rb:227:10:227:10 | x [element] : | semantics.rb:227:10:227:13 | ...[...] | -| semantics.rb:228:10:228:10 | x [element] : | semantics.rb:228:10:228:13 | ...[...] | -| semantics.rb:228:10:228:10 | x [element] : | semantics.rb:228:10:228:13 | ...[...] | -| semantics.rb:229:10:229:10 | x [element] : | semantics.rb:229:10:229:13 | ...[...] | -| semantics.rb:229:10:229:10 | x [element] : | semantics.rb:229:10:229:13 | ...[...] | -| semantics.rb:230:10:230:10 | x [element] : | semantics.rb:230:10:230:13 | ...[...] | -| semantics.rb:230:10:230:10 | x [element] : | semantics.rb:230:10:230:13 | ...[...] | -| semantics.rb:235:5:235:5 | b : | semantics.rb:240:5:240:5 | [post] h [element 1] : | -| semantics.rb:235:5:235:5 | b : | semantics.rb:240:5:240:5 | [post] h [element 1] : | -| semantics.rb:235:9:235:18 | call to source : | semantics.rb:235:5:235:5 | b : | -| semantics.rb:235:9:235:18 | call to source : | semantics.rb:235:5:235:5 | b : | -| semantics.rb:236:5:236:5 | c : | semantics.rb:241:5:241:5 | [post] h [element 2] : | -| semantics.rb:236:5:236:5 | c : | semantics.rb:241:5:241:5 | [post] h [element 2] : | -| semantics.rb:236:9:236:18 | call to source : | semantics.rb:236:5:236:5 | c : | -| semantics.rb:236:9:236:18 | call to source : | semantics.rb:236:5:236:5 | c : | -| semantics.rb:240:5:240:5 | [post] h [element 1] : | semantics.rb:241:5:241:5 | h [element 1] : | -| semantics.rb:240:5:240:5 | [post] h [element 1] : | semantics.rb:241:5:241:5 | h [element 1] : | -| semantics.rb:241:5:241:5 | [post] h [element 1] : | semantics.rb:244:14:244:14 | h [element 1] : | -| semantics.rb:241:5:241:5 | [post] h [element 1] : | semantics.rb:244:14:244:14 | h [element 1] : | -| semantics.rb:241:5:241:5 | [post] h [element 2] : | semantics.rb:244:14:244:14 | h [element 2] : | -| semantics.rb:241:5:241:5 | [post] h [element 2] : | semantics.rb:244:14:244:14 | h [element 2] : | -| semantics.rb:241:5:241:5 | h [element 1] : | semantics.rb:241:5:241:5 | [post] h [element 1] : | -| semantics.rb:241:5:241:5 | h [element 1] : | semantics.rb:241:5:241:5 | [post] h [element 1] : | -| semantics.rb:244:14:244:14 | h [element 1] : | semantics.rb:244:10:244:15 | call to s29 | -| semantics.rb:244:14:244:14 | h [element 1] : | semantics.rb:244:10:244:15 | call to s29 | -| semantics.rb:244:14:244:14 | h [element 2] : | semantics.rb:244:10:244:15 | call to s29 | -| semantics.rb:244:14:244:14 | h [element 2] : | semantics.rb:244:10:244:15 | call to s29 | -| semantics.rb:248:5:248:5 | a : | semantics.rb:249:13:249:13 | a : | -| semantics.rb:248:5:248:5 | a : | semantics.rb:249:13:249:13 | a : | -| semantics.rb:248:9:248:18 | call to source : | semantics.rb:248:5:248:5 | a : | -| semantics.rb:248:9:248:18 | call to source : | semantics.rb:248:5:248:5 | a : | -| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:250:10:250:10 | x [element] : | -| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:250:10:250:10 | x [element] : | -| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:251:10:251:10 | x [element] : | -| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:251:10:251:10 | x [element] : | -| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:252:10:252:10 | x [element] : | -| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:252:10:252:10 | x [element] : | -| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:253:10:253:10 | x [element] : | -| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:253:10:253:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:249:5:249:5 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:249:5:249:5 | x [element] : | -| semantics.rb:249:13:249:13 | a : | semantics.rb:249:9:249:14 | call to s30 [element] : | -| semantics.rb:249:13:249:13 | a : | semantics.rb:249:9:249:14 | call to s30 [element] : | -| semantics.rb:250:10:250:10 | x [element] : | semantics.rb:250:10:250:13 | ...[...] | -| semantics.rb:250:10:250:10 | x [element] : | semantics.rb:250:10:250:13 | ...[...] | -| semantics.rb:251:10:251:10 | x [element] : | semantics.rb:251:10:251:13 | ...[...] | -| semantics.rb:251:10:251:10 | x [element] : | semantics.rb:251:10:251:13 | ...[...] | -| semantics.rb:252:10:252:10 | x [element] : | semantics.rb:252:10:252:13 | ...[...] | -| semantics.rb:252:10:252:10 | x [element] : | semantics.rb:252:10:252:13 | ...[...] | -| semantics.rb:253:10:253:10 | x [element] : | semantics.rb:253:10:253:13 | ...[...] | -| semantics.rb:253:10:253:10 | x [element] : | semantics.rb:253:10:253:13 | ...[...] | -| semantics.rb:257:5:257:5 | [post] h [element :foo] : | semantics.rb:258:5:258:5 | h [element :foo] : | -| semantics.rb:257:5:257:5 | [post] h [element :foo] : | semantics.rb:258:5:258:5 | h [element :foo] : | -| semantics.rb:257:15:257:25 | call to source : | semantics.rb:257:5:257:5 | [post] h [element :foo] : | -| semantics.rb:257:15:257:25 | call to source : | semantics.rb:257:5:257:5 | [post] h [element :foo] : | -| semantics.rb:258:5:258:5 | [post] h [element :foo] : | semantics.rb:259:5:259:5 | h [element :foo] : | -| semantics.rb:258:5:258:5 | [post] h [element :foo] : | semantics.rb:259:5:259:5 | h [element :foo] : | -| semantics.rb:258:5:258:5 | h [element :foo] : | semantics.rb:258:5:258:5 | [post] h [element :foo] : | -| semantics.rb:258:5:258:5 | h [element :foo] : | semantics.rb:258:5:258:5 | [post] h [element :foo] : | -| semantics.rb:259:5:259:5 | [post] h [element :foo] : | semantics.rb:262:14:262:14 | h [element :foo] : | -| semantics.rb:259:5:259:5 | [post] h [element :foo] : | semantics.rb:262:14:262:14 | h [element :foo] : | -| semantics.rb:259:5:259:5 | h [element :foo] : | semantics.rb:259:5:259:5 | [post] h [element :foo] : | -| semantics.rb:259:5:259:5 | h [element :foo] : | semantics.rb:259:5:259:5 | [post] h [element :foo] : | -| semantics.rb:260:5:260:5 | [post] h [element] : | semantics.rb:262:14:262:14 | h [element] : | -| semantics.rb:260:5:260:5 | [post] h [element] : | semantics.rb:262:14:262:14 | h [element] : | -| semantics.rb:260:12:260:22 | call to source : | semantics.rb:260:5:260:5 | [post] h [element] : | -| semantics.rb:260:12:260:22 | call to source : | semantics.rb:260:5:260:5 | [post] h [element] : | -| semantics.rb:262:14:262:14 | h [element :foo] : | semantics.rb:262:10:262:15 | call to s31 | -| semantics.rb:262:14:262:14 | h [element :foo] : | semantics.rb:262:10:262:15 | call to s31 | -| semantics.rb:262:14:262:14 | h [element] : | semantics.rb:262:10:262:15 | call to s31 | -| semantics.rb:262:14:262:14 | h [element] : | semantics.rb:262:10:262:15 | call to s31 | -| semantics.rb:267:5:267:5 | [post] h [element foo] : | semantics.rb:268:5:268:5 | h [element foo] : | -| semantics.rb:267:5:267:5 | [post] h [element foo] : | semantics.rb:268:5:268:5 | h [element foo] : | -| semantics.rb:267:16:267:26 | call to source : | semantics.rb:267:5:267:5 | [post] h [element foo] : | -| semantics.rb:267:16:267:26 | call to source : | semantics.rb:267:5:267:5 | [post] h [element foo] : | -| semantics.rb:268:5:268:5 | [post] h [element foo] : | semantics.rb:269:5:269:5 | h [element foo] : | -| semantics.rb:268:5:268:5 | [post] h [element foo] : | semantics.rb:269:5:269:5 | h [element foo] : | -| semantics.rb:268:5:268:5 | h [element foo] : | semantics.rb:268:5:268:5 | [post] h [element foo] : | -| semantics.rb:268:5:268:5 | h [element foo] : | semantics.rb:268:5:268:5 | [post] h [element foo] : | -| semantics.rb:269:5:269:5 | [post] h [element foo] : | semantics.rb:272:14:272:14 | h [element foo] : | -| semantics.rb:269:5:269:5 | [post] h [element foo] : | semantics.rb:272:14:272:14 | h [element foo] : | -| semantics.rb:269:5:269:5 | h [element foo] : | semantics.rb:269:5:269:5 | [post] h [element foo] : | -| semantics.rb:269:5:269:5 | h [element foo] : | semantics.rb:269:5:269:5 | [post] h [element foo] : | -| semantics.rb:270:5:270:5 | [post] h [element] : | semantics.rb:272:14:272:14 | h [element] : | -| semantics.rb:270:5:270:5 | [post] h [element] : | semantics.rb:272:14:272:14 | h [element] : | -| semantics.rb:270:12:270:22 | call to source : | semantics.rb:270:5:270:5 | [post] h [element] : | -| semantics.rb:270:12:270:22 | call to source : | semantics.rb:270:5:270:5 | [post] h [element] : | -| semantics.rb:272:14:272:14 | h [element foo] : | semantics.rb:272:10:272:15 | call to s32 | -| semantics.rb:272:14:272:14 | h [element foo] : | semantics.rb:272:10:272:15 | call to s32 | -| semantics.rb:272:14:272:14 | h [element] : | semantics.rb:272:10:272:15 | call to s32 | -| semantics.rb:272:14:272:14 | h [element] : | semantics.rb:272:10:272:15 | call to s32 | -| semantics.rb:280:5:280:5 | [post] h [element] : | semantics.rb:281:5:281:5 | h [element] : | -| semantics.rb:280:5:280:5 | [post] h [element] : | semantics.rb:281:5:281:5 | h [element] : | -| semantics.rb:280:12:280:22 | call to source : | semantics.rb:280:5:280:5 | [post] h [element] : | -| semantics.rb:280:12:280:22 | call to source : | semantics.rb:280:5:280:5 | [post] h [element] : | -| semantics.rb:281:5:281:5 | [post] h [element nil] : | semantics.rb:282:5:282:5 | h [element nil] : | -| semantics.rb:281:5:281:5 | [post] h [element nil] : | semantics.rb:282:5:282:5 | h [element nil] : | -| semantics.rb:281:5:281:5 | [post] h [element] : | semantics.rb:282:5:282:5 | h [element] : | -| semantics.rb:281:5:281:5 | [post] h [element] : | semantics.rb:282:5:282:5 | h [element] : | -| semantics.rb:281:5:281:5 | h [element] : | semantics.rb:281:5:281:5 | [post] h [element] : | -| semantics.rb:281:5:281:5 | h [element] : | semantics.rb:281:5:281:5 | [post] h [element] : | -| semantics.rb:281:14:281:24 | call to source : | semantics.rb:281:5:281:5 | [post] h [element nil] : | -| semantics.rb:281:14:281:24 | call to source : | semantics.rb:281:5:281:5 | [post] h [element nil] : | -| semantics.rb:282:5:282:5 | [post] h [element nil] : | semantics.rb:283:5:283:5 | h [element nil] : | -| semantics.rb:282:5:282:5 | [post] h [element nil] : | semantics.rb:283:5:283:5 | h [element nil] : | -| semantics.rb:282:5:282:5 | [post] h [element true] : | semantics.rb:283:5:283:5 | h [element true] : | -| semantics.rb:282:5:282:5 | [post] h [element true] : | semantics.rb:283:5:283:5 | h [element true] : | -| semantics.rb:282:5:282:5 | [post] h [element] : | semantics.rb:283:5:283:5 | h [element] : | -| semantics.rb:282:5:282:5 | [post] h [element] : | semantics.rb:283:5:283:5 | h [element] : | -| semantics.rb:282:5:282:5 | h [element nil] : | semantics.rb:282:5:282:5 | [post] h [element nil] : | -| semantics.rb:282:5:282:5 | h [element nil] : | semantics.rb:282:5:282:5 | [post] h [element nil] : | -| semantics.rb:282:5:282:5 | h [element] : | semantics.rb:282:5:282:5 | [post] h [element] : | -| semantics.rb:282:5:282:5 | h [element] : | semantics.rb:282:5:282:5 | [post] h [element] : | -| semantics.rb:282:15:282:25 | call to source : | semantics.rb:282:5:282:5 | [post] h [element true] : | -| semantics.rb:282:15:282:25 | call to source : | semantics.rb:282:5:282:5 | [post] h [element true] : | -| semantics.rb:283:5:283:5 | [post] h [element false] : | semantics.rb:285:14:285:14 | h [element false] : | -| semantics.rb:283:5:283:5 | [post] h [element false] : | semantics.rb:285:14:285:14 | h [element false] : | -| semantics.rb:283:5:283:5 | [post] h [element nil] : | semantics.rb:285:14:285:14 | h [element nil] : | -| semantics.rb:283:5:283:5 | [post] h [element nil] : | semantics.rb:285:14:285:14 | h [element nil] : | -| semantics.rb:283:5:283:5 | [post] h [element true] : | semantics.rb:285:14:285:14 | h [element true] : | -| semantics.rb:283:5:283:5 | [post] h [element true] : | semantics.rb:285:14:285:14 | h [element true] : | -| semantics.rb:283:5:283:5 | [post] h [element] : | semantics.rb:285:14:285:14 | h [element] : | -| semantics.rb:283:5:283:5 | [post] h [element] : | semantics.rb:285:14:285:14 | h [element] : | -| semantics.rb:283:5:283:5 | h [element nil] : | semantics.rb:283:5:283:5 | [post] h [element nil] : | -| semantics.rb:283:5:283:5 | h [element nil] : | semantics.rb:283:5:283:5 | [post] h [element nil] : | -| semantics.rb:283:5:283:5 | h [element true] : | semantics.rb:283:5:283:5 | [post] h [element true] : | -| semantics.rb:283:5:283:5 | h [element true] : | semantics.rb:283:5:283:5 | [post] h [element true] : | -| semantics.rb:283:5:283:5 | h [element] : | semantics.rb:283:5:283:5 | [post] h [element] : | -| semantics.rb:283:5:283:5 | h [element] : | semantics.rb:283:5:283:5 | [post] h [element] : | -| semantics.rb:283:16:283:26 | call to source : | semantics.rb:283:5:283:5 | [post] h [element false] : | -| semantics.rb:283:16:283:26 | call to source : | semantics.rb:283:5:283:5 | [post] h [element false] : | -| semantics.rb:285:14:285:14 | h [element false] : | semantics.rb:285:10:285:15 | call to s33 | -| semantics.rb:285:14:285:14 | h [element false] : | semantics.rb:285:10:285:15 | call to s33 | -| semantics.rb:285:14:285:14 | h [element nil] : | semantics.rb:285:10:285:15 | call to s33 | -| semantics.rb:285:14:285:14 | h [element nil] : | semantics.rb:285:10:285:15 | call to s33 | -| semantics.rb:285:14:285:14 | h [element true] : | semantics.rb:285:10:285:15 | call to s33 | -| semantics.rb:285:14:285:14 | h [element true] : | semantics.rb:285:10:285:15 | call to s33 | -| semantics.rb:285:14:285:14 | h [element] : | semantics.rb:285:10:285:15 | call to s33 | -| semantics.rb:285:14:285:14 | h [element] : | semantics.rb:285:10:285:15 | call to s33 | -| semantics.rb:289:5:289:5 | x [element :foo] : | semantics.rb:290:10:290:10 | x [element :foo] : | -| semantics.rb:289:5:289:5 | x [element :foo] : | semantics.rb:290:10:290:10 | x [element :foo] : | -| semantics.rb:289:5:289:5 | x [element :foo] : | semantics.rb:292:10:292:10 | x [element :foo] : | -| semantics.rb:289:5:289:5 | x [element :foo] : | semantics.rb:292:10:292:10 | x [element :foo] : | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:289:5:289:5 | x [element :foo] : | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:289:5:289:5 | x [element :foo] : | -| semantics.rb:289:13:289:23 | call to source : | semantics.rb:289:9:289:24 | call to s35 [element :foo] : | -| semantics.rb:289:13:289:23 | call to source : | semantics.rb:289:9:289:24 | call to s35 [element :foo] : | -| semantics.rb:290:10:290:10 | x [element :foo] : | semantics.rb:290:10:290:16 | ...[...] | -| semantics.rb:290:10:290:10 | x [element :foo] : | semantics.rb:290:10:290:16 | ...[...] | -| semantics.rb:292:10:292:10 | x [element :foo] : | semantics.rb:292:10:292:13 | ...[...] | -| semantics.rb:292:10:292:10 | x [element :foo] : | semantics.rb:292:10:292:13 | ...[...] | -| semantics.rb:296:5:296:5 | x [element foo] : | semantics.rb:298:10:298:10 | x [element foo] : | -| semantics.rb:296:5:296:5 | x [element foo] : | semantics.rb:298:10:298:10 | x [element foo] : | -| semantics.rb:296:5:296:5 | x [element foo] : | semantics.rb:300:10:300:10 | x [element foo] : | -| semantics.rb:296:5:296:5 | x [element foo] : | semantics.rb:300:10:300:10 | x [element foo] : | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:296:5:296:5 | x [element foo] : | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:296:5:296:5 | x [element foo] : | -| semantics.rb:296:13:296:23 | call to source : | semantics.rb:296:9:296:24 | call to s36 [element foo] : | -| semantics.rb:296:13:296:23 | call to source : | semantics.rb:296:9:296:24 | call to s36 [element foo] : | -| semantics.rb:298:10:298:10 | x [element foo] : | semantics.rb:298:10:298:17 | ...[...] | -| semantics.rb:298:10:298:10 | x [element foo] : | semantics.rb:298:10:298:17 | ...[...] | -| semantics.rb:300:10:300:10 | x [element foo] : | semantics.rb:300:10:300:13 | ...[...] | -| semantics.rb:300:10:300:10 | x [element foo] : | semantics.rb:300:10:300:13 | ...[...] | -| semantics.rb:304:5:304:5 | x [element true] : | semantics.rb:306:10:306:10 | x [element true] : | -| semantics.rb:304:5:304:5 | x [element true] : | semantics.rb:306:10:306:10 | x [element true] : | -| semantics.rb:304:5:304:5 | x [element true] : | semantics.rb:308:10:308:10 | x [element true] : | -| semantics.rb:304:5:304:5 | x [element true] : | semantics.rb:308:10:308:10 | x [element true] : | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:304:5:304:5 | x [element true] : | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:304:5:304:5 | x [element true] : | -| semantics.rb:304:13:304:23 | call to source : | semantics.rb:304:9:304:24 | call to s37 [element true] : | -| semantics.rb:304:13:304:23 | call to source : | semantics.rb:304:9:304:24 | call to s37 [element true] : | -| semantics.rb:306:10:306:10 | x [element true] : | semantics.rb:306:10:306:16 | ...[...] | -| semantics.rb:306:10:306:10 | x [element true] : | semantics.rb:306:10:306:16 | ...[...] | -| semantics.rb:308:10:308:10 | x [element true] : | semantics.rb:308:10:308:13 | ...[...] | -| semantics.rb:308:10:308:10 | x [element true] : | semantics.rb:308:10:308:13 | ...[...] | -| semantics.rb:312:5:312:5 | [post] h [element foo] : | semantics.rb:315:14:315:14 | h [element foo] : | -| semantics.rb:312:5:312:5 | [post] h [element foo] : | semantics.rb:315:14:315:14 | h [element foo] : | -| semantics.rb:312:16:312:26 | call to source : | semantics.rb:312:5:312:5 | [post] h [element foo] : | -| semantics.rb:312:16:312:26 | call to source : | semantics.rb:312:5:312:5 | [post] h [element foo] : | -| semantics.rb:315:14:315:14 | h [element foo] : | semantics.rb:315:10:315:15 | call to s38 | -| semantics.rb:315:14:315:14 | h [element foo] : | semantics.rb:315:10:315:15 | call to s38 | -| semantics.rb:319:5:319:5 | x [element :foo] : | semantics.rb:321:10:321:10 | x [element :foo] : | -| semantics.rb:319:5:319:5 | x [element :foo] : | semantics.rb:321:10:321:10 | x [element :foo] : | -| semantics.rb:319:5:319:5 | x [element :foo] : | semantics.rb:322:10:322:10 | x [element :foo] : | -| semantics.rb:319:5:319:5 | x [element :foo] : | semantics.rb:322:10:322:10 | x [element :foo] : | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:319:5:319:5 | x [element :foo] : | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:319:5:319:5 | x [element :foo] : | -| semantics.rb:319:13:319:23 | call to source : | semantics.rb:319:9:319:24 | call to s39 [element :foo] : | -| semantics.rb:319:13:319:23 | call to source : | semantics.rb:319:9:319:24 | call to s39 [element :foo] : | -| semantics.rb:321:10:321:10 | x [element :foo] : | semantics.rb:321:10:321:16 | ...[...] | -| semantics.rb:321:10:321:10 | x [element :foo] : | semantics.rb:321:10:321:16 | ...[...] | -| semantics.rb:322:10:322:10 | x [element :foo] : | semantics.rb:322:10:322:13 | ...[...] | -| semantics.rb:322:10:322:10 | x [element :foo] : | semantics.rb:322:10:322:13 | ...[...] | -| semantics.rb:327:5:327:5 | [post] x [@foo] : | semantics.rb:329:14:329:14 | x [@foo] : | -| semantics.rb:327:5:327:5 | [post] x [@foo] : | semantics.rb:329:14:329:14 | x [@foo] : | -| semantics.rb:327:13:327:23 | call to source : | semantics.rb:327:5:327:5 | [post] x [@foo] : | -| semantics.rb:327:13:327:23 | call to source : | semantics.rb:327:5:327:5 | [post] x [@foo] : | -| semantics.rb:329:14:329:14 | x [@foo] : | semantics.rb:329:10:329:15 | call to s40 | -| semantics.rb:329:14:329:14 | x [@foo] : | semantics.rb:329:10:329:15 | call to s40 | -| semantics.rb:333:5:333:5 | x [@foo] : | semantics.rb:334:10:334:10 | x [@foo] : | -| semantics.rb:333:5:333:5 | x [@foo] : | semantics.rb:334:10:334:10 | x [@foo] : | -| semantics.rb:333:9:333:24 | call to s41 [@foo] : | semantics.rb:333:5:333:5 | x [@foo] : | -| semantics.rb:333:9:333:24 | call to s41 [@foo] : | semantics.rb:333:5:333:5 | x [@foo] : | -| semantics.rb:333:13:333:23 | call to source : | semantics.rb:333:9:333:24 | call to s41 [@foo] : | -| semantics.rb:333:13:333:23 | call to source : | semantics.rb:333:9:333:24 | call to s41 [@foo] : | -| semantics.rb:334:10:334:10 | x [@foo] : | semantics.rb:334:10:334:14 | call to foo | -| semantics.rb:334:10:334:10 | x [@foo] : | semantics.rb:334:10:334:14 | call to foo | -| semantics.rb:339:5:339:5 | [post] h [element 0] : | semantics.rb:342:13:342:13 | h [element 0] : | -| semantics.rb:339:5:339:5 | [post] h [element 0] : | semantics.rb:342:13:342:13 | h [element 0] : | -| semantics.rb:339:12:339:22 | call to source : | semantics.rb:339:5:339:5 | [post] h [element 0] : | -| semantics.rb:339:12:339:22 | call to source : | semantics.rb:339:5:339:5 | [post] h [element 0] : | -| semantics.rb:340:5:340:5 | [post] h [element] : | semantics.rb:342:13:342:13 | h [element] : | -| semantics.rb:340:5:340:5 | [post] h [element] : | semantics.rb:342:13:342:13 | h [element] : | -| semantics.rb:340:12:340:22 | call to source : | semantics.rb:340:5:340:5 | [post] h [element] : | -| semantics.rb:340:12:340:22 | call to source : | semantics.rb:340:5:340:5 | [post] h [element] : | -| semantics.rb:342:5:342:5 | x [element 0] : | semantics.rb:344:10:344:10 | x [element 0] : | -| semantics.rb:342:5:342:5 | x [element 0] : | semantics.rb:344:10:344:10 | x [element 0] : | -| semantics.rb:342:5:342:5 | x [element 0] : | semantics.rb:346:10:346:10 | x [element 0] : | -| semantics.rb:342:5:342:5 | x [element 0] : | semantics.rb:346:10:346:10 | x [element 0] : | -| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:344:10:344:10 | x [element] : | -| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:344:10:344:10 | x [element] : | -| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:345:10:345:10 | x [element] : | -| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:345:10:345:10 | x [element] : | -| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:346:10:346:10 | x [element] : | -| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:346:10:346:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:342:5:342:5 | x [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:342:5:342:5 | x [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:342:5:342:5 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:342:5:342:5 | x [element] : | -| semantics.rb:342:13:342:13 | h [element 0] : | semantics.rb:342:9:342:14 | call to s42 [element 0] : | -| semantics.rb:342:13:342:13 | h [element 0] : | semantics.rb:342:9:342:14 | call to s42 [element 0] : | -| semantics.rb:342:13:342:13 | h [element] : | semantics.rb:342:9:342:14 | call to s42 [element] : | -| semantics.rb:342:13:342:13 | h [element] : | semantics.rb:342:9:342:14 | call to s42 [element] : | -| semantics.rb:344:10:344:10 | x [element 0] : | semantics.rb:344:10:344:13 | ...[...] | -| semantics.rb:344:10:344:10 | x [element 0] : | semantics.rb:344:10:344:13 | ...[...] | -| semantics.rb:344:10:344:10 | x [element] : | semantics.rb:344:10:344:13 | ...[...] | -| semantics.rb:344:10:344:10 | x [element] : | semantics.rb:344:10:344:13 | ...[...] | -| semantics.rb:345:10:345:10 | x [element] : | semantics.rb:345:10:345:13 | ...[...] | -| semantics.rb:345:10:345:10 | x [element] : | semantics.rb:345:10:345:13 | ...[...] | -| semantics.rb:346:10:346:10 | x [element 0] : | semantics.rb:346:10:346:13 | ...[...] | -| semantics.rb:346:10:346:10 | x [element 0] : | semantics.rb:346:10:346:13 | ...[...] | -| semantics.rb:346:10:346:10 | x [element] : | semantics.rb:346:10:346:13 | ...[...] | -| semantics.rb:346:10:346:10 | x [element] : | semantics.rb:346:10:346:13 | ...[...] | -| semantics.rb:350:5:350:5 | [post] h [element 0] : | semantics.rb:353:13:353:13 | h [element 0] : | -| semantics.rb:350:5:350:5 | [post] h [element 0] : | semantics.rb:353:13:353:13 | h [element 0] : | -| semantics.rb:350:12:350:22 | call to source : | semantics.rb:350:5:350:5 | [post] h [element 0] : | -| semantics.rb:350:12:350:22 | call to source : | semantics.rb:350:5:350:5 | [post] h [element 0] : | -| semantics.rb:353:5:353:5 | x [element 0] : | semantics.rb:355:10:355:10 | x [element 0] : | -| semantics.rb:353:5:353:5 | x [element 0] : | semantics.rb:355:10:355:10 | x [element 0] : | -| semantics.rb:353:5:353:5 | x [element 0] : | semantics.rb:357:10:357:10 | x [element 0] : | -| semantics.rb:353:5:353:5 | x [element 0] : | semantics.rb:357:10:357:10 | x [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:353:5:353:5 | x [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:353:5:353:5 | x [element 0] : | -| semantics.rb:353:13:353:13 | h [element 0] : | semantics.rb:353:9:353:14 | call to s43 [element 0] : | -| semantics.rb:353:13:353:13 | h [element 0] : | semantics.rb:353:9:353:14 | call to s43 [element 0] : | -| semantics.rb:355:10:355:10 | x [element 0] : | semantics.rb:355:10:355:13 | ...[...] | -| semantics.rb:355:10:355:10 | x [element 0] : | semantics.rb:355:10:355:13 | ...[...] | -| semantics.rb:357:10:357:10 | x [element 0] : | semantics.rb:357:10:357:13 | ...[...] | -| semantics.rb:357:10:357:10 | x [element 0] : | semantics.rb:357:10:357:13 | ...[...] | -| semantics.rb:362:5:362:5 | [post] h [element 1] : | semantics.rb:365:9:365:9 | h [element 1] : | -| semantics.rb:362:5:362:5 | [post] h [element 1] : | semantics.rb:365:9:365:9 | h [element 1] : | -| semantics.rb:362:12:362:22 | call to source : | semantics.rb:362:5:362:5 | [post] h [element 1] : | -| semantics.rb:362:12:362:22 | call to source : | semantics.rb:362:5:362:5 | [post] h [element 1] : | -| semantics.rb:365:9:365:9 | [post] h [element 1] : | semantics.rb:368:10:368:10 | h [element 1] : | -| semantics.rb:365:9:365:9 | [post] h [element 1] : | semantics.rb:368:10:368:10 | h [element 1] : | -| semantics.rb:365:9:365:9 | [post] h [element 1] : | semantics.rb:369:10:369:10 | h [element 1] : | -| semantics.rb:365:9:365:9 | [post] h [element 1] : | semantics.rb:369:10:369:10 | h [element 1] : | -| semantics.rb:365:9:365:9 | h [element 1] : | semantics.rb:365:9:365:9 | [post] h [element 1] : | -| semantics.rb:365:9:365:9 | h [element 1] : | semantics.rb:365:9:365:9 | [post] h [element 1] : | -| semantics.rb:368:10:368:10 | h [element 1] : | semantics.rb:368:10:368:13 | ...[...] | -| semantics.rb:368:10:368:10 | h [element 1] : | semantics.rb:368:10:368:13 | ...[...] | -| semantics.rb:369:10:369:10 | h [element 1] : | semantics.rb:369:10:369:13 | ...[...] | -| semantics.rb:369:10:369:10 | h [element 1] : | semantics.rb:369:10:369:13 | ...[...] | -| semantics.rb:373:5:373:5 | [post] h [element 0] : | semantics.rb:374:5:374:5 | h [element 0] : | -| semantics.rb:373:5:373:5 | [post] h [element 0] : | semantics.rb:374:5:374:5 | h [element 0] : | -| semantics.rb:373:12:373:22 | call to source : | semantics.rb:373:5:373:5 | [post] h [element 0] : | -| semantics.rb:373:12:373:22 | call to source : | semantics.rb:373:5:373:5 | [post] h [element 0] : | -| semantics.rb:374:5:374:5 | [post] h [element 0] : | semantics.rb:377:10:377:10 | h [element 0] : | -| semantics.rb:374:5:374:5 | [post] h [element 0] : | semantics.rb:377:10:377:10 | h [element 0] : | -| semantics.rb:374:5:374:5 | [post] h [element 0] : | semantics.rb:379:10:379:10 | h [element 0] : | -| semantics.rb:374:5:374:5 | [post] h [element 0] : | semantics.rb:379:10:379:10 | h [element 0] : | -| semantics.rb:374:5:374:5 | [post] h [element 1] : | semantics.rb:378:10:378:10 | h [element 1] : | -| semantics.rb:374:5:374:5 | [post] h [element 1] : | semantics.rb:378:10:378:10 | h [element 1] : | -| semantics.rb:374:5:374:5 | [post] h [element 1] : | semantics.rb:379:10:379:10 | h [element 1] : | -| semantics.rb:374:5:374:5 | [post] h [element 1] : | semantics.rb:379:10:379:10 | h [element 1] : | -| semantics.rb:374:5:374:5 | [post] h [element 1] : | semantics.rb:381:9:381:9 | h [element 1] : | -| semantics.rb:374:5:374:5 | [post] h [element 1] : | semantics.rb:381:9:381:9 | h [element 1] : | -| semantics.rb:374:5:374:5 | h [element 0] : | semantics.rb:374:5:374:5 | [post] h [element 0] : | -| semantics.rb:374:5:374:5 | h [element 0] : | semantics.rb:374:5:374:5 | [post] h [element 0] : | -| semantics.rb:374:12:374:22 | call to source : | semantics.rb:374:5:374:5 | [post] h [element 1] : | -| semantics.rb:374:12:374:22 | call to source : | semantics.rb:374:5:374:5 | [post] h [element 1] : | -| semantics.rb:375:5:375:5 | [post] h [element] : | semantics.rb:377:10:377:10 | h [element] : | -| semantics.rb:375:5:375:5 | [post] h [element] : | semantics.rb:377:10:377:10 | h [element] : | -| semantics.rb:375:5:375:5 | [post] h [element] : | semantics.rb:378:10:378:10 | h [element] : | -| semantics.rb:375:5:375:5 | [post] h [element] : | semantics.rb:378:10:378:10 | h [element] : | -| semantics.rb:375:5:375:5 | [post] h [element] : | semantics.rb:379:10:379:10 | h [element] : | -| semantics.rb:375:5:375:5 | [post] h [element] : | semantics.rb:379:10:379:10 | h [element] : | -| semantics.rb:375:5:375:5 | [post] h [element] : | semantics.rb:381:9:381:9 | h [element] : | -| semantics.rb:375:5:375:5 | [post] h [element] : | semantics.rb:381:9:381:9 | h [element] : | -| semantics.rb:375:12:375:22 | call to source : | semantics.rb:375:5:375:5 | [post] h [element] : | -| semantics.rb:375:12:375:22 | call to source : | semantics.rb:375:5:375:5 | [post] h [element] : | -| semantics.rb:377:10:377:10 | h [element 0] : | semantics.rb:377:10:377:13 | ...[...] | -| semantics.rb:377:10:377:10 | h [element 0] : | semantics.rb:377:10:377:13 | ...[...] | -| semantics.rb:377:10:377:10 | h [element] : | semantics.rb:377:10:377:13 | ...[...] | -| semantics.rb:377:10:377:10 | h [element] : | semantics.rb:377:10:377:13 | ...[...] | -| semantics.rb:378:10:378:10 | h [element 1] : | semantics.rb:378:10:378:13 | ...[...] | -| semantics.rb:378:10:378:10 | h [element 1] : | semantics.rb:378:10:378:13 | ...[...] | -| semantics.rb:378:10:378:10 | h [element] : | semantics.rb:378:10:378:13 | ...[...] | -| semantics.rb:378:10:378:10 | h [element] : | semantics.rb:378:10:378:13 | ...[...] | -| semantics.rb:379:10:379:10 | h [element 0] : | semantics.rb:379:10:379:13 | ...[...] | -| semantics.rb:379:10:379:10 | h [element 0] : | semantics.rb:379:10:379:13 | ...[...] | -| semantics.rb:379:10:379:10 | h [element 1] : | semantics.rb:379:10:379:13 | ...[...] | -| semantics.rb:379:10:379:10 | h [element 1] : | semantics.rb:379:10:379:13 | ...[...] | -| semantics.rb:379:10:379:10 | h [element] : | semantics.rb:379:10:379:13 | ...[...] | -| semantics.rb:379:10:379:10 | h [element] : | semantics.rb:379:10:379:13 | ...[...] | -| semantics.rb:381:9:381:9 | [post] h [element 1] : | semantics.rb:384:10:384:10 | h [element 1] : | -| semantics.rb:381:9:381:9 | [post] h [element 1] : | semantics.rb:384:10:384:10 | h [element 1] : | -| semantics.rb:381:9:381:9 | [post] h [element 1] : | semantics.rb:385:10:385:10 | h [element 1] : | -| semantics.rb:381:9:381:9 | [post] h [element 1] : | semantics.rb:385:10:385:10 | h [element 1] : | -| semantics.rb:381:9:381:9 | [post] h [element] : | semantics.rb:383:10:383:10 | h [element] : | -| semantics.rb:381:9:381:9 | [post] h [element] : | semantics.rb:383:10:383:10 | h [element] : | -| semantics.rb:381:9:381:9 | [post] h [element] : | semantics.rb:384:10:384:10 | h [element] : | -| semantics.rb:381:9:381:9 | [post] h [element] : | semantics.rb:384:10:384:10 | h [element] : | -| semantics.rb:381:9:381:9 | [post] h [element] : | semantics.rb:385:10:385:10 | h [element] : | -| semantics.rb:381:9:381:9 | [post] h [element] : | semantics.rb:385:10:385:10 | h [element] : | -| semantics.rb:381:9:381:9 | h [element 1] : | semantics.rb:381:9:381:9 | [post] h [element 1] : | -| semantics.rb:381:9:381:9 | h [element 1] : | semantics.rb:381:9:381:9 | [post] h [element 1] : | -| semantics.rb:381:9:381:9 | h [element] : | semantics.rb:381:9:381:9 | [post] h [element] : | -| semantics.rb:381:9:381:9 | h [element] : | semantics.rb:381:9:381:9 | [post] h [element] : | -| semantics.rb:383:10:383:10 | h [element] : | semantics.rb:383:10:383:13 | ...[...] | -| semantics.rb:383:10:383:10 | h [element] : | semantics.rb:383:10:383:13 | ...[...] | -| semantics.rb:384:10:384:10 | h [element 1] : | semantics.rb:384:10:384:13 | ...[...] | -| semantics.rb:384:10:384:10 | h [element 1] : | semantics.rb:384:10:384:13 | ...[...] | -| semantics.rb:384:10:384:10 | h [element] : | semantics.rb:384:10:384:13 | ...[...] | -| semantics.rb:384:10:384:10 | h [element] : | semantics.rb:384:10:384:13 | ...[...] | -| semantics.rb:385:10:385:10 | h [element 1] : | semantics.rb:385:10:385:13 | ...[...] | -| semantics.rb:385:10:385:10 | h [element 1] : | semantics.rb:385:10:385:13 | ...[...] | -| semantics.rb:385:10:385:10 | h [element] : | semantics.rb:385:10:385:13 | ...[...] | -| semantics.rb:385:10:385:10 | h [element] : | semantics.rb:385:10:385:13 | ...[...] | -| semantics.rb:389:5:389:5 | [post] h [element 0] : | semantics.rb:390:5:390:5 | h [element 0] : | -| semantics.rb:389:5:389:5 | [post] h [element 0] : | semantics.rb:390:5:390:5 | h [element 0] : | -| semantics.rb:389:12:389:22 | call to source : | semantics.rb:389:5:389:5 | [post] h [element 0] : | -| semantics.rb:389:12:389:22 | call to source : | semantics.rb:389:5:389:5 | [post] h [element 0] : | -| semantics.rb:390:5:390:5 | [post] h [element 0] : | semantics.rb:393:10:393:10 | h [element 0] : | -| semantics.rb:390:5:390:5 | [post] h [element 0] : | semantics.rb:393:10:393:10 | h [element 0] : | -| semantics.rb:390:5:390:5 | [post] h [element 0] : | semantics.rb:395:10:395:10 | h [element 0] : | -| semantics.rb:390:5:390:5 | [post] h [element 0] : | semantics.rb:395:10:395:10 | h [element 0] : | -| semantics.rb:390:5:390:5 | [post] h [element 1] : | semantics.rb:394:10:394:10 | h [element 1] : | -| semantics.rb:390:5:390:5 | [post] h [element 1] : | semantics.rb:394:10:394:10 | h [element 1] : | -| semantics.rb:390:5:390:5 | [post] h [element 1] : | semantics.rb:395:10:395:10 | h [element 1] : | -| semantics.rb:390:5:390:5 | [post] h [element 1] : | semantics.rb:395:10:395:10 | h [element 1] : | -| semantics.rb:390:5:390:5 | [post] h [element 1] : | semantics.rb:397:13:397:13 | h [element 1] : | -| semantics.rb:390:5:390:5 | [post] h [element 1] : | semantics.rb:397:13:397:13 | h [element 1] : | -| semantics.rb:390:5:390:5 | h [element 0] : | semantics.rb:390:5:390:5 | [post] h [element 0] : | -| semantics.rb:390:5:390:5 | h [element 0] : | semantics.rb:390:5:390:5 | [post] h [element 0] : | -| semantics.rb:390:12:390:22 | call to source : | semantics.rb:390:5:390:5 | [post] h [element 1] : | -| semantics.rb:390:12:390:22 | call to source : | semantics.rb:390:5:390:5 | [post] h [element 1] : | -| semantics.rb:391:5:391:5 | [post] h [element] : | semantics.rb:393:10:393:10 | h [element] : | -| semantics.rb:391:5:391:5 | [post] h [element] : | semantics.rb:393:10:393:10 | h [element] : | -| semantics.rb:391:5:391:5 | [post] h [element] : | semantics.rb:394:10:394:10 | h [element] : | -| semantics.rb:391:5:391:5 | [post] h [element] : | semantics.rb:394:10:394:10 | h [element] : | -| semantics.rb:391:5:391:5 | [post] h [element] : | semantics.rb:395:10:395:10 | h [element] : | -| semantics.rb:391:5:391:5 | [post] h [element] : | semantics.rb:395:10:395:10 | h [element] : | -| semantics.rb:391:12:391:22 | call to source : | semantics.rb:391:5:391:5 | [post] h [element] : | -| semantics.rb:391:12:391:22 | call to source : | semantics.rb:391:5:391:5 | [post] h [element] : | -| semantics.rb:393:10:393:10 | h [element 0] : | semantics.rb:393:10:393:13 | ...[...] | -| semantics.rb:393:10:393:10 | h [element 0] : | semantics.rb:393:10:393:13 | ...[...] | -| semantics.rb:393:10:393:10 | h [element] : | semantics.rb:393:10:393:13 | ...[...] | -| semantics.rb:393:10:393:10 | h [element] : | semantics.rb:393:10:393:13 | ...[...] | -| semantics.rb:394:10:394:10 | h [element 1] : | semantics.rb:394:10:394:13 | ...[...] | -| semantics.rb:394:10:394:10 | h [element 1] : | semantics.rb:394:10:394:13 | ...[...] | -| semantics.rb:394:10:394:10 | h [element] : | semantics.rb:394:10:394:13 | ...[...] | -| semantics.rb:394:10:394:10 | h [element] : | semantics.rb:394:10:394:13 | ...[...] | -| semantics.rb:395:10:395:10 | h [element 0] : | semantics.rb:395:10:395:13 | ...[...] | -| semantics.rb:395:10:395:10 | h [element 0] : | semantics.rb:395:10:395:13 | ...[...] | -| semantics.rb:395:10:395:10 | h [element 1] : | semantics.rb:395:10:395:13 | ...[...] | -| semantics.rb:395:10:395:10 | h [element 1] : | semantics.rb:395:10:395:13 | ...[...] | -| semantics.rb:395:10:395:10 | h [element] : | semantics.rb:395:10:395:13 | ...[...] | -| semantics.rb:395:10:395:10 | h [element] : | semantics.rb:395:10:395:13 | ...[...] | -| semantics.rb:397:5:397:5 | x [element 1] : | semantics.rb:400:10:400:10 | x [element 1] : | -| semantics.rb:397:5:397:5 | x [element 1] : | semantics.rb:400:10:400:10 | x [element 1] : | -| semantics.rb:397:5:397:5 | x [element 1] : | semantics.rb:401:10:401:10 | x [element 1] : | -| semantics.rb:397:5:397:5 | x [element 1] : | semantics.rb:401:10:401:10 | x [element 1] : | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:397:5:397:5 | x [element 1] : | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:397:5:397:5 | x [element 1] : | -| semantics.rb:397:13:397:13 | h [element 1] : | semantics.rb:397:9:397:14 | call to s46 [element 1] : | -| semantics.rb:397:13:397:13 | h [element 1] : | semantics.rb:397:9:397:14 | call to s46 [element 1] : | -| semantics.rb:400:10:400:10 | x [element 1] : | semantics.rb:400:10:400:13 | ...[...] | -| semantics.rb:400:10:400:10 | x [element 1] : | semantics.rb:400:10:400:13 | ...[...] | -| semantics.rb:401:10:401:10 | x [element 1] : | semantics.rb:401:10:401:13 | ...[...] | -| semantics.rb:401:10:401:10 | x [element 1] : | semantics.rb:401:10:401:13 | ...[...] | -| semantics.rb:405:5:405:5 | [post] h [element :foo] : | semantics.rb:406:5:406:5 | h [element :foo] : | -| semantics.rb:405:5:405:5 | [post] h [element :foo] : | semantics.rb:406:5:406:5 | h [element :foo] : | -| semantics.rb:405:15:405:25 | call to source : | semantics.rb:405:5:405:5 | [post] h [element :foo] : | -| semantics.rb:405:15:405:25 | call to source : | semantics.rb:405:5:405:5 | [post] h [element :foo] : | -| semantics.rb:406:5:406:5 | [post] h [element :bar] : | semantics.rb:410:10:410:10 | h [element :bar] : | -| semantics.rb:406:5:406:5 | [post] h [element :bar] : | semantics.rb:410:10:410:10 | h [element :bar] : | -| semantics.rb:406:5:406:5 | [post] h [element :bar] : | semantics.rb:412:13:412:13 | h [element :bar] : | -| semantics.rb:406:5:406:5 | [post] h [element :bar] : | semantics.rb:412:13:412:13 | h [element :bar] : | -| semantics.rb:406:5:406:5 | [post] h [element :foo] : | semantics.rb:409:10:409:10 | h [element :foo] : | -| semantics.rb:406:5:406:5 | [post] h [element :foo] : | semantics.rb:409:10:409:10 | h [element :foo] : | -| semantics.rb:406:5:406:5 | h [element :foo] : | semantics.rb:406:5:406:5 | [post] h [element :foo] : | -| semantics.rb:406:5:406:5 | h [element :foo] : | semantics.rb:406:5:406:5 | [post] h [element :foo] : | -| semantics.rb:406:15:406:25 | call to source : | semantics.rb:406:5:406:5 | [post] h [element :bar] : | -| semantics.rb:406:15:406:25 | call to source : | semantics.rb:406:5:406:5 | [post] h [element :bar] : | -| semantics.rb:407:5:407:5 | [post] h [element] : | semantics.rb:409:10:409:10 | h [element] : | -| semantics.rb:407:5:407:5 | [post] h [element] : | semantics.rb:409:10:409:10 | h [element] : | -| semantics.rb:407:5:407:5 | [post] h [element] : | semantics.rb:410:10:410:10 | h [element] : | -| semantics.rb:407:5:407:5 | [post] h [element] : | semantics.rb:410:10:410:10 | h [element] : | -| semantics.rb:407:12:407:22 | call to source : | semantics.rb:407:5:407:5 | [post] h [element] : | -| semantics.rb:407:12:407:22 | call to source : | semantics.rb:407:5:407:5 | [post] h [element] : | -| semantics.rb:409:10:409:10 | h [element :foo] : | semantics.rb:409:10:409:16 | ...[...] | -| semantics.rb:409:10:409:10 | h [element :foo] : | semantics.rb:409:10:409:16 | ...[...] | -| semantics.rb:409:10:409:10 | h [element] : | semantics.rb:409:10:409:16 | ...[...] | -| semantics.rb:409:10:409:10 | h [element] : | semantics.rb:409:10:409:16 | ...[...] | -| semantics.rb:410:10:410:10 | h [element :bar] : | semantics.rb:410:10:410:16 | ...[...] | -| semantics.rb:410:10:410:10 | h [element :bar] : | semantics.rb:410:10:410:16 | ...[...] | -| semantics.rb:410:10:410:10 | h [element] : | semantics.rb:410:10:410:16 | ...[...] | -| semantics.rb:410:10:410:10 | h [element] : | semantics.rb:410:10:410:16 | ...[...] | -| semantics.rb:412:5:412:5 | x [element :bar] : | semantics.rb:415:10:415:10 | x [element :bar] : | -| semantics.rb:412:5:412:5 | x [element :bar] : | semantics.rb:415:10:415:10 | x [element :bar] : | -| semantics.rb:412:9:412:14 | call to s47 [element :bar] : | semantics.rb:412:5:412:5 | x [element :bar] : | -| semantics.rb:412:9:412:14 | call to s47 [element :bar] : | semantics.rb:412:5:412:5 | x [element :bar] : | -| semantics.rb:412:13:412:13 | h [element :bar] : | semantics.rb:412:9:412:14 | call to s47 [element :bar] : | -| semantics.rb:412:13:412:13 | h [element :bar] : | semantics.rb:412:9:412:14 | call to s47 [element :bar] : | -| semantics.rb:415:10:415:10 | x [element :bar] : | semantics.rb:415:10:415:16 | ...[...] | -| semantics.rb:415:10:415:10 | x [element :bar] : | semantics.rb:415:10:415:16 | ...[...] | -| semantics.rb:419:5:419:5 | [post] h [element :foo] : | semantics.rb:420:5:420:5 | h [element :foo] : | -| semantics.rb:419:5:419:5 | [post] h [element :foo] : | semantics.rb:420:5:420:5 | h [element :foo] : | -| semantics.rb:419:15:419:25 | call to source : | semantics.rb:419:5:419:5 | [post] h [element :foo] : | -| semantics.rb:419:15:419:25 | call to source : | semantics.rb:419:5:419:5 | [post] h [element :foo] : | -| semantics.rb:420:5:420:5 | [post] h [element :bar] : | semantics.rb:424:10:424:10 | h [element :bar] : | -| semantics.rb:420:5:420:5 | [post] h [element :bar] : | semantics.rb:424:10:424:10 | h [element :bar] : | -| semantics.rb:420:5:420:5 | [post] h [element :bar] : | semantics.rb:426:13:426:13 | h [element :bar] : | -| semantics.rb:420:5:420:5 | [post] h [element :bar] : | semantics.rb:426:13:426:13 | h [element :bar] : | -| semantics.rb:420:5:420:5 | [post] h [element :foo] : | semantics.rb:423:10:423:10 | h [element :foo] : | -| semantics.rb:420:5:420:5 | [post] h [element :foo] : | semantics.rb:423:10:423:10 | h [element :foo] : | -| semantics.rb:420:5:420:5 | h [element :foo] : | semantics.rb:420:5:420:5 | [post] h [element :foo] : | -| semantics.rb:420:5:420:5 | h [element :foo] : | semantics.rb:420:5:420:5 | [post] h [element :foo] : | -| semantics.rb:420:15:420:25 | call to source : | semantics.rb:420:5:420:5 | [post] h [element :bar] : | -| semantics.rb:420:15:420:25 | call to source : | semantics.rb:420:5:420:5 | [post] h [element :bar] : | -| semantics.rb:421:5:421:5 | [post] h [element] : | semantics.rb:423:10:423:10 | h [element] : | -| semantics.rb:421:5:421:5 | [post] h [element] : | semantics.rb:423:10:423:10 | h [element] : | -| semantics.rb:421:5:421:5 | [post] h [element] : | semantics.rb:424:10:424:10 | h [element] : | -| semantics.rb:421:5:421:5 | [post] h [element] : | semantics.rb:424:10:424:10 | h [element] : | -| semantics.rb:421:12:421:22 | call to source : | semantics.rb:421:5:421:5 | [post] h [element] : | -| semantics.rb:421:12:421:22 | call to source : | semantics.rb:421:5:421:5 | [post] h [element] : | -| semantics.rb:423:10:423:10 | h [element :foo] : | semantics.rb:423:10:423:16 | ...[...] | -| semantics.rb:423:10:423:10 | h [element :foo] : | semantics.rb:423:10:423:16 | ...[...] | -| semantics.rb:423:10:423:10 | h [element] : | semantics.rb:423:10:423:16 | ...[...] | -| semantics.rb:423:10:423:10 | h [element] : | semantics.rb:423:10:423:16 | ...[...] | -| semantics.rb:424:10:424:10 | h [element :bar] : | semantics.rb:424:10:424:16 | ...[...] | -| semantics.rb:424:10:424:10 | h [element :bar] : | semantics.rb:424:10:424:16 | ...[...] | -| semantics.rb:424:10:424:10 | h [element] : | semantics.rb:424:10:424:16 | ...[...] | -| semantics.rb:424:10:424:10 | h [element] : | semantics.rb:424:10:424:16 | ...[...] | -| semantics.rb:426:5:426:5 | x [element :bar] : | semantics.rb:429:10:429:10 | x [element :bar] : | -| semantics.rb:426:5:426:5 | x [element :bar] : | semantics.rb:429:10:429:10 | x [element :bar] : | -| semantics.rb:426:9:426:14 | call to s48 [element :bar] : | semantics.rb:426:5:426:5 | x [element :bar] : | -| semantics.rb:426:9:426:14 | call to s48 [element :bar] : | semantics.rb:426:5:426:5 | x [element :bar] : | -| semantics.rb:426:13:426:13 | h [element :bar] : | semantics.rb:426:9:426:14 | call to s48 [element :bar] : | -| semantics.rb:426:13:426:13 | h [element :bar] : | semantics.rb:426:9:426:14 | call to s48 [element :bar] : | -| semantics.rb:429:10:429:10 | x [element :bar] : | semantics.rb:429:10:429:16 | ...[...] | -| semantics.rb:429:10:429:10 | x [element :bar] : | semantics.rb:429:10:429:16 | ...[...] | -| semantics.rb:433:5:433:5 | [post] h [element :foo] : | semantics.rb:434:5:434:5 | h [element :foo] : | -| semantics.rb:433:5:433:5 | [post] h [element :foo] : | semantics.rb:434:5:434:5 | h [element :foo] : | -| semantics.rb:433:15:433:25 | call to source : | semantics.rb:433:5:433:5 | [post] h [element :foo] : | -| semantics.rb:433:15:433:25 | call to source : | semantics.rb:433:5:433:5 | [post] h [element :foo] : | -| semantics.rb:434:5:434:5 | [post] h [element :bar] : | semantics.rb:438:10:438:10 | h [element :bar] : | -| semantics.rb:434:5:434:5 | [post] h [element :bar] : | semantics.rb:438:10:438:10 | h [element :bar] : | -| semantics.rb:434:5:434:5 | [post] h [element :bar] : | semantics.rb:440:13:440:13 | h [element :bar] : | -| semantics.rb:434:5:434:5 | [post] h [element :bar] : | semantics.rb:440:13:440:13 | h [element :bar] : | -| semantics.rb:434:5:434:5 | [post] h [element :foo] : | semantics.rb:437:10:437:10 | h [element :foo] : | -| semantics.rb:434:5:434:5 | [post] h [element :foo] : | semantics.rb:437:10:437:10 | h [element :foo] : | -| semantics.rb:434:5:434:5 | h [element :foo] : | semantics.rb:434:5:434:5 | [post] h [element :foo] : | -| semantics.rb:434:5:434:5 | h [element :foo] : | semantics.rb:434:5:434:5 | [post] h [element :foo] : | -| semantics.rb:434:15:434:25 | call to source : | semantics.rb:434:5:434:5 | [post] h [element :bar] : | -| semantics.rb:434:15:434:25 | call to source : | semantics.rb:434:5:434:5 | [post] h [element :bar] : | -| semantics.rb:435:5:435:5 | [post] h [element] : | semantics.rb:437:10:437:10 | h [element] : | -| semantics.rb:435:5:435:5 | [post] h [element] : | semantics.rb:437:10:437:10 | h [element] : | -| semantics.rb:435:5:435:5 | [post] h [element] : | semantics.rb:438:10:438:10 | h [element] : | -| semantics.rb:435:5:435:5 | [post] h [element] : | semantics.rb:438:10:438:10 | h [element] : | -| semantics.rb:435:5:435:5 | [post] h [element] : | semantics.rb:440:13:440:13 | h [element] : | -| semantics.rb:435:5:435:5 | [post] h [element] : | semantics.rb:440:13:440:13 | h [element] : | -| semantics.rb:435:12:435:22 | call to source : | semantics.rb:435:5:435:5 | [post] h [element] : | -| semantics.rb:435:12:435:22 | call to source : | semantics.rb:435:5:435:5 | [post] h [element] : | -| semantics.rb:437:10:437:10 | h [element :foo] : | semantics.rb:437:10:437:16 | ...[...] | -| semantics.rb:437:10:437:10 | h [element :foo] : | semantics.rb:437:10:437:16 | ...[...] | -| semantics.rb:437:10:437:10 | h [element] : | semantics.rb:437:10:437:16 | ...[...] | -| semantics.rb:437:10:437:10 | h [element] : | semantics.rb:437:10:437:16 | ...[...] | -| semantics.rb:438:10:438:10 | h [element :bar] : | semantics.rb:438:10:438:16 | ...[...] | -| semantics.rb:438:10:438:10 | h [element :bar] : | semantics.rb:438:10:438:16 | ...[...] | -| semantics.rb:438:10:438:10 | h [element] : | semantics.rb:438:10:438:16 | ...[...] | -| semantics.rb:438:10:438:10 | h [element] : | semantics.rb:438:10:438:16 | ...[...] | -| semantics.rb:440:5:440:5 | x [element :bar] : | semantics.rb:443:10:443:10 | x [element :bar] : | -| semantics.rb:440:5:440:5 | x [element :bar] : | semantics.rb:443:10:443:10 | x [element :bar] : | -| semantics.rb:440:5:440:5 | x [element] : | semantics.rb:442:10:442:10 | x [element] : | -| semantics.rb:440:5:440:5 | x [element] : | semantics.rb:442:10:442:10 | x [element] : | -| semantics.rb:440:5:440:5 | x [element] : | semantics.rb:443:10:443:10 | x [element] : | -| semantics.rb:440:5:440:5 | x [element] : | semantics.rb:443:10:443:10 | x [element] : | -| semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semantics.rb:440:5:440:5 | x [element :bar] : | -| semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semantics.rb:440:5:440:5 | x [element :bar] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:440:5:440:5 | x [element] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:440:5:440:5 | x [element] : | -| semantics.rb:440:13:440:13 | h [element :bar] : | semantics.rb:440:9:440:14 | call to s49 [element :bar] : | -| semantics.rb:440:13:440:13 | h [element :bar] : | semantics.rb:440:9:440:14 | call to s49 [element :bar] : | -| semantics.rb:440:13:440:13 | h [element] : | semantics.rb:440:9:440:14 | call to s49 [element] : | -| semantics.rb:440:13:440:13 | h [element] : | semantics.rb:440:9:440:14 | call to s49 [element] : | -| semantics.rb:442:10:442:10 | x [element] : | semantics.rb:442:10:442:16 | ...[...] | -| semantics.rb:442:10:442:10 | x [element] : | semantics.rb:442:10:442:16 | ...[...] | -| semantics.rb:443:10:443:10 | x [element :bar] : | semantics.rb:443:10:443:16 | ...[...] | -| semantics.rb:443:10:443:10 | x [element :bar] : | semantics.rb:443:10:443:16 | ...[...] | -| semantics.rb:443:10:443:10 | x [element] : | semantics.rb:443:10:443:16 | ...[...] | -| semantics.rb:443:10:443:10 | x [element] : | semantics.rb:443:10:443:16 | ...[...] | -| semantics.rb:447:5:447:5 | [post] h [element :foo] : | semantics.rb:448:5:448:5 | h [element :foo] : | -| semantics.rb:447:5:447:5 | [post] h [element :foo] : | semantics.rb:448:5:448:5 | h [element :foo] : | -| semantics.rb:447:15:447:25 | call to source : | semantics.rb:447:5:447:5 | [post] h [element :foo] : | -| semantics.rb:447:15:447:25 | call to source : | semantics.rb:447:5:447:5 | [post] h [element :foo] : | -| semantics.rb:448:5:448:5 | [post] h [element :bar] : | semantics.rb:452:10:452:10 | h [element :bar] : | -| semantics.rb:448:5:448:5 | [post] h [element :bar] : | semantics.rb:452:10:452:10 | h [element :bar] : | -| semantics.rb:448:5:448:5 | [post] h [element :bar] : | semantics.rb:454:9:454:9 | h [element :bar] : | -| semantics.rb:448:5:448:5 | [post] h [element :bar] : | semantics.rb:454:9:454:9 | h [element :bar] : | -| semantics.rb:448:5:448:5 | [post] h [element :foo] : | semantics.rb:451:10:451:10 | h [element :foo] : | -| semantics.rb:448:5:448:5 | [post] h [element :foo] : | semantics.rb:451:10:451:10 | h [element :foo] : | -| semantics.rb:448:5:448:5 | h [element :foo] : | semantics.rb:448:5:448:5 | [post] h [element :foo] : | -| semantics.rb:448:5:448:5 | h [element :foo] : | semantics.rb:448:5:448:5 | [post] h [element :foo] : | -| semantics.rb:448:15:448:25 | call to source : | semantics.rb:448:5:448:5 | [post] h [element :bar] : | -| semantics.rb:448:15:448:25 | call to source : | semantics.rb:448:5:448:5 | [post] h [element :bar] : | -| semantics.rb:449:5:449:5 | [post] h [element] : | semantics.rb:451:10:451:10 | h [element] : | -| semantics.rb:449:5:449:5 | [post] h [element] : | semantics.rb:451:10:451:10 | h [element] : | -| semantics.rb:449:5:449:5 | [post] h [element] : | semantics.rb:452:10:452:10 | h [element] : | -| semantics.rb:449:5:449:5 | [post] h [element] : | semantics.rb:452:10:452:10 | h [element] : | -| semantics.rb:449:12:449:22 | call to source : | semantics.rb:449:5:449:5 | [post] h [element] : | -| semantics.rb:449:12:449:22 | call to source : | semantics.rb:449:5:449:5 | [post] h [element] : | -| semantics.rb:451:10:451:10 | h [element :foo] : | semantics.rb:451:10:451:16 | ...[...] | -| semantics.rb:451:10:451:10 | h [element :foo] : | semantics.rb:451:10:451:16 | ...[...] | -| semantics.rb:451:10:451:10 | h [element] : | semantics.rb:451:10:451:16 | ...[...] | -| semantics.rb:451:10:451:10 | h [element] : | semantics.rb:451:10:451:16 | ...[...] | -| semantics.rb:452:10:452:10 | h [element :bar] : | semantics.rb:452:10:452:16 | ...[...] | -| semantics.rb:452:10:452:10 | h [element :bar] : | semantics.rb:452:10:452:16 | ...[...] | -| semantics.rb:452:10:452:10 | h [element] : | semantics.rb:452:10:452:16 | ...[...] | -| semantics.rb:452:10:452:10 | h [element] : | semantics.rb:452:10:452:16 | ...[...] | -| semantics.rb:454:9:454:9 | [post] h [element :bar] : | semantics.rb:457:10:457:10 | h [element :bar] : | -| semantics.rb:454:9:454:9 | [post] h [element :bar] : | semantics.rb:457:10:457:10 | h [element :bar] : | -| semantics.rb:454:9:454:9 | h [element :bar] : | semantics.rb:454:9:454:9 | [post] h [element :bar] : | -| semantics.rb:454:9:454:9 | h [element :bar] : | semantics.rb:454:9:454:9 | [post] h [element :bar] : | -| semantics.rb:457:10:457:10 | h [element :bar] : | semantics.rb:457:10:457:16 | ...[...] | -| semantics.rb:457:10:457:10 | h [element :bar] : | semantics.rb:457:10:457:16 | ...[...] | -| semantics.rb:461:5:461:5 | [post] h [element :foo] : | semantics.rb:462:5:462:5 | h [element :foo] : | -| semantics.rb:461:5:461:5 | [post] h [element :foo] : | semantics.rb:462:5:462:5 | h [element :foo] : | -| semantics.rb:461:15:461:25 | call to source : | semantics.rb:461:5:461:5 | [post] h [element :foo] : | -| semantics.rb:461:15:461:25 | call to source : | semantics.rb:461:5:461:5 | [post] h [element :foo] : | -| semantics.rb:462:5:462:5 | [post] h [element :bar] : | semantics.rb:466:10:466:10 | h [element :bar] : | -| semantics.rb:462:5:462:5 | [post] h [element :bar] : | semantics.rb:466:10:466:10 | h [element :bar] : | -| semantics.rb:462:5:462:5 | [post] h [element :bar] : | semantics.rb:468:9:468:9 | h [element :bar] : | -| semantics.rb:462:5:462:5 | [post] h [element :bar] : | semantics.rb:468:9:468:9 | h [element :bar] : | -| semantics.rb:462:5:462:5 | [post] h [element :foo] : | semantics.rb:465:10:465:10 | h [element :foo] : | -| semantics.rb:462:5:462:5 | [post] h [element :foo] : | semantics.rb:465:10:465:10 | h [element :foo] : | -| semantics.rb:462:5:462:5 | h [element :foo] : | semantics.rb:462:5:462:5 | [post] h [element :foo] : | -| semantics.rb:462:5:462:5 | h [element :foo] : | semantics.rb:462:5:462:5 | [post] h [element :foo] : | -| semantics.rb:462:15:462:25 | call to source : | semantics.rb:462:5:462:5 | [post] h [element :bar] : | -| semantics.rb:462:15:462:25 | call to source : | semantics.rb:462:5:462:5 | [post] h [element :bar] : | -| semantics.rb:463:5:463:5 | [post] h [element] : | semantics.rb:465:10:465:10 | h [element] : | -| semantics.rb:463:5:463:5 | [post] h [element] : | semantics.rb:465:10:465:10 | h [element] : | -| semantics.rb:463:5:463:5 | [post] h [element] : | semantics.rb:466:10:466:10 | h [element] : | -| semantics.rb:463:5:463:5 | [post] h [element] : | semantics.rb:466:10:466:10 | h [element] : | -| semantics.rb:463:5:463:5 | [post] h [element] : | semantics.rb:468:9:468:9 | h [element] : | -| semantics.rb:463:5:463:5 | [post] h [element] : | semantics.rb:468:9:468:9 | h [element] : | -| semantics.rb:463:12:463:22 | call to source : | semantics.rb:463:5:463:5 | [post] h [element] : | -| semantics.rb:463:12:463:22 | call to source : | semantics.rb:463:5:463:5 | [post] h [element] : | -| semantics.rb:465:10:465:10 | h [element :foo] : | semantics.rb:465:10:465:16 | ...[...] | -| semantics.rb:465:10:465:10 | h [element :foo] : | semantics.rb:465:10:465:16 | ...[...] | -| semantics.rb:465:10:465:10 | h [element] : | semantics.rb:465:10:465:16 | ...[...] | -| semantics.rb:465:10:465:10 | h [element] : | semantics.rb:465:10:465:16 | ...[...] | -| semantics.rb:466:10:466:10 | h [element :bar] : | semantics.rb:466:10:466:16 | ...[...] | -| semantics.rb:466:10:466:10 | h [element :bar] : | semantics.rb:466:10:466:16 | ...[...] | -| semantics.rb:466:10:466:10 | h [element] : | semantics.rb:466:10:466:16 | ...[...] | -| semantics.rb:466:10:466:10 | h [element] : | semantics.rb:466:10:466:16 | ...[...] | -| semantics.rb:468:9:468:9 | [post] h [element :bar] : | semantics.rb:471:10:471:10 | h [element :bar] : | -| semantics.rb:468:9:468:9 | [post] h [element :bar] : | semantics.rb:471:10:471:10 | h [element :bar] : | -| semantics.rb:468:9:468:9 | [post] h [element] : | semantics.rb:470:10:470:10 | h [element] : | -| semantics.rb:468:9:468:9 | [post] h [element] : | semantics.rb:470:10:470:10 | h [element] : | -| semantics.rb:468:9:468:9 | [post] h [element] : | semantics.rb:471:10:471:10 | h [element] : | -| semantics.rb:468:9:468:9 | [post] h [element] : | semantics.rb:471:10:471:10 | h [element] : | -| semantics.rb:468:9:468:9 | h [element :bar] : | semantics.rb:468:9:468:9 | [post] h [element :bar] : | -| semantics.rb:468:9:468:9 | h [element :bar] : | semantics.rb:468:9:468:9 | [post] h [element :bar] : | -| semantics.rb:468:9:468:9 | h [element] : | semantics.rb:468:9:468:9 | [post] h [element] : | -| semantics.rb:468:9:468:9 | h [element] : | semantics.rb:468:9:468:9 | [post] h [element] : | -| semantics.rb:470:10:470:10 | h [element] : | semantics.rb:470:10:470:16 | ...[...] | -| semantics.rb:470:10:470:10 | h [element] : | semantics.rb:470:10:470:16 | ...[...] | -| semantics.rb:471:10:471:10 | h [element :bar] : | semantics.rb:471:10:471:16 | ...[...] | -| semantics.rb:471:10:471:10 | h [element :bar] : | semantics.rb:471:10:471:16 | ...[...] | -| semantics.rb:471:10:471:10 | h [element] : | semantics.rb:471:10:471:16 | ...[...] | -| semantics.rb:471:10:471:10 | h [element] : | semantics.rb:471:10:471:16 | ...[...] | -| semantics.rb:475:5:475:5 | [post] h [element :foo] : | semantics.rb:476:5:476:5 | h [element :foo] : | -| semantics.rb:475:5:475:5 | [post] h [element :foo] : | semantics.rb:476:5:476:5 | h [element :foo] : | -| semantics.rb:475:15:475:25 | call to source : | semantics.rb:475:5:475:5 | [post] h [element :foo] : | -| semantics.rb:475:15:475:25 | call to source : | semantics.rb:475:5:475:5 | [post] h [element :foo] : | -| semantics.rb:476:5:476:5 | [post] h [element :bar] : | semantics.rb:480:10:480:10 | h [element :bar] : | -| semantics.rb:476:5:476:5 | [post] h [element :bar] : | semantics.rb:480:10:480:10 | h [element :bar] : | -| semantics.rb:476:5:476:5 | [post] h [element :bar] : | semantics.rb:482:5:482:5 | h [element :bar] : | -| semantics.rb:476:5:476:5 | [post] h [element :bar] : | semantics.rb:482:5:482:5 | h [element :bar] : | -| semantics.rb:476:5:476:5 | [post] h [element :foo] : | semantics.rb:479:10:479:10 | h [element :foo] : | -| semantics.rb:476:5:476:5 | [post] h [element :foo] : | semantics.rb:479:10:479:10 | h [element :foo] : | -| semantics.rb:476:5:476:5 | h [element :foo] : | semantics.rb:476:5:476:5 | [post] h [element :foo] : | -| semantics.rb:476:5:476:5 | h [element :foo] : | semantics.rb:476:5:476:5 | [post] h [element :foo] : | -| semantics.rb:476:15:476:25 | call to source : | semantics.rb:476:5:476:5 | [post] h [element :bar] : | -| semantics.rb:476:15:476:25 | call to source : | semantics.rb:476:5:476:5 | [post] h [element :bar] : | -| semantics.rb:477:5:477:5 | [post] h [element] : | semantics.rb:479:10:479:10 | h [element] : | -| semantics.rb:477:5:477:5 | [post] h [element] : | semantics.rb:479:10:479:10 | h [element] : | -| semantics.rb:477:5:477:5 | [post] h [element] : | semantics.rb:480:10:480:10 | h [element] : | -| semantics.rb:477:5:477:5 | [post] h [element] : | semantics.rb:480:10:480:10 | h [element] : | -| semantics.rb:477:12:477:22 | call to source : | semantics.rb:477:5:477:5 | [post] h [element] : | -| semantics.rb:477:12:477:22 | call to source : | semantics.rb:477:5:477:5 | [post] h [element] : | -| semantics.rb:479:10:479:10 | h [element :foo] : | semantics.rb:479:10:479:16 | ...[...] | -| semantics.rb:479:10:479:10 | h [element :foo] : | semantics.rb:479:10:479:16 | ...[...] | -| semantics.rb:479:10:479:10 | h [element] : | semantics.rb:479:10:479:16 | ...[...] | -| semantics.rb:479:10:479:10 | h [element] : | semantics.rb:479:10:479:16 | ...[...] | -| semantics.rb:480:10:480:10 | h [element :bar] : | semantics.rb:480:10:480:16 | ...[...] | -| semantics.rb:480:10:480:10 | h [element :bar] : | semantics.rb:480:10:480:16 | ...[...] | -| semantics.rb:480:10:480:10 | h [element] : | semantics.rb:480:10:480:16 | ...[...] | -| semantics.rb:480:10:480:10 | h [element] : | semantics.rb:480:10:480:16 | ...[...] | -| semantics.rb:482:5:482:5 | [post] h [element :bar] : | semantics.rb:485:10:485:10 | h [element :bar] : | -| semantics.rb:482:5:482:5 | [post] h [element :bar] : | semantics.rb:485:10:485:10 | h [element :bar] : | -| semantics.rb:482:5:482:5 | h [element :bar] : | semantics.rb:482:5:482:5 | [post] h [element :bar] : | -| semantics.rb:482:5:482:5 | h [element :bar] : | semantics.rb:482:5:482:5 | [post] h [element :bar] : | -| semantics.rb:485:10:485:10 | h [element :bar] : | semantics.rb:485:10:485:16 | ...[...] | -| semantics.rb:485:10:485:10 | h [element :bar] : | semantics.rb:485:10:485:16 | ...[...] | -| semantics.rb:489:5:489:5 | [post] h [element :foo] : | semantics.rb:490:5:490:5 | h [element :foo] : | -| semantics.rb:489:5:489:5 | [post] h [element :foo] : | semantics.rb:490:5:490:5 | h [element :foo] : | -| semantics.rb:489:15:489:25 | call to source : | semantics.rb:489:5:489:5 | [post] h [element :foo] : | -| semantics.rb:489:15:489:25 | call to source : | semantics.rb:489:5:489:5 | [post] h [element :foo] : | -| semantics.rb:490:5:490:5 | [post] h [element :bar] : | semantics.rb:494:10:494:10 | h [element :bar] : | -| semantics.rb:490:5:490:5 | [post] h [element :bar] : | semantics.rb:494:10:494:10 | h [element :bar] : | -| semantics.rb:490:5:490:5 | [post] h [element :bar] : | semantics.rb:496:9:496:9 | h [element :bar] : | -| semantics.rb:490:5:490:5 | [post] h [element :bar] : | semantics.rb:496:9:496:9 | h [element :bar] : | -| semantics.rb:490:5:490:5 | [post] h [element :foo] : | semantics.rb:493:10:493:10 | h [element :foo] : | -| semantics.rb:490:5:490:5 | [post] h [element :foo] : | semantics.rb:493:10:493:10 | h [element :foo] : | -| semantics.rb:490:5:490:5 | h [element :foo] : | semantics.rb:490:5:490:5 | [post] h [element :foo] : | -| semantics.rb:490:5:490:5 | h [element :foo] : | semantics.rb:490:5:490:5 | [post] h [element :foo] : | -| semantics.rb:490:15:490:25 | call to source : | semantics.rb:490:5:490:5 | [post] h [element :bar] : | -| semantics.rb:490:15:490:25 | call to source : | semantics.rb:490:5:490:5 | [post] h [element :bar] : | -| semantics.rb:491:5:491:5 | [post] h [element] : | semantics.rb:493:10:493:10 | h [element] : | -| semantics.rb:491:5:491:5 | [post] h [element] : | semantics.rb:493:10:493:10 | h [element] : | -| semantics.rb:491:5:491:5 | [post] h [element] : | semantics.rb:494:10:494:10 | h [element] : | -| semantics.rb:491:5:491:5 | [post] h [element] : | semantics.rb:494:10:494:10 | h [element] : | -| semantics.rb:491:12:491:22 | call to source : | semantics.rb:491:5:491:5 | [post] h [element] : | -| semantics.rb:491:12:491:22 | call to source : | semantics.rb:491:5:491:5 | [post] h [element] : | -| semantics.rb:493:10:493:10 | h [element :foo] : | semantics.rb:493:10:493:16 | ...[...] | -| semantics.rb:493:10:493:10 | h [element :foo] : | semantics.rb:493:10:493:16 | ...[...] | -| semantics.rb:493:10:493:10 | h [element] : | semantics.rb:493:10:493:16 | ...[...] | -| semantics.rb:493:10:493:10 | h [element] : | semantics.rb:493:10:493:16 | ...[...] | -| semantics.rb:494:10:494:10 | h [element :bar] : | semantics.rb:494:10:494:16 | ...[...] | -| semantics.rb:494:10:494:10 | h [element :bar] : | semantics.rb:494:10:494:16 | ...[...] | -| semantics.rb:494:10:494:10 | h [element] : | semantics.rb:494:10:494:16 | ...[...] | -| semantics.rb:494:10:494:10 | h [element] : | semantics.rb:494:10:494:16 | ...[...] | -| semantics.rb:496:5:496:5 | x [element :bar] : | semantics.rb:499:10:499:10 | x [element :bar] : | -| semantics.rb:496:5:496:5 | x [element :bar] : | semantics.rb:499:10:499:10 | x [element :bar] : | -| semantics.rb:496:9:496:9 | h [element :bar] : | semantics.rb:496:9:496:15 | call to s53 [element :bar] : | -| semantics.rb:496:9:496:9 | h [element :bar] : | semantics.rb:496:9:496:15 | call to s53 [element :bar] : | -| semantics.rb:496:9:496:15 | call to s53 [element :bar] : | semantics.rb:496:5:496:5 | x [element :bar] : | -| semantics.rb:496:9:496:15 | call to s53 [element :bar] : | semantics.rb:496:5:496:5 | x [element :bar] : | -| semantics.rb:499:10:499:10 | x [element :bar] : | semantics.rb:499:10:499:16 | ...[...] | -| semantics.rb:499:10:499:10 | x [element :bar] : | semantics.rb:499:10:499:16 | ...[...] | -| semantics.rb:501:10:501:20 | call to source : | semantics.rb:501:10:501:26 | call to s53 | -| semantics.rb:501:10:501:20 | call to source : | semantics.rb:501:10:501:26 | call to s53 | -| semantics.rb:505:5:505:5 | [post] h [element :foo] : | semantics.rb:506:5:506:5 | h [element :foo] : | -| semantics.rb:505:5:505:5 | [post] h [element :foo] : | semantics.rb:506:5:506:5 | h [element :foo] : | -| semantics.rb:505:15:505:25 | call to source : | semantics.rb:505:5:505:5 | [post] h [element :foo] : | -| semantics.rb:505:15:505:25 | call to source : | semantics.rb:505:5:505:5 | [post] h [element :foo] : | -| semantics.rb:506:5:506:5 | [post] h [element :bar] : | semantics.rb:510:10:510:10 | h [element :bar] : | -| semantics.rb:506:5:506:5 | [post] h [element :bar] : | semantics.rb:510:10:510:10 | h [element :bar] : | -| semantics.rb:506:5:506:5 | [post] h [element :bar] : | semantics.rb:512:9:512:9 | h [element :bar] : | -| semantics.rb:506:5:506:5 | [post] h [element :bar] : | semantics.rb:512:9:512:9 | h [element :bar] : | -| semantics.rb:506:5:506:5 | [post] h [element :foo] : | semantics.rb:509:10:509:10 | h [element :foo] : | -| semantics.rb:506:5:506:5 | [post] h [element :foo] : | semantics.rb:509:10:509:10 | h [element :foo] : | -| semantics.rb:506:5:506:5 | h [element :foo] : | semantics.rb:506:5:506:5 | [post] h [element :foo] : | -| semantics.rb:506:5:506:5 | h [element :foo] : | semantics.rb:506:5:506:5 | [post] h [element :foo] : | -| semantics.rb:506:15:506:25 | call to source : | semantics.rb:506:5:506:5 | [post] h [element :bar] : | -| semantics.rb:506:15:506:25 | call to source : | semantics.rb:506:5:506:5 | [post] h [element :bar] : | -| semantics.rb:507:5:507:5 | [post] h [element] : | semantics.rb:509:10:509:10 | h [element] : | -| semantics.rb:507:5:507:5 | [post] h [element] : | semantics.rb:509:10:509:10 | h [element] : | -| semantics.rb:507:5:507:5 | [post] h [element] : | semantics.rb:510:10:510:10 | h [element] : | -| semantics.rb:507:5:507:5 | [post] h [element] : | semantics.rb:510:10:510:10 | h [element] : | -| semantics.rb:507:12:507:22 | call to source : | semantics.rb:507:5:507:5 | [post] h [element] : | -| semantics.rb:507:12:507:22 | call to source : | semantics.rb:507:5:507:5 | [post] h [element] : | -| semantics.rb:509:10:509:10 | h [element :foo] : | semantics.rb:509:10:509:16 | ...[...] | -| semantics.rb:509:10:509:10 | h [element :foo] : | semantics.rb:509:10:509:16 | ...[...] | -| semantics.rb:509:10:509:10 | h [element] : | semantics.rb:509:10:509:16 | ...[...] | -| semantics.rb:509:10:509:10 | h [element] : | semantics.rb:509:10:509:16 | ...[...] | -| semantics.rb:510:10:510:10 | h [element :bar] : | semantics.rb:510:10:510:16 | ...[...] | -| semantics.rb:510:10:510:10 | h [element :bar] : | semantics.rb:510:10:510:16 | ...[...] | -| semantics.rb:510:10:510:10 | h [element] : | semantics.rb:510:10:510:16 | ...[...] | -| semantics.rb:510:10:510:10 | h [element] : | semantics.rb:510:10:510:16 | ...[...] | -| semantics.rb:512:5:512:5 | x [element :bar] : | semantics.rb:515:10:515:10 | x [element :bar] : | -| semantics.rb:512:5:512:5 | x [element :bar] : | semantics.rb:515:10:515:10 | x [element :bar] : | -| semantics.rb:512:9:512:9 | h [element :bar] : | semantics.rb:512:9:512:15 | call to s54 [element :bar] : | -| semantics.rb:512:9:512:9 | h [element :bar] : | semantics.rb:512:9:512:15 | call to s54 [element :bar] : | -| semantics.rb:512:9:512:15 | call to s54 [element :bar] : | semantics.rb:512:5:512:5 | x [element :bar] : | -| semantics.rb:512:9:512:15 | call to s54 [element :bar] : | semantics.rb:512:5:512:5 | x [element :bar] : | -| semantics.rb:515:10:515:10 | x [element :bar] : | semantics.rb:515:10:515:16 | ...[...] | -| semantics.rb:515:10:515:10 | x [element :bar] : | semantics.rb:515:10:515:16 | ...[...] | +| semantics.rb:2:5:2:5 | a | semantics.rb:3:9:3:9 | a | +| semantics.rb:2:5:2:5 | a | semantics.rb:3:9:3:9 | a | +| semantics.rb:2:9:2:18 | call to source | semantics.rb:2:5:2:5 | a | +| semantics.rb:2:9:2:18 | call to source | semantics.rb:2:5:2:5 | a | +| semantics.rb:3:5:3:5 | x | semantics.rb:4:10:4:10 | x | +| semantics.rb:3:5:3:5 | x | semantics.rb:4:10:4:10 | x | +| semantics.rb:3:9:3:9 | a | semantics.rb:3:9:3:14 | call to s1 | +| semantics.rb:3:9:3:9 | a | semantics.rb:3:9:3:14 | call to s1 | +| semantics.rb:3:9:3:14 | call to s1 | semantics.rb:3:5:3:5 | x | +| semantics.rb:3:9:3:14 | call to s1 | semantics.rb:3:5:3:5 | x | +| semantics.rb:8:5:8:5 | a | semantics.rb:9:10:9:10 | a | +| semantics.rb:8:5:8:5 | a | semantics.rb:9:10:9:10 | a | +| semantics.rb:8:9:8:18 | call to source | semantics.rb:8:5:8:5 | a | +| semantics.rb:8:9:8:18 | call to source | semantics.rb:8:5:8:5 | a | +| semantics.rb:9:5:9:5 | [post] x | semantics.rb:10:10:10:10 | x | +| semantics.rb:9:5:9:5 | [post] x | semantics.rb:10:10:10:10 | x | +| semantics.rb:9:10:9:10 | a | semantics.rb:9:5:9:5 | [post] x | +| semantics.rb:9:10:9:10 | a | semantics.rb:9:5:9:5 | [post] x | +| semantics.rb:14:5:14:5 | a | semantics.rb:15:8:15:8 | a | +| semantics.rb:14:5:14:5 | a | semantics.rb:15:8:15:8 | a | +| semantics.rb:14:9:14:18 | call to source | semantics.rb:14:5:14:5 | a | +| semantics.rb:14:9:14:18 | call to source | semantics.rb:14:5:14:5 | a | +| semantics.rb:15:8:15:8 | a | semantics.rb:15:11:15:11 | [post] x | +| semantics.rb:15:8:15:8 | a | semantics.rb:15:11:15:11 | [post] x | +| semantics.rb:15:11:15:11 | [post] x | semantics.rb:16:10:16:10 | x | +| semantics.rb:15:11:15:11 | [post] x | semantics.rb:16:10:16:10 | x | +| semantics.rb:22:18:22:32 | call to source | semantics.rb:22:10:22:33 | call to s4 | +| semantics.rb:22:18:22:32 | call to source | semantics.rb:22:10:22:33 | call to s4 | +| semantics.rb:23:23:23:32 | call to source | semantics.rb:23:10:23:33 | call to s4 | +| semantics.rb:23:23:23:32 | call to source | semantics.rb:23:10:23:33 | call to s4 | +| semantics.rb:28:5:28:5 | a | semantics.rb:29:8:29:8 | a | +| semantics.rb:28:5:28:5 | a | semantics.rb:29:8:29:8 | a | +| semantics.rb:28:9:28:18 | call to source | semantics.rb:28:5:28:5 | a | +| semantics.rb:28:9:28:18 | call to source | semantics.rb:28:5:28:5 | a | +| semantics.rb:29:8:29:8 | a | semantics.rb:29:14:29:14 | [post] y | +| semantics.rb:29:8:29:8 | a | semantics.rb:29:14:29:14 | [post] y | +| semantics.rb:29:8:29:8 | a | semantics.rb:29:17:29:17 | [post] z | +| semantics.rb:29:8:29:8 | a | semantics.rb:29:17:29:17 | [post] z | +| semantics.rb:29:14:29:14 | [post] y | semantics.rb:31:10:31:10 | y | +| semantics.rb:29:14:29:14 | [post] y | semantics.rb:31:10:31:10 | y | +| semantics.rb:29:17:29:17 | [post] z | semantics.rb:32:10:32:10 | z | +| semantics.rb:29:17:29:17 | [post] z | semantics.rb:32:10:32:10 | z | +| semantics.rb:40:5:40:5 | a | semantics.rb:41:8:41:8 | a | +| semantics.rb:40:5:40:5 | a | semantics.rb:41:8:41:8 | a | +| semantics.rb:40:9:40:18 | call to source | semantics.rb:40:5:40:5 | a | +| semantics.rb:40:9:40:18 | call to source | semantics.rb:40:5:40:5 | a | +| semantics.rb:41:8:41:8 | a | semantics.rb:41:16:41:16 | [post] x | +| semantics.rb:41:8:41:8 | a | semantics.rb:41:16:41:16 | [post] x | +| semantics.rb:41:16:41:16 | [post] x | semantics.rb:42:10:42:10 | x | +| semantics.rb:41:16:41:16 | [post] x | semantics.rb:42:10:42:10 | x | +| semantics.rb:46:15:46:24 | call to source | semantics.rb:46:10:46:26 | call to s8 | +| semantics.rb:46:15:46:24 | call to source | semantics.rb:46:10:46:26 | call to s8 | +| semantics.rb:48:9:48:18 | call to source | semantics.rb:47:10:49:7 | call to s8 | +| semantics.rb:48:9:48:18 | call to source | semantics.rb:47:10:49:7 | call to s8 | +| semantics.rb:53:8:53:17 | call to source | semantics.rb:53:23:53:23 | x | +| semantics.rb:53:8:53:17 | call to source | semantics.rb:53:23:53:23 | x | +| semantics.rb:53:23:53:23 | x | semantics.rb:53:31:53:31 | x | +| semantics.rb:53:23:53:23 | x | semantics.rb:53:31:53:31 | x | +| semantics.rb:54:8:54:17 | call to source | semantics.rb:54:24:54:24 | x | +| semantics.rb:54:8:54:17 | call to source | semantics.rb:54:24:54:24 | x | +| semantics.rb:54:24:54:24 | x | semantics.rb:55:14:55:14 | x | +| semantics.rb:54:24:54:24 | x | semantics.rb:55:14:55:14 | x | +| semantics.rb:60:5:60:5 | a | semantics.rb:61:14:61:14 | a | +| semantics.rb:60:5:60:5 | a | semantics.rb:61:14:61:14 | a | +| semantics.rb:60:5:60:5 | a | semantics.rb:62:17:62:17 | a | +| semantics.rb:60:5:60:5 | a | semantics.rb:62:17:62:17 | a | +| semantics.rb:60:5:60:5 | a | semantics.rb:63:19:63:19 | a | +| semantics.rb:60:5:60:5 | a | semantics.rb:63:19:63:19 | a | +| semantics.rb:60:5:60:5 | a | semantics.rb:64:27:64:27 | a | +| semantics.rb:60:5:60:5 | a | semantics.rb:64:27:64:27 | a | +| semantics.rb:60:5:60:5 | a | semantics.rb:66:14:66:15 | &... | +| semantics.rb:60:5:60:5 | a | semantics.rb:66:14:66:15 | &... | +| semantics.rb:60:9:60:18 | call to source | semantics.rb:60:5:60:5 | a | +| semantics.rb:60:9:60:18 | call to source | semantics.rb:60:5:60:5 | a | +| semantics.rb:61:14:61:14 | a | semantics.rb:61:10:61:15 | call to s10 | +| semantics.rb:61:14:61:14 | a | semantics.rb:61:10:61:15 | call to s10 | +| semantics.rb:62:17:62:17 | a | semantics.rb:62:10:62:18 | call to s10 | +| semantics.rb:62:17:62:17 | a | semantics.rb:62:10:62:18 | call to s10 | +| semantics.rb:63:19:63:19 | a | semantics.rb:63:10:63:20 | call to s10 | +| semantics.rb:63:19:63:19 | a | semantics.rb:63:10:63:20 | call to s10 | +| semantics.rb:64:27:64:27 | a | semantics.rb:64:10:64:28 | call to s10 | +| semantics.rb:64:27:64:27 | a | semantics.rb:64:10:64:28 | call to s10 | +| semantics.rb:66:14:66:15 | &... | semantics.rb:66:10:66:16 | call to s10 | +| semantics.rb:66:14:66:15 | &... | semantics.rb:66:10:66:16 | call to s10 | +| semantics.rb:80:5:80:5 | a | semantics.rb:81:5:81:5 | a | +| semantics.rb:80:5:80:5 | a | semantics.rb:81:5:81:5 | a | +| semantics.rb:80:9:80:18 | call to source | semantics.rb:80:5:80:5 | a | +| semantics.rb:80:9:80:18 | call to source | semantics.rb:80:5:80:5 | a | +| semantics.rb:81:5:81:5 | a | semantics.rb:81:11:81:11 | [post] x | +| semantics.rb:81:5:81:5 | a | semantics.rb:81:11:81:11 | [post] x | +| semantics.rb:81:5:81:5 | a | semantics.rb:81:14:81:14 | [post] y | +| semantics.rb:81:5:81:5 | a | semantics.rb:81:14:81:14 | [post] y | +| semantics.rb:81:5:81:5 | a | semantics.rb:81:22:81:22 | [post] z | +| semantics.rb:81:5:81:5 | a | semantics.rb:81:22:81:22 | [post] z | +| semantics.rb:81:11:81:11 | [post] x | semantics.rb:82:10:82:10 | x | +| semantics.rb:81:11:81:11 | [post] x | semantics.rb:82:10:82:10 | x | +| semantics.rb:81:14:81:14 | [post] y | semantics.rb:83:10:83:10 | y | +| semantics.rb:81:14:81:14 | [post] y | semantics.rb:83:10:83:10 | y | +| semantics.rb:81:22:81:22 | [post] z | semantics.rb:84:10:84:10 | z | +| semantics.rb:81:22:81:22 | [post] z | semantics.rb:84:10:84:10 | z | +| semantics.rb:89:5:89:5 | a | semantics.rb:91:19:91:19 | a | +| semantics.rb:89:5:89:5 | a | semantics.rb:91:19:91:19 | a | +| semantics.rb:89:5:89:5 | a | semantics.rb:92:27:92:27 | a | +| semantics.rb:89:5:89:5 | a | semantics.rb:92:27:92:27 | a | +| semantics.rb:89:9:89:18 | call to source | semantics.rb:89:5:89:5 | a | +| semantics.rb:89:9:89:18 | call to source | semantics.rb:89:5:89:5 | a | +| semantics.rb:91:19:91:19 | a | semantics.rb:91:10:91:20 | call to s13 | +| semantics.rb:91:19:91:19 | a | semantics.rb:91:10:91:20 | call to s13 | +| semantics.rb:92:27:92:27 | a | semantics.rb:92:10:92:28 | call to s13 | +| semantics.rb:92:27:92:27 | a | semantics.rb:92:10:92:28 | call to s13 | +| semantics.rb:97:5:97:5 | a | semantics.rb:98:5:98:5 | a | +| semantics.rb:97:5:97:5 | a | semantics.rb:98:5:98:5 | a | +| semantics.rb:97:5:97:5 | a | semantics.rb:99:5:99:5 | a | +| semantics.rb:97:5:97:5 | a | semantics.rb:99:5:99:5 | a | +| semantics.rb:97:9:97:18 | call to source | semantics.rb:97:5:97:5 | a | +| semantics.rb:97:9:97:18 | call to source | semantics.rb:97:5:97:5 | a | +| semantics.rb:98:5:98:5 | a | semantics.rb:98:19:98:19 | [post] x | +| semantics.rb:98:5:98:5 | a | semantics.rb:98:19:98:19 | [post] x | +| semantics.rb:98:19:98:19 | [post] x | semantics.rb:101:10:101:10 | x | +| semantics.rb:98:19:98:19 | [post] x | semantics.rb:101:10:101:10 | x | +| semantics.rb:99:5:99:5 | a | semantics.rb:99:16:99:16 | [post] y | +| semantics.rb:99:5:99:5 | a | semantics.rb:99:16:99:16 | [post] y | +| semantics.rb:99:5:99:5 | a | semantics.rb:99:24:99:24 | [post] z | +| semantics.rb:99:5:99:5 | a | semantics.rb:99:24:99:24 | [post] z | +| semantics.rb:99:16:99:16 | [post] y | semantics.rb:102:10:102:10 | y | +| semantics.rb:99:16:99:16 | [post] y | semantics.rb:102:10:102:10 | y | +| semantics.rb:99:24:99:24 | [post] z | semantics.rb:103:10:103:10 | z | +| semantics.rb:99:24:99:24 | [post] z | semantics.rb:103:10:103:10 | z | +| semantics.rb:107:5:107:5 | a | semantics.rb:109:14:109:16 | ** ... | +| semantics.rb:107:5:107:5 | a | semantics.rb:110:28:110:30 | ** ... | +| semantics.rb:107:9:107:18 | call to source | semantics.rb:107:5:107:5 | a | +| semantics.rb:109:14:109:16 | ** ... | semantics.rb:109:10:109:17 | call to s15 | +| semantics.rb:110:28:110:30 | ** ... | semantics.rb:110:10:110:31 | call to s15 | +| semantics.rb:114:5:114:5 | a | semantics.rb:116:14:116:14 | a | +| semantics.rb:114:5:114:5 | a | semantics.rb:116:14:116:14 | a | +| semantics.rb:114:5:114:5 | a | semantics.rb:119:17:119:17 | a | +| semantics.rb:114:5:114:5 | a | semantics.rb:119:17:119:17 | a | +| semantics.rb:114:9:114:18 | call to source | semantics.rb:114:5:114:5 | a | +| semantics.rb:114:9:114:18 | call to source | semantics.rb:114:5:114:5 | a | +| semantics.rb:115:5:115:5 | b | semantics.rb:121:17:121:17 | b | +| semantics.rb:115:5:115:5 | b | semantics.rb:121:17:121:17 | b | +| semantics.rb:115:9:115:18 | call to source | semantics.rb:115:5:115:5 | b | +| semantics.rb:115:9:115:18 | call to source | semantics.rb:115:5:115:5 | b | +| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:117:16:117:16 | h [element :a] | +| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:117:16:117:16 | h [element :a] | +| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:121:22:121:22 | h [element :a] | +| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:121:22:121:22 | h [element :a] | +| semantics.rb:116:14:116:14 | a | semantics.rb:116:5:116:5 | h [element :a] | +| semantics.rb:116:14:116:14 | a | semantics.rb:116:5:116:5 | h [element :a] | +| semantics.rb:117:14:117:16 | ** ... [element :a] | semantics.rb:117:10:117:17 | call to s16 | +| semantics.rb:117:14:117:16 | ** ... [element :a] | semantics.rb:117:10:117:17 | call to s16 | +| semantics.rb:117:16:117:16 | h [element :a] | semantics.rb:117:14:117:16 | ** ... [element :a] | +| semantics.rb:117:16:117:16 | h [element :a] | semantics.rb:117:14:117:16 | ** ... [element :a] | +| semantics.rb:119:17:119:17 | a | semantics.rb:119:10:119:18 | call to s16 | +| semantics.rb:119:17:119:17 | a | semantics.rb:119:10:119:18 | call to s16 | +| semantics.rb:121:17:121:17 | b | semantics.rb:121:10:121:23 | call to s16 | +| semantics.rb:121:17:121:17 | b | semantics.rb:121:10:121:23 | call to s16 | +| semantics.rb:121:20:121:22 | ** ... [element :a] | semantics.rb:121:10:121:23 | call to s16 | +| semantics.rb:121:20:121:22 | ** ... [element :a] | semantics.rb:121:10:121:23 | call to s16 | +| semantics.rb:121:22:121:22 | h [element :a] | semantics.rb:121:20:121:22 | ** ... [element :a] | +| semantics.rb:121:22:121:22 | h [element :a] | semantics.rb:121:20:121:22 | ** ... [element :a] | +| semantics.rb:125:5:125:5 | a | semantics.rb:126:9:126:9 | a | +| semantics.rb:125:5:125:5 | a | semantics.rb:126:9:126:9 | a | +| semantics.rb:125:9:125:18 | call to source | semantics.rb:125:5:125:5 | a | +| semantics.rb:125:9:125:18 | call to source | semantics.rb:125:5:125:5 | a | +| semantics.rb:126:9:126:9 | a | semantics.rb:126:12:126:14 | [post] ** ... | +| semantics.rb:126:9:126:9 | a | semantics.rb:126:12:126:14 | [post] ** ... | +| semantics.rb:126:12:126:14 | [post] ** ... | semantics.rb:127:10:127:10 | h | +| semantics.rb:126:12:126:14 | [post] ** ... | semantics.rb:127:10:127:10 | h | +| semantics.rb:141:5:141:5 | b | semantics.rb:145:5:145:5 | [post] h [element] | +| semantics.rb:141:5:141:5 | b | semantics.rb:145:5:145:5 | [post] h [element] | +| semantics.rb:141:9:141:18 | call to source | semantics.rb:141:5:141:5 | b | +| semantics.rb:141:9:141:18 | call to source | semantics.rb:141:5:141:5 | b | +| semantics.rb:145:5:145:5 | [post] h [element] | semantics.rb:147:14:147:14 | h [element] | +| semantics.rb:145:5:145:5 | [post] h [element] | semantics.rb:147:14:147:14 | h [element] | +| semantics.rb:147:14:147:14 | h [element] | semantics.rb:147:10:147:15 | call to s19 | +| semantics.rb:147:14:147:14 | h [element] | semantics.rb:147:10:147:15 | call to s19 | +| semantics.rb:151:5:151:5 | a | semantics.rb:152:13:152:13 | a | +| semantics.rb:151:5:151:5 | a | semantics.rb:152:13:152:13 | a | +| semantics.rb:151:9:151:18 | call to source | semantics.rb:151:5:151:5 | a | +| semantics.rb:151:9:151:18 | call to source | semantics.rb:151:5:151:5 | a | +| semantics.rb:152:5:152:5 | x [element] | semantics.rb:153:10:153:10 | x [element] | +| semantics.rb:152:5:152:5 | x [element] | semantics.rb:153:10:153:10 | x [element] | +| semantics.rb:152:5:152:5 | x [element] | semantics.rb:154:10:154:10 | x [element] | +| semantics.rb:152:5:152:5 | x [element] | semantics.rb:154:10:154:10 | x [element] | +| semantics.rb:152:9:152:14 | call to s20 [element] | semantics.rb:152:5:152:5 | x [element] | +| semantics.rb:152:9:152:14 | call to s20 [element] | semantics.rb:152:5:152:5 | x [element] | +| semantics.rb:152:13:152:13 | a | semantics.rb:152:9:152:14 | call to s20 [element] | +| semantics.rb:152:13:152:13 | a | semantics.rb:152:9:152:14 | call to s20 [element] | +| semantics.rb:153:10:153:10 | x [element] | semantics.rb:153:10:153:13 | ...[...] | +| semantics.rb:153:10:153:10 | x [element] | semantics.rb:153:10:153:13 | ...[...] | +| semantics.rb:154:10:154:10 | x [element] | semantics.rb:154:10:154:13 | ...[...] | +| semantics.rb:154:10:154:10 | x [element] | semantics.rb:154:10:154:13 | ...[...] | +| semantics.rb:158:5:158:5 | a | semantics.rb:162:5:162:5 | [post] h [element 0] | +| semantics.rb:158:5:158:5 | a | semantics.rb:162:5:162:5 | [post] h [element 0] | +| semantics.rb:158:9:158:18 | call to source | semantics.rb:158:5:158:5 | a | +| semantics.rb:158:9:158:18 | call to source | semantics.rb:158:5:158:5 | a | +| semantics.rb:159:5:159:5 | b | semantics.rb:163:5:163:5 | [post] h [element] | +| semantics.rb:159:5:159:5 | b | semantics.rb:163:5:163:5 | [post] h [element] | +| semantics.rb:159:9:159:18 | call to source | semantics.rb:159:5:159:5 | b | +| semantics.rb:159:9:159:18 | call to source | semantics.rb:159:5:159:5 | b | +| semantics.rb:162:5:162:5 | [post] h [element 0] | semantics.rb:165:14:165:14 | h [element 0] | +| semantics.rb:162:5:162:5 | [post] h [element 0] | semantics.rb:165:14:165:14 | h [element 0] | +| semantics.rb:163:5:163:5 | [post] h [element] | semantics.rb:165:14:165:14 | h [element] | +| semantics.rb:163:5:163:5 | [post] h [element] | semantics.rb:165:14:165:14 | h [element] | +| semantics.rb:165:14:165:14 | h [element 0] | semantics.rb:165:10:165:15 | call to s21 | +| semantics.rb:165:14:165:14 | h [element 0] | semantics.rb:165:10:165:15 | call to s21 | +| semantics.rb:165:14:165:14 | h [element] | semantics.rb:165:10:165:15 | call to s21 | +| semantics.rb:165:14:165:14 | h [element] | semantics.rb:165:10:165:15 | call to s21 | +| semantics.rb:169:5:169:5 | a | semantics.rb:170:13:170:13 | a | +| semantics.rb:169:5:169:5 | a | semantics.rb:170:13:170:13 | a | +| semantics.rb:169:9:169:18 | call to source | semantics.rb:169:5:169:5 | a | +| semantics.rb:169:9:169:18 | call to source | semantics.rb:169:5:169:5 | a | +| semantics.rb:170:5:170:5 | x [element] | semantics.rb:171:10:171:10 | x [element] | +| semantics.rb:170:5:170:5 | x [element] | semantics.rb:171:10:171:10 | x [element] | +| semantics.rb:170:5:170:5 | x [element] | semantics.rb:172:10:172:10 | x [element] | +| semantics.rb:170:5:170:5 | x [element] | semantics.rb:172:10:172:10 | x [element] | +| semantics.rb:170:9:170:14 | call to s22 [element] | semantics.rb:170:5:170:5 | x [element] | +| semantics.rb:170:9:170:14 | call to s22 [element] | semantics.rb:170:5:170:5 | x [element] | +| semantics.rb:170:13:170:13 | a | semantics.rb:170:9:170:14 | call to s22 [element] | +| semantics.rb:170:13:170:13 | a | semantics.rb:170:9:170:14 | call to s22 [element] | +| semantics.rb:171:10:171:10 | x [element] | semantics.rb:171:10:171:13 | ...[...] | +| semantics.rb:171:10:171:10 | x [element] | semantics.rb:171:10:171:13 | ...[...] | +| semantics.rb:172:10:172:10 | x [element] | semantics.rb:172:10:172:13 | ...[...] | +| semantics.rb:172:10:172:10 | x [element] | semantics.rb:172:10:172:13 | ...[...] | +| semantics.rb:176:5:176:5 | a | semantics.rb:179:5:179:5 | [post] h [element 0] | +| semantics.rb:176:5:176:5 | a | semantics.rb:179:5:179:5 | [post] h [element 0] | +| semantics.rb:176:9:176:18 | call to source | semantics.rb:176:5:176:5 | a | +| semantics.rb:176:9:176:18 | call to source | semantics.rb:176:5:176:5 | a | +| semantics.rb:179:5:179:5 | [post] h [element 0] | semantics.rb:180:5:180:5 | h [element 0] | +| semantics.rb:179:5:179:5 | [post] h [element 0] | semantics.rb:180:5:180:5 | h [element 0] | +| semantics.rb:180:5:180:5 | [post] h [element 0] | semantics.rb:181:14:181:14 | h [element 0] | +| semantics.rb:180:5:180:5 | [post] h [element 0] | semantics.rb:181:14:181:14 | h [element 0] | +| semantics.rb:180:5:180:5 | h [element 0] | semantics.rb:180:5:180:5 | [post] h [element 0] | +| semantics.rb:180:5:180:5 | h [element 0] | semantics.rb:180:5:180:5 | [post] h [element 0] | +| semantics.rb:181:14:181:14 | h [element 0] | semantics.rb:181:10:181:15 | call to s23 | +| semantics.rb:181:14:181:14 | h [element 0] | semantics.rb:181:10:181:15 | call to s23 | +| semantics.rb:185:5:185:5 | a | semantics.rb:186:13:186:13 | a | +| semantics.rb:185:5:185:5 | a | semantics.rb:186:13:186:13 | a | +| semantics.rb:185:9:185:18 | call to source | semantics.rb:185:5:185:5 | a | +| semantics.rb:185:9:185:18 | call to source | semantics.rb:185:5:185:5 | a | +| semantics.rb:186:5:186:5 | x [element 0] | semantics.rb:187:10:187:10 | x [element 0] | +| semantics.rb:186:5:186:5 | x [element 0] | semantics.rb:187:10:187:10 | x [element 0] | +| semantics.rb:186:5:186:5 | x [element 0] | semantics.rb:189:10:189:10 | x [element 0] | +| semantics.rb:186:5:186:5 | x [element 0] | semantics.rb:189:10:189:10 | x [element 0] | +| semantics.rb:186:9:186:14 | call to s24 [element 0] | semantics.rb:186:5:186:5 | x [element 0] | +| semantics.rb:186:9:186:14 | call to s24 [element 0] | semantics.rb:186:5:186:5 | x [element 0] | +| semantics.rb:186:13:186:13 | a | semantics.rb:186:9:186:14 | call to s24 [element 0] | +| semantics.rb:186:13:186:13 | a | semantics.rb:186:9:186:14 | call to s24 [element 0] | +| semantics.rb:187:10:187:10 | x [element 0] | semantics.rb:187:10:187:13 | ...[...] | +| semantics.rb:187:10:187:10 | x [element 0] | semantics.rb:187:10:187:13 | ...[...] | +| semantics.rb:189:10:189:10 | x [element 0] | semantics.rb:189:10:189:13 | ...[...] | +| semantics.rb:189:10:189:10 | x [element 0] | semantics.rb:189:10:189:13 | ...[...] | +| semantics.rb:193:5:193:5 | a | semantics.rb:196:5:196:5 | [post] h [element 0] | +| semantics.rb:193:5:193:5 | a | semantics.rb:196:5:196:5 | [post] h [element 0] | +| semantics.rb:193:9:193:18 | call to source | semantics.rb:193:5:193:5 | a | +| semantics.rb:193:9:193:18 | call to source | semantics.rb:193:5:193:5 | a | +| semantics.rb:196:5:196:5 | [post] h [element 0] | semantics.rb:197:5:197:5 | h [element 0] | +| semantics.rb:196:5:196:5 | [post] h [element 0] | semantics.rb:197:5:197:5 | h [element 0] | +| semantics.rb:197:5:197:5 | [post] h [element 0] | semantics.rb:198:14:198:14 | h [element 0] | +| semantics.rb:197:5:197:5 | [post] h [element 0] | semantics.rb:198:14:198:14 | h [element 0] | +| semantics.rb:197:5:197:5 | h [element 0] | semantics.rb:197:5:197:5 | [post] h [element 0] | +| semantics.rb:197:5:197:5 | h [element 0] | semantics.rb:197:5:197:5 | [post] h [element 0] | +| semantics.rb:198:14:198:14 | h [element 0] | semantics.rb:198:10:198:15 | call to s25 | +| semantics.rb:198:14:198:14 | h [element 0] | semantics.rb:198:10:198:15 | call to s25 | +| semantics.rb:202:5:202:5 | a | semantics.rb:203:13:203:13 | a | +| semantics.rb:202:5:202:5 | a | semantics.rb:203:13:203:13 | a | +| semantics.rb:202:9:202:18 | call to source | semantics.rb:202:5:202:5 | a | +| semantics.rb:202:9:202:18 | call to source | semantics.rb:202:5:202:5 | a | +| semantics.rb:203:5:203:5 | x [element 0] | semantics.rb:204:10:204:10 | x [element 0] | +| semantics.rb:203:5:203:5 | x [element 0] | semantics.rb:204:10:204:10 | x [element 0] | +| semantics.rb:203:5:203:5 | x [element 0] | semantics.rb:206:10:206:10 | x [element 0] | +| semantics.rb:203:5:203:5 | x [element 0] | semantics.rb:206:10:206:10 | x [element 0] | +| semantics.rb:203:9:203:14 | call to s26 [element 0] | semantics.rb:203:5:203:5 | x [element 0] | +| semantics.rb:203:9:203:14 | call to s26 [element 0] | semantics.rb:203:5:203:5 | x [element 0] | +| semantics.rb:203:13:203:13 | a | semantics.rb:203:9:203:14 | call to s26 [element 0] | +| semantics.rb:203:13:203:13 | a | semantics.rb:203:9:203:14 | call to s26 [element 0] | +| semantics.rb:204:10:204:10 | x [element 0] | semantics.rb:204:10:204:13 | ...[...] | +| semantics.rb:204:10:204:10 | x [element 0] | semantics.rb:204:10:204:13 | ...[...] | +| semantics.rb:206:10:206:10 | x [element 0] | semantics.rb:206:10:206:13 | ...[...] | +| semantics.rb:206:10:206:10 | x [element 0] | semantics.rb:206:10:206:13 | ...[...] | +| semantics.rb:211:5:211:5 | b | semantics.rb:217:5:217:5 | [post] h [element 1] | +| semantics.rb:211:5:211:5 | b | semantics.rb:217:5:217:5 | [post] h [element 1] | +| semantics.rb:211:9:211:18 | call to source | semantics.rb:211:5:211:5 | b | +| semantics.rb:211:9:211:18 | call to source | semantics.rb:211:5:211:5 | b | +| semantics.rb:212:5:212:5 | c | semantics.rb:218:5:218:5 | [post] h [element 2] | +| semantics.rb:212:5:212:5 | c | semantics.rb:218:5:218:5 | [post] h [element 2] | +| semantics.rb:212:9:212:18 | call to source | semantics.rb:212:5:212:5 | c | +| semantics.rb:212:9:212:18 | call to source | semantics.rb:212:5:212:5 | c | +| semantics.rb:213:5:213:5 | d | semantics.rb:219:5:219:5 | [post] h [element] | +| semantics.rb:213:5:213:5 | d | semantics.rb:219:5:219:5 | [post] h [element] | +| semantics.rb:213:9:213:18 | call to source | semantics.rb:213:5:213:5 | d | +| semantics.rb:213:9:213:18 | call to source | semantics.rb:213:5:213:5 | d | +| semantics.rb:217:5:217:5 | [post] h [element 1] | semantics.rb:218:5:218:5 | h [element 1] | +| semantics.rb:217:5:217:5 | [post] h [element 1] | semantics.rb:218:5:218:5 | h [element 1] | +| semantics.rb:218:5:218:5 | [post] h [element 1] | semantics.rb:221:14:221:14 | h [element 1] | +| semantics.rb:218:5:218:5 | [post] h [element 1] | semantics.rb:221:14:221:14 | h [element 1] | +| semantics.rb:218:5:218:5 | [post] h [element 2] | semantics.rb:221:14:221:14 | h [element 2] | +| semantics.rb:218:5:218:5 | [post] h [element 2] | semantics.rb:221:14:221:14 | h [element 2] | +| semantics.rb:218:5:218:5 | h [element 1] | semantics.rb:218:5:218:5 | [post] h [element 1] | +| semantics.rb:218:5:218:5 | h [element 1] | semantics.rb:218:5:218:5 | [post] h [element 1] | +| semantics.rb:219:5:219:5 | [post] h [element] | semantics.rb:221:14:221:14 | h [element] | +| semantics.rb:219:5:219:5 | [post] h [element] | semantics.rb:221:14:221:14 | h [element] | +| semantics.rb:221:14:221:14 | h [element 1] | semantics.rb:221:10:221:15 | call to s27 | +| semantics.rb:221:14:221:14 | h [element 1] | semantics.rb:221:10:221:15 | call to s27 | +| semantics.rb:221:14:221:14 | h [element 2] | semantics.rb:221:10:221:15 | call to s27 | +| semantics.rb:221:14:221:14 | h [element 2] | semantics.rb:221:10:221:15 | call to s27 | +| semantics.rb:221:14:221:14 | h [element] | semantics.rb:221:10:221:15 | call to s27 | +| semantics.rb:221:14:221:14 | h [element] | semantics.rb:221:10:221:15 | call to s27 | +| semantics.rb:225:5:225:5 | a | semantics.rb:226:13:226:13 | a | +| semantics.rb:225:5:225:5 | a | semantics.rb:226:13:226:13 | a | +| semantics.rb:225:9:225:18 | call to source | semantics.rb:225:5:225:5 | a | +| semantics.rb:225:9:225:18 | call to source | semantics.rb:225:5:225:5 | a | +| semantics.rb:226:5:226:5 | x [element] | semantics.rb:227:10:227:10 | x [element] | +| semantics.rb:226:5:226:5 | x [element] | semantics.rb:227:10:227:10 | x [element] | +| semantics.rb:226:5:226:5 | x [element] | semantics.rb:228:10:228:10 | x [element] | +| semantics.rb:226:5:226:5 | x [element] | semantics.rb:228:10:228:10 | x [element] | +| semantics.rb:226:5:226:5 | x [element] | semantics.rb:229:10:229:10 | x [element] | +| semantics.rb:226:5:226:5 | x [element] | semantics.rb:229:10:229:10 | x [element] | +| semantics.rb:226:5:226:5 | x [element] | semantics.rb:230:10:230:10 | x [element] | +| semantics.rb:226:5:226:5 | x [element] | semantics.rb:230:10:230:10 | x [element] | +| semantics.rb:226:9:226:14 | call to s28 [element] | semantics.rb:226:5:226:5 | x [element] | +| semantics.rb:226:9:226:14 | call to s28 [element] | semantics.rb:226:5:226:5 | x [element] | +| semantics.rb:226:13:226:13 | a | semantics.rb:226:9:226:14 | call to s28 [element] | +| semantics.rb:226:13:226:13 | a | semantics.rb:226:9:226:14 | call to s28 [element] | +| semantics.rb:227:10:227:10 | x [element] | semantics.rb:227:10:227:13 | ...[...] | +| semantics.rb:227:10:227:10 | x [element] | semantics.rb:227:10:227:13 | ...[...] | +| semantics.rb:228:10:228:10 | x [element] | semantics.rb:228:10:228:13 | ...[...] | +| semantics.rb:228:10:228:10 | x [element] | semantics.rb:228:10:228:13 | ...[...] | +| semantics.rb:229:10:229:10 | x [element] | semantics.rb:229:10:229:13 | ...[...] | +| semantics.rb:229:10:229:10 | x [element] | semantics.rb:229:10:229:13 | ...[...] | +| semantics.rb:230:10:230:10 | x [element] | semantics.rb:230:10:230:13 | ...[...] | +| semantics.rb:230:10:230:10 | x [element] | semantics.rb:230:10:230:13 | ...[...] | +| semantics.rb:235:5:235:5 | b | semantics.rb:240:5:240:5 | [post] h [element 1] | +| semantics.rb:235:5:235:5 | b | semantics.rb:240:5:240:5 | [post] h [element 1] | +| semantics.rb:235:9:235:18 | call to source | semantics.rb:235:5:235:5 | b | +| semantics.rb:235:9:235:18 | call to source | semantics.rb:235:5:235:5 | b | +| semantics.rb:236:5:236:5 | c | semantics.rb:241:5:241:5 | [post] h [element 2] | +| semantics.rb:236:5:236:5 | c | semantics.rb:241:5:241:5 | [post] h [element 2] | +| semantics.rb:236:9:236:18 | call to source | semantics.rb:236:5:236:5 | c | +| semantics.rb:236:9:236:18 | call to source | semantics.rb:236:5:236:5 | c | +| semantics.rb:240:5:240:5 | [post] h [element 1] | semantics.rb:241:5:241:5 | h [element 1] | +| semantics.rb:240:5:240:5 | [post] h [element 1] | semantics.rb:241:5:241:5 | h [element 1] | +| semantics.rb:241:5:241:5 | [post] h [element 1] | semantics.rb:244:14:244:14 | h [element 1] | +| semantics.rb:241:5:241:5 | [post] h [element 1] | semantics.rb:244:14:244:14 | h [element 1] | +| semantics.rb:241:5:241:5 | [post] h [element 2] | semantics.rb:244:14:244:14 | h [element 2] | +| semantics.rb:241:5:241:5 | [post] h [element 2] | semantics.rb:244:14:244:14 | h [element 2] | +| semantics.rb:241:5:241:5 | h [element 1] | semantics.rb:241:5:241:5 | [post] h [element 1] | +| semantics.rb:241:5:241:5 | h [element 1] | semantics.rb:241:5:241:5 | [post] h [element 1] | +| semantics.rb:244:14:244:14 | h [element 1] | semantics.rb:244:10:244:15 | call to s29 | +| semantics.rb:244:14:244:14 | h [element 1] | semantics.rb:244:10:244:15 | call to s29 | +| semantics.rb:244:14:244:14 | h [element 2] | semantics.rb:244:10:244:15 | call to s29 | +| semantics.rb:244:14:244:14 | h [element 2] | semantics.rb:244:10:244:15 | call to s29 | +| semantics.rb:248:5:248:5 | a | semantics.rb:249:13:249:13 | a | +| semantics.rb:248:5:248:5 | a | semantics.rb:249:13:249:13 | a | +| semantics.rb:248:9:248:18 | call to source | semantics.rb:248:5:248:5 | a | +| semantics.rb:248:9:248:18 | call to source | semantics.rb:248:5:248:5 | a | +| semantics.rb:249:5:249:5 | x [element] | semantics.rb:250:10:250:10 | x [element] | +| semantics.rb:249:5:249:5 | x [element] | semantics.rb:250:10:250:10 | x [element] | +| semantics.rb:249:5:249:5 | x [element] | semantics.rb:251:10:251:10 | x [element] | +| semantics.rb:249:5:249:5 | x [element] | semantics.rb:251:10:251:10 | x [element] | +| semantics.rb:249:5:249:5 | x [element] | semantics.rb:252:10:252:10 | x [element] | +| semantics.rb:249:5:249:5 | x [element] | semantics.rb:252:10:252:10 | x [element] | +| semantics.rb:249:5:249:5 | x [element] | semantics.rb:253:10:253:10 | x [element] | +| semantics.rb:249:5:249:5 | x [element] | semantics.rb:253:10:253:10 | x [element] | +| semantics.rb:249:9:249:14 | call to s30 [element] | semantics.rb:249:5:249:5 | x [element] | +| semantics.rb:249:9:249:14 | call to s30 [element] | semantics.rb:249:5:249:5 | x [element] | +| semantics.rb:249:13:249:13 | a | semantics.rb:249:9:249:14 | call to s30 [element] | +| semantics.rb:249:13:249:13 | a | semantics.rb:249:9:249:14 | call to s30 [element] | +| semantics.rb:250:10:250:10 | x [element] | semantics.rb:250:10:250:13 | ...[...] | +| semantics.rb:250:10:250:10 | x [element] | semantics.rb:250:10:250:13 | ...[...] | +| semantics.rb:251:10:251:10 | x [element] | semantics.rb:251:10:251:13 | ...[...] | +| semantics.rb:251:10:251:10 | x [element] | semantics.rb:251:10:251:13 | ...[...] | +| semantics.rb:252:10:252:10 | x [element] | semantics.rb:252:10:252:13 | ...[...] | +| semantics.rb:252:10:252:10 | x [element] | semantics.rb:252:10:252:13 | ...[...] | +| semantics.rb:253:10:253:10 | x [element] | semantics.rb:253:10:253:13 | ...[...] | +| semantics.rb:253:10:253:10 | x [element] | semantics.rb:253:10:253:13 | ...[...] | +| semantics.rb:257:5:257:5 | [post] h [element :foo] | semantics.rb:258:5:258:5 | h [element :foo] | +| semantics.rb:257:5:257:5 | [post] h [element :foo] | semantics.rb:258:5:258:5 | h [element :foo] | +| semantics.rb:257:15:257:25 | call to source | semantics.rb:257:5:257:5 | [post] h [element :foo] | +| semantics.rb:257:15:257:25 | call to source | semantics.rb:257:5:257:5 | [post] h [element :foo] | +| semantics.rb:258:5:258:5 | [post] h [element :foo] | semantics.rb:259:5:259:5 | h [element :foo] | +| semantics.rb:258:5:258:5 | [post] h [element :foo] | semantics.rb:259:5:259:5 | h [element :foo] | +| semantics.rb:258:5:258:5 | h [element :foo] | semantics.rb:258:5:258:5 | [post] h [element :foo] | +| semantics.rb:258:5:258:5 | h [element :foo] | semantics.rb:258:5:258:5 | [post] h [element :foo] | +| semantics.rb:259:5:259:5 | [post] h [element :foo] | semantics.rb:262:14:262:14 | h [element :foo] | +| semantics.rb:259:5:259:5 | [post] h [element :foo] | semantics.rb:262:14:262:14 | h [element :foo] | +| semantics.rb:259:5:259:5 | h [element :foo] | semantics.rb:259:5:259:5 | [post] h [element :foo] | +| semantics.rb:259:5:259:5 | h [element :foo] | semantics.rb:259:5:259:5 | [post] h [element :foo] | +| semantics.rb:260:5:260:5 | [post] h [element] | semantics.rb:262:14:262:14 | h [element] | +| semantics.rb:260:5:260:5 | [post] h [element] | semantics.rb:262:14:262:14 | h [element] | +| semantics.rb:260:12:260:22 | call to source | semantics.rb:260:5:260:5 | [post] h [element] | +| semantics.rb:260:12:260:22 | call to source | semantics.rb:260:5:260:5 | [post] h [element] | +| semantics.rb:262:14:262:14 | h [element :foo] | semantics.rb:262:10:262:15 | call to s31 | +| semantics.rb:262:14:262:14 | h [element :foo] | semantics.rb:262:10:262:15 | call to s31 | +| semantics.rb:262:14:262:14 | h [element] | semantics.rb:262:10:262:15 | call to s31 | +| semantics.rb:262:14:262:14 | h [element] | semantics.rb:262:10:262:15 | call to s31 | +| semantics.rb:267:5:267:5 | [post] h [element foo] | semantics.rb:268:5:268:5 | h [element foo] | +| semantics.rb:267:5:267:5 | [post] h [element foo] | semantics.rb:268:5:268:5 | h [element foo] | +| semantics.rb:267:16:267:26 | call to source | semantics.rb:267:5:267:5 | [post] h [element foo] | +| semantics.rb:267:16:267:26 | call to source | semantics.rb:267:5:267:5 | [post] h [element foo] | +| semantics.rb:268:5:268:5 | [post] h [element foo] | semantics.rb:269:5:269:5 | h [element foo] | +| semantics.rb:268:5:268:5 | [post] h [element foo] | semantics.rb:269:5:269:5 | h [element foo] | +| semantics.rb:268:5:268:5 | h [element foo] | semantics.rb:268:5:268:5 | [post] h [element foo] | +| semantics.rb:268:5:268:5 | h [element foo] | semantics.rb:268:5:268:5 | [post] h [element foo] | +| semantics.rb:269:5:269:5 | [post] h [element foo] | semantics.rb:272:14:272:14 | h [element foo] | +| semantics.rb:269:5:269:5 | [post] h [element foo] | semantics.rb:272:14:272:14 | h [element foo] | +| semantics.rb:269:5:269:5 | h [element foo] | semantics.rb:269:5:269:5 | [post] h [element foo] | +| semantics.rb:269:5:269:5 | h [element foo] | semantics.rb:269:5:269:5 | [post] h [element foo] | +| semantics.rb:270:5:270:5 | [post] h [element] | semantics.rb:272:14:272:14 | h [element] | +| semantics.rb:270:5:270:5 | [post] h [element] | semantics.rb:272:14:272:14 | h [element] | +| semantics.rb:270:12:270:22 | call to source | semantics.rb:270:5:270:5 | [post] h [element] | +| semantics.rb:270:12:270:22 | call to source | semantics.rb:270:5:270:5 | [post] h [element] | +| semantics.rb:272:14:272:14 | h [element foo] | semantics.rb:272:10:272:15 | call to s32 | +| semantics.rb:272:14:272:14 | h [element foo] | semantics.rb:272:10:272:15 | call to s32 | +| semantics.rb:272:14:272:14 | h [element] | semantics.rb:272:10:272:15 | call to s32 | +| semantics.rb:272:14:272:14 | h [element] | semantics.rb:272:10:272:15 | call to s32 | +| semantics.rb:280:5:280:5 | [post] h [element] | semantics.rb:281:5:281:5 | h [element] | +| semantics.rb:280:5:280:5 | [post] h [element] | semantics.rb:281:5:281:5 | h [element] | +| semantics.rb:280:12:280:22 | call to source | semantics.rb:280:5:280:5 | [post] h [element] | +| semantics.rb:280:12:280:22 | call to source | semantics.rb:280:5:280:5 | [post] h [element] | +| semantics.rb:281:5:281:5 | [post] h [element nil] | semantics.rb:282:5:282:5 | h [element nil] | +| semantics.rb:281:5:281:5 | [post] h [element nil] | semantics.rb:282:5:282:5 | h [element nil] | +| semantics.rb:281:5:281:5 | [post] h [element] | semantics.rb:282:5:282:5 | h [element] | +| semantics.rb:281:5:281:5 | [post] h [element] | semantics.rb:282:5:282:5 | h [element] | +| semantics.rb:281:5:281:5 | h [element] | semantics.rb:281:5:281:5 | [post] h [element] | +| semantics.rb:281:5:281:5 | h [element] | semantics.rb:281:5:281:5 | [post] h [element] | +| semantics.rb:281:14:281:24 | call to source | semantics.rb:281:5:281:5 | [post] h [element nil] | +| semantics.rb:281:14:281:24 | call to source | semantics.rb:281:5:281:5 | [post] h [element nil] | +| semantics.rb:282:5:282:5 | [post] h [element nil] | semantics.rb:283:5:283:5 | h [element nil] | +| semantics.rb:282:5:282:5 | [post] h [element nil] | semantics.rb:283:5:283:5 | h [element nil] | +| semantics.rb:282:5:282:5 | [post] h [element true] | semantics.rb:283:5:283:5 | h [element true] | +| semantics.rb:282:5:282:5 | [post] h [element true] | semantics.rb:283:5:283:5 | h [element true] | +| semantics.rb:282:5:282:5 | [post] h [element] | semantics.rb:283:5:283:5 | h [element] | +| semantics.rb:282:5:282:5 | [post] h [element] | semantics.rb:283:5:283:5 | h [element] | +| semantics.rb:282:5:282:5 | h [element nil] | semantics.rb:282:5:282:5 | [post] h [element nil] | +| semantics.rb:282:5:282:5 | h [element nil] | semantics.rb:282:5:282:5 | [post] h [element nil] | +| semantics.rb:282:5:282:5 | h [element] | semantics.rb:282:5:282:5 | [post] h [element] | +| semantics.rb:282:5:282:5 | h [element] | semantics.rb:282:5:282:5 | [post] h [element] | +| semantics.rb:282:15:282:25 | call to source | semantics.rb:282:5:282:5 | [post] h [element true] | +| semantics.rb:282:15:282:25 | call to source | semantics.rb:282:5:282:5 | [post] h [element true] | +| semantics.rb:283:5:283:5 | [post] h [element false] | semantics.rb:285:14:285:14 | h [element false] | +| semantics.rb:283:5:283:5 | [post] h [element false] | semantics.rb:285:14:285:14 | h [element false] | +| semantics.rb:283:5:283:5 | [post] h [element nil] | semantics.rb:285:14:285:14 | h [element nil] | +| semantics.rb:283:5:283:5 | [post] h [element nil] | semantics.rb:285:14:285:14 | h [element nil] | +| semantics.rb:283:5:283:5 | [post] h [element true] | semantics.rb:285:14:285:14 | h [element true] | +| semantics.rb:283:5:283:5 | [post] h [element true] | semantics.rb:285:14:285:14 | h [element true] | +| semantics.rb:283:5:283:5 | [post] h [element] | semantics.rb:285:14:285:14 | h [element] | +| semantics.rb:283:5:283:5 | [post] h [element] | semantics.rb:285:14:285:14 | h [element] | +| semantics.rb:283:5:283:5 | h [element nil] | semantics.rb:283:5:283:5 | [post] h [element nil] | +| semantics.rb:283:5:283:5 | h [element nil] | semantics.rb:283:5:283:5 | [post] h [element nil] | +| semantics.rb:283:5:283:5 | h [element true] | semantics.rb:283:5:283:5 | [post] h [element true] | +| semantics.rb:283:5:283:5 | h [element true] | semantics.rb:283:5:283:5 | [post] h [element true] | +| semantics.rb:283:5:283:5 | h [element] | semantics.rb:283:5:283:5 | [post] h [element] | +| semantics.rb:283:5:283:5 | h [element] | semantics.rb:283:5:283:5 | [post] h [element] | +| semantics.rb:283:16:283:26 | call to source | semantics.rb:283:5:283:5 | [post] h [element false] | +| semantics.rb:283:16:283:26 | call to source | semantics.rb:283:5:283:5 | [post] h [element false] | +| semantics.rb:285:14:285:14 | h [element false] | semantics.rb:285:10:285:15 | call to s33 | +| semantics.rb:285:14:285:14 | h [element false] | semantics.rb:285:10:285:15 | call to s33 | +| semantics.rb:285:14:285:14 | h [element nil] | semantics.rb:285:10:285:15 | call to s33 | +| semantics.rb:285:14:285:14 | h [element nil] | semantics.rb:285:10:285:15 | call to s33 | +| semantics.rb:285:14:285:14 | h [element true] | semantics.rb:285:10:285:15 | call to s33 | +| semantics.rb:285:14:285:14 | h [element true] | semantics.rb:285:10:285:15 | call to s33 | +| semantics.rb:285:14:285:14 | h [element] | semantics.rb:285:10:285:15 | call to s33 | +| semantics.rb:285:14:285:14 | h [element] | semantics.rb:285:10:285:15 | call to s33 | +| semantics.rb:289:5:289:5 | x [element :foo] | semantics.rb:290:10:290:10 | x [element :foo] | +| semantics.rb:289:5:289:5 | x [element :foo] | semantics.rb:290:10:290:10 | x [element :foo] | +| semantics.rb:289:5:289:5 | x [element :foo] | semantics.rb:292:10:292:10 | x [element :foo] | +| semantics.rb:289:5:289:5 | x [element :foo] | semantics.rb:292:10:292:10 | x [element :foo] | +| semantics.rb:289:9:289:24 | call to s35 [element :foo] | semantics.rb:289:5:289:5 | x [element :foo] | +| semantics.rb:289:9:289:24 | call to s35 [element :foo] | semantics.rb:289:5:289:5 | x [element :foo] | +| semantics.rb:289:13:289:23 | call to source | semantics.rb:289:9:289:24 | call to s35 [element :foo] | +| semantics.rb:289:13:289:23 | call to source | semantics.rb:289:9:289:24 | call to s35 [element :foo] | +| semantics.rb:290:10:290:10 | x [element :foo] | semantics.rb:290:10:290:16 | ...[...] | +| semantics.rb:290:10:290:10 | x [element :foo] | semantics.rb:290:10:290:16 | ...[...] | +| semantics.rb:292:10:292:10 | x [element :foo] | semantics.rb:292:10:292:13 | ...[...] | +| semantics.rb:292:10:292:10 | x [element :foo] | semantics.rb:292:10:292:13 | ...[...] | +| semantics.rb:296:5:296:5 | x [element foo] | semantics.rb:298:10:298:10 | x [element foo] | +| semantics.rb:296:5:296:5 | x [element foo] | semantics.rb:298:10:298:10 | x [element foo] | +| semantics.rb:296:5:296:5 | x [element foo] | semantics.rb:300:10:300:10 | x [element foo] | +| semantics.rb:296:5:296:5 | x [element foo] | semantics.rb:300:10:300:10 | x [element foo] | +| semantics.rb:296:9:296:24 | call to s36 [element foo] | semantics.rb:296:5:296:5 | x [element foo] | +| semantics.rb:296:9:296:24 | call to s36 [element foo] | semantics.rb:296:5:296:5 | x [element foo] | +| semantics.rb:296:13:296:23 | call to source | semantics.rb:296:9:296:24 | call to s36 [element foo] | +| semantics.rb:296:13:296:23 | call to source | semantics.rb:296:9:296:24 | call to s36 [element foo] | +| semantics.rb:298:10:298:10 | x [element foo] | semantics.rb:298:10:298:17 | ...[...] | +| semantics.rb:298:10:298:10 | x [element foo] | semantics.rb:298:10:298:17 | ...[...] | +| semantics.rb:300:10:300:10 | x [element foo] | semantics.rb:300:10:300:13 | ...[...] | +| semantics.rb:300:10:300:10 | x [element foo] | semantics.rb:300:10:300:13 | ...[...] | +| semantics.rb:304:5:304:5 | x [element true] | semantics.rb:306:10:306:10 | x [element true] | +| semantics.rb:304:5:304:5 | x [element true] | semantics.rb:306:10:306:10 | x [element true] | +| semantics.rb:304:5:304:5 | x [element true] | semantics.rb:308:10:308:10 | x [element true] | +| semantics.rb:304:5:304:5 | x [element true] | semantics.rb:308:10:308:10 | x [element true] | +| semantics.rb:304:9:304:24 | call to s37 [element true] | semantics.rb:304:5:304:5 | x [element true] | +| semantics.rb:304:9:304:24 | call to s37 [element true] | semantics.rb:304:5:304:5 | x [element true] | +| semantics.rb:304:13:304:23 | call to source | semantics.rb:304:9:304:24 | call to s37 [element true] | +| semantics.rb:304:13:304:23 | call to source | semantics.rb:304:9:304:24 | call to s37 [element true] | +| semantics.rb:306:10:306:10 | x [element true] | semantics.rb:306:10:306:16 | ...[...] | +| semantics.rb:306:10:306:10 | x [element true] | semantics.rb:306:10:306:16 | ...[...] | +| semantics.rb:308:10:308:10 | x [element true] | semantics.rb:308:10:308:13 | ...[...] | +| semantics.rb:308:10:308:10 | x [element true] | semantics.rb:308:10:308:13 | ...[...] | +| semantics.rb:312:5:312:5 | [post] h [element foo] | semantics.rb:315:14:315:14 | h [element foo] | +| semantics.rb:312:5:312:5 | [post] h [element foo] | semantics.rb:315:14:315:14 | h [element foo] | +| semantics.rb:312:16:312:26 | call to source | semantics.rb:312:5:312:5 | [post] h [element foo] | +| semantics.rb:312:16:312:26 | call to source | semantics.rb:312:5:312:5 | [post] h [element foo] | +| semantics.rb:315:14:315:14 | h [element foo] | semantics.rb:315:10:315:15 | call to s38 | +| semantics.rb:315:14:315:14 | h [element foo] | semantics.rb:315:10:315:15 | call to s38 | +| semantics.rb:319:5:319:5 | x [element :foo] | semantics.rb:321:10:321:10 | x [element :foo] | +| semantics.rb:319:5:319:5 | x [element :foo] | semantics.rb:321:10:321:10 | x [element :foo] | +| semantics.rb:319:5:319:5 | x [element :foo] | semantics.rb:322:10:322:10 | x [element :foo] | +| semantics.rb:319:5:319:5 | x [element :foo] | semantics.rb:322:10:322:10 | x [element :foo] | +| semantics.rb:319:9:319:24 | call to s39 [element :foo] | semantics.rb:319:5:319:5 | x [element :foo] | +| semantics.rb:319:9:319:24 | call to s39 [element :foo] | semantics.rb:319:5:319:5 | x [element :foo] | +| semantics.rb:319:13:319:23 | call to source | semantics.rb:319:9:319:24 | call to s39 [element :foo] | +| semantics.rb:319:13:319:23 | call to source | semantics.rb:319:9:319:24 | call to s39 [element :foo] | +| semantics.rb:321:10:321:10 | x [element :foo] | semantics.rb:321:10:321:16 | ...[...] | +| semantics.rb:321:10:321:10 | x [element :foo] | semantics.rb:321:10:321:16 | ...[...] | +| semantics.rb:322:10:322:10 | x [element :foo] | semantics.rb:322:10:322:13 | ...[...] | +| semantics.rb:322:10:322:10 | x [element :foo] | semantics.rb:322:10:322:13 | ...[...] | +| semantics.rb:327:5:327:5 | [post] x [@foo] | semantics.rb:329:14:329:14 | x [@foo] | +| semantics.rb:327:5:327:5 | [post] x [@foo] | semantics.rb:329:14:329:14 | x [@foo] | +| semantics.rb:327:13:327:23 | call to source | semantics.rb:327:5:327:5 | [post] x [@foo] | +| semantics.rb:327:13:327:23 | call to source | semantics.rb:327:5:327:5 | [post] x [@foo] | +| semantics.rb:329:14:329:14 | x [@foo] | semantics.rb:329:10:329:15 | call to s40 | +| semantics.rb:329:14:329:14 | x [@foo] | semantics.rb:329:10:329:15 | call to s40 | +| semantics.rb:333:5:333:5 | x [@foo] | semantics.rb:334:10:334:10 | x [@foo] | +| semantics.rb:333:5:333:5 | x [@foo] | semantics.rb:334:10:334:10 | x [@foo] | +| semantics.rb:333:9:333:24 | call to s41 [@foo] | semantics.rb:333:5:333:5 | x [@foo] | +| semantics.rb:333:9:333:24 | call to s41 [@foo] | semantics.rb:333:5:333:5 | x [@foo] | +| semantics.rb:333:13:333:23 | call to source | semantics.rb:333:9:333:24 | call to s41 [@foo] | +| semantics.rb:333:13:333:23 | call to source | semantics.rb:333:9:333:24 | call to s41 [@foo] | +| semantics.rb:334:10:334:10 | x [@foo] | semantics.rb:334:10:334:14 | call to foo | +| semantics.rb:334:10:334:10 | x [@foo] | semantics.rb:334:10:334:14 | call to foo | +| semantics.rb:339:5:339:5 | [post] h [element 0] | semantics.rb:342:13:342:13 | h [element 0] | +| semantics.rb:339:5:339:5 | [post] h [element 0] | semantics.rb:342:13:342:13 | h [element 0] | +| semantics.rb:339:12:339:22 | call to source | semantics.rb:339:5:339:5 | [post] h [element 0] | +| semantics.rb:339:12:339:22 | call to source | semantics.rb:339:5:339:5 | [post] h [element 0] | +| semantics.rb:340:5:340:5 | [post] h [element] | semantics.rb:342:13:342:13 | h [element] | +| semantics.rb:340:5:340:5 | [post] h [element] | semantics.rb:342:13:342:13 | h [element] | +| semantics.rb:340:12:340:22 | call to source | semantics.rb:340:5:340:5 | [post] h [element] | +| semantics.rb:340:12:340:22 | call to source | semantics.rb:340:5:340:5 | [post] h [element] | +| semantics.rb:342:5:342:5 | x [element 0] | semantics.rb:344:10:344:10 | x [element 0] | +| semantics.rb:342:5:342:5 | x [element 0] | semantics.rb:344:10:344:10 | x [element 0] | +| semantics.rb:342:5:342:5 | x [element 0] | semantics.rb:346:10:346:10 | x [element 0] | +| semantics.rb:342:5:342:5 | x [element 0] | semantics.rb:346:10:346:10 | x [element 0] | +| semantics.rb:342:5:342:5 | x [element] | semantics.rb:344:10:344:10 | x [element] | +| semantics.rb:342:5:342:5 | x [element] | semantics.rb:344:10:344:10 | x [element] | +| semantics.rb:342:5:342:5 | x [element] | semantics.rb:345:10:345:10 | x [element] | +| semantics.rb:342:5:342:5 | x [element] | semantics.rb:345:10:345:10 | x [element] | +| semantics.rb:342:5:342:5 | x [element] | semantics.rb:346:10:346:10 | x [element] | +| semantics.rb:342:5:342:5 | x [element] | semantics.rb:346:10:346:10 | x [element] | +| semantics.rb:342:9:342:14 | call to s42 [element 0] | semantics.rb:342:5:342:5 | x [element 0] | +| semantics.rb:342:9:342:14 | call to s42 [element 0] | semantics.rb:342:5:342:5 | x [element 0] | +| semantics.rb:342:9:342:14 | call to s42 [element] | semantics.rb:342:5:342:5 | x [element] | +| semantics.rb:342:9:342:14 | call to s42 [element] | semantics.rb:342:5:342:5 | x [element] | +| semantics.rb:342:13:342:13 | h [element 0] | semantics.rb:342:9:342:14 | call to s42 [element 0] | +| semantics.rb:342:13:342:13 | h [element 0] | semantics.rb:342:9:342:14 | call to s42 [element 0] | +| semantics.rb:342:13:342:13 | h [element] | semantics.rb:342:9:342:14 | call to s42 [element] | +| semantics.rb:342:13:342:13 | h [element] | semantics.rb:342:9:342:14 | call to s42 [element] | +| semantics.rb:344:10:344:10 | x [element 0] | semantics.rb:344:10:344:13 | ...[...] | +| semantics.rb:344:10:344:10 | x [element 0] | semantics.rb:344:10:344:13 | ...[...] | +| semantics.rb:344:10:344:10 | x [element] | semantics.rb:344:10:344:13 | ...[...] | +| semantics.rb:344:10:344:10 | x [element] | semantics.rb:344:10:344:13 | ...[...] | +| semantics.rb:345:10:345:10 | x [element] | semantics.rb:345:10:345:13 | ...[...] | +| semantics.rb:345:10:345:10 | x [element] | semantics.rb:345:10:345:13 | ...[...] | +| semantics.rb:346:10:346:10 | x [element 0] | semantics.rb:346:10:346:13 | ...[...] | +| semantics.rb:346:10:346:10 | x [element 0] | semantics.rb:346:10:346:13 | ...[...] | +| semantics.rb:346:10:346:10 | x [element] | semantics.rb:346:10:346:13 | ...[...] | +| semantics.rb:346:10:346:10 | x [element] | semantics.rb:346:10:346:13 | ...[...] | +| semantics.rb:350:5:350:5 | [post] h [element 0] | semantics.rb:353:13:353:13 | h [element 0] | +| semantics.rb:350:5:350:5 | [post] h [element 0] | semantics.rb:353:13:353:13 | h [element 0] | +| semantics.rb:350:12:350:22 | call to source | semantics.rb:350:5:350:5 | [post] h [element 0] | +| semantics.rb:350:12:350:22 | call to source | semantics.rb:350:5:350:5 | [post] h [element 0] | +| semantics.rb:353:5:353:5 | x [element 0] | semantics.rb:355:10:355:10 | x [element 0] | +| semantics.rb:353:5:353:5 | x [element 0] | semantics.rb:355:10:355:10 | x [element 0] | +| semantics.rb:353:5:353:5 | x [element 0] | semantics.rb:357:10:357:10 | x [element 0] | +| semantics.rb:353:5:353:5 | x [element 0] | semantics.rb:357:10:357:10 | x [element 0] | +| semantics.rb:353:9:353:14 | call to s43 [element 0] | semantics.rb:353:5:353:5 | x [element 0] | +| semantics.rb:353:9:353:14 | call to s43 [element 0] | semantics.rb:353:5:353:5 | x [element 0] | +| semantics.rb:353:13:353:13 | h [element 0] | semantics.rb:353:9:353:14 | call to s43 [element 0] | +| semantics.rb:353:13:353:13 | h [element 0] | semantics.rb:353:9:353:14 | call to s43 [element 0] | +| semantics.rb:355:10:355:10 | x [element 0] | semantics.rb:355:10:355:13 | ...[...] | +| semantics.rb:355:10:355:10 | x [element 0] | semantics.rb:355:10:355:13 | ...[...] | +| semantics.rb:357:10:357:10 | x [element 0] | semantics.rb:357:10:357:13 | ...[...] | +| semantics.rb:357:10:357:10 | x [element 0] | semantics.rb:357:10:357:13 | ...[...] | +| semantics.rb:362:5:362:5 | [post] h [element 1] | semantics.rb:365:9:365:9 | h [element 1] | +| semantics.rb:362:5:362:5 | [post] h [element 1] | semantics.rb:365:9:365:9 | h [element 1] | +| semantics.rb:362:12:362:22 | call to source | semantics.rb:362:5:362:5 | [post] h [element 1] | +| semantics.rb:362:12:362:22 | call to source | semantics.rb:362:5:362:5 | [post] h [element 1] | +| semantics.rb:365:9:365:9 | [post] h [element 1] | semantics.rb:368:10:368:10 | h [element 1] | +| semantics.rb:365:9:365:9 | [post] h [element 1] | semantics.rb:368:10:368:10 | h [element 1] | +| semantics.rb:365:9:365:9 | [post] h [element 1] | semantics.rb:369:10:369:10 | h [element 1] | +| semantics.rb:365:9:365:9 | [post] h [element 1] | semantics.rb:369:10:369:10 | h [element 1] | +| semantics.rb:365:9:365:9 | h [element 1] | semantics.rb:365:9:365:9 | [post] h [element 1] | +| semantics.rb:365:9:365:9 | h [element 1] | semantics.rb:365:9:365:9 | [post] h [element 1] | +| semantics.rb:368:10:368:10 | h [element 1] | semantics.rb:368:10:368:13 | ...[...] | +| semantics.rb:368:10:368:10 | h [element 1] | semantics.rb:368:10:368:13 | ...[...] | +| semantics.rb:369:10:369:10 | h [element 1] | semantics.rb:369:10:369:13 | ...[...] | +| semantics.rb:369:10:369:10 | h [element 1] | semantics.rb:369:10:369:13 | ...[...] | +| semantics.rb:373:5:373:5 | [post] h [element 0] | semantics.rb:374:5:374:5 | h [element 0] | +| semantics.rb:373:5:373:5 | [post] h [element 0] | semantics.rb:374:5:374:5 | h [element 0] | +| semantics.rb:373:12:373:22 | call to source | semantics.rb:373:5:373:5 | [post] h [element 0] | +| semantics.rb:373:12:373:22 | call to source | semantics.rb:373:5:373:5 | [post] h [element 0] | +| semantics.rb:374:5:374:5 | [post] h [element 0] | semantics.rb:377:10:377:10 | h [element 0] | +| semantics.rb:374:5:374:5 | [post] h [element 0] | semantics.rb:377:10:377:10 | h [element 0] | +| semantics.rb:374:5:374:5 | [post] h [element 0] | semantics.rb:379:10:379:10 | h [element 0] | +| semantics.rb:374:5:374:5 | [post] h [element 0] | semantics.rb:379:10:379:10 | h [element 0] | +| semantics.rb:374:5:374:5 | [post] h [element 1] | semantics.rb:378:10:378:10 | h [element 1] | +| semantics.rb:374:5:374:5 | [post] h [element 1] | semantics.rb:378:10:378:10 | h [element 1] | +| semantics.rb:374:5:374:5 | [post] h [element 1] | semantics.rb:379:10:379:10 | h [element 1] | +| semantics.rb:374:5:374:5 | [post] h [element 1] | semantics.rb:379:10:379:10 | h [element 1] | +| semantics.rb:374:5:374:5 | [post] h [element 1] | semantics.rb:381:9:381:9 | h [element 1] | +| semantics.rb:374:5:374:5 | [post] h [element 1] | semantics.rb:381:9:381:9 | h [element 1] | +| semantics.rb:374:5:374:5 | h [element 0] | semantics.rb:374:5:374:5 | [post] h [element 0] | +| semantics.rb:374:5:374:5 | h [element 0] | semantics.rb:374:5:374:5 | [post] h [element 0] | +| semantics.rb:374:12:374:22 | call to source | semantics.rb:374:5:374:5 | [post] h [element 1] | +| semantics.rb:374:12:374:22 | call to source | semantics.rb:374:5:374:5 | [post] h [element 1] | +| semantics.rb:375:5:375:5 | [post] h [element] | semantics.rb:377:10:377:10 | h [element] | +| semantics.rb:375:5:375:5 | [post] h [element] | semantics.rb:377:10:377:10 | h [element] | +| semantics.rb:375:5:375:5 | [post] h [element] | semantics.rb:378:10:378:10 | h [element] | +| semantics.rb:375:5:375:5 | [post] h [element] | semantics.rb:378:10:378:10 | h [element] | +| semantics.rb:375:5:375:5 | [post] h [element] | semantics.rb:379:10:379:10 | h [element] | +| semantics.rb:375:5:375:5 | [post] h [element] | semantics.rb:379:10:379:10 | h [element] | +| semantics.rb:375:5:375:5 | [post] h [element] | semantics.rb:381:9:381:9 | h [element] | +| semantics.rb:375:5:375:5 | [post] h [element] | semantics.rb:381:9:381:9 | h [element] | +| semantics.rb:375:12:375:22 | call to source | semantics.rb:375:5:375:5 | [post] h [element] | +| semantics.rb:375:12:375:22 | call to source | semantics.rb:375:5:375:5 | [post] h [element] | +| semantics.rb:377:10:377:10 | h [element 0] | semantics.rb:377:10:377:13 | ...[...] | +| semantics.rb:377:10:377:10 | h [element 0] | semantics.rb:377:10:377:13 | ...[...] | +| semantics.rb:377:10:377:10 | h [element] | semantics.rb:377:10:377:13 | ...[...] | +| semantics.rb:377:10:377:10 | h [element] | semantics.rb:377:10:377:13 | ...[...] | +| semantics.rb:378:10:378:10 | h [element 1] | semantics.rb:378:10:378:13 | ...[...] | +| semantics.rb:378:10:378:10 | h [element 1] | semantics.rb:378:10:378:13 | ...[...] | +| semantics.rb:378:10:378:10 | h [element] | semantics.rb:378:10:378:13 | ...[...] | +| semantics.rb:378:10:378:10 | h [element] | semantics.rb:378:10:378:13 | ...[...] | +| semantics.rb:379:10:379:10 | h [element 0] | semantics.rb:379:10:379:13 | ...[...] | +| semantics.rb:379:10:379:10 | h [element 0] | semantics.rb:379:10:379:13 | ...[...] | +| semantics.rb:379:10:379:10 | h [element 1] | semantics.rb:379:10:379:13 | ...[...] | +| semantics.rb:379:10:379:10 | h [element 1] | semantics.rb:379:10:379:13 | ...[...] | +| semantics.rb:379:10:379:10 | h [element] | semantics.rb:379:10:379:13 | ...[...] | +| semantics.rb:379:10:379:10 | h [element] | semantics.rb:379:10:379:13 | ...[...] | +| semantics.rb:381:9:381:9 | [post] h [element 1] | semantics.rb:384:10:384:10 | h [element 1] | +| semantics.rb:381:9:381:9 | [post] h [element 1] | semantics.rb:384:10:384:10 | h [element 1] | +| semantics.rb:381:9:381:9 | [post] h [element 1] | semantics.rb:385:10:385:10 | h [element 1] | +| semantics.rb:381:9:381:9 | [post] h [element 1] | semantics.rb:385:10:385:10 | h [element 1] | +| semantics.rb:381:9:381:9 | [post] h [element] | semantics.rb:383:10:383:10 | h [element] | +| semantics.rb:381:9:381:9 | [post] h [element] | semantics.rb:383:10:383:10 | h [element] | +| semantics.rb:381:9:381:9 | [post] h [element] | semantics.rb:384:10:384:10 | h [element] | +| semantics.rb:381:9:381:9 | [post] h [element] | semantics.rb:384:10:384:10 | h [element] | +| semantics.rb:381:9:381:9 | [post] h [element] | semantics.rb:385:10:385:10 | h [element] | +| semantics.rb:381:9:381:9 | [post] h [element] | semantics.rb:385:10:385:10 | h [element] | +| semantics.rb:381:9:381:9 | h [element 1] | semantics.rb:381:9:381:9 | [post] h [element 1] | +| semantics.rb:381:9:381:9 | h [element 1] | semantics.rb:381:9:381:9 | [post] h [element 1] | +| semantics.rb:381:9:381:9 | h [element] | semantics.rb:381:9:381:9 | [post] h [element] | +| semantics.rb:381:9:381:9 | h [element] | semantics.rb:381:9:381:9 | [post] h [element] | +| semantics.rb:383:10:383:10 | h [element] | semantics.rb:383:10:383:13 | ...[...] | +| semantics.rb:383:10:383:10 | h [element] | semantics.rb:383:10:383:13 | ...[...] | +| semantics.rb:384:10:384:10 | h [element 1] | semantics.rb:384:10:384:13 | ...[...] | +| semantics.rb:384:10:384:10 | h [element 1] | semantics.rb:384:10:384:13 | ...[...] | +| semantics.rb:384:10:384:10 | h [element] | semantics.rb:384:10:384:13 | ...[...] | +| semantics.rb:384:10:384:10 | h [element] | semantics.rb:384:10:384:13 | ...[...] | +| semantics.rb:385:10:385:10 | h [element 1] | semantics.rb:385:10:385:13 | ...[...] | +| semantics.rb:385:10:385:10 | h [element 1] | semantics.rb:385:10:385:13 | ...[...] | +| semantics.rb:385:10:385:10 | h [element] | semantics.rb:385:10:385:13 | ...[...] | +| semantics.rb:385:10:385:10 | h [element] | semantics.rb:385:10:385:13 | ...[...] | +| semantics.rb:389:5:389:5 | [post] h [element 0] | semantics.rb:390:5:390:5 | h [element 0] | +| semantics.rb:389:5:389:5 | [post] h [element 0] | semantics.rb:390:5:390:5 | h [element 0] | +| semantics.rb:389:12:389:22 | call to source | semantics.rb:389:5:389:5 | [post] h [element 0] | +| semantics.rb:389:12:389:22 | call to source | semantics.rb:389:5:389:5 | [post] h [element 0] | +| semantics.rb:390:5:390:5 | [post] h [element 0] | semantics.rb:393:10:393:10 | h [element 0] | +| semantics.rb:390:5:390:5 | [post] h [element 0] | semantics.rb:393:10:393:10 | h [element 0] | +| semantics.rb:390:5:390:5 | [post] h [element 0] | semantics.rb:395:10:395:10 | h [element 0] | +| semantics.rb:390:5:390:5 | [post] h [element 0] | semantics.rb:395:10:395:10 | h [element 0] | +| semantics.rb:390:5:390:5 | [post] h [element 1] | semantics.rb:394:10:394:10 | h [element 1] | +| semantics.rb:390:5:390:5 | [post] h [element 1] | semantics.rb:394:10:394:10 | h [element 1] | +| semantics.rb:390:5:390:5 | [post] h [element 1] | semantics.rb:395:10:395:10 | h [element 1] | +| semantics.rb:390:5:390:5 | [post] h [element 1] | semantics.rb:395:10:395:10 | h [element 1] | +| semantics.rb:390:5:390:5 | [post] h [element 1] | semantics.rb:397:13:397:13 | h [element 1] | +| semantics.rb:390:5:390:5 | [post] h [element 1] | semantics.rb:397:13:397:13 | h [element 1] | +| semantics.rb:390:5:390:5 | h [element 0] | semantics.rb:390:5:390:5 | [post] h [element 0] | +| semantics.rb:390:5:390:5 | h [element 0] | semantics.rb:390:5:390:5 | [post] h [element 0] | +| semantics.rb:390:12:390:22 | call to source | semantics.rb:390:5:390:5 | [post] h [element 1] | +| semantics.rb:390:12:390:22 | call to source | semantics.rb:390:5:390:5 | [post] h [element 1] | +| semantics.rb:391:5:391:5 | [post] h [element] | semantics.rb:393:10:393:10 | h [element] | +| semantics.rb:391:5:391:5 | [post] h [element] | semantics.rb:393:10:393:10 | h [element] | +| semantics.rb:391:5:391:5 | [post] h [element] | semantics.rb:394:10:394:10 | h [element] | +| semantics.rb:391:5:391:5 | [post] h [element] | semantics.rb:394:10:394:10 | h [element] | +| semantics.rb:391:5:391:5 | [post] h [element] | semantics.rb:395:10:395:10 | h [element] | +| semantics.rb:391:5:391:5 | [post] h [element] | semantics.rb:395:10:395:10 | h [element] | +| semantics.rb:391:12:391:22 | call to source | semantics.rb:391:5:391:5 | [post] h [element] | +| semantics.rb:391:12:391:22 | call to source | semantics.rb:391:5:391:5 | [post] h [element] | +| semantics.rb:393:10:393:10 | h [element 0] | semantics.rb:393:10:393:13 | ...[...] | +| semantics.rb:393:10:393:10 | h [element 0] | semantics.rb:393:10:393:13 | ...[...] | +| semantics.rb:393:10:393:10 | h [element] | semantics.rb:393:10:393:13 | ...[...] | +| semantics.rb:393:10:393:10 | h [element] | semantics.rb:393:10:393:13 | ...[...] | +| semantics.rb:394:10:394:10 | h [element 1] | semantics.rb:394:10:394:13 | ...[...] | +| semantics.rb:394:10:394:10 | h [element 1] | semantics.rb:394:10:394:13 | ...[...] | +| semantics.rb:394:10:394:10 | h [element] | semantics.rb:394:10:394:13 | ...[...] | +| semantics.rb:394:10:394:10 | h [element] | semantics.rb:394:10:394:13 | ...[...] | +| semantics.rb:395:10:395:10 | h [element 0] | semantics.rb:395:10:395:13 | ...[...] | +| semantics.rb:395:10:395:10 | h [element 0] | semantics.rb:395:10:395:13 | ...[...] | +| semantics.rb:395:10:395:10 | h [element 1] | semantics.rb:395:10:395:13 | ...[...] | +| semantics.rb:395:10:395:10 | h [element 1] | semantics.rb:395:10:395:13 | ...[...] | +| semantics.rb:395:10:395:10 | h [element] | semantics.rb:395:10:395:13 | ...[...] | +| semantics.rb:395:10:395:10 | h [element] | semantics.rb:395:10:395:13 | ...[...] | +| semantics.rb:397:5:397:5 | x [element 1] | semantics.rb:400:10:400:10 | x [element 1] | +| semantics.rb:397:5:397:5 | x [element 1] | semantics.rb:400:10:400:10 | x [element 1] | +| semantics.rb:397:5:397:5 | x [element 1] | semantics.rb:401:10:401:10 | x [element 1] | +| semantics.rb:397:5:397:5 | x [element 1] | semantics.rb:401:10:401:10 | x [element 1] | +| semantics.rb:397:9:397:14 | call to s46 [element 1] | semantics.rb:397:5:397:5 | x [element 1] | +| semantics.rb:397:9:397:14 | call to s46 [element 1] | semantics.rb:397:5:397:5 | x [element 1] | +| semantics.rb:397:13:397:13 | h [element 1] | semantics.rb:397:9:397:14 | call to s46 [element 1] | +| semantics.rb:397:13:397:13 | h [element 1] | semantics.rb:397:9:397:14 | call to s46 [element 1] | +| semantics.rb:400:10:400:10 | x [element 1] | semantics.rb:400:10:400:13 | ...[...] | +| semantics.rb:400:10:400:10 | x [element 1] | semantics.rb:400:10:400:13 | ...[...] | +| semantics.rb:401:10:401:10 | x [element 1] | semantics.rb:401:10:401:13 | ...[...] | +| semantics.rb:401:10:401:10 | x [element 1] | semantics.rb:401:10:401:13 | ...[...] | +| semantics.rb:405:5:405:5 | [post] h [element :foo] | semantics.rb:406:5:406:5 | h [element :foo] | +| semantics.rb:405:5:405:5 | [post] h [element :foo] | semantics.rb:406:5:406:5 | h [element :foo] | +| semantics.rb:405:15:405:25 | call to source | semantics.rb:405:5:405:5 | [post] h [element :foo] | +| semantics.rb:405:15:405:25 | call to source | semantics.rb:405:5:405:5 | [post] h [element :foo] | +| semantics.rb:406:5:406:5 | [post] h [element :bar] | semantics.rb:410:10:410:10 | h [element :bar] | +| semantics.rb:406:5:406:5 | [post] h [element :bar] | semantics.rb:410:10:410:10 | h [element :bar] | +| semantics.rb:406:5:406:5 | [post] h [element :bar] | semantics.rb:412:13:412:13 | h [element :bar] | +| semantics.rb:406:5:406:5 | [post] h [element :bar] | semantics.rb:412:13:412:13 | h [element :bar] | +| semantics.rb:406:5:406:5 | [post] h [element :foo] | semantics.rb:409:10:409:10 | h [element :foo] | +| semantics.rb:406:5:406:5 | [post] h [element :foo] | semantics.rb:409:10:409:10 | h [element :foo] | +| semantics.rb:406:5:406:5 | h [element :foo] | semantics.rb:406:5:406:5 | [post] h [element :foo] | +| semantics.rb:406:5:406:5 | h [element :foo] | semantics.rb:406:5:406:5 | [post] h [element :foo] | +| semantics.rb:406:15:406:25 | call to source | semantics.rb:406:5:406:5 | [post] h [element :bar] | +| semantics.rb:406:15:406:25 | call to source | semantics.rb:406:5:406:5 | [post] h [element :bar] | +| semantics.rb:407:5:407:5 | [post] h [element] | semantics.rb:409:10:409:10 | h [element] | +| semantics.rb:407:5:407:5 | [post] h [element] | semantics.rb:409:10:409:10 | h [element] | +| semantics.rb:407:5:407:5 | [post] h [element] | semantics.rb:410:10:410:10 | h [element] | +| semantics.rb:407:5:407:5 | [post] h [element] | semantics.rb:410:10:410:10 | h [element] | +| semantics.rb:407:12:407:22 | call to source | semantics.rb:407:5:407:5 | [post] h [element] | +| semantics.rb:407:12:407:22 | call to source | semantics.rb:407:5:407:5 | [post] h [element] | +| semantics.rb:409:10:409:10 | h [element :foo] | semantics.rb:409:10:409:16 | ...[...] | +| semantics.rb:409:10:409:10 | h [element :foo] | semantics.rb:409:10:409:16 | ...[...] | +| semantics.rb:409:10:409:10 | h [element] | semantics.rb:409:10:409:16 | ...[...] | +| semantics.rb:409:10:409:10 | h [element] | semantics.rb:409:10:409:16 | ...[...] | +| semantics.rb:410:10:410:10 | h [element :bar] | semantics.rb:410:10:410:16 | ...[...] | +| semantics.rb:410:10:410:10 | h [element :bar] | semantics.rb:410:10:410:16 | ...[...] | +| semantics.rb:410:10:410:10 | h [element] | semantics.rb:410:10:410:16 | ...[...] | +| semantics.rb:410:10:410:10 | h [element] | semantics.rb:410:10:410:16 | ...[...] | +| semantics.rb:412:5:412:5 | x [element :bar] | semantics.rb:415:10:415:10 | x [element :bar] | +| semantics.rb:412:5:412:5 | x [element :bar] | semantics.rb:415:10:415:10 | x [element :bar] | +| semantics.rb:412:9:412:14 | call to s47 [element :bar] | semantics.rb:412:5:412:5 | x [element :bar] | +| semantics.rb:412:9:412:14 | call to s47 [element :bar] | semantics.rb:412:5:412:5 | x [element :bar] | +| semantics.rb:412:13:412:13 | h [element :bar] | semantics.rb:412:9:412:14 | call to s47 [element :bar] | +| semantics.rb:412:13:412:13 | h [element :bar] | semantics.rb:412:9:412:14 | call to s47 [element :bar] | +| semantics.rb:415:10:415:10 | x [element :bar] | semantics.rb:415:10:415:16 | ...[...] | +| semantics.rb:415:10:415:10 | x [element :bar] | semantics.rb:415:10:415:16 | ...[...] | +| semantics.rb:419:5:419:5 | [post] h [element :foo] | semantics.rb:420:5:420:5 | h [element :foo] | +| semantics.rb:419:5:419:5 | [post] h [element :foo] | semantics.rb:420:5:420:5 | h [element :foo] | +| semantics.rb:419:15:419:25 | call to source | semantics.rb:419:5:419:5 | [post] h [element :foo] | +| semantics.rb:419:15:419:25 | call to source | semantics.rb:419:5:419:5 | [post] h [element :foo] | +| semantics.rb:420:5:420:5 | [post] h [element :bar] | semantics.rb:424:10:424:10 | h [element :bar] | +| semantics.rb:420:5:420:5 | [post] h [element :bar] | semantics.rb:424:10:424:10 | h [element :bar] | +| semantics.rb:420:5:420:5 | [post] h [element :bar] | semantics.rb:426:13:426:13 | h [element :bar] | +| semantics.rb:420:5:420:5 | [post] h [element :bar] | semantics.rb:426:13:426:13 | h [element :bar] | +| semantics.rb:420:5:420:5 | [post] h [element :foo] | semantics.rb:423:10:423:10 | h [element :foo] | +| semantics.rb:420:5:420:5 | [post] h [element :foo] | semantics.rb:423:10:423:10 | h [element :foo] | +| semantics.rb:420:5:420:5 | h [element :foo] | semantics.rb:420:5:420:5 | [post] h [element :foo] | +| semantics.rb:420:5:420:5 | h [element :foo] | semantics.rb:420:5:420:5 | [post] h [element :foo] | +| semantics.rb:420:15:420:25 | call to source | semantics.rb:420:5:420:5 | [post] h [element :bar] | +| semantics.rb:420:15:420:25 | call to source | semantics.rb:420:5:420:5 | [post] h [element :bar] | +| semantics.rb:421:5:421:5 | [post] h [element] | semantics.rb:423:10:423:10 | h [element] | +| semantics.rb:421:5:421:5 | [post] h [element] | semantics.rb:423:10:423:10 | h [element] | +| semantics.rb:421:5:421:5 | [post] h [element] | semantics.rb:424:10:424:10 | h [element] | +| semantics.rb:421:5:421:5 | [post] h [element] | semantics.rb:424:10:424:10 | h [element] | +| semantics.rb:421:12:421:22 | call to source | semantics.rb:421:5:421:5 | [post] h [element] | +| semantics.rb:421:12:421:22 | call to source | semantics.rb:421:5:421:5 | [post] h [element] | +| semantics.rb:423:10:423:10 | h [element :foo] | semantics.rb:423:10:423:16 | ...[...] | +| semantics.rb:423:10:423:10 | h [element :foo] | semantics.rb:423:10:423:16 | ...[...] | +| semantics.rb:423:10:423:10 | h [element] | semantics.rb:423:10:423:16 | ...[...] | +| semantics.rb:423:10:423:10 | h [element] | semantics.rb:423:10:423:16 | ...[...] | +| semantics.rb:424:10:424:10 | h [element :bar] | semantics.rb:424:10:424:16 | ...[...] | +| semantics.rb:424:10:424:10 | h [element :bar] | semantics.rb:424:10:424:16 | ...[...] | +| semantics.rb:424:10:424:10 | h [element] | semantics.rb:424:10:424:16 | ...[...] | +| semantics.rb:424:10:424:10 | h [element] | semantics.rb:424:10:424:16 | ...[...] | +| semantics.rb:426:5:426:5 | x [element :bar] | semantics.rb:429:10:429:10 | x [element :bar] | +| semantics.rb:426:5:426:5 | x [element :bar] | semantics.rb:429:10:429:10 | x [element :bar] | +| semantics.rb:426:9:426:14 | call to s48 [element :bar] | semantics.rb:426:5:426:5 | x [element :bar] | +| semantics.rb:426:9:426:14 | call to s48 [element :bar] | semantics.rb:426:5:426:5 | x [element :bar] | +| semantics.rb:426:13:426:13 | h [element :bar] | semantics.rb:426:9:426:14 | call to s48 [element :bar] | +| semantics.rb:426:13:426:13 | h [element :bar] | semantics.rb:426:9:426:14 | call to s48 [element :bar] | +| semantics.rb:429:10:429:10 | x [element :bar] | semantics.rb:429:10:429:16 | ...[...] | +| semantics.rb:429:10:429:10 | x [element :bar] | semantics.rb:429:10:429:16 | ...[...] | +| semantics.rb:433:5:433:5 | [post] h [element :foo] | semantics.rb:434:5:434:5 | h [element :foo] | +| semantics.rb:433:5:433:5 | [post] h [element :foo] | semantics.rb:434:5:434:5 | h [element :foo] | +| semantics.rb:433:15:433:25 | call to source | semantics.rb:433:5:433:5 | [post] h [element :foo] | +| semantics.rb:433:15:433:25 | call to source | semantics.rb:433:5:433:5 | [post] h [element :foo] | +| semantics.rb:434:5:434:5 | [post] h [element :bar] | semantics.rb:438:10:438:10 | h [element :bar] | +| semantics.rb:434:5:434:5 | [post] h [element :bar] | semantics.rb:438:10:438:10 | h [element :bar] | +| semantics.rb:434:5:434:5 | [post] h [element :bar] | semantics.rb:440:13:440:13 | h [element :bar] | +| semantics.rb:434:5:434:5 | [post] h [element :bar] | semantics.rb:440:13:440:13 | h [element :bar] | +| semantics.rb:434:5:434:5 | [post] h [element :foo] | semantics.rb:437:10:437:10 | h [element :foo] | +| semantics.rb:434:5:434:5 | [post] h [element :foo] | semantics.rb:437:10:437:10 | h [element :foo] | +| semantics.rb:434:5:434:5 | h [element :foo] | semantics.rb:434:5:434:5 | [post] h [element :foo] | +| semantics.rb:434:5:434:5 | h [element :foo] | semantics.rb:434:5:434:5 | [post] h [element :foo] | +| semantics.rb:434:15:434:25 | call to source | semantics.rb:434:5:434:5 | [post] h [element :bar] | +| semantics.rb:434:15:434:25 | call to source | semantics.rb:434:5:434:5 | [post] h [element :bar] | +| semantics.rb:435:5:435:5 | [post] h [element] | semantics.rb:437:10:437:10 | h [element] | +| semantics.rb:435:5:435:5 | [post] h [element] | semantics.rb:437:10:437:10 | h [element] | +| semantics.rb:435:5:435:5 | [post] h [element] | semantics.rb:438:10:438:10 | h [element] | +| semantics.rb:435:5:435:5 | [post] h [element] | semantics.rb:438:10:438:10 | h [element] | +| semantics.rb:435:5:435:5 | [post] h [element] | semantics.rb:440:13:440:13 | h [element] | +| semantics.rb:435:5:435:5 | [post] h [element] | semantics.rb:440:13:440:13 | h [element] | +| semantics.rb:435:12:435:22 | call to source | semantics.rb:435:5:435:5 | [post] h [element] | +| semantics.rb:435:12:435:22 | call to source | semantics.rb:435:5:435:5 | [post] h [element] | +| semantics.rb:437:10:437:10 | h [element :foo] | semantics.rb:437:10:437:16 | ...[...] | +| semantics.rb:437:10:437:10 | h [element :foo] | semantics.rb:437:10:437:16 | ...[...] | +| semantics.rb:437:10:437:10 | h [element] | semantics.rb:437:10:437:16 | ...[...] | +| semantics.rb:437:10:437:10 | h [element] | semantics.rb:437:10:437:16 | ...[...] | +| semantics.rb:438:10:438:10 | h [element :bar] | semantics.rb:438:10:438:16 | ...[...] | +| semantics.rb:438:10:438:10 | h [element :bar] | semantics.rb:438:10:438:16 | ...[...] | +| semantics.rb:438:10:438:10 | h [element] | semantics.rb:438:10:438:16 | ...[...] | +| semantics.rb:438:10:438:10 | h [element] | semantics.rb:438:10:438:16 | ...[...] | +| semantics.rb:440:5:440:5 | x [element :bar] | semantics.rb:443:10:443:10 | x [element :bar] | +| semantics.rb:440:5:440:5 | x [element :bar] | semantics.rb:443:10:443:10 | x [element :bar] | +| semantics.rb:440:5:440:5 | x [element] | semantics.rb:442:10:442:10 | x [element] | +| semantics.rb:440:5:440:5 | x [element] | semantics.rb:442:10:442:10 | x [element] | +| semantics.rb:440:5:440:5 | x [element] | semantics.rb:443:10:443:10 | x [element] | +| semantics.rb:440:5:440:5 | x [element] | semantics.rb:443:10:443:10 | x [element] | +| semantics.rb:440:9:440:14 | call to s49 [element :bar] | semantics.rb:440:5:440:5 | x [element :bar] | +| semantics.rb:440:9:440:14 | call to s49 [element :bar] | semantics.rb:440:5:440:5 | x [element :bar] | +| semantics.rb:440:9:440:14 | call to s49 [element] | semantics.rb:440:5:440:5 | x [element] | +| semantics.rb:440:9:440:14 | call to s49 [element] | semantics.rb:440:5:440:5 | x [element] | +| semantics.rb:440:13:440:13 | h [element :bar] | semantics.rb:440:9:440:14 | call to s49 [element :bar] | +| semantics.rb:440:13:440:13 | h [element :bar] | semantics.rb:440:9:440:14 | call to s49 [element :bar] | +| semantics.rb:440:13:440:13 | h [element] | semantics.rb:440:9:440:14 | call to s49 [element] | +| semantics.rb:440:13:440:13 | h [element] | semantics.rb:440:9:440:14 | call to s49 [element] | +| semantics.rb:442:10:442:10 | x [element] | semantics.rb:442:10:442:16 | ...[...] | +| semantics.rb:442:10:442:10 | x [element] | semantics.rb:442:10:442:16 | ...[...] | +| semantics.rb:443:10:443:10 | x [element :bar] | semantics.rb:443:10:443:16 | ...[...] | +| semantics.rb:443:10:443:10 | x [element :bar] | semantics.rb:443:10:443:16 | ...[...] | +| semantics.rb:443:10:443:10 | x [element] | semantics.rb:443:10:443:16 | ...[...] | +| semantics.rb:443:10:443:10 | x [element] | semantics.rb:443:10:443:16 | ...[...] | +| semantics.rb:447:5:447:5 | [post] h [element :foo] | semantics.rb:448:5:448:5 | h [element :foo] | +| semantics.rb:447:5:447:5 | [post] h [element :foo] | semantics.rb:448:5:448:5 | h [element :foo] | +| semantics.rb:447:15:447:25 | call to source | semantics.rb:447:5:447:5 | [post] h [element :foo] | +| semantics.rb:447:15:447:25 | call to source | semantics.rb:447:5:447:5 | [post] h [element :foo] | +| semantics.rb:448:5:448:5 | [post] h [element :bar] | semantics.rb:452:10:452:10 | h [element :bar] | +| semantics.rb:448:5:448:5 | [post] h [element :bar] | semantics.rb:452:10:452:10 | h [element :bar] | +| semantics.rb:448:5:448:5 | [post] h [element :bar] | semantics.rb:454:9:454:9 | h [element :bar] | +| semantics.rb:448:5:448:5 | [post] h [element :bar] | semantics.rb:454:9:454:9 | h [element :bar] | +| semantics.rb:448:5:448:5 | [post] h [element :foo] | semantics.rb:451:10:451:10 | h [element :foo] | +| semantics.rb:448:5:448:5 | [post] h [element :foo] | semantics.rb:451:10:451:10 | h [element :foo] | +| semantics.rb:448:5:448:5 | h [element :foo] | semantics.rb:448:5:448:5 | [post] h [element :foo] | +| semantics.rb:448:5:448:5 | h [element :foo] | semantics.rb:448:5:448:5 | [post] h [element :foo] | +| semantics.rb:448:15:448:25 | call to source | semantics.rb:448:5:448:5 | [post] h [element :bar] | +| semantics.rb:448:15:448:25 | call to source | semantics.rb:448:5:448:5 | [post] h [element :bar] | +| semantics.rb:449:5:449:5 | [post] h [element] | semantics.rb:451:10:451:10 | h [element] | +| semantics.rb:449:5:449:5 | [post] h [element] | semantics.rb:451:10:451:10 | h [element] | +| semantics.rb:449:5:449:5 | [post] h [element] | semantics.rb:452:10:452:10 | h [element] | +| semantics.rb:449:5:449:5 | [post] h [element] | semantics.rb:452:10:452:10 | h [element] | +| semantics.rb:449:12:449:22 | call to source | semantics.rb:449:5:449:5 | [post] h [element] | +| semantics.rb:449:12:449:22 | call to source | semantics.rb:449:5:449:5 | [post] h [element] | +| semantics.rb:451:10:451:10 | h [element :foo] | semantics.rb:451:10:451:16 | ...[...] | +| semantics.rb:451:10:451:10 | h [element :foo] | semantics.rb:451:10:451:16 | ...[...] | +| semantics.rb:451:10:451:10 | h [element] | semantics.rb:451:10:451:16 | ...[...] | +| semantics.rb:451:10:451:10 | h [element] | semantics.rb:451:10:451:16 | ...[...] | +| semantics.rb:452:10:452:10 | h [element :bar] | semantics.rb:452:10:452:16 | ...[...] | +| semantics.rb:452:10:452:10 | h [element :bar] | semantics.rb:452:10:452:16 | ...[...] | +| semantics.rb:452:10:452:10 | h [element] | semantics.rb:452:10:452:16 | ...[...] | +| semantics.rb:452:10:452:10 | h [element] | semantics.rb:452:10:452:16 | ...[...] | +| semantics.rb:454:9:454:9 | [post] h [element :bar] | semantics.rb:457:10:457:10 | h [element :bar] | +| semantics.rb:454:9:454:9 | [post] h [element :bar] | semantics.rb:457:10:457:10 | h [element :bar] | +| semantics.rb:454:9:454:9 | h [element :bar] | semantics.rb:454:9:454:9 | [post] h [element :bar] | +| semantics.rb:454:9:454:9 | h [element :bar] | semantics.rb:454:9:454:9 | [post] h [element :bar] | +| semantics.rb:457:10:457:10 | h [element :bar] | semantics.rb:457:10:457:16 | ...[...] | +| semantics.rb:457:10:457:10 | h [element :bar] | semantics.rb:457:10:457:16 | ...[...] | +| semantics.rb:461:5:461:5 | [post] h [element :foo] | semantics.rb:462:5:462:5 | h [element :foo] | +| semantics.rb:461:5:461:5 | [post] h [element :foo] | semantics.rb:462:5:462:5 | h [element :foo] | +| semantics.rb:461:15:461:25 | call to source | semantics.rb:461:5:461:5 | [post] h [element :foo] | +| semantics.rb:461:15:461:25 | call to source | semantics.rb:461:5:461:5 | [post] h [element :foo] | +| semantics.rb:462:5:462:5 | [post] h [element :bar] | semantics.rb:466:10:466:10 | h [element :bar] | +| semantics.rb:462:5:462:5 | [post] h [element :bar] | semantics.rb:466:10:466:10 | h [element :bar] | +| semantics.rb:462:5:462:5 | [post] h [element :bar] | semantics.rb:468:9:468:9 | h [element :bar] | +| semantics.rb:462:5:462:5 | [post] h [element :bar] | semantics.rb:468:9:468:9 | h [element :bar] | +| semantics.rb:462:5:462:5 | [post] h [element :foo] | semantics.rb:465:10:465:10 | h [element :foo] | +| semantics.rb:462:5:462:5 | [post] h [element :foo] | semantics.rb:465:10:465:10 | h [element :foo] | +| semantics.rb:462:5:462:5 | h [element :foo] | semantics.rb:462:5:462:5 | [post] h [element :foo] | +| semantics.rb:462:5:462:5 | h [element :foo] | semantics.rb:462:5:462:5 | [post] h [element :foo] | +| semantics.rb:462:15:462:25 | call to source | semantics.rb:462:5:462:5 | [post] h [element :bar] | +| semantics.rb:462:15:462:25 | call to source | semantics.rb:462:5:462:5 | [post] h [element :bar] | +| semantics.rb:463:5:463:5 | [post] h [element] | semantics.rb:465:10:465:10 | h [element] | +| semantics.rb:463:5:463:5 | [post] h [element] | semantics.rb:465:10:465:10 | h [element] | +| semantics.rb:463:5:463:5 | [post] h [element] | semantics.rb:466:10:466:10 | h [element] | +| semantics.rb:463:5:463:5 | [post] h [element] | semantics.rb:466:10:466:10 | h [element] | +| semantics.rb:463:5:463:5 | [post] h [element] | semantics.rb:468:9:468:9 | h [element] | +| semantics.rb:463:5:463:5 | [post] h [element] | semantics.rb:468:9:468:9 | h [element] | +| semantics.rb:463:12:463:22 | call to source | semantics.rb:463:5:463:5 | [post] h [element] | +| semantics.rb:463:12:463:22 | call to source | semantics.rb:463:5:463:5 | [post] h [element] | +| semantics.rb:465:10:465:10 | h [element :foo] | semantics.rb:465:10:465:16 | ...[...] | +| semantics.rb:465:10:465:10 | h [element :foo] | semantics.rb:465:10:465:16 | ...[...] | +| semantics.rb:465:10:465:10 | h [element] | semantics.rb:465:10:465:16 | ...[...] | +| semantics.rb:465:10:465:10 | h [element] | semantics.rb:465:10:465:16 | ...[...] | +| semantics.rb:466:10:466:10 | h [element :bar] | semantics.rb:466:10:466:16 | ...[...] | +| semantics.rb:466:10:466:10 | h [element :bar] | semantics.rb:466:10:466:16 | ...[...] | +| semantics.rb:466:10:466:10 | h [element] | semantics.rb:466:10:466:16 | ...[...] | +| semantics.rb:466:10:466:10 | h [element] | semantics.rb:466:10:466:16 | ...[...] | +| semantics.rb:468:9:468:9 | [post] h [element :bar] | semantics.rb:471:10:471:10 | h [element :bar] | +| semantics.rb:468:9:468:9 | [post] h [element :bar] | semantics.rb:471:10:471:10 | h [element :bar] | +| semantics.rb:468:9:468:9 | [post] h [element] | semantics.rb:470:10:470:10 | h [element] | +| semantics.rb:468:9:468:9 | [post] h [element] | semantics.rb:470:10:470:10 | h [element] | +| semantics.rb:468:9:468:9 | [post] h [element] | semantics.rb:471:10:471:10 | h [element] | +| semantics.rb:468:9:468:9 | [post] h [element] | semantics.rb:471:10:471:10 | h [element] | +| semantics.rb:468:9:468:9 | h [element :bar] | semantics.rb:468:9:468:9 | [post] h [element :bar] | +| semantics.rb:468:9:468:9 | h [element :bar] | semantics.rb:468:9:468:9 | [post] h [element :bar] | +| semantics.rb:468:9:468:9 | h [element] | semantics.rb:468:9:468:9 | [post] h [element] | +| semantics.rb:468:9:468:9 | h [element] | semantics.rb:468:9:468:9 | [post] h [element] | +| semantics.rb:470:10:470:10 | h [element] | semantics.rb:470:10:470:16 | ...[...] | +| semantics.rb:470:10:470:10 | h [element] | semantics.rb:470:10:470:16 | ...[...] | +| semantics.rb:471:10:471:10 | h [element :bar] | semantics.rb:471:10:471:16 | ...[...] | +| semantics.rb:471:10:471:10 | h [element :bar] | semantics.rb:471:10:471:16 | ...[...] | +| semantics.rb:471:10:471:10 | h [element] | semantics.rb:471:10:471:16 | ...[...] | +| semantics.rb:471:10:471:10 | h [element] | semantics.rb:471:10:471:16 | ...[...] | +| semantics.rb:475:5:475:5 | [post] h [element :foo] | semantics.rb:476:5:476:5 | h [element :foo] | +| semantics.rb:475:5:475:5 | [post] h [element :foo] | semantics.rb:476:5:476:5 | h [element :foo] | +| semantics.rb:475:15:475:25 | call to source | semantics.rb:475:5:475:5 | [post] h [element :foo] | +| semantics.rb:475:15:475:25 | call to source | semantics.rb:475:5:475:5 | [post] h [element :foo] | +| semantics.rb:476:5:476:5 | [post] h [element :bar] | semantics.rb:480:10:480:10 | h [element :bar] | +| semantics.rb:476:5:476:5 | [post] h [element :bar] | semantics.rb:480:10:480:10 | h [element :bar] | +| semantics.rb:476:5:476:5 | [post] h [element :bar] | semantics.rb:482:5:482:5 | h [element :bar] | +| semantics.rb:476:5:476:5 | [post] h [element :bar] | semantics.rb:482:5:482:5 | h [element :bar] | +| semantics.rb:476:5:476:5 | [post] h [element :foo] | semantics.rb:479:10:479:10 | h [element :foo] | +| semantics.rb:476:5:476:5 | [post] h [element :foo] | semantics.rb:479:10:479:10 | h [element :foo] | +| semantics.rb:476:5:476:5 | h [element :foo] | semantics.rb:476:5:476:5 | [post] h [element :foo] | +| semantics.rb:476:5:476:5 | h [element :foo] | semantics.rb:476:5:476:5 | [post] h [element :foo] | +| semantics.rb:476:15:476:25 | call to source | semantics.rb:476:5:476:5 | [post] h [element :bar] | +| semantics.rb:476:15:476:25 | call to source | semantics.rb:476:5:476:5 | [post] h [element :bar] | +| semantics.rb:477:5:477:5 | [post] h [element] | semantics.rb:479:10:479:10 | h [element] | +| semantics.rb:477:5:477:5 | [post] h [element] | semantics.rb:479:10:479:10 | h [element] | +| semantics.rb:477:5:477:5 | [post] h [element] | semantics.rb:480:10:480:10 | h [element] | +| semantics.rb:477:5:477:5 | [post] h [element] | semantics.rb:480:10:480:10 | h [element] | +| semantics.rb:477:12:477:22 | call to source | semantics.rb:477:5:477:5 | [post] h [element] | +| semantics.rb:477:12:477:22 | call to source | semantics.rb:477:5:477:5 | [post] h [element] | +| semantics.rb:479:10:479:10 | h [element :foo] | semantics.rb:479:10:479:16 | ...[...] | +| semantics.rb:479:10:479:10 | h [element :foo] | semantics.rb:479:10:479:16 | ...[...] | +| semantics.rb:479:10:479:10 | h [element] | semantics.rb:479:10:479:16 | ...[...] | +| semantics.rb:479:10:479:10 | h [element] | semantics.rb:479:10:479:16 | ...[...] | +| semantics.rb:480:10:480:10 | h [element :bar] | semantics.rb:480:10:480:16 | ...[...] | +| semantics.rb:480:10:480:10 | h [element :bar] | semantics.rb:480:10:480:16 | ...[...] | +| semantics.rb:480:10:480:10 | h [element] | semantics.rb:480:10:480:16 | ...[...] | +| semantics.rb:480:10:480:10 | h [element] | semantics.rb:480:10:480:16 | ...[...] | +| semantics.rb:482:5:482:5 | [post] h [element :bar] | semantics.rb:485:10:485:10 | h [element :bar] | +| semantics.rb:482:5:482:5 | [post] h [element :bar] | semantics.rb:485:10:485:10 | h [element :bar] | +| semantics.rb:482:5:482:5 | h [element :bar] | semantics.rb:482:5:482:5 | [post] h [element :bar] | +| semantics.rb:482:5:482:5 | h [element :bar] | semantics.rb:482:5:482:5 | [post] h [element :bar] | +| semantics.rb:485:10:485:10 | h [element :bar] | semantics.rb:485:10:485:16 | ...[...] | +| semantics.rb:485:10:485:10 | h [element :bar] | semantics.rb:485:10:485:16 | ...[...] | +| semantics.rb:489:5:489:5 | [post] h [element :foo] | semantics.rb:490:5:490:5 | h [element :foo] | +| semantics.rb:489:5:489:5 | [post] h [element :foo] | semantics.rb:490:5:490:5 | h [element :foo] | +| semantics.rb:489:15:489:25 | call to source | semantics.rb:489:5:489:5 | [post] h [element :foo] | +| semantics.rb:489:15:489:25 | call to source | semantics.rb:489:5:489:5 | [post] h [element :foo] | +| semantics.rb:490:5:490:5 | [post] h [element :bar] | semantics.rb:494:10:494:10 | h [element :bar] | +| semantics.rb:490:5:490:5 | [post] h [element :bar] | semantics.rb:494:10:494:10 | h [element :bar] | +| semantics.rb:490:5:490:5 | [post] h [element :bar] | semantics.rb:496:9:496:9 | h [element :bar] | +| semantics.rb:490:5:490:5 | [post] h [element :bar] | semantics.rb:496:9:496:9 | h [element :bar] | +| semantics.rb:490:5:490:5 | [post] h [element :foo] | semantics.rb:493:10:493:10 | h [element :foo] | +| semantics.rb:490:5:490:5 | [post] h [element :foo] | semantics.rb:493:10:493:10 | h [element :foo] | +| semantics.rb:490:5:490:5 | h [element :foo] | semantics.rb:490:5:490:5 | [post] h [element :foo] | +| semantics.rb:490:5:490:5 | h [element :foo] | semantics.rb:490:5:490:5 | [post] h [element :foo] | +| semantics.rb:490:15:490:25 | call to source | semantics.rb:490:5:490:5 | [post] h [element :bar] | +| semantics.rb:490:15:490:25 | call to source | semantics.rb:490:5:490:5 | [post] h [element :bar] | +| semantics.rb:491:5:491:5 | [post] h [element] | semantics.rb:493:10:493:10 | h [element] | +| semantics.rb:491:5:491:5 | [post] h [element] | semantics.rb:493:10:493:10 | h [element] | +| semantics.rb:491:5:491:5 | [post] h [element] | semantics.rb:494:10:494:10 | h [element] | +| semantics.rb:491:5:491:5 | [post] h [element] | semantics.rb:494:10:494:10 | h [element] | +| semantics.rb:491:12:491:22 | call to source | semantics.rb:491:5:491:5 | [post] h [element] | +| semantics.rb:491:12:491:22 | call to source | semantics.rb:491:5:491:5 | [post] h [element] | +| semantics.rb:493:10:493:10 | h [element :foo] | semantics.rb:493:10:493:16 | ...[...] | +| semantics.rb:493:10:493:10 | h [element :foo] | semantics.rb:493:10:493:16 | ...[...] | +| semantics.rb:493:10:493:10 | h [element] | semantics.rb:493:10:493:16 | ...[...] | +| semantics.rb:493:10:493:10 | h [element] | semantics.rb:493:10:493:16 | ...[...] | +| semantics.rb:494:10:494:10 | h [element :bar] | semantics.rb:494:10:494:16 | ...[...] | +| semantics.rb:494:10:494:10 | h [element :bar] | semantics.rb:494:10:494:16 | ...[...] | +| semantics.rb:494:10:494:10 | h [element] | semantics.rb:494:10:494:16 | ...[...] | +| semantics.rb:494:10:494:10 | h [element] | semantics.rb:494:10:494:16 | ...[...] | +| semantics.rb:496:5:496:5 | x [element :bar] | semantics.rb:499:10:499:10 | x [element :bar] | +| semantics.rb:496:5:496:5 | x [element :bar] | semantics.rb:499:10:499:10 | x [element :bar] | +| semantics.rb:496:9:496:9 | h [element :bar] | semantics.rb:496:9:496:15 | call to s53 [element :bar] | +| semantics.rb:496:9:496:9 | h [element :bar] | semantics.rb:496:9:496:15 | call to s53 [element :bar] | +| semantics.rb:496:9:496:15 | call to s53 [element :bar] | semantics.rb:496:5:496:5 | x [element :bar] | +| semantics.rb:496:9:496:15 | call to s53 [element :bar] | semantics.rb:496:5:496:5 | x [element :bar] | +| semantics.rb:499:10:499:10 | x [element :bar] | semantics.rb:499:10:499:16 | ...[...] | +| semantics.rb:499:10:499:10 | x [element :bar] | semantics.rb:499:10:499:16 | ...[...] | +| semantics.rb:501:10:501:20 | call to source | semantics.rb:501:10:501:26 | call to s53 | +| semantics.rb:501:10:501:20 | call to source | semantics.rb:501:10:501:26 | call to s53 | +| semantics.rb:505:5:505:5 | [post] h [element :foo] | semantics.rb:506:5:506:5 | h [element :foo] | +| semantics.rb:505:5:505:5 | [post] h [element :foo] | semantics.rb:506:5:506:5 | h [element :foo] | +| semantics.rb:505:15:505:25 | call to source | semantics.rb:505:5:505:5 | [post] h [element :foo] | +| semantics.rb:505:15:505:25 | call to source | semantics.rb:505:5:505:5 | [post] h [element :foo] | +| semantics.rb:506:5:506:5 | [post] h [element :bar] | semantics.rb:510:10:510:10 | h [element :bar] | +| semantics.rb:506:5:506:5 | [post] h [element :bar] | semantics.rb:510:10:510:10 | h [element :bar] | +| semantics.rb:506:5:506:5 | [post] h [element :bar] | semantics.rb:512:9:512:9 | h [element :bar] | +| semantics.rb:506:5:506:5 | [post] h [element :bar] | semantics.rb:512:9:512:9 | h [element :bar] | +| semantics.rb:506:5:506:5 | [post] h [element :foo] | semantics.rb:509:10:509:10 | h [element :foo] | +| semantics.rb:506:5:506:5 | [post] h [element :foo] | semantics.rb:509:10:509:10 | h [element :foo] | +| semantics.rb:506:5:506:5 | h [element :foo] | semantics.rb:506:5:506:5 | [post] h [element :foo] | +| semantics.rb:506:5:506:5 | h [element :foo] | semantics.rb:506:5:506:5 | [post] h [element :foo] | +| semantics.rb:506:15:506:25 | call to source | semantics.rb:506:5:506:5 | [post] h [element :bar] | +| semantics.rb:506:15:506:25 | call to source | semantics.rb:506:5:506:5 | [post] h [element :bar] | +| semantics.rb:507:5:507:5 | [post] h [element] | semantics.rb:509:10:509:10 | h [element] | +| semantics.rb:507:5:507:5 | [post] h [element] | semantics.rb:509:10:509:10 | h [element] | +| semantics.rb:507:5:507:5 | [post] h [element] | semantics.rb:510:10:510:10 | h [element] | +| semantics.rb:507:5:507:5 | [post] h [element] | semantics.rb:510:10:510:10 | h [element] | +| semantics.rb:507:12:507:22 | call to source | semantics.rb:507:5:507:5 | [post] h [element] | +| semantics.rb:507:12:507:22 | call to source | semantics.rb:507:5:507:5 | [post] h [element] | +| semantics.rb:509:10:509:10 | h [element :foo] | semantics.rb:509:10:509:16 | ...[...] | +| semantics.rb:509:10:509:10 | h [element :foo] | semantics.rb:509:10:509:16 | ...[...] | +| semantics.rb:509:10:509:10 | h [element] | semantics.rb:509:10:509:16 | ...[...] | +| semantics.rb:509:10:509:10 | h [element] | semantics.rb:509:10:509:16 | ...[...] | +| semantics.rb:510:10:510:10 | h [element :bar] | semantics.rb:510:10:510:16 | ...[...] | +| semantics.rb:510:10:510:10 | h [element :bar] | semantics.rb:510:10:510:16 | ...[...] | +| semantics.rb:510:10:510:10 | h [element] | semantics.rb:510:10:510:16 | ...[...] | +| semantics.rb:510:10:510:10 | h [element] | semantics.rb:510:10:510:16 | ...[...] | +| semantics.rb:512:5:512:5 | x [element :bar] | semantics.rb:515:10:515:10 | x [element :bar] | +| semantics.rb:512:5:512:5 | x [element :bar] | semantics.rb:515:10:515:10 | x [element :bar] | +| semantics.rb:512:9:512:9 | h [element :bar] | semantics.rb:512:9:512:15 | call to s54 [element :bar] | +| semantics.rb:512:9:512:9 | h [element :bar] | semantics.rb:512:9:512:15 | call to s54 [element :bar] | +| semantics.rb:512:9:512:15 | call to s54 [element :bar] | semantics.rb:512:5:512:5 | x [element :bar] | +| semantics.rb:512:9:512:15 | call to s54 [element :bar] | semantics.rb:512:5:512:5 | x [element :bar] | +| semantics.rb:515:10:515:10 | x [element :bar] | semantics.rb:515:10:515:16 | ...[...] | +| semantics.rb:515:10:515:10 | x [element :bar] | semantics.rb:515:10:515:16 | ...[...] | nodes -| semantics.rb:2:5:2:5 | a : | semmle.label | a : | -| semantics.rb:2:5:2:5 | a : | semmle.label | a : | -| semantics.rb:2:9:2:18 | call to source : | semmle.label | call to source : | -| semantics.rb:2:9:2:18 | call to source : | semmle.label | call to source : | -| semantics.rb:3:5:3:5 | x : | semmle.label | x : | -| semantics.rb:3:5:3:5 | x : | semmle.label | x : | -| semantics.rb:3:9:3:9 | a : | semmle.label | a : | -| semantics.rb:3:9:3:9 | a : | semmle.label | a : | -| semantics.rb:3:9:3:14 | call to s1 : | semmle.label | call to s1 : | -| semantics.rb:3:9:3:14 | call to s1 : | semmle.label | call to s1 : | +| semantics.rb:2:5:2:5 | a | semmle.label | a | +| semantics.rb:2:5:2:5 | a | semmle.label | a | +| semantics.rb:2:9:2:18 | call to source | semmle.label | call to source | +| semantics.rb:2:9:2:18 | call to source | semmle.label | call to source | +| semantics.rb:3:5:3:5 | x | semmle.label | x | +| semantics.rb:3:5:3:5 | x | semmle.label | x | +| semantics.rb:3:9:3:9 | a | semmle.label | a | +| semantics.rb:3:9:3:9 | a | semmle.label | a | +| semantics.rb:3:9:3:14 | call to s1 | semmle.label | call to s1 | +| semantics.rb:3:9:3:14 | call to s1 | semmle.label | call to s1 | | semantics.rb:4:10:4:10 | x | semmle.label | x | | semantics.rb:4:10:4:10 | x | semmle.label | x | -| semantics.rb:8:5:8:5 | a : | semmle.label | a : | -| semantics.rb:8:5:8:5 | a : | semmle.label | a : | -| semantics.rb:8:9:8:18 | call to source : | semmle.label | call to source : | -| semantics.rb:8:9:8:18 | call to source : | semmle.label | call to source : | -| semantics.rb:9:5:9:5 | [post] x : | semmle.label | [post] x : | -| semantics.rb:9:5:9:5 | [post] x : | semmle.label | [post] x : | -| semantics.rb:9:10:9:10 | a : | semmle.label | a : | -| semantics.rb:9:10:9:10 | a : | semmle.label | a : | +| semantics.rb:8:5:8:5 | a | semmle.label | a | +| semantics.rb:8:5:8:5 | a | semmle.label | a | +| semantics.rb:8:9:8:18 | call to source | semmle.label | call to source | +| semantics.rb:8:9:8:18 | call to source | semmle.label | call to source | +| semantics.rb:9:5:9:5 | [post] x | semmle.label | [post] x | +| semantics.rb:9:5:9:5 | [post] x | semmle.label | [post] x | +| semantics.rb:9:10:9:10 | a | semmle.label | a | +| semantics.rb:9:10:9:10 | a | semmle.label | a | | semantics.rb:10:10:10:10 | x | semmle.label | x | | semantics.rb:10:10:10:10 | x | semmle.label | x | -| semantics.rb:14:5:14:5 | a : | semmle.label | a : | -| semantics.rb:14:5:14:5 | a : | semmle.label | a : | -| semantics.rb:14:9:14:18 | call to source : | semmle.label | call to source : | -| semantics.rb:14:9:14:18 | call to source : | semmle.label | call to source : | -| semantics.rb:15:8:15:8 | a : | semmle.label | a : | -| semantics.rb:15:8:15:8 | a : | semmle.label | a : | -| semantics.rb:15:11:15:11 | [post] x : | semmle.label | [post] x : | -| semantics.rb:15:11:15:11 | [post] x : | semmle.label | [post] x : | +| semantics.rb:14:5:14:5 | a | semmle.label | a | +| semantics.rb:14:5:14:5 | a | semmle.label | a | +| semantics.rb:14:9:14:18 | call to source | semmle.label | call to source | +| semantics.rb:14:9:14:18 | call to source | semmle.label | call to source | +| semantics.rb:15:8:15:8 | a | semmle.label | a | +| semantics.rb:15:8:15:8 | a | semmle.label | a | +| semantics.rb:15:11:15:11 | [post] x | semmle.label | [post] x | +| semantics.rb:15:11:15:11 | [post] x | semmle.label | [post] x | | semantics.rb:16:10:16:10 | x | semmle.label | x | | semantics.rb:16:10:16:10 | x | semmle.label | x | | semantics.rb:22:10:22:33 | call to s4 | semmle.label | call to s4 | | semantics.rb:22:10:22:33 | call to s4 | semmle.label | call to s4 | -| semantics.rb:22:18:22:32 | call to source : | semmle.label | call to source : | -| semantics.rb:22:18:22:32 | call to source : | semmle.label | call to source : | +| semantics.rb:22:18:22:32 | call to source | semmle.label | call to source | +| semantics.rb:22:18:22:32 | call to source | semmle.label | call to source | | semantics.rb:23:10:23:33 | call to s4 | semmle.label | call to s4 | | semantics.rb:23:10:23:33 | call to s4 | semmle.label | call to s4 | -| semantics.rb:23:23:23:32 | call to source : | semmle.label | call to source : | -| semantics.rb:23:23:23:32 | call to source : | semmle.label | call to source : | -| semantics.rb:28:5:28:5 | a : | semmle.label | a : | -| semantics.rb:28:5:28:5 | a : | semmle.label | a : | -| semantics.rb:28:9:28:18 | call to source : | semmle.label | call to source : | -| semantics.rb:28:9:28:18 | call to source : | semmle.label | call to source : | -| semantics.rb:29:8:29:8 | a : | semmle.label | a : | -| semantics.rb:29:8:29:8 | a : | semmle.label | a : | -| semantics.rb:29:14:29:14 | [post] y : | semmle.label | [post] y : | -| semantics.rb:29:14:29:14 | [post] y : | semmle.label | [post] y : | -| semantics.rb:29:17:29:17 | [post] z : | semmle.label | [post] z : | -| semantics.rb:29:17:29:17 | [post] z : | semmle.label | [post] z : | +| semantics.rb:23:23:23:32 | call to source | semmle.label | call to source | +| semantics.rb:23:23:23:32 | call to source | semmle.label | call to source | +| semantics.rb:28:5:28:5 | a | semmle.label | a | +| semantics.rb:28:5:28:5 | a | semmle.label | a | +| semantics.rb:28:9:28:18 | call to source | semmle.label | call to source | +| semantics.rb:28:9:28:18 | call to source | semmle.label | call to source | +| semantics.rb:29:8:29:8 | a | semmle.label | a | +| semantics.rb:29:8:29:8 | a | semmle.label | a | +| semantics.rb:29:14:29:14 | [post] y | semmle.label | [post] y | +| semantics.rb:29:14:29:14 | [post] y | semmle.label | [post] y | +| semantics.rb:29:17:29:17 | [post] z | semmle.label | [post] z | +| semantics.rb:29:17:29:17 | [post] z | semmle.label | [post] z | | semantics.rb:31:10:31:10 | y | semmle.label | y | | semantics.rb:31:10:31:10 | y | semmle.label | y | | semantics.rb:32:10:32:10 | z | semmle.label | z | | semantics.rb:32:10:32:10 | z | semmle.label | z | -| semantics.rb:40:5:40:5 | a : | semmle.label | a : | -| semantics.rb:40:5:40:5 | a : | semmle.label | a : | -| semantics.rb:40:9:40:18 | call to source : | semmle.label | call to source : | -| semantics.rb:40:9:40:18 | call to source : | semmle.label | call to source : | -| semantics.rb:41:8:41:8 | a : | semmle.label | a : | -| semantics.rb:41:8:41:8 | a : | semmle.label | a : | -| semantics.rb:41:16:41:16 | [post] x : | semmle.label | [post] x : | -| semantics.rb:41:16:41:16 | [post] x : | semmle.label | [post] x : | +| semantics.rb:40:5:40:5 | a | semmle.label | a | +| semantics.rb:40:5:40:5 | a | semmle.label | a | +| semantics.rb:40:9:40:18 | call to source | semmle.label | call to source | +| semantics.rb:40:9:40:18 | call to source | semmle.label | call to source | +| semantics.rb:41:8:41:8 | a | semmle.label | a | +| semantics.rb:41:8:41:8 | a | semmle.label | a | +| semantics.rb:41:16:41:16 | [post] x | semmle.label | [post] x | +| semantics.rb:41:16:41:16 | [post] x | semmle.label | [post] x | | semantics.rb:42:10:42:10 | x | semmle.label | x | | semantics.rb:42:10:42:10 | x | semmle.label | x | | semantics.rb:46:10:46:26 | call to s8 | semmle.label | call to s8 | | semantics.rb:46:10:46:26 | call to s8 | semmle.label | call to s8 | -| semantics.rb:46:15:46:24 | call to source : | semmle.label | call to source : | -| semantics.rb:46:15:46:24 | call to source : | semmle.label | call to source : | +| semantics.rb:46:15:46:24 | call to source | semmle.label | call to source | +| semantics.rb:46:15:46:24 | call to source | semmle.label | call to source | | semantics.rb:47:10:49:7 | call to s8 | semmle.label | call to s8 | | semantics.rb:47:10:49:7 | call to s8 | semmle.label | call to s8 | -| semantics.rb:48:9:48:18 | call to source : | semmle.label | call to source : | -| semantics.rb:48:9:48:18 | call to source : | semmle.label | call to source : | -| semantics.rb:53:8:53:17 | call to source : | semmle.label | call to source : | -| semantics.rb:53:8:53:17 | call to source : | semmle.label | call to source : | -| semantics.rb:53:23:53:23 | x : | semmle.label | x : | -| semantics.rb:53:23:53:23 | x : | semmle.label | x : | +| semantics.rb:48:9:48:18 | call to source | semmle.label | call to source | +| semantics.rb:48:9:48:18 | call to source | semmle.label | call to source | +| semantics.rb:53:8:53:17 | call to source | semmle.label | call to source | +| semantics.rb:53:8:53:17 | call to source | semmle.label | call to source | +| semantics.rb:53:23:53:23 | x | semmle.label | x | +| semantics.rb:53:23:53:23 | x | semmle.label | x | | semantics.rb:53:31:53:31 | x | semmle.label | x | | semantics.rb:53:31:53:31 | x | semmle.label | x | -| semantics.rb:54:8:54:17 | call to source : | semmle.label | call to source : | -| semantics.rb:54:8:54:17 | call to source : | semmle.label | call to source : | -| semantics.rb:54:24:54:24 | x : | semmle.label | x : | -| semantics.rb:54:24:54:24 | x : | semmle.label | x : | +| semantics.rb:54:8:54:17 | call to source | semmle.label | call to source | +| semantics.rb:54:8:54:17 | call to source | semmle.label | call to source | +| semantics.rb:54:24:54:24 | x | semmle.label | x | +| semantics.rb:54:24:54:24 | x | semmle.label | x | | semantics.rb:55:14:55:14 | x | semmle.label | x | | semantics.rb:55:14:55:14 | x | semmle.label | x | -| semantics.rb:60:5:60:5 | a : | semmle.label | a : | -| semantics.rb:60:5:60:5 | a : | semmle.label | a : | -| semantics.rb:60:9:60:18 | call to source : | semmle.label | call to source : | -| semantics.rb:60:9:60:18 | call to source : | semmle.label | call to source : | +| semantics.rb:60:5:60:5 | a | semmle.label | a | +| semantics.rb:60:5:60:5 | a | semmle.label | a | +| semantics.rb:60:9:60:18 | call to source | semmle.label | call to source | +| semantics.rb:60:9:60:18 | call to source | semmle.label | call to source | | semantics.rb:61:10:61:15 | call to s10 | semmle.label | call to s10 | | semantics.rb:61:10:61:15 | call to s10 | semmle.label | call to s10 | -| semantics.rb:61:14:61:14 | a : | semmle.label | a : | -| semantics.rb:61:14:61:14 | a : | semmle.label | a : | +| semantics.rb:61:14:61:14 | a | semmle.label | a | +| semantics.rb:61:14:61:14 | a | semmle.label | a | | semantics.rb:62:10:62:18 | call to s10 | semmle.label | call to s10 | | semantics.rb:62:10:62:18 | call to s10 | semmle.label | call to s10 | -| semantics.rb:62:17:62:17 | a : | semmle.label | a : | -| semantics.rb:62:17:62:17 | a : | semmle.label | a : | +| semantics.rb:62:17:62:17 | a | semmle.label | a | +| semantics.rb:62:17:62:17 | a | semmle.label | a | | semantics.rb:63:10:63:20 | call to s10 | semmle.label | call to s10 | | semantics.rb:63:10:63:20 | call to s10 | semmle.label | call to s10 | -| semantics.rb:63:19:63:19 | a : | semmle.label | a : | -| semantics.rb:63:19:63:19 | a : | semmle.label | a : | +| semantics.rb:63:19:63:19 | a | semmle.label | a | +| semantics.rb:63:19:63:19 | a | semmle.label | a | | semantics.rb:64:10:64:28 | call to s10 | semmle.label | call to s10 | | semantics.rb:64:10:64:28 | call to s10 | semmle.label | call to s10 | -| semantics.rb:64:27:64:27 | a : | semmle.label | a : | -| semantics.rb:64:27:64:27 | a : | semmle.label | a : | +| semantics.rb:64:27:64:27 | a | semmle.label | a | +| semantics.rb:64:27:64:27 | a | semmle.label | a | | semantics.rb:66:10:66:16 | call to s10 | semmle.label | call to s10 | | semantics.rb:66:10:66:16 | call to s10 | semmle.label | call to s10 | -| semantics.rb:66:14:66:15 | &... : | semmle.label | &... : | -| semantics.rb:66:14:66:15 | &... : | semmle.label | &... : | -| semantics.rb:80:5:80:5 | a : | semmle.label | a : | -| semantics.rb:80:5:80:5 | a : | semmle.label | a : | -| semantics.rb:80:9:80:18 | call to source : | semmle.label | call to source : | -| semantics.rb:80:9:80:18 | call to source : | semmle.label | call to source : | -| semantics.rb:81:5:81:5 | a : | semmle.label | a : | -| semantics.rb:81:5:81:5 | a : | semmle.label | a : | -| semantics.rb:81:11:81:11 | [post] x : | semmle.label | [post] x : | -| semantics.rb:81:11:81:11 | [post] x : | semmle.label | [post] x : | -| semantics.rb:81:14:81:14 | [post] y : | semmle.label | [post] y : | -| semantics.rb:81:14:81:14 | [post] y : | semmle.label | [post] y : | -| semantics.rb:81:22:81:22 | [post] z : | semmle.label | [post] z : | -| semantics.rb:81:22:81:22 | [post] z : | semmle.label | [post] z : | +| semantics.rb:66:14:66:15 | &... | semmle.label | &... | +| semantics.rb:66:14:66:15 | &... | semmle.label | &... | +| semantics.rb:80:5:80:5 | a | semmle.label | a | +| semantics.rb:80:5:80:5 | a | semmle.label | a | +| semantics.rb:80:9:80:18 | call to source | semmle.label | call to source | +| semantics.rb:80:9:80:18 | call to source | semmle.label | call to source | +| semantics.rb:81:5:81:5 | a | semmle.label | a | +| semantics.rb:81:5:81:5 | a | semmle.label | a | +| semantics.rb:81:11:81:11 | [post] x | semmle.label | [post] x | +| semantics.rb:81:11:81:11 | [post] x | semmle.label | [post] x | +| semantics.rb:81:14:81:14 | [post] y | semmle.label | [post] y | +| semantics.rb:81:14:81:14 | [post] y | semmle.label | [post] y | +| semantics.rb:81:22:81:22 | [post] z | semmle.label | [post] z | +| semantics.rb:81:22:81:22 | [post] z | semmle.label | [post] z | | semantics.rb:82:10:82:10 | x | semmle.label | x | | semantics.rb:82:10:82:10 | x | semmle.label | x | | semantics.rb:83:10:83:10 | y | semmle.label | y | | semantics.rb:83:10:83:10 | y | semmle.label | y | | semantics.rb:84:10:84:10 | z | semmle.label | z | | semantics.rb:84:10:84:10 | z | semmle.label | z | -| semantics.rb:89:5:89:5 | a : | semmle.label | a : | -| semantics.rb:89:5:89:5 | a : | semmle.label | a : | -| semantics.rb:89:9:89:18 | call to source : | semmle.label | call to source : | -| semantics.rb:89:9:89:18 | call to source : | semmle.label | call to source : | +| semantics.rb:89:5:89:5 | a | semmle.label | a | +| semantics.rb:89:5:89:5 | a | semmle.label | a | +| semantics.rb:89:9:89:18 | call to source | semmle.label | call to source | +| semantics.rb:89:9:89:18 | call to source | semmle.label | call to source | | semantics.rb:91:10:91:20 | call to s13 | semmle.label | call to s13 | | semantics.rb:91:10:91:20 | call to s13 | semmle.label | call to s13 | -| semantics.rb:91:19:91:19 | a : | semmle.label | a : | -| semantics.rb:91:19:91:19 | a : | semmle.label | a : | +| semantics.rb:91:19:91:19 | a | semmle.label | a | +| semantics.rb:91:19:91:19 | a | semmle.label | a | | semantics.rb:92:10:92:28 | call to s13 | semmle.label | call to s13 | | semantics.rb:92:10:92:28 | call to s13 | semmle.label | call to s13 | -| semantics.rb:92:27:92:27 | a : | semmle.label | a : | -| semantics.rb:92:27:92:27 | a : | semmle.label | a : | -| semantics.rb:97:5:97:5 | a : | semmle.label | a : | -| semantics.rb:97:5:97:5 | a : | semmle.label | a : | -| semantics.rb:97:9:97:18 | call to source : | semmle.label | call to source : | -| semantics.rb:97:9:97:18 | call to source : | semmle.label | call to source : | -| semantics.rb:98:5:98:5 | a : | semmle.label | a : | -| semantics.rb:98:5:98:5 | a : | semmle.label | a : | -| semantics.rb:98:19:98:19 | [post] x : | semmle.label | [post] x : | -| semantics.rb:98:19:98:19 | [post] x : | semmle.label | [post] x : | -| semantics.rb:99:5:99:5 | a : | semmle.label | a : | -| semantics.rb:99:5:99:5 | a : | semmle.label | a : | -| semantics.rb:99:16:99:16 | [post] y : | semmle.label | [post] y : | -| semantics.rb:99:16:99:16 | [post] y : | semmle.label | [post] y : | -| semantics.rb:99:24:99:24 | [post] z : | semmle.label | [post] z : | -| semantics.rb:99:24:99:24 | [post] z : | semmle.label | [post] z : | +| semantics.rb:92:27:92:27 | a | semmle.label | a | +| semantics.rb:92:27:92:27 | a | semmle.label | a | +| semantics.rb:97:5:97:5 | a | semmle.label | a | +| semantics.rb:97:5:97:5 | a | semmle.label | a | +| semantics.rb:97:9:97:18 | call to source | semmle.label | call to source | +| semantics.rb:97:9:97:18 | call to source | semmle.label | call to source | +| semantics.rb:98:5:98:5 | a | semmle.label | a | +| semantics.rb:98:5:98:5 | a | semmle.label | a | +| semantics.rb:98:19:98:19 | [post] x | semmle.label | [post] x | +| semantics.rb:98:19:98:19 | [post] x | semmle.label | [post] x | +| semantics.rb:99:5:99:5 | a | semmle.label | a | +| semantics.rb:99:5:99:5 | a | semmle.label | a | +| semantics.rb:99:16:99:16 | [post] y | semmle.label | [post] y | +| semantics.rb:99:16:99:16 | [post] y | semmle.label | [post] y | +| semantics.rb:99:24:99:24 | [post] z | semmle.label | [post] z | +| semantics.rb:99:24:99:24 | [post] z | semmle.label | [post] z | | semantics.rb:101:10:101:10 | x | semmle.label | x | | semantics.rb:101:10:101:10 | x | semmle.label | x | | semantics.rb:102:10:102:10 | y | semmle.label | y | | semantics.rb:102:10:102:10 | y | semmle.label | y | | semantics.rb:103:10:103:10 | z | semmle.label | z | | semantics.rb:103:10:103:10 | z | semmle.label | z | -| semantics.rb:107:5:107:5 | a : | semmle.label | a : | -| semantics.rb:107:9:107:18 | call to source : | semmle.label | call to source : | +| semantics.rb:107:5:107:5 | a | semmle.label | a | +| semantics.rb:107:9:107:18 | call to source | semmle.label | call to source | | semantics.rb:109:10:109:17 | call to s15 | semmle.label | call to s15 | -| semantics.rb:109:14:109:16 | ** ... : | semmle.label | ** ... : | +| semantics.rb:109:14:109:16 | ** ... | semmle.label | ** ... | | semantics.rb:110:10:110:31 | call to s15 | semmle.label | call to s15 | -| semantics.rb:110:28:110:30 | ** ... : | semmle.label | ** ... : | -| semantics.rb:114:5:114:5 | a : | semmle.label | a : | -| semantics.rb:114:5:114:5 | a : | semmle.label | a : | -| semantics.rb:114:9:114:18 | call to source : | semmle.label | call to source : | -| semantics.rb:114:9:114:18 | call to source : | semmle.label | call to source : | -| semantics.rb:115:5:115:5 | b : | semmle.label | b : | -| semantics.rb:115:5:115:5 | b : | semmle.label | b : | -| semantics.rb:115:9:115:18 | call to source : | semmle.label | call to source : | -| semantics.rb:115:9:115:18 | call to source : | semmle.label | call to source : | -| semantics.rb:116:5:116:5 | h [element :a] : | semmle.label | h [element :a] : | -| semantics.rb:116:5:116:5 | h [element :a] : | semmle.label | h [element :a] : | -| semantics.rb:116:14:116:14 | a : | semmle.label | a : | -| semantics.rb:116:14:116:14 | a : | semmle.label | a : | +| semantics.rb:110:28:110:30 | ** ... | semmle.label | ** ... | +| semantics.rb:114:5:114:5 | a | semmle.label | a | +| semantics.rb:114:5:114:5 | a | semmle.label | a | +| semantics.rb:114:9:114:18 | call to source | semmle.label | call to source | +| semantics.rb:114:9:114:18 | call to source | semmle.label | call to source | +| semantics.rb:115:5:115:5 | b | semmle.label | b | +| semantics.rb:115:5:115:5 | b | semmle.label | b | +| semantics.rb:115:9:115:18 | call to source | semmle.label | call to source | +| semantics.rb:115:9:115:18 | call to source | semmle.label | call to source | +| semantics.rb:116:5:116:5 | h [element :a] | semmle.label | h [element :a] | +| semantics.rb:116:5:116:5 | h [element :a] | semmle.label | h [element :a] | +| semantics.rb:116:14:116:14 | a | semmle.label | a | +| semantics.rb:116:14:116:14 | a | semmle.label | a | | semantics.rb:117:10:117:17 | call to s16 | semmle.label | call to s16 | | semantics.rb:117:10:117:17 | call to s16 | semmle.label | call to s16 | -| semantics.rb:117:14:117:16 | ** ... [element :a] : | semmle.label | ** ... [element :a] : | -| semantics.rb:117:14:117:16 | ** ... [element :a] : | semmle.label | ** ... [element :a] : | -| semantics.rb:117:16:117:16 | h [element :a] : | semmle.label | h [element :a] : | -| semantics.rb:117:16:117:16 | h [element :a] : | semmle.label | h [element :a] : | +| semantics.rb:117:14:117:16 | ** ... [element :a] | semmle.label | ** ... [element :a] | +| semantics.rb:117:14:117:16 | ** ... [element :a] | semmle.label | ** ... [element :a] | +| semantics.rb:117:16:117:16 | h [element :a] | semmle.label | h [element :a] | +| semantics.rb:117:16:117:16 | h [element :a] | semmle.label | h [element :a] | | semantics.rb:119:10:119:18 | call to s16 | semmle.label | call to s16 | | semantics.rb:119:10:119:18 | call to s16 | semmle.label | call to s16 | -| semantics.rb:119:17:119:17 | a : | semmle.label | a : | -| semantics.rb:119:17:119:17 | a : | semmle.label | a : | +| semantics.rb:119:17:119:17 | a | semmle.label | a | +| semantics.rb:119:17:119:17 | a | semmle.label | a | | semantics.rb:121:10:121:23 | call to s16 | semmle.label | call to s16 | | semantics.rb:121:10:121:23 | call to s16 | semmle.label | call to s16 | -| semantics.rb:121:17:121:17 | b : | semmle.label | b : | -| semantics.rb:121:17:121:17 | b : | semmle.label | b : | -| semantics.rb:121:20:121:22 | ** ... [element :a] : | semmle.label | ** ... [element :a] : | -| semantics.rb:121:20:121:22 | ** ... [element :a] : | semmle.label | ** ... [element :a] : | -| semantics.rb:121:22:121:22 | h [element :a] : | semmle.label | h [element :a] : | -| semantics.rb:121:22:121:22 | h [element :a] : | semmle.label | h [element :a] : | -| semantics.rb:125:5:125:5 | a : | semmle.label | a : | -| semantics.rb:125:5:125:5 | a : | semmle.label | a : | -| semantics.rb:125:9:125:18 | call to source : | semmle.label | call to source : | -| semantics.rb:125:9:125:18 | call to source : | semmle.label | call to source : | -| semantics.rb:126:9:126:9 | a : | semmle.label | a : | -| semantics.rb:126:9:126:9 | a : | semmle.label | a : | -| semantics.rb:126:12:126:14 | [post] ** ... : | semmle.label | [post] ** ... : | -| semantics.rb:126:12:126:14 | [post] ** ... : | semmle.label | [post] ** ... : | +| semantics.rb:121:17:121:17 | b | semmle.label | b | +| semantics.rb:121:17:121:17 | b | semmle.label | b | +| semantics.rb:121:20:121:22 | ** ... [element :a] | semmle.label | ** ... [element :a] | +| semantics.rb:121:20:121:22 | ** ... [element :a] | semmle.label | ** ... [element :a] | +| semantics.rb:121:22:121:22 | h [element :a] | semmle.label | h [element :a] | +| semantics.rb:121:22:121:22 | h [element :a] | semmle.label | h [element :a] | +| semantics.rb:125:5:125:5 | a | semmle.label | a | +| semantics.rb:125:5:125:5 | a | semmle.label | a | +| semantics.rb:125:9:125:18 | call to source | semmle.label | call to source | +| semantics.rb:125:9:125:18 | call to source | semmle.label | call to source | +| semantics.rb:126:9:126:9 | a | semmle.label | a | +| semantics.rb:126:9:126:9 | a | semmle.label | a | +| semantics.rb:126:12:126:14 | [post] ** ... | semmle.label | [post] ** ... | +| semantics.rb:126:12:126:14 | [post] ** ... | semmle.label | [post] ** ... | | semantics.rb:127:10:127:10 | h | semmle.label | h | | semantics.rb:127:10:127:10 | h | semmle.label | h | -| semantics.rb:141:5:141:5 | b : | semmle.label | b : | -| semantics.rb:141:5:141:5 | b : | semmle.label | b : | -| semantics.rb:141:9:141:18 | call to source : | semmle.label | call to source : | -| semantics.rb:141:9:141:18 | call to source : | semmle.label | call to source : | -| semantics.rb:145:5:145:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:145:5:145:5 | [post] h [element] : | semmle.label | [post] h [element] : | +| semantics.rb:141:5:141:5 | b | semmle.label | b | +| semantics.rb:141:5:141:5 | b | semmle.label | b | +| semantics.rb:141:9:141:18 | call to source | semmle.label | call to source | +| semantics.rb:141:9:141:18 | call to source | semmle.label | call to source | +| semantics.rb:145:5:145:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:145:5:145:5 | [post] h [element] | semmle.label | [post] h [element] | | semantics.rb:147:10:147:15 | call to s19 | semmle.label | call to s19 | | semantics.rb:147:10:147:15 | call to s19 | semmle.label | call to s19 | -| semantics.rb:147:14:147:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:147:14:147:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:151:5:151:5 | a : | semmle.label | a : | -| semantics.rb:151:5:151:5 | a : | semmle.label | a : | -| semantics.rb:151:9:151:18 | call to source : | semmle.label | call to source : | -| semantics.rb:151:9:151:18 | call to source : | semmle.label | call to source : | -| semantics.rb:152:5:152:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:152:5:152:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:152:9:152:14 | call to s20 [element] : | semmle.label | call to s20 [element] : | -| semantics.rb:152:9:152:14 | call to s20 [element] : | semmle.label | call to s20 [element] : | -| semantics.rb:152:13:152:13 | a : | semmle.label | a : | -| semantics.rb:152:13:152:13 | a : | semmle.label | a : | -| semantics.rb:153:10:153:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:153:10:153:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:147:14:147:14 | h [element] | semmle.label | h [element] | +| semantics.rb:147:14:147:14 | h [element] | semmle.label | h [element] | +| semantics.rb:151:5:151:5 | a | semmle.label | a | +| semantics.rb:151:5:151:5 | a | semmle.label | a | +| semantics.rb:151:9:151:18 | call to source | semmle.label | call to source | +| semantics.rb:151:9:151:18 | call to source | semmle.label | call to source | +| semantics.rb:152:5:152:5 | x [element] | semmle.label | x [element] | +| semantics.rb:152:5:152:5 | x [element] | semmle.label | x [element] | +| semantics.rb:152:9:152:14 | call to s20 [element] | semmle.label | call to s20 [element] | +| semantics.rb:152:9:152:14 | call to s20 [element] | semmle.label | call to s20 [element] | +| semantics.rb:152:13:152:13 | a | semmle.label | a | +| semantics.rb:152:13:152:13 | a | semmle.label | a | +| semantics.rb:153:10:153:10 | x [element] | semmle.label | x [element] | +| semantics.rb:153:10:153:10 | x [element] | semmle.label | x [element] | | semantics.rb:153:10:153:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:153:10:153:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:154:10:154:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:154:10:154:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:154:10:154:10 | x [element] | semmle.label | x [element] | +| semantics.rb:154:10:154:10 | x [element] | semmle.label | x [element] | | semantics.rb:154:10:154:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:154:10:154:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:158:5:158:5 | a : | semmle.label | a : | -| semantics.rb:158:5:158:5 | a : | semmle.label | a : | -| semantics.rb:158:9:158:18 | call to source : | semmle.label | call to source : | -| semantics.rb:158:9:158:18 | call to source : | semmle.label | call to source : | -| semantics.rb:159:5:159:5 | b : | semmle.label | b : | -| semantics.rb:159:5:159:5 | b : | semmle.label | b : | -| semantics.rb:159:9:159:18 | call to source : | semmle.label | call to source : | -| semantics.rb:159:9:159:18 | call to source : | semmle.label | call to source : | -| semantics.rb:162:5:162:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:162:5:162:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:163:5:163:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:163:5:163:5 | [post] h [element] : | semmle.label | [post] h [element] : | +| semantics.rb:158:5:158:5 | a | semmle.label | a | +| semantics.rb:158:5:158:5 | a | semmle.label | a | +| semantics.rb:158:9:158:18 | call to source | semmle.label | call to source | +| semantics.rb:158:9:158:18 | call to source | semmle.label | call to source | +| semantics.rb:159:5:159:5 | b | semmle.label | b | +| semantics.rb:159:5:159:5 | b | semmle.label | b | +| semantics.rb:159:9:159:18 | call to source | semmle.label | call to source | +| semantics.rb:159:9:159:18 | call to source | semmle.label | call to source | +| semantics.rb:162:5:162:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:162:5:162:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:163:5:163:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:163:5:163:5 | [post] h [element] | semmle.label | [post] h [element] | | semantics.rb:165:10:165:15 | call to s21 | semmle.label | call to s21 | | semantics.rb:165:10:165:15 | call to s21 | semmle.label | call to s21 | -| semantics.rb:165:14:165:14 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:165:14:165:14 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:165:14:165:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:165:14:165:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:169:5:169:5 | a : | semmle.label | a : | -| semantics.rb:169:5:169:5 | a : | semmle.label | a : | -| semantics.rb:169:9:169:18 | call to source : | semmle.label | call to source : | -| semantics.rb:169:9:169:18 | call to source : | semmle.label | call to source : | -| semantics.rb:170:5:170:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:170:5:170:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:170:9:170:14 | call to s22 [element] : | semmle.label | call to s22 [element] : | -| semantics.rb:170:9:170:14 | call to s22 [element] : | semmle.label | call to s22 [element] : | -| semantics.rb:170:13:170:13 | a : | semmle.label | a : | -| semantics.rb:170:13:170:13 | a : | semmle.label | a : | -| semantics.rb:171:10:171:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:171:10:171:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:165:14:165:14 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:165:14:165:14 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:165:14:165:14 | h [element] | semmle.label | h [element] | +| semantics.rb:165:14:165:14 | h [element] | semmle.label | h [element] | +| semantics.rb:169:5:169:5 | a | semmle.label | a | +| semantics.rb:169:5:169:5 | a | semmle.label | a | +| semantics.rb:169:9:169:18 | call to source | semmle.label | call to source | +| semantics.rb:169:9:169:18 | call to source | semmle.label | call to source | +| semantics.rb:170:5:170:5 | x [element] | semmle.label | x [element] | +| semantics.rb:170:5:170:5 | x [element] | semmle.label | x [element] | +| semantics.rb:170:9:170:14 | call to s22 [element] | semmle.label | call to s22 [element] | +| semantics.rb:170:9:170:14 | call to s22 [element] | semmle.label | call to s22 [element] | +| semantics.rb:170:13:170:13 | a | semmle.label | a | +| semantics.rb:170:13:170:13 | a | semmle.label | a | +| semantics.rb:171:10:171:10 | x [element] | semmle.label | x [element] | +| semantics.rb:171:10:171:10 | x [element] | semmle.label | x [element] | | semantics.rb:171:10:171:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:171:10:171:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:172:10:172:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:172:10:172:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:172:10:172:10 | x [element] | semmle.label | x [element] | +| semantics.rb:172:10:172:10 | x [element] | semmle.label | x [element] | | semantics.rb:172:10:172:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:172:10:172:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:176:5:176:5 | a : | semmle.label | a : | -| semantics.rb:176:5:176:5 | a : | semmle.label | a : | -| semantics.rb:176:9:176:18 | call to source : | semmle.label | call to source : | -| semantics.rb:176:9:176:18 | call to source : | semmle.label | call to source : | -| semantics.rb:179:5:179:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:179:5:179:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:180:5:180:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:180:5:180:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:180:5:180:5 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:180:5:180:5 | h [element 0] : | semmle.label | h [element 0] : | +| semantics.rb:176:5:176:5 | a | semmle.label | a | +| semantics.rb:176:5:176:5 | a | semmle.label | a | +| semantics.rb:176:9:176:18 | call to source | semmle.label | call to source | +| semantics.rb:176:9:176:18 | call to source | semmle.label | call to source | +| semantics.rb:179:5:179:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:179:5:179:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:180:5:180:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:180:5:180:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:180:5:180:5 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:180:5:180:5 | h [element 0] | semmle.label | h [element 0] | | semantics.rb:181:10:181:15 | call to s23 | semmle.label | call to s23 | | semantics.rb:181:10:181:15 | call to s23 | semmle.label | call to s23 | -| semantics.rb:181:14:181:14 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:181:14:181:14 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:185:5:185:5 | a : | semmle.label | a : | -| semantics.rb:185:5:185:5 | a : | semmle.label | a : | -| semantics.rb:185:9:185:18 | call to source : | semmle.label | call to source : | -| semantics.rb:185:9:185:18 | call to source : | semmle.label | call to source : | -| semantics.rb:186:5:186:5 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:186:5:186:5 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semmle.label | call to s24 [element 0] : | -| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semmle.label | call to s24 [element 0] : | -| semantics.rb:186:13:186:13 | a : | semmle.label | a : | -| semantics.rb:186:13:186:13 | a : | semmle.label | a : | -| semantics.rb:187:10:187:10 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:187:10:187:10 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:181:14:181:14 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:181:14:181:14 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:185:5:185:5 | a | semmle.label | a | +| semantics.rb:185:5:185:5 | a | semmle.label | a | +| semantics.rb:185:9:185:18 | call to source | semmle.label | call to source | +| semantics.rb:185:9:185:18 | call to source | semmle.label | call to source | +| semantics.rb:186:5:186:5 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:186:5:186:5 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:186:9:186:14 | call to s24 [element 0] | semmle.label | call to s24 [element 0] | +| semantics.rb:186:9:186:14 | call to s24 [element 0] | semmle.label | call to s24 [element 0] | +| semantics.rb:186:13:186:13 | a | semmle.label | a | +| semantics.rb:186:13:186:13 | a | semmle.label | a | +| semantics.rb:187:10:187:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:187:10:187:10 | x [element 0] | semmle.label | x [element 0] | | semantics.rb:187:10:187:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:187:10:187:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:189:10:189:10 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:189:10:189:10 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:189:10:189:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:189:10:189:10 | x [element 0] | semmle.label | x [element 0] | | semantics.rb:189:10:189:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:189:10:189:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:193:5:193:5 | a : | semmle.label | a : | -| semantics.rb:193:5:193:5 | a : | semmle.label | a : | -| semantics.rb:193:9:193:18 | call to source : | semmle.label | call to source : | -| semantics.rb:193:9:193:18 | call to source : | semmle.label | call to source : | -| semantics.rb:196:5:196:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:196:5:196:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:197:5:197:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:197:5:197:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:197:5:197:5 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:197:5:197:5 | h [element 0] : | semmle.label | h [element 0] : | +| semantics.rb:193:5:193:5 | a | semmle.label | a | +| semantics.rb:193:5:193:5 | a | semmle.label | a | +| semantics.rb:193:9:193:18 | call to source | semmle.label | call to source | +| semantics.rb:193:9:193:18 | call to source | semmle.label | call to source | +| semantics.rb:196:5:196:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:196:5:196:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:197:5:197:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:197:5:197:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:197:5:197:5 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:197:5:197:5 | h [element 0] | semmle.label | h [element 0] | | semantics.rb:198:10:198:15 | call to s25 | semmle.label | call to s25 | | semantics.rb:198:10:198:15 | call to s25 | semmle.label | call to s25 | -| semantics.rb:198:14:198:14 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:198:14:198:14 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:202:5:202:5 | a : | semmle.label | a : | -| semantics.rb:202:5:202:5 | a : | semmle.label | a : | -| semantics.rb:202:9:202:18 | call to source : | semmle.label | call to source : | -| semantics.rb:202:9:202:18 | call to source : | semmle.label | call to source : | -| semantics.rb:203:5:203:5 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:203:5:203:5 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semmle.label | call to s26 [element 0] : | -| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semmle.label | call to s26 [element 0] : | -| semantics.rb:203:13:203:13 | a : | semmle.label | a : | -| semantics.rb:203:13:203:13 | a : | semmle.label | a : | -| semantics.rb:204:10:204:10 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:204:10:204:10 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:198:14:198:14 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:198:14:198:14 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:202:5:202:5 | a | semmle.label | a | +| semantics.rb:202:5:202:5 | a | semmle.label | a | +| semantics.rb:202:9:202:18 | call to source | semmle.label | call to source | +| semantics.rb:202:9:202:18 | call to source | semmle.label | call to source | +| semantics.rb:203:5:203:5 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:203:5:203:5 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:203:9:203:14 | call to s26 [element 0] | semmle.label | call to s26 [element 0] | +| semantics.rb:203:9:203:14 | call to s26 [element 0] | semmle.label | call to s26 [element 0] | +| semantics.rb:203:13:203:13 | a | semmle.label | a | +| semantics.rb:203:13:203:13 | a | semmle.label | a | +| semantics.rb:204:10:204:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:204:10:204:10 | x [element 0] | semmle.label | x [element 0] | | semantics.rb:204:10:204:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:204:10:204:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:206:10:206:10 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:206:10:206:10 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:206:10:206:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:206:10:206:10 | x [element 0] | semmle.label | x [element 0] | | semantics.rb:206:10:206:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:206:10:206:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:211:5:211:5 | b : | semmle.label | b : | -| semantics.rb:211:5:211:5 | b : | semmle.label | b : | -| semantics.rb:211:9:211:18 | call to source : | semmle.label | call to source : | -| semantics.rb:211:9:211:18 | call to source : | semmle.label | call to source : | -| semantics.rb:212:5:212:5 | c : | semmle.label | c : | -| semantics.rb:212:5:212:5 | c : | semmle.label | c : | -| semantics.rb:212:9:212:18 | call to source : | semmle.label | call to source : | -| semantics.rb:212:9:212:18 | call to source : | semmle.label | call to source : | -| semantics.rb:213:5:213:5 | d : | semmle.label | d : | -| semantics.rb:213:5:213:5 | d : | semmle.label | d : | -| semantics.rb:213:9:213:18 | call to source : | semmle.label | call to source : | -| semantics.rb:213:9:213:18 | call to source : | semmle.label | call to source : | -| semantics.rb:217:5:217:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:217:5:217:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:218:5:218:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:218:5:218:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:218:5:218:5 | [post] h [element 2] : | semmle.label | [post] h [element 2] : | -| semantics.rb:218:5:218:5 | [post] h [element 2] : | semmle.label | [post] h [element 2] : | -| semantics.rb:218:5:218:5 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:218:5:218:5 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:219:5:219:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:219:5:219:5 | [post] h [element] : | semmle.label | [post] h [element] : | +| semantics.rb:211:5:211:5 | b | semmle.label | b | +| semantics.rb:211:5:211:5 | b | semmle.label | b | +| semantics.rb:211:9:211:18 | call to source | semmle.label | call to source | +| semantics.rb:211:9:211:18 | call to source | semmle.label | call to source | +| semantics.rb:212:5:212:5 | c | semmle.label | c | +| semantics.rb:212:5:212:5 | c | semmle.label | c | +| semantics.rb:212:9:212:18 | call to source | semmle.label | call to source | +| semantics.rb:212:9:212:18 | call to source | semmle.label | call to source | +| semantics.rb:213:5:213:5 | d | semmle.label | d | +| semantics.rb:213:5:213:5 | d | semmle.label | d | +| semantics.rb:213:9:213:18 | call to source | semmle.label | call to source | +| semantics.rb:213:9:213:18 | call to source | semmle.label | call to source | +| semantics.rb:217:5:217:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:217:5:217:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:218:5:218:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:218:5:218:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:218:5:218:5 | [post] h [element 2] | semmle.label | [post] h [element 2] | +| semantics.rb:218:5:218:5 | [post] h [element 2] | semmle.label | [post] h [element 2] | +| semantics.rb:218:5:218:5 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:218:5:218:5 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:219:5:219:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:219:5:219:5 | [post] h [element] | semmle.label | [post] h [element] | | semantics.rb:221:10:221:15 | call to s27 | semmle.label | call to s27 | | semantics.rb:221:10:221:15 | call to s27 | semmle.label | call to s27 | -| semantics.rb:221:14:221:14 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:221:14:221:14 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:221:14:221:14 | h [element 2] : | semmle.label | h [element 2] : | -| semantics.rb:221:14:221:14 | h [element 2] : | semmle.label | h [element 2] : | -| semantics.rb:221:14:221:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:221:14:221:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:225:5:225:5 | a : | semmle.label | a : | -| semantics.rb:225:5:225:5 | a : | semmle.label | a : | -| semantics.rb:225:9:225:18 | call to source : | semmle.label | call to source : | -| semantics.rb:225:9:225:18 | call to source : | semmle.label | call to source : | -| semantics.rb:226:5:226:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:226:5:226:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semmle.label | call to s28 [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semmle.label | call to s28 [element] : | -| semantics.rb:226:13:226:13 | a : | semmle.label | a : | -| semantics.rb:226:13:226:13 | a : | semmle.label | a : | -| semantics.rb:227:10:227:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:227:10:227:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:221:14:221:14 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:221:14:221:14 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:221:14:221:14 | h [element 2] | semmle.label | h [element 2] | +| semantics.rb:221:14:221:14 | h [element 2] | semmle.label | h [element 2] | +| semantics.rb:221:14:221:14 | h [element] | semmle.label | h [element] | +| semantics.rb:221:14:221:14 | h [element] | semmle.label | h [element] | +| semantics.rb:225:5:225:5 | a | semmle.label | a | +| semantics.rb:225:5:225:5 | a | semmle.label | a | +| semantics.rb:225:9:225:18 | call to source | semmle.label | call to source | +| semantics.rb:225:9:225:18 | call to source | semmle.label | call to source | +| semantics.rb:226:5:226:5 | x [element] | semmle.label | x [element] | +| semantics.rb:226:5:226:5 | x [element] | semmle.label | x [element] | +| semantics.rb:226:9:226:14 | call to s28 [element] | semmle.label | call to s28 [element] | +| semantics.rb:226:9:226:14 | call to s28 [element] | semmle.label | call to s28 [element] | +| semantics.rb:226:13:226:13 | a | semmle.label | a | +| semantics.rb:226:13:226:13 | a | semmle.label | a | +| semantics.rb:227:10:227:10 | x [element] | semmle.label | x [element] | +| semantics.rb:227:10:227:10 | x [element] | semmle.label | x [element] | | semantics.rb:227:10:227:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:227:10:227:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:228:10:228:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:228:10:228:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:228:10:228:10 | x [element] | semmle.label | x [element] | +| semantics.rb:228:10:228:10 | x [element] | semmle.label | x [element] | | semantics.rb:228:10:228:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:228:10:228:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:229:10:229:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:229:10:229:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:229:10:229:10 | x [element] | semmle.label | x [element] | +| semantics.rb:229:10:229:10 | x [element] | semmle.label | x [element] | | semantics.rb:229:10:229:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:229:10:229:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:230:10:230:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:230:10:230:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:230:10:230:10 | x [element] | semmle.label | x [element] | +| semantics.rb:230:10:230:10 | x [element] | semmle.label | x [element] | | semantics.rb:230:10:230:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:230:10:230:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:235:5:235:5 | b : | semmle.label | b : | -| semantics.rb:235:5:235:5 | b : | semmle.label | b : | -| semantics.rb:235:9:235:18 | call to source : | semmle.label | call to source : | -| semantics.rb:235:9:235:18 | call to source : | semmle.label | call to source : | -| semantics.rb:236:5:236:5 | c : | semmle.label | c : | -| semantics.rb:236:5:236:5 | c : | semmle.label | c : | -| semantics.rb:236:9:236:18 | call to source : | semmle.label | call to source : | -| semantics.rb:236:9:236:18 | call to source : | semmle.label | call to source : | -| semantics.rb:240:5:240:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:240:5:240:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:241:5:241:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:241:5:241:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:241:5:241:5 | [post] h [element 2] : | semmle.label | [post] h [element 2] : | -| semantics.rb:241:5:241:5 | [post] h [element 2] : | semmle.label | [post] h [element 2] : | -| semantics.rb:241:5:241:5 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:241:5:241:5 | h [element 1] : | semmle.label | h [element 1] : | +| semantics.rb:235:5:235:5 | b | semmle.label | b | +| semantics.rb:235:5:235:5 | b | semmle.label | b | +| semantics.rb:235:9:235:18 | call to source | semmle.label | call to source | +| semantics.rb:235:9:235:18 | call to source | semmle.label | call to source | +| semantics.rb:236:5:236:5 | c | semmle.label | c | +| semantics.rb:236:5:236:5 | c | semmle.label | c | +| semantics.rb:236:9:236:18 | call to source | semmle.label | call to source | +| semantics.rb:236:9:236:18 | call to source | semmle.label | call to source | +| semantics.rb:240:5:240:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:240:5:240:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:241:5:241:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:241:5:241:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:241:5:241:5 | [post] h [element 2] | semmle.label | [post] h [element 2] | +| semantics.rb:241:5:241:5 | [post] h [element 2] | semmle.label | [post] h [element 2] | +| semantics.rb:241:5:241:5 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:241:5:241:5 | h [element 1] | semmle.label | h [element 1] | | semantics.rb:244:10:244:15 | call to s29 | semmle.label | call to s29 | | semantics.rb:244:10:244:15 | call to s29 | semmle.label | call to s29 | -| semantics.rb:244:14:244:14 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:244:14:244:14 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:244:14:244:14 | h [element 2] : | semmle.label | h [element 2] : | -| semantics.rb:244:14:244:14 | h [element 2] : | semmle.label | h [element 2] : | -| semantics.rb:248:5:248:5 | a : | semmle.label | a : | -| semantics.rb:248:5:248:5 | a : | semmle.label | a : | -| semantics.rb:248:9:248:18 | call to source : | semmle.label | call to source : | -| semantics.rb:248:9:248:18 | call to source : | semmle.label | call to source : | -| semantics.rb:249:5:249:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:249:5:249:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semmle.label | call to s30 [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semmle.label | call to s30 [element] : | -| semantics.rb:249:13:249:13 | a : | semmle.label | a : | -| semantics.rb:249:13:249:13 | a : | semmle.label | a : | -| semantics.rb:250:10:250:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:250:10:250:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:244:14:244:14 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:244:14:244:14 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:244:14:244:14 | h [element 2] | semmle.label | h [element 2] | +| semantics.rb:244:14:244:14 | h [element 2] | semmle.label | h [element 2] | +| semantics.rb:248:5:248:5 | a | semmle.label | a | +| semantics.rb:248:5:248:5 | a | semmle.label | a | +| semantics.rb:248:9:248:18 | call to source | semmle.label | call to source | +| semantics.rb:248:9:248:18 | call to source | semmle.label | call to source | +| semantics.rb:249:5:249:5 | x [element] | semmle.label | x [element] | +| semantics.rb:249:5:249:5 | x [element] | semmle.label | x [element] | +| semantics.rb:249:9:249:14 | call to s30 [element] | semmle.label | call to s30 [element] | +| semantics.rb:249:9:249:14 | call to s30 [element] | semmle.label | call to s30 [element] | +| semantics.rb:249:13:249:13 | a | semmle.label | a | +| semantics.rb:249:13:249:13 | a | semmle.label | a | +| semantics.rb:250:10:250:10 | x [element] | semmle.label | x [element] | +| semantics.rb:250:10:250:10 | x [element] | semmle.label | x [element] | | semantics.rb:250:10:250:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:250:10:250:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:251:10:251:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:251:10:251:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:251:10:251:10 | x [element] | semmle.label | x [element] | +| semantics.rb:251:10:251:10 | x [element] | semmle.label | x [element] | | semantics.rb:251:10:251:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:251:10:251:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:252:10:252:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:252:10:252:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:252:10:252:10 | x [element] | semmle.label | x [element] | +| semantics.rb:252:10:252:10 | x [element] | semmle.label | x [element] | | semantics.rb:252:10:252:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:252:10:252:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:253:10:253:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:253:10:253:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:253:10:253:10 | x [element] | semmle.label | x [element] | +| semantics.rb:253:10:253:10 | x [element] | semmle.label | x [element] | | semantics.rb:253:10:253:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:253:10:253:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:257:5:257:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:257:5:257:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:257:15:257:25 | call to source : | semmle.label | call to source : | -| semantics.rb:257:15:257:25 | call to source : | semmle.label | call to source : | -| semantics.rb:258:5:258:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:258:5:258:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:258:5:258:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:258:5:258:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:259:5:259:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:259:5:259:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:259:5:259:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:259:5:259:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:260:5:260:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:260:5:260:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:260:12:260:22 | call to source : | semmle.label | call to source : | -| semantics.rb:260:12:260:22 | call to source : | semmle.label | call to source : | +| semantics.rb:257:5:257:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:257:5:257:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:257:15:257:25 | call to source | semmle.label | call to source | +| semantics.rb:257:15:257:25 | call to source | semmle.label | call to source | +| semantics.rb:258:5:258:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:258:5:258:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:258:5:258:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:258:5:258:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:259:5:259:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:259:5:259:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:259:5:259:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:259:5:259:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:260:5:260:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:260:5:260:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:260:12:260:22 | call to source | semmle.label | call to source | +| semantics.rb:260:12:260:22 | call to source | semmle.label | call to source | | semantics.rb:262:10:262:15 | call to s31 | semmle.label | call to s31 | | semantics.rb:262:10:262:15 | call to s31 | semmle.label | call to s31 | -| semantics.rb:262:14:262:14 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:262:14:262:14 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:262:14:262:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:262:14:262:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:267:5:267:5 | [post] h [element foo] : | semmle.label | [post] h [element foo] : | -| semantics.rb:267:5:267:5 | [post] h [element foo] : | semmle.label | [post] h [element foo] : | -| semantics.rb:267:16:267:26 | call to source : | semmle.label | call to source : | -| semantics.rb:267:16:267:26 | call to source : | semmle.label | call to source : | -| semantics.rb:268:5:268:5 | [post] h [element foo] : | semmle.label | [post] h [element foo] : | -| semantics.rb:268:5:268:5 | [post] h [element foo] : | semmle.label | [post] h [element foo] : | -| semantics.rb:268:5:268:5 | h [element foo] : | semmle.label | h [element foo] : | -| semantics.rb:268:5:268:5 | h [element foo] : | semmle.label | h [element foo] : | -| semantics.rb:269:5:269:5 | [post] h [element foo] : | semmle.label | [post] h [element foo] : | -| semantics.rb:269:5:269:5 | [post] h [element foo] : | semmle.label | [post] h [element foo] : | -| semantics.rb:269:5:269:5 | h [element foo] : | semmle.label | h [element foo] : | -| semantics.rb:269:5:269:5 | h [element foo] : | semmle.label | h [element foo] : | -| semantics.rb:270:5:270:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:270:5:270:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:270:12:270:22 | call to source : | semmle.label | call to source : | -| semantics.rb:270:12:270:22 | call to source : | semmle.label | call to source : | +| semantics.rb:262:14:262:14 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:262:14:262:14 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:262:14:262:14 | h [element] | semmle.label | h [element] | +| semantics.rb:262:14:262:14 | h [element] | semmle.label | h [element] | +| semantics.rb:267:5:267:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | +| semantics.rb:267:5:267:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | +| semantics.rb:267:16:267:26 | call to source | semmle.label | call to source | +| semantics.rb:267:16:267:26 | call to source | semmle.label | call to source | +| semantics.rb:268:5:268:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | +| semantics.rb:268:5:268:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | +| semantics.rb:268:5:268:5 | h [element foo] | semmle.label | h [element foo] | +| semantics.rb:268:5:268:5 | h [element foo] | semmle.label | h [element foo] | +| semantics.rb:269:5:269:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | +| semantics.rb:269:5:269:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | +| semantics.rb:269:5:269:5 | h [element foo] | semmle.label | h [element foo] | +| semantics.rb:269:5:269:5 | h [element foo] | semmle.label | h [element foo] | +| semantics.rb:270:5:270:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:270:5:270:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:270:12:270:22 | call to source | semmle.label | call to source | +| semantics.rb:270:12:270:22 | call to source | semmle.label | call to source | | semantics.rb:272:10:272:15 | call to s32 | semmle.label | call to s32 | | semantics.rb:272:10:272:15 | call to s32 | semmle.label | call to s32 | -| semantics.rb:272:14:272:14 | h [element foo] : | semmle.label | h [element foo] : | -| semantics.rb:272:14:272:14 | h [element foo] : | semmle.label | h [element foo] : | -| semantics.rb:272:14:272:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:272:14:272:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:280:5:280:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:280:5:280:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:280:12:280:22 | call to source : | semmle.label | call to source : | -| semantics.rb:280:12:280:22 | call to source : | semmle.label | call to source : | -| semantics.rb:281:5:281:5 | [post] h [element nil] : | semmle.label | [post] h [element nil] : | -| semantics.rb:281:5:281:5 | [post] h [element nil] : | semmle.label | [post] h [element nil] : | -| semantics.rb:281:5:281:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:281:5:281:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:281:5:281:5 | h [element] : | semmle.label | h [element] : | -| semantics.rb:281:5:281:5 | h [element] : | semmle.label | h [element] : | -| semantics.rb:281:14:281:24 | call to source : | semmle.label | call to source : | -| semantics.rb:281:14:281:24 | call to source : | semmle.label | call to source : | -| semantics.rb:282:5:282:5 | [post] h [element nil] : | semmle.label | [post] h [element nil] : | -| semantics.rb:282:5:282:5 | [post] h [element nil] : | semmle.label | [post] h [element nil] : | -| semantics.rb:282:5:282:5 | [post] h [element true] : | semmle.label | [post] h [element true] : | -| semantics.rb:282:5:282:5 | [post] h [element true] : | semmle.label | [post] h [element true] : | -| semantics.rb:282:5:282:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:282:5:282:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:282:5:282:5 | h [element nil] : | semmle.label | h [element nil] : | -| semantics.rb:282:5:282:5 | h [element nil] : | semmle.label | h [element nil] : | -| semantics.rb:282:5:282:5 | h [element] : | semmle.label | h [element] : | -| semantics.rb:282:5:282:5 | h [element] : | semmle.label | h [element] : | -| semantics.rb:282:15:282:25 | call to source : | semmle.label | call to source : | -| semantics.rb:282:15:282:25 | call to source : | semmle.label | call to source : | -| semantics.rb:283:5:283:5 | [post] h [element false] : | semmle.label | [post] h [element false] : | -| semantics.rb:283:5:283:5 | [post] h [element false] : | semmle.label | [post] h [element false] : | -| semantics.rb:283:5:283:5 | [post] h [element nil] : | semmle.label | [post] h [element nil] : | -| semantics.rb:283:5:283:5 | [post] h [element nil] : | semmle.label | [post] h [element nil] : | -| semantics.rb:283:5:283:5 | [post] h [element true] : | semmle.label | [post] h [element true] : | -| semantics.rb:283:5:283:5 | [post] h [element true] : | semmle.label | [post] h [element true] : | -| semantics.rb:283:5:283:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:283:5:283:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:283:5:283:5 | h [element nil] : | semmle.label | h [element nil] : | -| semantics.rb:283:5:283:5 | h [element nil] : | semmle.label | h [element nil] : | -| semantics.rb:283:5:283:5 | h [element true] : | semmle.label | h [element true] : | -| semantics.rb:283:5:283:5 | h [element true] : | semmle.label | h [element true] : | -| semantics.rb:283:5:283:5 | h [element] : | semmle.label | h [element] : | -| semantics.rb:283:5:283:5 | h [element] : | semmle.label | h [element] : | -| semantics.rb:283:16:283:26 | call to source : | semmle.label | call to source : | -| semantics.rb:283:16:283:26 | call to source : | semmle.label | call to source : | +| semantics.rb:272:14:272:14 | h [element foo] | semmle.label | h [element foo] | +| semantics.rb:272:14:272:14 | h [element foo] | semmle.label | h [element foo] | +| semantics.rb:272:14:272:14 | h [element] | semmle.label | h [element] | +| semantics.rb:272:14:272:14 | h [element] | semmle.label | h [element] | +| semantics.rb:280:5:280:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:280:5:280:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:280:12:280:22 | call to source | semmle.label | call to source | +| semantics.rb:280:12:280:22 | call to source | semmle.label | call to source | +| semantics.rb:281:5:281:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | +| semantics.rb:281:5:281:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | +| semantics.rb:281:5:281:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:281:5:281:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:281:5:281:5 | h [element] | semmle.label | h [element] | +| semantics.rb:281:5:281:5 | h [element] | semmle.label | h [element] | +| semantics.rb:281:14:281:24 | call to source | semmle.label | call to source | +| semantics.rb:281:14:281:24 | call to source | semmle.label | call to source | +| semantics.rb:282:5:282:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | +| semantics.rb:282:5:282:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | +| semantics.rb:282:5:282:5 | [post] h [element true] | semmle.label | [post] h [element true] | +| semantics.rb:282:5:282:5 | [post] h [element true] | semmle.label | [post] h [element true] | +| semantics.rb:282:5:282:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:282:5:282:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:282:5:282:5 | h [element nil] | semmle.label | h [element nil] | +| semantics.rb:282:5:282:5 | h [element nil] | semmle.label | h [element nil] | +| semantics.rb:282:5:282:5 | h [element] | semmle.label | h [element] | +| semantics.rb:282:5:282:5 | h [element] | semmle.label | h [element] | +| semantics.rb:282:15:282:25 | call to source | semmle.label | call to source | +| semantics.rb:282:15:282:25 | call to source | semmle.label | call to source | +| semantics.rb:283:5:283:5 | [post] h [element false] | semmle.label | [post] h [element false] | +| semantics.rb:283:5:283:5 | [post] h [element false] | semmle.label | [post] h [element false] | +| semantics.rb:283:5:283:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | +| semantics.rb:283:5:283:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | +| semantics.rb:283:5:283:5 | [post] h [element true] | semmle.label | [post] h [element true] | +| semantics.rb:283:5:283:5 | [post] h [element true] | semmle.label | [post] h [element true] | +| semantics.rb:283:5:283:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:283:5:283:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:283:5:283:5 | h [element nil] | semmle.label | h [element nil] | +| semantics.rb:283:5:283:5 | h [element nil] | semmle.label | h [element nil] | +| semantics.rb:283:5:283:5 | h [element true] | semmle.label | h [element true] | +| semantics.rb:283:5:283:5 | h [element true] | semmle.label | h [element true] | +| semantics.rb:283:5:283:5 | h [element] | semmle.label | h [element] | +| semantics.rb:283:5:283:5 | h [element] | semmle.label | h [element] | +| semantics.rb:283:16:283:26 | call to source | semmle.label | call to source | +| semantics.rb:283:16:283:26 | call to source | semmle.label | call to source | | semantics.rb:285:10:285:15 | call to s33 | semmle.label | call to s33 | | semantics.rb:285:10:285:15 | call to s33 | semmle.label | call to s33 | -| semantics.rb:285:14:285:14 | h [element false] : | semmle.label | h [element false] : | -| semantics.rb:285:14:285:14 | h [element false] : | semmle.label | h [element false] : | -| semantics.rb:285:14:285:14 | h [element nil] : | semmle.label | h [element nil] : | -| semantics.rb:285:14:285:14 | h [element nil] : | semmle.label | h [element nil] : | -| semantics.rb:285:14:285:14 | h [element true] : | semmle.label | h [element true] : | -| semantics.rb:285:14:285:14 | h [element true] : | semmle.label | h [element true] : | -| semantics.rb:285:14:285:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:285:14:285:14 | h [element] : | semmle.label | h [element] : | -| semantics.rb:289:5:289:5 | x [element :foo] : | semmle.label | x [element :foo] : | -| semantics.rb:289:5:289:5 | x [element :foo] : | semmle.label | x [element :foo] : | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semmle.label | call to s35 [element :foo] : | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semmle.label | call to s35 [element :foo] : | -| semantics.rb:289:13:289:23 | call to source : | semmle.label | call to source : | -| semantics.rb:289:13:289:23 | call to source : | semmle.label | call to source : | -| semantics.rb:290:10:290:10 | x [element :foo] : | semmle.label | x [element :foo] : | -| semantics.rb:290:10:290:10 | x [element :foo] : | semmle.label | x [element :foo] : | +| semantics.rb:285:14:285:14 | h [element false] | semmle.label | h [element false] | +| semantics.rb:285:14:285:14 | h [element false] | semmle.label | h [element false] | +| semantics.rb:285:14:285:14 | h [element nil] | semmle.label | h [element nil] | +| semantics.rb:285:14:285:14 | h [element nil] | semmle.label | h [element nil] | +| semantics.rb:285:14:285:14 | h [element true] | semmle.label | h [element true] | +| semantics.rb:285:14:285:14 | h [element true] | semmle.label | h [element true] | +| semantics.rb:285:14:285:14 | h [element] | semmle.label | h [element] | +| semantics.rb:285:14:285:14 | h [element] | semmle.label | h [element] | +| semantics.rb:289:5:289:5 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:289:5:289:5 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:289:9:289:24 | call to s35 [element :foo] | semmle.label | call to s35 [element :foo] | +| semantics.rb:289:9:289:24 | call to s35 [element :foo] | semmle.label | call to s35 [element :foo] | +| semantics.rb:289:13:289:23 | call to source | semmle.label | call to source | +| semantics.rb:289:13:289:23 | call to source | semmle.label | call to source | +| semantics.rb:290:10:290:10 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:290:10:290:10 | x [element :foo] | semmle.label | x [element :foo] | | semantics.rb:290:10:290:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:290:10:290:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:292:10:292:10 | x [element :foo] : | semmle.label | x [element :foo] : | -| semantics.rb:292:10:292:10 | x [element :foo] : | semmle.label | x [element :foo] : | +| semantics.rb:292:10:292:10 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:292:10:292:10 | x [element :foo] | semmle.label | x [element :foo] | | semantics.rb:292:10:292:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:292:10:292:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:296:5:296:5 | x [element foo] : | semmle.label | x [element foo] : | -| semantics.rb:296:5:296:5 | x [element foo] : | semmle.label | x [element foo] : | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semmle.label | call to s36 [element foo] : | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semmle.label | call to s36 [element foo] : | -| semantics.rb:296:13:296:23 | call to source : | semmle.label | call to source : | -| semantics.rb:296:13:296:23 | call to source : | semmle.label | call to source : | -| semantics.rb:298:10:298:10 | x [element foo] : | semmle.label | x [element foo] : | -| semantics.rb:298:10:298:10 | x [element foo] : | semmle.label | x [element foo] : | +| semantics.rb:296:5:296:5 | x [element foo] | semmle.label | x [element foo] | +| semantics.rb:296:5:296:5 | x [element foo] | semmle.label | x [element foo] | +| semantics.rb:296:9:296:24 | call to s36 [element foo] | semmle.label | call to s36 [element foo] | +| semantics.rb:296:9:296:24 | call to s36 [element foo] | semmle.label | call to s36 [element foo] | +| semantics.rb:296:13:296:23 | call to source | semmle.label | call to source | +| semantics.rb:296:13:296:23 | call to source | semmle.label | call to source | +| semantics.rb:298:10:298:10 | x [element foo] | semmle.label | x [element foo] | +| semantics.rb:298:10:298:10 | x [element foo] | semmle.label | x [element foo] | | semantics.rb:298:10:298:17 | ...[...] | semmle.label | ...[...] | | semantics.rb:298:10:298:17 | ...[...] | semmle.label | ...[...] | -| semantics.rb:300:10:300:10 | x [element foo] : | semmle.label | x [element foo] : | -| semantics.rb:300:10:300:10 | x [element foo] : | semmle.label | x [element foo] : | +| semantics.rb:300:10:300:10 | x [element foo] | semmle.label | x [element foo] | +| semantics.rb:300:10:300:10 | x [element foo] | semmle.label | x [element foo] | | semantics.rb:300:10:300:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:300:10:300:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:304:5:304:5 | x [element true] : | semmle.label | x [element true] : | -| semantics.rb:304:5:304:5 | x [element true] : | semmle.label | x [element true] : | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semmle.label | call to s37 [element true] : | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semmle.label | call to s37 [element true] : | -| semantics.rb:304:13:304:23 | call to source : | semmle.label | call to source : | -| semantics.rb:304:13:304:23 | call to source : | semmle.label | call to source : | -| semantics.rb:306:10:306:10 | x [element true] : | semmle.label | x [element true] : | -| semantics.rb:306:10:306:10 | x [element true] : | semmle.label | x [element true] : | +| semantics.rb:304:5:304:5 | x [element true] | semmle.label | x [element true] | +| semantics.rb:304:5:304:5 | x [element true] | semmle.label | x [element true] | +| semantics.rb:304:9:304:24 | call to s37 [element true] | semmle.label | call to s37 [element true] | +| semantics.rb:304:9:304:24 | call to s37 [element true] | semmle.label | call to s37 [element true] | +| semantics.rb:304:13:304:23 | call to source | semmle.label | call to source | +| semantics.rb:304:13:304:23 | call to source | semmle.label | call to source | +| semantics.rb:306:10:306:10 | x [element true] | semmle.label | x [element true] | +| semantics.rb:306:10:306:10 | x [element true] | semmle.label | x [element true] | | semantics.rb:306:10:306:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:306:10:306:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:308:10:308:10 | x [element true] : | semmle.label | x [element true] : | -| semantics.rb:308:10:308:10 | x [element true] : | semmle.label | x [element true] : | +| semantics.rb:308:10:308:10 | x [element true] | semmle.label | x [element true] | +| semantics.rb:308:10:308:10 | x [element true] | semmle.label | x [element true] | | semantics.rb:308:10:308:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:308:10:308:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:312:5:312:5 | [post] h [element foo] : | semmle.label | [post] h [element foo] : | -| semantics.rb:312:5:312:5 | [post] h [element foo] : | semmle.label | [post] h [element foo] : | -| semantics.rb:312:16:312:26 | call to source : | semmle.label | call to source : | -| semantics.rb:312:16:312:26 | call to source : | semmle.label | call to source : | +| semantics.rb:312:5:312:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | +| semantics.rb:312:5:312:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | +| semantics.rb:312:16:312:26 | call to source | semmle.label | call to source | +| semantics.rb:312:16:312:26 | call to source | semmle.label | call to source | | semantics.rb:315:10:315:15 | call to s38 | semmle.label | call to s38 | | semantics.rb:315:10:315:15 | call to s38 | semmle.label | call to s38 | -| semantics.rb:315:14:315:14 | h [element foo] : | semmle.label | h [element foo] : | -| semantics.rb:315:14:315:14 | h [element foo] : | semmle.label | h [element foo] : | -| semantics.rb:319:5:319:5 | x [element :foo] : | semmle.label | x [element :foo] : | -| semantics.rb:319:5:319:5 | x [element :foo] : | semmle.label | x [element :foo] : | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semmle.label | call to s39 [element :foo] : | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semmle.label | call to s39 [element :foo] : | -| semantics.rb:319:13:319:23 | call to source : | semmle.label | call to source : | -| semantics.rb:319:13:319:23 | call to source : | semmle.label | call to source : | -| semantics.rb:321:10:321:10 | x [element :foo] : | semmle.label | x [element :foo] : | -| semantics.rb:321:10:321:10 | x [element :foo] : | semmle.label | x [element :foo] : | +| semantics.rb:315:14:315:14 | h [element foo] | semmle.label | h [element foo] | +| semantics.rb:315:14:315:14 | h [element foo] | semmle.label | h [element foo] | +| semantics.rb:319:5:319:5 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:319:5:319:5 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:319:9:319:24 | call to s39 [element :foo] | semmle.label | call to s39 [element :foo] | +| semantics.rb:319:9:319:24 | call to s39 [element :foo] | semmle.label | call to s39 [element :foo] | +| semantics.rb:319:13:319:23 | call to source | semmle.label | call to source | +| semantics.rb:319:13:319:23 | call to source | semmle.label | call to source | +| semantics.rb:321:10:321:10 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:321:10:321:10 | x [element :foo] | semmle.label | x [element :foo] | | semantics.rb:321:10:321:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:321:10:321:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:322:10:322:10 | x [element :foo] : | semmle.label | x [element :foo] : | -| semantics.rb:322:10:322:10 | x [element :foo] : | semmle.label | x [element :foo] : | +| semantics.rb:322:10:322:10 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:322:10:322:10 | x [element :foo] | semmle.label | x [element :foo] | | semantics.rb:322:10:322:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:322:10:322:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:327:5:327:5 | [post] x [@foo] : | semmle.label | [post] x [@foo] : | -| semantics.rb:327:5:327:5 | [post] x [@foo] : | semmle.label | [post] x [@foo] : | -| semantics.rb:327:13:327:23 | call to source : | semmle.label | call to source : | -| semantics.rb:327:13:327:23 | call to source : | semmle.label | call to source : | +| semantics.rb:327:5:327:5 | [post] x [@foo] | semmle.label | [post] x [@foo] | +| semantics.rb:327:5:327:5 | [post] x [@foo] | semmle.label | [post] x [@foo] | +| semantics.rb:327:13:327:23 | call to source | semmle.label | call to source | +| semantics.rb:327:13:327:23 | call to source | semmle.label | call to source | | semantics.rb:329:10:329:15 | call to s40 | semmle.label | call to s40 | | semantics.rb:329:10:329:15 | call to s40 | semmle.label | call to s40 | -| semantics.rb:329:14:329:14 | x [@foo] : | semmle.label | x [@foo] : | -| semantics.rb:329:14:329:14 | x [@foo] : | semmle.label | x [@foo] : | -| semantics.rb:333:5:333:5 | x [@foo] : | semmle.label | x [@foo] : | -| semantics.rb:333:5:333:5 | x [@foo] : | semmle.label | x [@foo] : | -| semantics.rb:333:9:333:24 | call to s41 [@foo] : | semmle.label | call to s41 [@foo] : | -| semantics.rb:333:9:333:24 | call to s41 [@foo] : | semmle.label | call to s41 [@foo] : | -| semantics.rb:333:13:333:23 | call to source : | semmle.label | call to source : | -| semantics.rb:333:13:333:23 | call to source : | semmle.label | call to source : | -| semantics.rb:334:10:334:10 | x [@foo] : | semmle.label | x [@foo] : | -| semantics.rb:334:10:334:10 | x [@foo] : | semmle.label | x [@foo] : | +| semantics.rb:329:14:329:14 | x [@foo] | semmle.label | x [@foo] | +| semantics.rb:329:14:329:14 | x [@foo] | semmle.label | x [@foo] | +| semantics.rb:333:5:333:5 | x [@foo] | semmle.label | x [@foo] | +| semantics.rb:333:5:333:5 | x [@foo] | semmle.label | x [@foo] | +| semantics.rb:333:9:333:24 | call to s41 [@foo] | semmle.label | call to s41 [@foo] | +| semantics.rb:333:9:333:24 | call to s41 [@foo] | semmle.label | call to s41 [@foo] | +| semantics.rb:333:13:333:23 | call to source | semmle.label | call to source | +| semantics.rb:333:13:333:23 | call to source | semmle.label | call to source | +| semantics.rb:334:10:334:10 | x [@foo] | semmle.label | x [@foo] | +| semantics.rb:334:10:334:10 | x [@foo] | semmle.label | x [@foo] | | semantics.rb:334:10:334:14 | call to foo | semmle.label | call to foo | | semantics.rb:334:10:334:14 | call to foo | semmle.label | call to foo | -| semantics.rb:339:5:339:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:339:5:339:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:339:12:339:22 | call to source : | semmle.label | call to source : | -| semantics.rb:339:12:339:22 | call to source : | semmle.label | call to source : | -| semantics.rb:340:5:340:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:340:5:340:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:340:12:340:22 | call to source : | semmle.label | call to source : | -| semantics.rb:340:12:340:22 | call to source : | semmle.label | call to source : | -| semantics.rb:342:5:342:5 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:342:5:342:5 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:342:5:342:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:342:5:342:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semmle.label | call to s42 [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semmle.label | call to s42 [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semmle.label | call to s42 [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semmle.label | call to s42 [element] : | -| semantics.rb:342:13:342:13 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:342:13:342:13 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:342:13:342:13 | h [element] : | semmle.label | h [element] : | -| semantics.rb:342:13:342:13 | h [element] : | semmle.label | h [element] : | -| semantics.rb:344:10:344:10 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:344:10:344:10 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:344:10:344:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:344:10:344:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:339:5:339:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:339:5:339:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:339:12:339:22 | call to source | semmle.label | call to source | +| semantics.rb:339:12:339:22 | call to source | semmle.label | call to source | +| semantics.rb:340:5:340:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:340:5:340:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:340:12:340:22 | call to source | semmle.label | call to source | +| semantics.rb:340:12:340:22 | call to source | semmle.label | call to source | +| semantics.rb:342:5:342:5 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:342:5:342:5 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:342:5:342:5 | x [element] | semmle.label | x [element] | +| semantics.rb:342:5:342:5 | x [element] | semmle.label | x [element] | +| semantics.rb:342:9:342:14 | call to s42 [element 0] | semmle.label | call to s42 [element 0] | +| semantics.rb:342:9:342:14 | call to s42 [element 0] | semmle.label | call to s42 [element 0] | +| semantics.rb:342:9:342:14 | call to s42 [element] | semmle.label | call to s42 [element] | +| semantics.rb:342:9:342:14 | call to s42 [element] | semmle.label | call to s42 [element] | +| semantics.rb:342:13:342:13 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:342:13:342:13 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:342:13:342:13 | h [element] | semmle.label | h [element] | +| semantics.rb:342:13:342:13 | h [element] | semmle.label | h [element] | +| semantics.rb:344:10:344:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:344:10:344:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:344:10:344:10 | x [element] | semmle.label | x [element] | +| semantics.rb:344:10:344:10 | x [element] | semmle.label | x [element] | | semantics.rb:344:10:344:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:344:10:344:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:345:10:345:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:345:10:345:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:345:10:345:10 | x [element] | semmle.label | x [element] | +| semantics.rb:345:10:345:10 | x [element] | semmle.label | x [element] | | semantics.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:346:10:346:10 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:346:10:346:10 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:346:10:346:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:346:10:346:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:346:10:346:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:346:10:346:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:346:10:346:10 | x [element] | semmle.label | x [element] | +| semantics.rb:346:10:346:10 | x [element] | semmle.label | x [element] | | semantics.rb:346:10:346:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:346:10:346:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:350:5:350:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:350:5:350:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:350:12:350:22 | call to source : | semmle.label | call to source : | -| semantics.rb:350:12:350:22 | call to source : | semmle.label | call to source : | -| semantics.rb:353:5:353:5 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:353:5:353:5 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semmle.label | call to s43 [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semmle.label | call to s43 [element 0] : | -| semantics.rb:353:13:353:13 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:353:13:353:13 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:355:10:355:10 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:355:10:355:10 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:350:5:350:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:350:5:350:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:350:12:350:22 | call to source | semmle.label | call to source | +| semantics.rb:350:12:350:22 | call to source | semmle.label | call to source | +| semantics.rb:353:5:353:5 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:353:5:353:5 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:353:9:353:14 | call to s43 [element 0] | semmle.label | call to s43 [element 0] | +| semantics.rb:353:9:353:14 | call to s43 [element 0] | semmle.label | call to s43 [element 0] | +| semantics.rb:353:13:353:13 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:353:13:353:13 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:355:10:355:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:355:10:355:10 | x [element 0] | semmle.label | x [element 0] | | semantics.rb:355:10:355:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:355:10:355:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:357:10:357:10 | x [element 0] : | semmle.label | x [element 0] : | -| semantics.rb:357:10:357:10 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:357:10:357:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:357:10:357:10 | x [element 0] | semmle.label | x [element 0] | | semantics.rb:357:10:357:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:357:10:357:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:362:5:362:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:362:5:362:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:362:12:362:22 | call to source : | semmle.label | call to source : | -| semantics.rb:362:12:362:22 | call to source : | semmle.label | call to source : | -| semantics.rb:365:9:365:9 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:365:9:365:9 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:365:9:365:9 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:365:9:365:9 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:368:10:368:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:368:10:368:10 | h [element 1] : | semmle.label | h [element 1] : | +| semantics.rb:362:5:362:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:362:5:362:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:362:12:362:22 | call to source | semmle.label | call to source | +| semantics.rb:362:12:362:22 | call to source | semmle.label | call to source | +| semantics.rb:365:9:365:9 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:365:9:365:9 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:365:9:365:9 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:365:9:365:9 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:368:10:368:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:368:10:368:10 | h [element 1] | semmle.label | h [element 1] | | semantics.rb:368:10:368:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:368:10:368:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:369:10:369:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:369:10:369:10 | h [element 1] : | semmle.label | h [element 1] : | +| semantics.rb:369:10:369:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:369:10:369:10 | h [element 1] | semmle.label | h [element 1] | | semantics.rb:369:10:369:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:369:10:369:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:373:5:373:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:373:5:373:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:373:12:373:22 | call to source : | semmle.label | call to source : | -| semantics.rb:373:12:373:22 | call to source : | semmle.label | call to source : | -| semantics.rb:374:5:374:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:374:5:374:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:374:5:374:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:374:5:374:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:374:5:374:5 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:374:5:374:5 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:374:12:374:22 | call to source : | semmle.label | call to source : | -| semantics.rb:374:12:374:22 | call to source : | semmle.label | call to source : | -| semantics.rb:375:5:375:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:375:5:375:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:375:12:375:22 | call to source : | semmle.label | call to source : | -| semantics.rb:375:12:375:22 | call to source : | semmle.label | call to source : | -| semantics.rb:377:10:377:10 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:377:10:377:10 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:377:10:377:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:377:10:377:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:373:5:373:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:373:5:373:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:373:12:373:22 | call to source | semmle.label | call to source | +| semantics.rb:373:12:373:22 | call to source | semmle.label | call to source | +| semantics.rb:374:5:374:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:374:5:374:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:374:5:374:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:374:5:374:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:374:5:374:5 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:374:5:374:5 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:374:12:374:22 | call to source | semmle.label | call to source | +| semantics.rb:374:12:374:22 | call to source | semmle.label | call to source | +| semantics.rb:375:5:375:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:375:5:375:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:375:12:375:22 | call to source | semmle.label | call to source | +| semantics.rb:375:12:375:22 | call to source | semmle.label | call to source | +| semantics.rb:377:10:377:10 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:377:10:377:10 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:377:10:377:10 | h [element] | semmle.label | h [element] | +| semantics.rb:377:10:377:10 | h [element] | semmle.label | h [element] | | semantics.rb:377:10:377:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:377:10:377:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:378:10:378:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:378:10:378:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:378:10:378:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:378:10:378:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:378:10:378:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:378:10:378:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:378:10:378:10 | h [element] | semmle.label | h [element] | +| semantics.rb:378:10:378:10 | h [element] | semmle.label | h [element] | | semantics.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:379:10:379:10 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:379:10:379:10 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:379:10:379:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:379:10:379:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:379:10:379:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:379:10:379:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:379:10:379:10 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:379:10:379:10 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:379:10:379:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:379:10:379:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:379:10:379:10 | h [element] | semmle.label | h [element] | +| semantics.rb:379:10:379:10 | h [element] | semmle.label | h [element] | | semantics.rb:379:10:379:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:379:10:379:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:381:9:381:9 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:381:9:381:9 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:381:9:381:9 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:381:9:381:9 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:381:9:381:9 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:381:9:381:9 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:381:9:381:9 | h [element] : | semmle.label | h [element] : | -| semantics.rb:381:9:381:9 | h [element] : | semmle.label | h [element] : | -| semantics.rb:383:10:383:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:383:10:383:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:381:9:381:9 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:381:9:381:9 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:381:9:381:9 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:381:9:381:9 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:381:9:381:9 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:381:9:381:9 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:381:9:381:9 | h [element] | semmle.label | h [element] | +| semantics.rb:381:9:381:9 | h [element] | semmle.label | h [element] | +| semantics.rb:383:10:383:10 | h [element] | semmle.label | h [element] | +| semantics.rb:383:10:383:10 | h [element] | semmle.label | h [element] | | semantics.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:384:10:384:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:384:10:384:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:384:10:384:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:384:10:384:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:384:10:384:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:384:10:384:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:384:10:384:10 | h [element] | semmle.label | h [element] | +| semantics.rb:384:10:384:10 | h [element] | semmle.label | h [element] | | semantics.rb:384:10:384:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:384:10:384:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:385:10:385:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:385:10:385:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:385:10:385:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:385:10:385:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:385:10:385:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:385:10:385:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:385:10:385:10 | h [element] | semmle.label | h [element] | +| semantics.rb:385:10:385:10 | h [element] | semmle.label | h [element] | | semantics.rb:385:10:385:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:385:10:385:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:389:5:389:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:389:5:389:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:389:12:389:22 | call to source : | semmle.label | call to source : | -| semantics.rb:389:12:389:22 | call to source : | semmle.label | call to source : | -| semantics.rb:390:5:390:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:390:5:390:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | -| semantics.rb:390:5:390:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:390:5:390:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | -| semantics.rb:390:5:390:5 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:390:5:390:5 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:390:12:390:22 | call to source : | semmle.label | call to source : | -| semantics.rb:390:12:390:22 | call to source : | semmle.label | call to source : | -| semantics.rb:391:5:391:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:391:5:391:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:391:12:391:22 | call to source : | semmle.label | call to source : | -| semantics.rb:391:12:391:22 | call to source : | semmle.label | call to source : | -| semantics.rb:393:10:393:10 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:393:10:393:10 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:393:10:393:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:393:10:393:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:389:5:389:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:389:5:389:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:389:12:389:22 | call to source | semmle.label | call to source | +| semantics.rb:389:12:389:22 | call to source | semmle.label | call to source | +| semantics.rb:390:5:390:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:390:5:390:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:390:5:390:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:390:5:390:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:390:5:390:5 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:390:5:390:5 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:390:12:390:22 | call to source | semmle.label | call to source | +| semantics.rb:390:12:390:22 | call to source | semmle.label | call to source | +| semantics.rb:391:5:391:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:391:5:391:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:391:12:391:22 | call to source | semmle.label | call to source | +| semantics.rb:391:12:391:22 | call to source | semmle.label | call to source | +| semantics.rb:393:10:393:10 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:393:10:393:10 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:393:10:393:10 | h [element] | semmle.label | h [element] | +| semantics.rb:393:10:393:10 | h [element] | semmle.label | h [element] | | semantics.rb:393:10:393:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:393:10:393:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:394:10:394:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:394:10:394:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:394:10:394:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:394:10:394:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:394:10:394:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:394:10:394:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:394:10:394:10 | h [element] | semmle.label | h [element] | +| semantics.rb:394:10:394:10 | h [element] | semmle.label | h [element] | | semantics.rb:394:10:394:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:394:10:394:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:395:10:395:10 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:395:10:395:10 | h [element 0] : | semmle.label | h [element 0] : | -| semantics.rb:395:10:395:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:395:10:395:10 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:395:10:395:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:395:10:395:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:395:10:395:10 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:395:10:395:10 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:395:10:395:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:395:10:395:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:395:10:395:10 | h [element] | semmle.label | h [element] | +| semantics.rb:395:10:395:10 | h [element] | semmle.label | h [element] | | semantics.rb:395:10:395:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:395:10:395:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:397:5:397:5 | x [element 1] : | semmle.label | x [element 1] : | -| semantics.rb:397:5:397:5 | x [element 1] : | semmle.label | x [element 1] : | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semmle.label | call to s46 [element 1] : | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semmle.label | call to s46 [element 1] : | -| semantics.rb:397:13:397:13 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:397:13:397:13 | h [element 1] : | semmle.label | h [element 1] : | -| semantics.rb:400:10:400:10 | x [element 1] : | semmle.label | x [element 1] : | -| semantics.rb:400:10:400:10 | x [element 1] : | semmle.label | x [element 1] : | +| semantics.rb:397:5:397:5 | x [element 1] | semmle.label | x [element 1] | +| semantics.rb:397:5:397:5 | x [element 1] | semmle.label | x [element 1] | +| semantics.rb:397:9:397:14 | call to s46 [element 1] | semmle.label | call to s46 [element 1] | +| semantics.rb:397:9:397:14 | call to s46 [element 1] | semmle.label | call to s46 [element 1] | +| semantics.rb:397:13:397:13 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:397:13:397:13 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:400:10:400:10 | x [element 1] | semmle.label | x [element 1] | +| semantics.rb:400:10:400:10 | x [element 1] | semmle.label | x [element 1] | | semantics.rb:400:10:400:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:400:10:400:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:401:10:401:10 | x [element 1] : | semmle.label | x [element 1] : | -| semantics.rb:401:10:401:10 | x [element 1] : | semmle.label | x [element 1] : | +| semantics.rb:401:10:401:10 | x [element 1] | semmle.label | x [element 1] | +| semantics.rb:401:10:401:10 | x [element 1] | semmle.label | x [element 1] | | semantics.rb:401:10:401:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:401:10:401:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:405:5:405:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:405:5:405:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:405:15:405:25 | call to source : | semmle.label | call to source : | -| semantics.rb:405:15:405:25 | call to source : | semmle.label | call to source : | -| semantics.rb:406:5:406:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:406:5:406:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:406:5:406:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:406:5:406:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:406:5:406:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:406:5:406:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:406:15:406:25 | call to source : | semmle.label | call to source : | -| semantics.rb:406:15:406:25 | call to source : | semmle.label | call to source : | -| semantics.rb:407:5:407:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:407:5:407:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:407:12:407:22 | call to source : | semmle.label | call to source : | -| semantics.rb:407:12:407:22 | call to source : | semmle.label | call to source : | -| semantics.rb:409:10:409:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:409:10:409:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:409:10:409:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:409:10:409:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:405:5:405:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:405:5:405:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:405:15:405:25 | call to source | semmle.label | call to source | +| semantics.rb:405:15:405:25 | call to source | semmle.label | call to source | +| semantics.rb:406:5:406:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:406:5:406:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:406:5:406:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:406:5:406:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:406:5:406:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:406:5:406:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:406:15:406:25 | call to source | semmle.label | call to source | +| semantics.rb:406:15:406:25 | call to source | semmle.label | call to source | +| semantics.rb:407:5:407:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:407:5:407:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:407:12:407:22 | call to source | semmle.label | call to source | +| semantics.rb:407:12:407:22 | call to source | semmle.label | call to source | +| semantics.rb:409:10:409:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:409:10:409:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:409:10:409:10 | h [element] | semmle.label | h [element] | +| semantics.rb:409:10:409:10 | h [element] | semmle.label | h [element] | | semantics.rb:409:10:409:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:409:10:409:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:410:10:410:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:410:10:410:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:410:10:410:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:410:10:410:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:410:10:410:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:410:10:410:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:410:10:410:10 | h [element] | semmle.label | h [element] | +| semantics.rb:410:10:410:10 | h [element] | semmle.label | h [element] | | semantics.rb:410:10:410:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:410:10:410:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:412:5:412:5 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:412:5:412:5 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:412:9:412:14 | call to s47 [element :bar] : | semmle.label | call to s47 [element :bar] : | -| semantics.rb:412:9:412:14 | call to s47 [element :bar] : | semmle.label | call to s47 [element :bar] : | -| semantics.rb:412:13:412:13 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:412:13:412:13 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:415:10:415:10 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:415:10:415:10 | x [element :bar] : | semmle.label | x [element :bar] : | +| semantics.rb:412:5:412:5 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:412:5:412:5 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:412:9:412:14 | call to s47 [element :bar] | semmle.label | call to s47 [element :bar] | +| semantics.rb:412:9:412:14 | call to s47 [element :bar] | semmle.label | call to s47 [element :bar] | +| semantics.rb:412:13:412:13 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:412:13:412:13 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:415:10:415:10 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:415:10:415:10 | x [element :bar] | semmle.label | x [element :bar] | | semantics.rb:415:10:415:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:415:10:415:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:419:5:419:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:419:5:419:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:419:15:419:25 | call to source : | semmle.label | call to source : | -| semantics.rb:419:15:419:25 | call to source : | semmle.label | call to source : | -| semantics.rb:420:5:420:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:420:5:420:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:420:5:420:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:420:5:420:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:420:5:420:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:420:5:420:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:420:15:420:25 | call to source : | semmle.label | call to source : | -| semantics.rb:420:15:420:25 | call to source : | semmle.label | call to source : | -| semantics.rb:421:5:421:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:421:5:421:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:421:12:421:22 | call to source : | semmle.label | call to source : | -| semantics.rb:421:12:421:22 | call to source : | semmle.label | call to source : | -| semantics.rb:423:10:423:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:423:10:423:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:423:10:423:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:423:10:423:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:419:5:419:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:419:5:419:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:419:15:419:25 | call to source | semmle.label | call to source | +| semantics.rb:419:15:419:25 | call to source | semmle.label | call to source | +| semantics.rb:420:5:420:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:420:5:420:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:420:5:420:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:420:5:420:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:420:5:420:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:420:5:420:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:420:15:420:25 | call to source | semmle.label | call to source | +| semantics.rb:420:15:420:25 | call to source | semmle.label | call to source | +| semantics.rb:421:5:421:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:421:5:421:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:421:12:421:22 | call to source | semmle.label | call to source | +| semantics.rb:421:12:421:22 | call to source | semmle.label | call to source | +| semantics.rb:423:10:423:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:423:10:423:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:423:10:423:10 | h [element] | semmle.label | h [element] | +| semantics.rb:423:10:423:10 | h [element] | semmle.label | h [element] | | semantics.rb:423:10:423:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:423:10:423:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:424:10:424:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:424:10:424:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:424:10:424:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:424:10:424:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:424:10:424:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:424:10:424:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:424:10:424:10 | h [element] | semmle.label | h [element] | +| semantics.rb:424:10:424:10 | h [element] | semmle.label | h [element] | | semantics.rb:424:10:424:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:424:10:424:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:426:5:426:5 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:426:5:426:5 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:426:9:426:14 | call to s48 [element :bar] : | semmle.label | call to s48 [element :bar] : | -| semantics.rb:426:9:426:14 | call to s48 [element :bar] : | semmle.label | call to s48 [element :bar] : | -| semantics.rb:426:13:426:13 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:426:13:426:13 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:429:10:429:10 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:429:10:429:10 | x [element :bar] : | semmle.label | x [element :bar] : | +| semantics.rb:426:5:426:5 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:426:5:426:5 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:426:9:426:14 | call to s48 [element :bar] | semmle.label | call to s48 [element :bar] | +| semantics.rb:426:9:426:14 | call to s48 [element :bar] | semmle.label | call to s48 [element :bar] | +| semantics.rb:426:13:426:13 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:426:13:426:13 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:429:10:429:10 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:429:10:429:10 | x [element :bar] | semmle.label | x [element :bar] | | semantics.rb:429:10:429:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:429:10:429:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:433:5:433:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:433:5:433:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:433:15:433:25 | call to source : | semmle.label | call to source : | -| semantics.rb:433:15:433:25 | call to source : | semmle.label | call to source : | -| semantics.rb:434:5:434:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:434:5:434:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:434:5:434:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:434:5:434:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:434:5:434:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:434:5:434:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:434:15:434:25 | call to source : | semmle.label | call to source : | -| semantics.rb:434:15:434:25 | call to source : | semmle.label | call to source : | -| semantics.rb:435:5:435:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:435:5:435:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:435:12:435:22 | call to source : | semmle.label | call to source : | -| semantics.rb:435:12:435:22 | call to source : | semmle.label | call to source : | -| semantics.rb:437:10:437:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:437:10:437:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:437:10:437:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:437:10:437:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:433:5:433:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:433:5:433:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:433:15:433:25 | call to source | semmle.label | call to source | +| semantics.rb:433:15:433:25 | call to source | semmle.label | call to source | +| semantics.rb:434:5:434:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:434:5:434:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:434:5:434:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:434:5:434:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:434:5:434:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:434:5:434:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:434:15:434:25 | call to source | semmle.label | call to source | +| semantics.rb:434:15:434:25 | call to source | semmle.label | call to source | +| semantics.rb:435:5:435:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:435:5:435:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:435:12:435:22 | call to source | semmle.label | call to source | +| semantics.rb:435:12:435:22 | call to source | semmle.label | call to source | +| semantics.rb:437:10:437:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:437:10:437:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:437:10:437:10 | h [element] | semmle.label | h [element] | +| semantics.rb:437:10:437:10 | h [element] | semmle.label | h [element] | | semantics.rb:437:10:437:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:437:10:437:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:438:10:438:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:438:10:438:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:438:10:438:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:438:10:438:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:438:10:438:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:438:10:438:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:438:10:438:10 | h [element] | semmle.label | h [element] | +| semantics.rb:438:10:438:10 | h [element] | semmle.label | h [element] | | semantics.rb:438:10:438:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:438:10:438:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:440:5:440:5 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:440:5:440:5 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:440:5:440:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:440:5:440:5 | x [element] : | semmle.label | x [element] : | -| semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semmle.label | call to s49 [element :bar] : | -| semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semmle.label | call to s49 [element :bar] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semmle.label | call to s49 [element] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semmle.label | call to s49 [element] : | -| semantics.rb:440:13:440:13 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:440:13:440:13 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:440:13:440:13 | h [element] : | semmle.label | h [element] : | -| semantics.rb:440:13:440:13 | h [element] : | semmle.label | h [element] : | -| semantics.rb:442:10:442:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:442:10:442:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:440:5:440:5 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:440:5:440:5 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:440:5:440:5 | x [element] | semmle.label | x [element] | +| semantics.rb:440:5:440:5 | x [element] | semmle.label | x [element] | +| semantics.rb:440:9:440:14 | call to s49 [element :bar] | semmle.label | call to s49 [element :bar] | +| semantics.rb:440:9:440:14 | call to s49 [element :bar] | semmle.label | call to s49 [element :bar] | +| semantics.rb:440:9:440:14 | call to s49 [element] | semmle.label | call to s49 [element] | +| semantics.rb:440:9:440:14 | call to s49 [element] | semmle.label | call to s49 [element] | +| semantics.rb:440:13:440:13 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:440:13:440:13 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:440:13:440:13 | h [element] | semmle.label | h [element] | +| semantics.rb:440:13:440:13 | h [element] | semmle.label | h [element] | +| semantics.rb:442:10:442:10 | x [element] | semmle.label | x [element] | +| semantics.rb:442:10:442:10 | x [element] | semmle.label | x [element] | | semantics.rb:442:10:442:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:442:10:442:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:443:10:443:10 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:443:10:443:10 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:443:10:443:10 | x [element] : | semmle.label | x [element] : | -| semantics.rb:443:10:443:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:443:10:443:10 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:443:10:443:10 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:443:10:443:10 | x [element] | semmle.label | x [element] | +| semantics.rb:443:10:443:10 | x [element] | semmle.label | x [element] | | semantics.rb:443:10:443:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:443:10:443:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:447:5:447:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:447:5:447:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:447:15:447:25 | call to source : | semmle.label | call to source : | -| semantics.rb:447:15:447:25 | call to source : | semmle.label | call to source : | -| semantics.rb:448:5:448:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:448:5:448:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:448:5:448:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:448:5:448:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:448:5:448:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:448:5:448:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:448:15:448:25 | call to source : | semmle.label | call to source : | -| semantics.rb:448:15:448:25 | call to source : | semmle.label | call to source : | -| semantics.rb:449:5:449:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:449:5:449:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:449:12:449:22 | call to source : | semmle.label | call to source : | -| semantics.rb:449:12:449:22 | call to source : | semmle.label | call to source : | -| semantics.rb:451:10:451:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:451:10:451:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:451:10:451:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:451:10:451:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:447:5:447:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:447:5:447:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:447:15:447:25 | call to source | semmle.label | call to source | +| semantics.rb:447:15:447:25 | call to source | semmle.label | call to source | +| semantics.rb:448:5:448:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:448:5:448:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:448:5:448:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:448:5:448:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:448:5:448:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:448:5:448:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:448:15:448:25 | call to source | semmle.label | call to source | +| semantics.rb:448:15:448:25 | call to source | semmle.label | call to source | +| semantics.rb:449:5:449:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:449:5:449:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:449:12:449:22 | call to source | semmle.label | call to source | +| semantics.rb:449:12:449:22 | call to source | semmle.label | call to source | +| semantics.rb:451:10:451:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:451:10:451:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:451:10:451:10 | h [element] | semmle.label | h [element] | +| semantics.rb:451:10:451:10 | h [element] | semmle.label | h [element] | | semantics.rb:451:10:451:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:451:10:451:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:452:10:452:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:452:10:452:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:452:10:452:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:452:10:452:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:452:10:452:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:452:10:452:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:452:10:452:10 | h [element] | semmle.label | h [element] | +| semantics.rb:452:10:452:10 | h [element] | semmle.label | h [element] | | semantics.rb:452:10:452:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:452:10:452:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:454:9:454:9 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:454:9:454:9 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:454:9:454:9 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:454:9:454:9 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:457:10:457:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:457:10:457:10 | h [element :bar] : | semmle.label | h [element :bar] : | +| semantics.rb:454:9:454:9 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:454:9:454:9 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:454:9:454:9 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:454:9:454:9 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:457:10:457:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:457:10:457:10 | h [element :bar] | semmle.label | h [element :bar] | | semantics.rb:457:10:457:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:457:10:457:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:461:5:461:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:461:5:461:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:461:15:461:25 | call to source : | semmle.label | call to source : | -| semantics.rb:461:15:461:25 | call to source : | semmle.label | call to source : | -| semantics.rb:462:5:462:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:462:5:462:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:462:5:462:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:462:5:462:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:462:5:462:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:462:5:462:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:462:15:462:25 | call to source : | semmle.label | call to source : | -| semantics.rb:462:15:462:25 | call to source : | semmle.label | call to source : | -| semantics.rb:463:5:463:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:463:5:463:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:463:12:463:22 | call to source : | semmle.label | call to source : | -| semantics.rb:463:12:463:22 | call to source : | semmle.label | call to source : | -| semantics.rb:465:10:465:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:465:10:465:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:465:10:465:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:465:10:465:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:461:5:461:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:461:5:461:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:461:15:461:25 | call to source | semmle.label | call to source | +| semantics.rb:461:15:461:25 | call to source | semmle.label | call to source | +| semantics.rb:462:5:462:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:462:5:462:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:462:5:462:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:462:5:462:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:462:5:462:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:462:5:462:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:462:15:462:25 | call to source | semmle.label | call to source | +| semantics.rb:462:15:462:25 | call to source | semmle.label | call to source | +| semantics.rb:463:5:463:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:463:5:463:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:463:12:463:22 | call to source | semmle.label | call to source | +| semantics.rb:463:12:463:22 | call to source | semmle.label | call to source | +| semantics.rb:465:10:465:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:465:10:465:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:465:10:465:10 | h [element] | semmle.label | h [element] | +| semantics.rb:465:10:465:10 | h [element] | semmle.label | h [element] | | semantics.rb:465:10:465:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:465:10:465:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:466:10:466:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:466:10:466:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:466:10:466:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:466:10:466:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:466:10:466:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:466:10:466:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:466:10:466:10 | h [element] | semmle.label | h [element] | +| semantics.rb:466:10:466:10 | h [element] | semmle.label | h [element] | | semantics.rb:466:10:466:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:466:10:466:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:468:9:468:9 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:468:9:468:9 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:468:9:468:9 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:468:9:468:9 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:468:9:468:9 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:468:9:468:9 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:468:9:468:9 | h [element] : | semmle.label | h [element] : | -| semantics.rb:468:9:468:9 | h [element] : | semmle.label | h [element] : | -| semantics.rb:470:10:470:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:470:10:470:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:468:9:468:9 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:468:9:468:9 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:468:9:468:9 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:468:9:468:9 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:468:9:468:9 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:468:9:468:9 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:468:9:468:9 | h [element] | semmle.label | h [element] | +| semantics.rb:468:9:468:9 | h [element] | semmle.label | h [element] | +| semantics.rb:470:10:470:10 | h [element] | semmle.label | h [element] | +| semantics.rb:470:10:470:10 | h [element] | semmle.label | h [element] | | semantics.rb:470:10:470:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:470:10:470:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:471:10:471:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:471:10:471:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:471:10:471:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:471:10:471:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:471:10:471:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:471:10:471:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:471:10:471:10 | h [element] | semmle.label | h [element] | +| semantics.rb:471:10:471:10 | h [element] | semmle.label | h [element] | | semantics.rb:471:10:471:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:471:10:471:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:475:5:475:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:475:5:475:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:475:15:475:25 | call to source : | semmle.label | call to source : | -| semantics.rb:475:15:475:25 | call to source : | semmle.label | call to source : | -| semantics.rb:476:5:476:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:476:5:476:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:476:5:476:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:476:5:476:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:476:5:476:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:476:5:476:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:476:15:476:25 | call to source : | semmle.label | call to source : | -| semantics.rb:476:15:476:25 | call to source : | semmle.label | call to source : | -| semantics.rb:477:5:477:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:477:5:477:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:477:12:477:22 | call to source : | semmle.label | call to source : | -| semantics.rb:477:12:477:22 | call to source : | semmle.label | call to source : | -| semantics.rb:479:10:479:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:479:10:479:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:479:10:479:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:479:10:479:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:475:5:475:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:475:5:475:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:475:15:475:25 | call to source | semmle.label | call to source | +| semantics.rb:475:15:475:25 | call to source | semmle.label | call to source | +| semantics.rb:476:5:476:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:476:5:476:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:476:5:476:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:476:5:476:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:476:5:476:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:476:5:476:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:476:15:476:25 | call to source | semmle.label | call to source | +| semantics.rb:476:15:476:25 | call to source | semmle.label | call to source | +| semantics.rb:477:5:477:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:477:5:477:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:477:12:477:22 | call to source | semmle.label | call to source | +| semantics.rb:477:12:477:22 | call to source | semmle.label | call to source | +| semantics.rb:479:10:479:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:479:10:479:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:479:10:479:10 | h [element] | semmle.label | h [element] | +| semantics.rb:479:10:479:10 | h [element] | semmle.label | h [element] | | semantics.rb:479:10:479:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:479:10:479:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:480:10:480:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:480:10:480:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:480:10:480:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:480:10:480:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:480:10:480:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:480:10:480:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:480:10:480:10 | h [element] | semmle.label | h [element] | +| semantics.rb:480:10:480:10 | h [element] | semmle.label | h [element] | | semantics.rb:480:10:480:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:480:10:480:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:482:5:482:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:482:5:482:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:482:5:482:5 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:482:5:482:5 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:485:10:485:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:485:10:485:10 | h [element :bar] : | semmle.label | h [element :bar] : | +| semantics.rb:482:5:482:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:482:5:482:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:482:5:482:5 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:482:5:482:5 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:485:10:485:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:485:10:485:10 | h [element :bar] | semmle.label | h [element :bar] | | semantics.rb:485:10:485:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:485:10:485:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:489:5:489:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:489:5:489:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:489:15:489:25 | call to source : | semmle.label | call to source : | -| semantics.rb:489:15:489:25 | call to source : | semmle.label | call to source : | -| semantics.rb:490:5:490:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:490:5:490:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:490:5:490:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:490:5:490:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:490:5:490:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:490:5:490:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:490:15:490:25 | call to source : | semmle.label | call to source : | -| semantics.rb:490:15:490:25 | call to source : | semmle.label | call to source : | -| semantics.rb:491:5:491:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:491:5:491:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:491:12:491:22 | call to source : | semmle.label | call to source : | -| semantics.rb:491:12:491:22 | call to source : | semmle.label | call to source : | -| semantics.rb:493:10:493:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:493:10:493:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:493:10:493:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:493:10:493:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:489:5:489:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:489:5:489:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:489:15:489:25 | call to source | semmle.label | call to source | +| semantics.rb:489:15:489:25 | call to source | semmle.label | call to source | +| semantics.rb:490:5:490:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:490:5:490:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:490:5:490:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:490:5:490:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:490:5:490:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:490:5:490:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:490:15:490:25 | call to source | semmle.label | call to source | +| semantics.rb:490:15:490:25 | call to source | semmle.label | call to source | +| semantics.rb:491:5:491:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:491:5:491:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:491:12:491:22 | call to source | semmle.label | call to source | +| semantics.rb:491:12:491:22 | call to source | semmle.label | call to source | +| semantics.rb:493:10:493:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:493:10:493:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:493:10:493:10 | h [element] | semmle.label | h [element] | +| semantics.rb:493:10:493:10 | h [element] | semmle.label | h [element] | | semantics.rb:493:10:493:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:493:10:493:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:494:10:494:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:494:10:494:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:494:10:494:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:494:10:494:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:494:10:494:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:494:10:494:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:494:10:494:10 | h [element] | semmle.label | h [element] | +| semantics.rb:494:10:494:10 | h [element] | semmle.label | h [element] | | semantics.rb:494:10:494:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:494:10:494:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:496:5:496:5 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:496:5:496:5 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:496:9:496:9 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:496:9:496:9 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:496:9:496:15 | call to s53 [element :bar] : | semmle.label | call to s53 [element :bar] : | -| semantics.rb:496:9:496:15 | call to s53 [element :bar] : | semmle.label | call to s53 [element :bar] : | -| semantics.rb:499:10:499:10 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:499:10:499:10 | x [element :bar] : | semmle.label | x [element :bar] : | +| semantics.rb:496:5:496:5 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:496:5:496:5 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:496:9:496:9 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:496:9:496:9 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:496:9:496:15 | call to s53 [element :bar] | semmle.label | call to s53 [element :bar] | +| semantics.rb:496:9:496:15 | call to s53 [element :bar] | semmle.label | call to s53 [element :bar] | +| semantics.rb:499:10:499:10 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:499:10:499:10 | x [element :bar] | semmle.label | x [element :bar] | | semantics.rb:499:10:499:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:499:10:499:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:501:10:501:20 | call to source : | semmle.label | call to source : | -| semantics.rb:501:10:501:20 | call to source : | semmle.label | call to source : | +| semantics.rb:501:10:501:20 | call to source | semmle.label | call to source | +| semantics.rb:501:10:501:20 | call to source | semmle.label | call to source | | semantics.rb:501:10:501:26 | call to s53 | semmle.label | call to s53 | | semantics.rb:501:10:501:26 | call to s53 | semmle.label | call to s53 | -| semantics.rb:505:5:505:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:505:5:505:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:505:15:505:25 | call to source : | semmle.label | call to source : | -| semantics.rb:505:15:505:25 | call to source : | semmle.label | call to source : | -| semantics.rb:506:5:506:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:506:5:506:5 | [post] h [element :bar] : | semmle.label | [post] h [element :bar] : | -| semantics.rb:506:5:506:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:506:5:506:5 | [post] h [element :foo] : | semmle.label | [post] h [element :foo] : | -| semantics.rb:506:5:506:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:506:5:506:5 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:506:15:506:25 | call to source : | semmle.label | call to source : | -| semantics.rb:506:15:506:25 | call to source : | semmle.label | call to source : | -| semantics.rb:507:5:507:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:507:5:507:5 | [post] h [element] : | semmle.label | [post] h [element] : | -| semantics.rb:507:12:507:22 | call to source : | semmle.label | call to source : | -| semantics.rb:507:12:507:22 | call to source : | semmle.label | call to source : | -| semantics.rb:509:10:509:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:509:10:509:10 | h [element :foo] : | semmle.label | h [element :foo] : | -| semantics.rb:509:10:509:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:509:10:509:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:505:5:505:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:505:5:505:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:505:15:505:25 | call to source | semmle.label | call to source | +| semantics.rb:505:15:505:25 | call to source | semmle.label | call to source | +| semantics.rb:506:5:506:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:506:5:506:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | +| semantics.rb:506:5:506:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:506:5:506:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:506:5:506:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:506:5:506:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:506:15:506:25 | call to source | semmle.label | call to source | +| semantics.rb:506:15:506:25 | call to source | semmle.label | call to source | +| semantics.rb:507:5:507:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:507:5:507:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:507:12:507:22 | call to source | semmle.label | call to source | +| semantics.rb:507:12:507:22 | call to source | semmle.label | call to source | +| semantics.rb:509:10:509:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:509:10:509:10 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:509:10:509:10 | h [element] | semmle.label | h [element] | +| semantics.rb:509:10:509:10 | h [element] | semmle.label | h [element] | | semantics.rb:509:10:509:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:509:10:509:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:510:10:510:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:510:10:510:10 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:510:10:510:10 | h [element] : | semmle.label | h [element] : | -| semantics.rb:510:10:510:10 | h [element] : | semmle.label | h [element] : | +| semantics.rb:510:10:510:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:510:10:510:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:510:10:510:10 | h [element] | semmle.label | h [element] | +| semantics.rb:510:10:510:10 | h [element] | semmle.label | h [element] | | semantics.rb:510:10:510:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:510:10:510:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:512:5:512:5 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:512:5:512:5 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:512:9:512:9 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:512:9:512:9 | h [element :bar] : | semmle.label | h [element :bar] : | -| semantics.rb:512:9:512:15 | call to s54 [element :bar] : | semmle.label | call to s54 [element :bar] : | -| semantics.rb:512:9:512:15 | call to s54 [element :bar] : | semmle.label | call to s54 [element :bar] : | -| semantics.rb:515:10:515:10 | x [element :bar] : | semmle.label | x [element :bar] : | -| semantics.rb:515:10:515:10 | x [element :bar] : | semmle.label | x [element :bar] : | +| semantics.rb:512:5:512:5 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:512:5:512:5 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:512:9:512:9 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:512:9:512:9 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:512:9:512:15 | call to s54 [element :bar] | semmle.label | call to s54 [element :bar] | +| semantics.rb:512:9:512:15 | call to s54 [element :bar] | semmle.label | call to s54 [element :bar] | +| semantics.rb:515:10:515:10 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:515:10:515:10 | x [element :bar] | semmle.label | x [element :bar] | | semantics.rb:515:10:515:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:515:10:515:16 | ...[...] | semmle.label | ...[...] | subpaths diff --git a/ruby/ql/test/library-tests/dataflow/global/Flow.expected b/ruby/ql/test/library-tests/dataflow/global/Flow.expected index ef1eb189de9..63359aa9a36 100644 --- a/ruby/ql/test/library-tests/dataflow/global/Flow.expected +++ b/ruby/ql/test/library-tests/dataflow/global/Flow.expected @@ -1,552 +1,552 @@ failures edges -| captured_variables.rb:1:24:1:24 | x : | captured_variables.rb:2:20:2:20 | x | -| captured_variables.rb:1:24:1:24 | x : | captured_variables.rb:2:20:2:20 | x | -| captured_variables.rb:5:20:5:30 | call to source : | captured_variables.rb:1:24:1:24 | x : | -| captured_variables.rb:5:20:5:30 | call to source : | captured_variables.rb:1:24:1:24 | x : | -| captured_variables.rb:21:33:21:33 | x : | captured_variables.rb:23:14:23:14 | x | -| captured_variables.rb:21:33:21:33 | x : | captured_variables.rb:23:14:23:14 | x | -| captured_variables.rb:27:29:27:39 | call to source : | captured_variables.rb:21:33:21:33 | x : | -| captured_variables.rb:27:29:27:39 | call to source : | captured_variables.rb:21:33:21:33 | x : | -| captured_variables.rb:32:31:32:31 | x : | captured_variables.rb:34:14:34:14 | x | -| captured_variables.rb:32:31:32:31 | x : | captured_variables.rb:34:14:34:14 | x | -| captured_variables.rb:38:27:38:37 | call to source : | captured_variables.rb:32:31:32:31 | x : | -| captured_variables.rb:38:27:38:37 | call to source : | captured_variables.rb:32:31:32:31 | x : | -| instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:18:11:18 | x : | -| instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:18:11:18 | x : | -| instance_variables.rb:11:18:11:18 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | -| instance_variables.rb:11:18:11:18 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | -| instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:16:14:21 | self [@field] : | -| instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:16:14:21 | self [@field] : | -| instance_variables.rb:14:16:14:21 | @field : | instance_variables.rb:14:9:14:21 | return : | -| instance_variables.rb:14:16:14:21 | @field : | instance_variables.rb:14:9:14:21 | return : | -| instance_variables.rb:14:16:14:21 | self [@field] : | instance_variables.rb:14:16:14:21 | @field : | -| instance_variables.rb:14:16:14:21 | self [@field] : | instance_variables.rb:14:16:14:21 | @field : | -| instance_variables.rb:16:5:18:7 | self in inc_field [@field] : | instance_variables.rb:17:9:17:14 | [post] self [@field] : | -| instance_variables.rb:17:9:17:14 | [post] self [@field] : | instance_variables.rb:17:9:17:14 | [post] self [@field] : | -| instance_variables.rb:19:5:19:8 | [post] self [@foo] : | instance_variables.rb:20:10:20:13 | self [@foo] : | -| instance_variables.rb:19:5:19:8 | [post] self [@foo] : | instance_variables.rb:20:10:20:13 | self [@foo] : | -| instance_variables.rb:19:12:19:21 | call to taint : | instance_variables.rb:19:5:19:8 | [post] self [@foo] : | -| instance_variables.rb:19:12:19:21 | call to taint : | instance_variables.rb:19:5:19:8 | [post] self [@foo] : | -| instance_variables.rb:20:10:20:13 | self [@foo] : | instance_variables.rb:20:10:20:13 | @foo | -| instance_variables.rb:20:10:20:13 | self [@foo] : | instance_variables.rb:20:10:20:13 | @foo | -| instance_variables.rb:22:20:22:24 | field : | instance_variables.rb:23:18:23:22 | field : | -| instance_variables.rb:22:20:22:24 | field : | instance_variables.rb:23:18:23:22 | field : | -| instance_variables.rb:23:18:23:22 | field : | instance_variables.rb:23:9:23:14 | [post] self [@field] : | -| instance_variables.rb:23:18:23:22 | field : | instance_variables.rb:23:9:23:14 | [post] self [@field] : | -| instance_variables.rb:24:9:24:17 | call to taint : | instance_variables.rb:28:9:28:25 | call to initialize : | -| instance_variables.rb:24:9:24:17 | call to taint : | instance_variables.rb:28:9:28:25 | call to initialize : | -| instance_variables.rb:27:25:27:29 | field : | instance_variables.rb:28:20:28:24 | field : | -| instance_variables.rb:27:25:27:29 | field : | instance_variables.rb:28:20:28:24 | field : | -| instance_variables.rb:28:9:28:25 | call to initialize : | instance_variables.rb:119:6:119:37 | call to call_initialize | -| instance_variables.rb:28:9:28:25 | call to initialize : | instance_variables.rb:119:6:119:37 | call to call_initialize | -| instance_variables.rb:28:20:28:24 | field : | instance_variables.rb:22:20:22:24 | field : | -| instance_variables.rb:28:20:28:24 | field : | instance_variables.rb:22:20:22:24 | field : | -| instance_variables.rb:28:20:28:24 | field : | instance_variables.rb:28:9:28:25 | [post] self [@field] : | -| instance_variables.rb:28:20:28:24 | field : | instance_variables.rb:28:9:28:25 | [post] self [@field] : | -| instance_variables.rb:31:18:31:18 | x : | instance_variables.rb:33:13:33:13 | x : | -| instance_variables.rb:31:18:31:18 | x : | instance_variables.rb:33:13:33:13 | x : | -| instance_variables.rb:32:13:32:21 | call to taint : | instance_variables.rb:22:20:22:24 | field : | -| instance_variables.rb:32:13:32:21 | call to taint : | instance_variables.rb:22:20:22:24 | field : | -| instance_variables.rb:32:13:32:21 | call to taint : | instance_variables.rb:48:20:48:20 | x : | -| instance_variables.rb:32:13:32:21 | call to taint : | instance_variables.rb:48:20:48:20 | x : | -| instance_variables.rb:33:13:33:13 | x : | instance_variables.rb:22:20:22:24 | field : | -| instance_variables.rb:33:13:33:13 | x : | instance_variables.rb:22:20:22:24 | field : | -| instance_variables.rb:33:13:33:13 | x : | instance_variables.rb:33:9:33:14 | call to new [@field] : | -| instance_variables.rb:33:13:33:13 | x : | instance_variables.rb:33:9:33:14 | call to new [@field] : | -| instance_variables.rb:36:10:36:23 | call to new [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:36:10:36:23 | call to new [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:36:10:36:23 | call to new [@field] : | instance_variables.rb:36:10:36:33 | call to get_field | -| instance_variables.rb:36:10:36:23 | call to new [@field] : | instance_variables.rb:36:10:36:33 | call to get_field | -| instance_variables.rb:36:14:36:22 | call to taint : | instance_variables.rb:22:20:22:24 | field : | -| instance_variables.rb:36:14:36:22 | call to taint : | instance_variables.rb:22:20:22:24 | field : | -| instance_variables.rb:36:14:36:22 | call to taint : | instance_variables.rb:36:10:36:23 | call to new [@field] : | -| instance_variables.rb:36:14:36:22 | call to taint : | instance_variables.rb:36:10:36:23 | call to new [@field] : | -| instance_variables.rb:39:6:39:23 | call to bar [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:39:6:39:23 | call to bar [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:39:6:39:23 | call to bar [@field] : | instance_variables.rb:39:6:39:33 | call to get_field | -| instance_variables.rb:39:6:39:23 | call to bar [@field] : | instance_variables.rb:39:6:39:33 | call to get_field | -| instance_variables.rb:39:14:39:22 | call to taint : | instance_variables.rb:31:18:31:18 | x : | -| instance_variables.rb:39:14:39:22 | call to taint : | instance_variables.rb:31:18:31:18 | x : | -| instance_variables.rb:39:14:39:22 | call to taint : | instance_variables.rb:39:6:39:23 | call to bar [@field] : | -| instance_variables.rb:39:14:39:22 | call to taint : | instance_variables.rb:39:6:39:23 | call to bar [@field] : | -| instance_variables.rb:43:9:43:17 | call to taint : | instance_variables.rb:121:7:121:24 | call to new : | -| instance_variables.rb:43:9:43:17 | call to taint : | instance_variables.rb:121:7:121:24 | call to new : | -| instance_variables.rb:48:20:48:20 | x : | instance_variables.rb:49:14:49:14 | x | -| instance_variables.rb:48:20:48:20 | x : | instance_variables.rb:49:14:49:14 | x | -| instance_variables.rb:54:1:54:3 | [post] foo [@field] : | instance_variables.rb:55:6:55:8 | foo [@field] : | -| instance_variables.rb:54:1:54:3 | [post] foo [@field] : | instance_variables.rb:55:6:55:8 | foo [@field] : | -| instance_variables.rb:54:15:54:23 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:54:15:54:23 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:54:15:54:23 | call to taint : | instance_variables.rb:54:1:54:3 | [post] foo [@field] : | -| instance_variables.rb:54:15:54:23 | call to taint : | instance_variables.rb:54:1:54:3 | [post] foo [@field] : | -| instance_variables.rb:55:6:55:8 | foo [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:55:6:55:8 | foo [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:55:6:55:8 | foo [@field] : | instance_variables.rb:55:6:55:18 | call to get_field | -| instance_variables.rb:55:6:55:8 | foo [@field] : | instance_variables.rb:55:6:55:18 | call to get_field | -| instance_variables.rb:58:1:58:3 | [post] bar [@field] : | instance_variables.rb:59:6:59:8 | bar [@field] : | -| instance_variables.rb:58:15:58:22 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:58:15:58:22 | call to taint : | instance_variables.rb:58:1:58:3 | [post] bar [@field] : | -| instance_variables.rb:59:6:59:8 | bar [@field] : | instance_variables.rb:16:5:18:7 | self in inc_field [@field] : | -| instance_variables.rb:59:6:59:8 | bar [@field] : | instance_variables.rb:59:6:59:18 | call to inc_field | -| instance_variables.rb:62:1:62:4 | [post] foo1 [@field] : | instance_variables.rb:63:6:63:9 | foo1 [@field] : | -| instance_variables.rb:62:1:62:4 | [post] foo1 [@field] : | instance_variables.rb:63:6:63:9 | foo1 [@field] : | -| instance_variables.rb:62:14:62:22 | call to taint : | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] : | -| instance_variables.rb:62:14:62:22 | call to taint : | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] : | -| instance_variables.rb:63:6:63:9 | foo1 [@field] : | instance_variables.rb:63:6:63:15 | call to field | -| instance_variables.rb:63:6:63:9 | foo1 [@field] : | instance_variables.rb:63:6:63:15 | call to field | -| instance_variables.rb:66:1:66:4 | [post] foo2 [@field] : | instance_variables.rb:67:6:67:9 | foo2 [@field] : | -| instance_variables.rb:66:1:66:4 | [post] foo2 [@field] : | instance_variables.rb:67:6:67:9 | foo2 [@field] : | -| instance_variables.rb:66:14:66:22 | call to taint : | instance_variables.rb:66:1:66:4 | [post] foo2 [@field] : | -| instance_variables.rb:66:14:66:22 | call to taint : | instance_variables.rb:66:1:66:4 | [post] foo2 [@field] : | -| instance_variables.rb:67:6:67:9 | foo2 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:67:6:67:9 | foo2 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:67:6:67:9 | foo2 [@field] : | instance_variables.rb:67:6:67:19 | call to get_field | -| instance_variables.rb:67:6:67:9 | foo2 [@field] : | instance_variables.rb:67:6:67:19 | call to get_field | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] : | instance_variables.rb:71:6:71:9 | foo3 [@field] : | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] : | instance_variables.rb:71:6:71:9 | foo3 [@field] : | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] : | instance_variables.rb:83:6:83:9 | foo3 [@field] : | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] : | instance_variables.rb:83:6:83:9 | foo3 [@field] : | -| instance_variables.rb:70:16:70:24 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:70:16:70:24 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:70:16:70:24 | call to taint : | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] : | -| instance_variables.rb:70:16:70:24 | call to taint : | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] : | -| instance_variables.rb:71:6:71:9 | foo3 [@field] : | instance_variables.rb:71:6:71:15 | call to field | -| instance_variables.rb:71:6:71:9 | foo3 [@field] : | instance_variables.rb:71:6:71:15 | call to field | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] : | instance_variables.rb:79:6:79:9 | foo5 [@field] : | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] : | instance_variables.rb:79:6:79:9 | foo5 [@field] : | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] : | instance_variables.rb:84:6:84:9 | foo5 [@field] : | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] : | instance_variables.rb:84:6:84:9 | foo5 [@field] : | -| instance_variables.rb:78:18:78:26 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:78:18:78:26 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:78:18:78:26 | call to taint : | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] : | -| instance_variables.rb:78:18:78:26 | call to taint : | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] : | -| instance_variables.rb:79:6:79:9 | foo5 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:79:6:79:9 | foo5 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:79:6:79:9 | foo5 [@field] : | instance_variables.rb:79:6:79:19 | call to get_field | -| instance_variables.rb:79:6:79:9 | foo5 [@field] : | instance_variables.rb:79:6:79:19 | call to get_field | -| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] : | instance_variables.rb:85:6:85:9 | foo6 [@field] : | -| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] : | instance_variables.rb:85:6:85:9 | foo6 [@field] : | -| instance_variables.rb:82:32:82:40 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:82:32:82:40 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:82:32:82:40 | call to taint : | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] : | -| instance_variables.rb:82:32:82:40 | call to taint : | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] : | -| instance_variables.rb:83:6:83:9 | foo3 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:83:6:83:9 | foo3 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:83:6:83:9 | foo3 [@field] : | instance_variables.rb:83:6:83:19 | call to get_field | -| instance_variables.rb:83:6:83:9 | foo3 [@field] : | instance_variables.rb:83:6:83:19 | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:84:6:84:9 | foo5 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:84:6:84:9 | foo5 [@field] : | instance_variables.rb:84:6:84:19 | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] : | instance_variables.rb:84:6:84:19 | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:85:6:85:9 | foo6 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:85:6:85:9 | foo6 [@field] : | instance_variables.rb:85:6:85:19 | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] : | instance_variables.rb:85:6:85:19 | call to get_field | -| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] : | instance_variables.rb:90:6:90:9 | foo7 [@field] : | -| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] : | instance_variables.rb:90:6:90:9 | foo7 [@field] : | -| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] : | instance_variables.rb:91:6:91:9 | foo8 [@field] : | -| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] : | instance_variables.rb:91:6:91:9 | foo8 [@field] : | -| instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] : | -| instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] : | -| instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] : | -| instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] : | -| instance_variables.rb:90:6:90:9 | foo7 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:90:6:90:9 | foo7 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:90:6:90:9 | foo7 [@field] : | instance_variables.rb:90:6:90:19 | call to get_field | -| instance_variables.rb:90:6:90:9 | foo7 [@field] : | instance_variables.rb:90:6:90:19 | call to get_field | -| instance_variables.rb:91:6:91:9 | foo8 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:91:6:91:9 | foo8 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:91:6:91:9 | foo8 [@field] : | instance_variables.rb:91:6:91:19 | call to get_field | -| instance_variables.rb:91:6:91:9 | foo8 [@field] : | instance_variables.rb:91:6:91:19 | call to get_field | -| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] : | instance_variables.rb:96:6:96:9 | foo9 [@field] : | -| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] : | instance_variables.rb:96:6:96:9 | foo9 [@field] : | -| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] : | instance_variables.rb:97:6:97:10 | foo10 [@field] : | -| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] : | instance_variables.rb:97:6:97:10 | foo10 [@field] : | -| instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] : | -| instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] : | -| instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] : | -| instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] : | -| instance_variables.rb:96:6:96:9 | foo9 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:96:6:96:9 | foo9 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:96:6:96:9 | foo9 [@field] : | instance_variables.rb:96:6:96:19 | call to get_field | -| instance_variables.rb:96:6:96:9 | foo9 [@field] : | instance_variables.rb:96:6:96:19 | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:97:6:97:10 | foo10 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:97:6:97:10 | foo10 [@field] : | instance_variables.rb:97:6:97:20 | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] : | instance_variables.rb:97:6:97:20 | call to get_field | -| instance_variables.rb:100:5:100:5 | [post] x [@field] : | instance_variables.rb:104:14:104:18 | [post] foo11 [@field] : | -| instance_variables.rb:100:5:100:5 | [post] x [@field] : | instance_variables.rb:104:14:104:18 | [post] foo11 [@field] : | -| instance_variables.rb:100:5:100:5 | [post] x [@field] : | instance_variables.rb:108:15:108:19 | [post] foo12 [@field] : | -| instance_variables.rb:100:5:100:5 | [post] x [@field] : | instance_variables.rb:108:15:108:19 | [post] foo12 [@field] : | -| instance_variables.rb:100:5:100:5 | [post] x [@field] : | instance_variables.rb:113:22:113:26 | [post] foo13 [@field] : | -| instance_variables.rb:100:5:100:5 | [post] x [@field] : | instance_variables.rb:113:22:113:26 | [post] foo13 [@field] : | -| instance_variables.rb:100:17:100:25 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:100:17:100:25 | call to taint : | instance_variables.rb:10:19:10:19 | x : | -| instance_variables.rb:100:17:100:25 | call to taint : | instance_variables.rb:100:5:100:5 | [post] x [@field] : | -| instance_variables.rb:100:17:100:25 | call to taint : | instance_variables.rb:100:5:100:5 | [post] x [@field] : | -| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] : | instance_variables.rb:105:6:105:10 | foo11 [@field] : | -| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] : | instance_variables.rb:105:6:105:10 | foo11 [@field] : | -| instance_variables.rb:105:6:105:10 | foo11 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:105:6:105:10 | foo11 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:105:6:105:10 | foo11 [@field] : | instance_variables.rb:105:6:105:20 | call to get_field | -| instance_variables.rb:105:6:105:10 | foo11 [@field] : | instance_variables.rb:105:6:105:20 | call to get_field | -| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] : | instance_variables.rb:109:6:109:10 | foo12 [@field] : | -| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] : | instance_variables.rb:109:6:109:10 | foo12 [@field] : | -| instance_variables.rb:109:6:109:10 | foo12 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:109:6:109:10 | foo12 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:109:6:109:10 | foo12 [@field] : | instance_variables.rb:109:6:109:20 | call to get_field | -| instance_variables.rb:109:6:109:10 | foo12 [@field] : | instance_variables.rb:109:6:109:20 | call to get_field | -| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] : | instance_variables.rb:114:6:114:10 | foo13 [@field] : | -| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] : | instance_variables.rb:114:6:114:10 | foo13 [@field] : | -| instance_variables.rb:114:6:114:10 | foo13 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:114:6:114:10 | foo13 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:114:6:114:10 | foo13 [@field] : | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:114:6:114:10 | foo13 [@field] : | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:116:1:116:5 | foo15 [@field] : | instance_variables.rb:117:6:117:10 | foo15 [@field] : | -| instance_variables.rb:116:1:116:5 | foo15 [@field] : | instance_variables.rb:117:6:117:10 | foo15 [@field] : | -| instance_variables.rb:116:9:116:26 | call to new [@field] : | instance_variables.rb:116:1:116:5 | foo15 [@field] : | -| instance_variables.rb:116:9:116:26 | call to new [@field] : | instance_variables.rb:116:1:116:5 | foo15 [@field] : | -| instance_variables.rb:116:17:116:25 | call to taint : | instance_variables.rb:22:20:22:24 | field : | -| instance_variables.rb:116:17:116:25 | call to taint : | instance_variables.rb:22:20:22:24 | field : | -| instance_variables.rb:116:17:116:25 | call to taint : | instance_variables.rb:116:9:116:26 | call to new [@field] : | -| instance_variables.rb:116:17:116:25 | call to taint : | instance_variables.rb:116:9:116:26 | call to new [@field] : | -| instance_variables.rb:117:6:117:10 | foo15 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:117:6:117:10 | foo15 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:117:6:117:10 | foo15 [@field] : | instance_variables.rb:117:6:117:20 | call to get_field | -| instance_variables.rb:117:6:117:10 | foo15 [@field] : | instance_variables.rb:117:6:117:20 | call to get_field | -| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] : | instance_variables.rb:120:6:120:10 | foo16 [@field] : | -| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] : | instance_variables.rb:120:6:120:10 | foo16 [@field] : | -| instance_variables.rb:119:28:119:36 | call to taint : | instance_variables.rb:27:25:27:29 | field : | -| instance_variables.rb:119:28:119:36 | call to taint : | instance_variables.rb:27:25:27:29 | field : | -| instance_variables.rb:119:28:119:36 | call to taint : | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] : | -| instance_variables.rb:119:28:119:36 | call to taint : | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] : | -| instance_variables.rb:120:6:120:10 | foo16 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:120:6:120:10 | foo16 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | -| instance_variables.rb:120:6:120:10 | foo16 [@field] : | instance_variables.rb:120:6:120:20 | call to get_field | -| instance_variables.rb:120:6:120:10 | foo16 [@field] : | instance_variables.rb:120:6:120:20 | call to get_field | -| instance_variables.rb:121:1:121:3 | bar : | instance_variables.rb:122:6:122:8 | bar | -| instance_variables.rb:121:1:121:3 | bar : | instance_variables.rb:122:6:122:8 | bar | -| instance_variables.rb:121:7:121:24 | call to new : | instance_variables.rb:121:1:121:3 | bar : | -| instance_variables.rb:121:7:121:24 | call to new : | instance_variables.rb:121:1:121:3 | bar : | +| captured_variables.rb:1:24:1:24 | x | captured_variables.rb:2:20:2:20 | x | +| captured_variables.rb:1:24:1:24 | x | captured_variables.rb:2:20:2:20 | x | +| captured_variables.rb:5:20:5:30 | call to source | captured_variables.rb:1:24:1:24 | x | +| captured_variables.rb:5:20:5:30 | call to source | captured_variables.rb:1:24:1:24 | x | +| captured_variables.rb:21:33:21:33 | x | captured_variables.rb:23:14:23:14 | x | +| captured_variables.rb:21:33:21:33 | x | captured_variables.rb:23:14:23:14 | x | +| captured_variables.rb:27:29:27:39 | call to source | captured_variables.rb:21:33:21:33 | x | +| captured_variables.rb:27:29:27:39 | call to source | captured_variables.rb:21:33:21:33 | x | +| captured_variables.rb:32:31:32:31 | x | captured_variables.rb:34:14:34:14 | x | +| captured_variables.rb:32:31:32:31 | x | captured_variables.rb:34:14:34:14 | x | +| captured_variables.rb:38:27:38:37 | call to source | captured_variables.rb:32:31:32:31 | x | +| captured_variables.rb:38:27:38:37 | call to source | captured_variables.rb:32:31:32:31 | x | +| instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:18:11:18 | x | +| instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:18:11:18 | x | +| instance_variables.rb:11:18:11:18 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | +| instance_variables.rb:11:18:11:18 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | +| instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:16:14:21 | self [@field] | +| instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:16:14:21 | self [@field] | +| instance_variables.rb:14:16:14:21 | @field | instance_variables.rb:14:9:14:21 | return | +| instance_variables.rb:14:16:14:21 | @field | instance_variables.rb:14:9:14:21 | return | +| instance_variables.rb:14:16:14:21 | self [@field] | instance_variables.rb:14:16:14:21 | @field | +| instance_variables.rb:14:16:14:21 | self [@field] | instance_variables.rb:14:16:14:21 | @field | +| instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | +| instance_variables.rb:17:9:17:14 | [post] self [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | +| instance_variables.rb:19:5:19:8 | [post] self [@foo] | instance_variables.rb:20:10:20:13 | self [@foo] | +| instance_variables.rb:19:5:19:8 | [post] self [@foo] | instance_variables.rb:20:10:20:13 | self [@foo] | +| instance_variables.rb:19:12:19:21 | call to taint | instance_variables.rb:19:5:19:8 | [post] self [@foo] | +| instance_variables.rb:19:12:19:21 | call to taint | instance_variables.rb:19:5:19:8 | [post] self [@foo] | +| instance_variables.rb:20:10:20:13 | self [@foo] | instance_variables.rb:20:10:20:13 | @foo | +| instance_variables.rb:20:10:20:13 | self [@foo] | instance_variables.rb:20:10:20:13 | @foo | +| instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:18:23:22 | field | +| instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:18:23:22 | field | +| instance_variables.rb:23:18:23:22 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | +| instance_variables.rb:23:18:23:22 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | +| instance_variables.rb:24:9:24:17 | call to taint | instance_variables.rb:28:9:28:25 | call to initialize | +| instance_variables.rb:24:9:24:17 | call to taint | instance_variables.rb:28:9:28:25 | call to initialize | +| instance_variables.rb:27:25:27:29 | field | instance_variables.rb:28:20:28:24 | field | +| instance_variables.rb:27:25:27:29 | field | instance_variables.rb:28:20:28:24 | field | +| instance_variables.rb:28:9:28:25 | call to initialize | instance_variables.rb:119:6:119:37 | call to call_initialize | +| instance_variables.rb:28:9:28:25 | call to initialize | instance_variables.rb:119:6:119:37 | call to call_initialize | +| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | +| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | +| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:28:9:28:25 | [post] self [@field] | +| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:28:9:28:25 | [post] self [@field] | +| instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:13:33:13 | x | +| instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:13:33:13 | x | +| instance_variables.rb:32:13:32:21 | call to taint | instance_variables.rb:22:20:22:24 | field | +| instance_variables.rb:32:13:32:21 | call to taint | instance_variables.rb:22:20:22:24 | field | +| instance_variables.rb:32:13:32:21 | call to taint | instance_variables.rb:48:20:48:20 | x | +| instance_variables.rb:32:13:32:21 | call to taint | instance_variables.rb:48:20:48:20 | x | +| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | +| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | +| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:33:9:33:14 | call to new [@field] | +| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:33:9:33:14 | call to new [@field] | +| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:36:10:36:33 | call to get_field | +| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:36:10:36:33 | call to get_field | +| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | +| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | +| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:36:10:36:23 | call to new [@field] | +| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:36:10:36:23 | call to new [@field] | +| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:39:6:39:33 | call to get_field | +| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:39:6:39:33 | call to get_field | +| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | +| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | +| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:39:6:39:23 | call to bar [@field] | +| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:39:6:39:23 | call to bar [@field] | +| instance_variables.rb:43:9:43:17 | call to taint | instance_variables.rb:121:7:121:24 | call to new | +| instance_variables.rb:43:9:43:17 | call to taint | instance_variables.rb:121:7:121:24 | call to new | +| instance_variables.rb:48:20:48:20 | x | instance_variables.rb:49:14:49:14 | x | +| instance_variables.rb:48:20:48:20 | x | instance_variables.rb:49:14:49:14 | x | +| instance_variables.rb:54:1:54:3 | [post] foo [@field] | instance_variables.rb:55:6:55:8 | foo [@field] | +| instance_variables.rb:54:1:54:3 | [post] foo [@field] | instance_variables.rb:55:6:55:8 | foo [@field] | +| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:54:1:54:3 | [post] foo [@field] | +| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:54:1:54:3 | [post] foo [@field] | +| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:55:6:55:18 | call to get_field | +| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:55:6:55:18 | call to get_field | +| instance_variables.rb:58:1:58:3 | [post] bar [@field] | instance_variables.rb:59:6:59:8 | bar [@field] | +| instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:58:1:58:3 | [post] bar [@field] | +| instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | +| instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | +| instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | instance_variables.rb:63:6:63:9 | foo1 [@field] | +| instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | instance_variables.rb:63:6:63:9 | foo1 [@field] | +| instance_variables.rb:62:14:62:22 | call to taint | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | +| instance_variables.rb:62:14:62:22 | call to taint | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | +| instance_variables.rb:63:6:63:9 | foo1 [@field] | instance_variables.rb:63:6:63:15 | call to field | +| instance_variables.rb:63:6:63:9 | foo1 [@field] | instance_variables.rb:63:6:63:15 | call to field | +| instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | instance_variables.rb:67:6:67:9 | foo2 [@field] | +| instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | instance_variables.rb:67:6:67:9 | foo2 [@field] | +| instance_variables.rb:66:14:66:22 | call to taint | instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | +| instance_variables.rb:66:14:66:22 | call to taint | instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:67:6:67:19 | call to get_field | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:67:6:67:19 | call to get_field | +| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | instance_variables.rb:71:6:71:9 | foo3 [@field] | +| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | instance_variables.rb:71:6:71:9 | foo3 [@field] | +| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | instance_variables.rb:83:6:83:9 | foo3 [@field] | +| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | instance_variables.rb:83:6:83:9 | foo3 [@field] | +| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | +| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | +| instance_variables.rb:71:6:71:9 | foo3 [@field] | instance_variables.rb:71:6:71:15 | call to field | +| instance_variables.rb:71:6:71:9 | foo3 [@field] | instance_variables.rb:71:6:71:15 | call to field | +| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | instance_variables.rb:79:6:79:9 | foo5 [@field] | +| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | instance_variables.rb:79:6:79:9 | foo5 [@field] | +| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | instance_variables.rb:84:6:84:9 | foo5 [@field] | +| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | instance_variables.rb:84:6:84:9 | foo5 [@field] | +| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | +| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | +| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:79:6:79:19 | call to get_field | +| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:79:6:79:19 | call to get_field | +| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | instance_variables.rb:85:6:85:9 | foo6 [@field] | +| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | instance_variables.rb:85:6:85:9 | foo6 [@field] | +| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | +| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | +| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:83:6:83:19 | call to get_field | +| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:83:6:83:19 | call to get_field | +| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:84:6:84:19 | call to get_field | +| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:84:6:84:19 | call to get_field | +| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:85:6:85:19 | call to get_field | +| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:85:6:85:19 | call to get_field | +| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | instance_variables.rb:90:6:90:9 | foo7 [@field] | +| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | instance_variables.rb:90:6:90:9 | foo7 [@field] | +| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | instance_variables.rb:91:6:91:9 | foo8 [@field] | +| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | instance_variables.rb:91:6:91:9 | foo8 [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | +| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:90:6:90:19 | call to get_field | +| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:90:6:90:19 | call to get_field | +| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:91:6:91:19 | call to get_field | +| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:91:6:91:19 | call to get_field | +| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | instance_variables.rb:96:6:96:9 | foo9 [@field] | +| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | instance_variables.rb:96:6:96:9 | foo9 [@field] | +| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | instance_variables.rb:97:6:97:10 | foo10 [@field] | +| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | instance_variables.rb:97:6:97:10 | foo10 [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | +| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:96:6:96:19 | call to get_field | +| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:96:6:96:19 | call to get_field | +| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:97:6:97:20 | call to get_field | +| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:97:6:97:20 | call to get_field | +| instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | +| instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | +| instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | +| instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | +| instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | +| instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | +| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | +| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:100:5:100:5 | [post] x [@field] | +| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:100:5:100:5 | [post] x [@field] | +| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | instance_variables.rb:105:6:105:10 | foo11 [@field] | +| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | instance_variables.rb:105:6:105:10 | foo11 [@field] | +| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:105:6:105:20 | call to get_field | +| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:105:6:105:20 | call to get_field | +| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | instance_variables.rb:109:6:109:10 | foo12 [@field] | +| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | instance_variables.rb:109:6:109:10 | foo12 [@field] | +| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:109:6:109:20 | call to get_field | +| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:109:6:109:20 | call to get_field | +| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | instance_variables.rb:114:6:114:10 | foo13 [@field] | +| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | instance_variables.rb:114:6:114:10 | foo13 [@field] | +| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:114:6:114:20 | call to get_field | +| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:114:6:114:20 | call to get_field | +| instance_variables.rb:116:1:116:5 | foo15 [@field] | instance_variables.rb:117:6:117:10 | foo15 [@field] | +| instance_variables.rb:116:1:116:5 | foo15 [@field] | instance_variables.rb:117:6:117:10 | foo15 [@field] | +| instance_variables.rb:116:9:116:26 | call to new [@field] | instance_variables.rb:116:1:116:5 | foo15 [@field] | +| instance_variables.rb:116:9:116:26 | call to new [@field] | instance_variables.rb:116:1:116:5 | foo15 [@field] | +| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | +| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | +| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:116:9:116:26 | call to new [@field] | +| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:116:9:116:26 | call to new [@field] | +| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:117:6:117:20 | call to get_field | +| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:117:6:117:20 | call to get_field | +| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | instance_variables.rb:120:6:120:10 | foo16 [@field] | +| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | instance_variables.rb:120:6:120:10 | foo16 [@field] | +| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | +| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | +| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | +| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | +| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | +| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:120:6:120:20 | call to get_field | +| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:120:6:120:20 | call to get_field | +| instance_variables.rb:121:1:121:3 | bar | instance_variables.rb:122:6:122:8 | bar | +| instance_variables.rb:121:1:121:3 | bar | instance_variables.rb:122:6:122:8 | bar | +| instance_variables.rb:121:7:121:24 | call to new | instance_variables.rb:121:1:121:3 | bar | +| instance_variables.rb:121:7:121:24 | call to new | instance_variables.rb:121:1:121:3 | bar | nodes -| captured_variables.rb:1:24:1:24 | x : | semmle.label | x : | -| captured_variables.rb:1:24:1:24 | x : | semmle.label | x : | +| captured_variables.rb:1:24:1:24 | x | semmle.label | x | +| captured_variables.rb:1:24:1:24 | x | semmle.label | x | | captured_variables.rb:2:20:2:20 | x | semmle.label | x | | captured_variables.rb:2:20:2:20 | x | semmle.label | x | -| captured_variables.rb:5:20:5:30 | call to source : | semmle.label | call to source : | -| captured_variables.rb:5:20:5:30 | call to source : | semmle.label | call to source : | -| captured_variables.rb:21:33:21:33 | x : | semmle.label | x : | -| captured_variables.rb:21:33:21:33 | x : | semmle.label | x : | +| captured_variables.rb:5:20:5:30 | call to source | semmle.label | call to source | +| captured_variables.rb:5:20:5:30 | call to source | semmle.label | call to source | +| captured_variables.rb:21:33:21:33 | x | semmle.label | x | +| captured_variables.rb:21:33:21:33 | x | semmle.label | x | | captured_variables.rb:23:14:23:14 | x | semmle.label | x | | captured_variables.rb:23:14:23:14 | x | semmle.label | x | -| captured_variables.rb:27:29:27:39 | call to source : | semmle.label | call to source : | -| captured_variables.rb:27:29:27:39 | call to source : | semmle.label | call to source : | -| captured_variables.rb:32:31:32:31 | x : | semmle.label | x : | -| captured_variables.rb:32:31:32:31 | x : | semmle.label | x : | +| captured_variables.rb:27:29:27:39 | call to source | semmle.label | call to source | +| captured_variables.rb:27:29:27:39 | call to source | semmle.label | call to source | +| captured_variables.rb:32:31:32:31 | x | semmle.label | x | +| captured_variables.rb:32:31:32:31 | x | semmle.label | x | | captured_variables.rb:34:14:34:14 | x | semmle.label | x | | captured_variables.rb:34:14:34:14 | x | semmle.label | x | -| captured_variables.rb:38:27:38:37 | call to source : | semmle.label | call to source : | -| captured_variables.rb:38:27:38:37 | call to source : | semmle.label | call to source : | -| instance_variables.rb:10:19:10:19 | x : | semmle.label | x : | -| instance_variables.rb:10:19:10:19 | x : | semmle.label | x : | -| instance_variables.rb:11:9:11:14 | [post] self [@field] : | semmle.label | [post] self [@field] : | -| instance_variables.rb:11:9:11:14 | [post] self [@field] : | semmle.label | [post] self [@field] : | -| instance_variables.rb:11:18:11:18 | x : | semmle.label | x : | -| instance_variables.rb:11:18:11:18 | x : | semmle.label | x : | -| instance_variables.rb:13:5:15:7 | self in get_field [@field] : | semmle.label | self in get_field [@field] : | -| instance_variables.rb:13:5:15:7 | self in get_field [@field] : | semmle.label | self in get_field [@field] : | -| instance_variables.rb:14:9:14:21 | return : | semmle.label | return : | -| instance_variables.rb:14:9:14:21 | return : | semmle.label | return : | -| instance_variables.rb:14:16:14:21 | @field : | semmle.label | @field : | -| instance_variables.rb:14:16:14:21 | @field : | semmle.label | @field : | -| instance_variables.rb:14:16:14:21 | self [@field] : | semmle.label | self [@field] : | -| instance_variables.rb:14:16:14:21 | self [@field] : | semmle.label | self [@field] : | -| instance_variables.rb:16:5:18:7 | self in inc_field [@field] : | semmle.label | self in inc_field [@field] : | -| instance_variables.rb:17:9:17:14 | [post] self [@field] : | semmle.label | [post] self [@field] : | -| instance_variables.rb:19:5:19:8 | [post] self [@foo] : | semmle.label | [post] self [@foo] : | -| instance_variables.rb:19:5:19:8 | [post] self [@foo] : | semmle.label | [post] self [@foo] : | -| instance_variables.rb:19:12:19:21 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:19:12:19:21 | call to taint : | semmle.label | call to taint : | +| captured_variables.rb:38:27:38:37 | call to source | semmle.label | call to source | +| captured_variables.rb:38:27:38:37 | call to source | semmle.label | call to source | +| instance_variables.rb:10:19:10:19 | x | semmle.label | x | +| instance_variables.rb:10:19:10:19 | x | semmle.label | x | +| instance_variables.rb:11:9:11:14 | [post] self [@field] | semmle.label | [post] self [@field] | +| instance_variables.rb:11:9:11:14 | [post] self [@field] | semmle.label | [post] self [@field] | +| instance_variables.rb:11:18:11:18 | x | semmle.label | x | +| instance_variables.rb:11:18:11:18 | x | semmle.label | x | +| instance_variables.rb:13:5:15:7 | self in get_field [@field] | semmle.label | self in get_field [@field] | +| instance_variables.rb:13:5:15:7 | self in get_field [@field] | semmle.label | self in get_field [@field] | +| instance_variables.rb:14:9:14:21 | return | semmle.label | return | +| instance_variables.rb:14:9:14:21 | return | semmle.label | return | +| instance_variables.rb:14:16:14:21 | @field | semmle.label | @field | +| instance_variables.rb:14:16:14:21 | @field | semmle.label | @field | +| instance_variables.rb:14:16:14:21 | self [@field] | semmle.label | self [@field] | +| instance_variables.rb:14:16:14:21 | self [@field] | semmle.label | self [@field] | +| instance_variables.rb:16:5:18:7 | self in inc_field [@field] | semmle.label | self in inc_field [@field] | +| instance_variables.rb:17:9:17:14 | [post] self [@field] | semmle.label | [post] self [@field] | +| instance_variables.rb:19:5:19:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | +| instance_variables.rb:19:5:19:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | +| instance_variables.rb:19:12:19:21 | call to taint | semmle.label | call to taint | +| instance_variables.rb:19:12:19:21 | call to taint | semmle.label | call to taint | | instance_variables.rb:20:10:20:13 | @foo | semmle.label | @foo | | instance_variables.rb:20:10:20:13 | @foo | semmle.label | @foo | -| instance_variables.rb:20:10:20:13 | self [@foo] : | semmle.label | self [@foo] : | -| instance_variables.rb:20:10:20:13 | self [@foo] : | semmle.label | self [@foo] : | -| instance_variables.rb:22:20:22:24 | field : | semmle.label | field : | -| instance_variables.rb:22:20:22:24 | field : | semmle.label | field : | -| instance_variables.rb:23:9:23:14 | [post] self [@field] : | semmle.label | [post] self [@field] : | -| instance_variables.rb:23:9:23:14 | [post] self [@field] : | semmle.label | [post] self [@field] : | -| instance_variables.rb:23:18:23:22 | field : | semmle.label | field : | -| instance_variables.rb:23:18:23:22 | field : | semmle.label | field : | -| instance_variables.rb:24:9:24:17 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:24:9:24:17 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:27:25:27:29 | field : | semmle.label | field : | -| instance_variables.rb:27:25:27:29 | field : | semmle.label | field : | -| instance_variables.rb:28:9:28:25 | [post] self [@field] : | semmle.label | [post] self [@field] : | -| instance_variables.rb:28:9:28:25 | [post] self [@field] : | semmle.label | [post] self [@field] : | -| instance_variables.rb:28:9:28:25 | call to initialize : | semmle.label | call to initialize : | -| instance_variables.rb:28:9:28:25 | call to initialize : | semmle.label | call to initialize : | -| instance_variables.rb:28:20:28:24 | field : | semmle.label | field : | -| instance_variables.rb:28:20:28:24 | field : | semmle.label | field : | -| instance_variables.rb:31:18:31:18 | x : | semmle.label | x : | -| instance_variables.rb:31:18:31:18 | x : | semmle.label | x : | -| instance_variables.rb:32:13:32:21 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:32:13:32:21 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:33:9:33:14 | call to new [@field] : | semmle.label | call to new [@field] : | -| instance_variables.rb:33:9:33:14 | call to new [@field] : | semmle.label | call to new [@field] : | -| instance_variables.rb:33:13:33:13 | x : | semmle.label | x : | -| instance_variables.rb:33:13:33:13 | x : | semmle.label | x : | -| instance_variables.rb:36:10:36:23 | call to new [@field] : | semmle.label | call to new [@field] : | -| instance_variables.rb:36:10:36:23 | call to new [@field] : | semmle.label | call to new [@field] : | +| instance_variables.rb:20:10:20:13 | self [@foo] | semmle.label | self [@foo] | +| instance_variables.rb:20:10:20:13 | self [@foo] | semmle.label | self [@foo] | +| instance_variables.rb:22:20:22:24 | field | semmle.label | field | +| instance_variables.rb:22:20:22:24 | field | semmle.label | field | +| instance_variables.rb:23:9:23:14 | [post] self [@field] | semmle.label | [post] self [@field] | +| instance_variables.rb:23:9:23:14 | [post] self [@field] | semmle.label | [post] self [@field] | +| instance_variables.rb:23:18:23:22 | field | semmle.label | field | +| instance_variables.rb:23:18:23:22 | field | semmle.label | field | +| instance_variables.rb:24:9:24:17 | call to taint | semmle.label | call to taint | +| instance_variables.rb:24:9:24:17 | call to taint | semmle.label | call to taint | +| instance_variables.rb:27:25:27:29 | field | semmle.label | field | +| instance_variables.rb:27:25:27:29 | field | semmle.label | field | +| instance_variables.rb:28:9:28:25 | [post] self [@field] | semmle.label | [post] self [@field] | +| instance_variables.rb:28:9:28:25 | [post] self [@field] | semmle.label | [post] self [@field] | +| instance_variables.rb:28:9:28:25 | call to initialize | semmle.label | call to initialize | +| instance_variables.rb:28:9:28:25 | call to initialize | semmle.label | call to initialize | +| instance_variables.rb:28:20:28:24 | field | semmle.label | field | +| instance_variables.rb:28:20:28:24 | field | semmle.label | field | +| instance_variables.rb:31:18:31:18 | x | semmle.label | x | +| instance_variables.rb:31:18:31:18 | x | semmle.label | x | +| instance_variables.rb:32:13:32:21 | call to taint | semmle.label | call to taint | +| instance_variables.rb:32:13:32:21 | call to taint | semmle.label | call to taint | +| instance_variables.rb:33:9:33:14 | call to new [@field] | semmle.label | call to new [@field] | +| instance_variables.rb:33:9:33:14 | call to new [@field] | semmle.label | call to new [@field] | +| instance_variables.rb:33:13:33:13 | x | semmle.label | x | +| instance_variables.rb:33:13:33:13 | x | semmle.label | x | +| instance_variables.rb:36:10:36:23 | call to new [@field] | semmle.label | call to new [@field] | +| instance_variables.rb:36:10:36:23 | call to new [@field] | semmle.label | call to new [@field] | | instance_variables.rb:36:10:36:33 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:36:10:36:33 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:36:14:36:22 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:36:14:36:22 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:39:6:39:23 | call to bar [@field] : | semmle.label | call to bar [@field] : | -| instance_variables.rb:39:6:39:23 | call to bar [@field] : | semmle.label | call to bar [@field] : | +| instance_variables.rb:36:14:36:22 | call to taint | semmle.label | call to taint | +| instance_variables.rb:36:14:36:22 | call to taint | semmle.label | call to taint | +| instance_variables.rb:39:6:39:23 | call to bar [@field] | semmle.label | call to bar [@field] | +| instance_variables.rb:39:6:39:23 | call to bar [@field] | semmle.label | call to bar [@field] | | instance_variables.rb:39:6:39:33 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:39:6:39:33 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:39:14:39:22 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:39:14:39:22 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:43:9:43:17 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:43:9:43:17 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:48:20:48:20 | x : | semmle.label | x : | -| instance_variables.rb:48:20:48:20 | x : | semmle.label | x : | +| instance_variables.rb:39:14:39:22 | call to taint | semmle.label | call to taint | +| instance_variables.rb:39:14:39:22 | call to taint | semmle.label | call to taint | +| instance_variables.rb:43:9:43:17 | call to taint | semmle.label | call to taint | +| instance_variables.rb:43:9:43:17 | call to taint | semmle.label | call to taint | +| instance_variables.rb:48:20:48:20 | x | semmle.label | x | +| instance_variables.rb:48:20:48:20 | x | semmle.label | x | | instance_variables.rb:49:14:49:14 | x | semmle.label | x | | instance_variables.rb:49:14:49:14 | x | semmle.label | x | -| instance_variables.rb:54:1:54:3 | [post] foo [@field] : | semmle.label | [post] foo [@field] : | -| instance_variables.rb:54:1:54:3 | [post] foo [@field] : | semmle.label | [post] foo [@field] : | -| instance_variables.rb:54:15:54:23 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:54:15:54:23 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:55:6:55:8 | foo [@field] : | semmle.label | foo [@field] : | -| instance_variables.rb:55:6:55:8 | foo [@field] : | semmle.label | foo [@field] : | +| instance_variables.rb:54:1:54:3 | [post] foo [@field] | semmle.label | [post] foo [@field] | +| instance_variables.rb:54:1:54:3 | [post] foo [@field] | semmle.label | [post] foo [@field] | +| instance_variables.rb:54:15:54:23 | call to taint | semmle.label | call to taint | +| instance_variables.rb:54:15:54:23 | call to taint | semmle.label | call to taint | +| instance_variables.rb:55:6:55:8 | foo [@field] | semmle.label | foo [@field] | +| instance_variables.rb:55:6:55:8 | foo [@field] | semmle.label | foo [@field] | | instance_variables.rb:55:6:55:18 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:55:6:55:18 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:58:1:58:3 | [post] bar [@field] : | semmle.label | [post] bar [@field] : | -| instance_variables.rb:58:15:58:22 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:59:6:59:8 | bar [@field] : | semmle.label | bar [@field] : | +| instance_variables.rb:58:1:58:3 | [post] bar [@field] | semmle.label | [post] bar [@field] | +| instance_variables.rb:58:15:58:22 | call to taint | semmle.label | call to taint | +| instance_variables.rb:59:6:59:8 | bar [@field] | semmle.label | bar [@field] | | instance_variables.rb:59:6:59:18 | call to inc_field | semmle.label | call to inc_field | -| instance_variables.rb:62:1:62:4 | [post] foo1 [@field] : | semmle.label | [post] foo1 [@field] : | -| instance_variables.rb:62:1:62:4 | [post] foo1 [@field] : | semmle.label | [post] foo1 [@field] : | -| instance_variables.rb:62:14:62:22 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:62:14:62:22 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:63:6:63:9 | foo1 [@field] : | semmle.label | foo1 [@field] : | -| instance_variables.rb:63:6:63:9 | foo1 [@field] : | semmle.label | foo1 [@field] : | +| instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | semmle.label | [post] foo1 [@field] | +| instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | semmle.label | [post] foo1 [@field] | +| instance_variables.rb:62:14:62:22 | call to taint | semmle.label | call to taint | +| instance_variables.rb:62:14:62:22 | call to taint | semmle.label | call to taint | +| instance_variables.rb:63:6:63:9 | foo1 [@field] | semmle.label | foo1 [@field] | +| instance_variables.rb:63:6:63:9 | foo1 [@field] | semmle.label | foo1 [@field] | | instance_variables.rb:63:6:63:15 | call to field | semmle.label | call to field | | instance_variables.rb:63:6:63:15 | call to field | semmle.label | call to field | -| instance_variables.rb:66:1:66:4 | [post] foo2 [@field] : | semmle.label | [post] foo2 [@field] : | -| instance_variables.rb:66:1:66:4 | [post] foo2 [@field] : | semmle.label | [post] foo2 [@field] : | -| instance_variables.rb:66:14:66:22 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:66:14:66:22 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:67:6:67:9 | foo2 [@field] : | semmle.label | foo2 [@field] : | -| instance_variables.rb:67:6:67:9 | foo2 [@field] : | semmle.label | foo2 [@field] : | +| instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | semmle.label | [post] foo2 [@field] | +| instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | semmle.label | [post] foo2 [@field] | +| instance_variables.rb:66:14:66:22 | call to taint | semmle.label | call to taint | +| instance_variables.rb:66:14:66:22 | call to taint | semmle.label | call to taint | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | semmle.label | foo2 [@field] | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | semmle.label | foo2 [@field] | | instance_variables.rb:67:6:67:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:67:6:67:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] : | semmle.label | [post] foo3 [@field] : | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] : | semmle.label | [post] foo3 [@field] : | -| instance_variables.rb:70:16:70:24 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:70:16:70:24 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:71:6:71:9 | foo3 [@field] : | semmle.label | foo3 [@field] : | -| instance_variables.rb:71:6:71:9 | foo3 [@field] : | semmle.label | foo3 [@field] : | +| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | semmle.label | [post] foo3 [@field] | +| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | semmle.label | [post] foo3 [@field] | +| instance_variables.rb:70:16:70:24 | call to taint | semmle.label | call to taint | +| instance_variables.rb:70:16:70:24 | call to taint | semmle.label | call to taint | +| instance_variables.rb:71:6:71:9 | foo3 [@field] | semmle.label | foo3 [@field] | +| instance_variables.rb:71:6:71:9 | foo3 [@field] | semmle.label | foo3 [@field] | | instance_variables.rb:71:6:71:15 | call to field | semmle.label | call to field | | instance_variables.rb:71:6:71:15 | call to field | semmle.label | call to field | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] : | semmle.label | [post] foo5 [@field] : | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] : | semmle.label | [post] foo5 [@field] : | -| instance_variables.rb:78:18:78:26 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:78:18:78:26 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:79:6:79:9 | foo5 [@field] : | semmle.label | foo5 [@field] : | -| instance_variables.rb:79:6:79:9 | foo5 [@field] : | semmle.label | foo5 [@field] : | +| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | semmle.label | [post] foo5 [@field] | +| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | semmle.label | [post] foo5 [@field] | +| instance_variables.rb:78:18:78:26 | call to taint | semmle.label | call to taint | +| instance_variables.rb:78:18:78:26 | call to taint | semmle.label | call to taint | +| instance_variables.rb:79:6:79:9 | foo5 [@field] | semmle.label | foo5 [@field] | +| instance_variables.rb:79:6:79:9 | foo5 [@field] | semmle.label | foo5 [@field] | | instance_variables.rb:79:6:79:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:79:6:79:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] : | semmle.label | [post] foo6 [@field] : | -| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] : | semmle.label | [post] foo6 [@field] : | -| instance_variables.rb:82:32:82:40 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:82:32:82:40 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:83:6:83:9 | foo3 [@field] : | semmle.label | foo3 [@field] : | -| instance_variables.rb:83:6:83:9 | foo3 [@field] : | semmle.label | foo3 [@field] : | +| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | semmle.label | [post] foo6 [@field] | +| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | semmle.label | [post] foo6 [@field] | +| instance_variables.rb:82:32:82:40 | call to taint | semmle.label | call to taint | +| instance_variables.rb:82:32:82:40 | call to taint | semmle.label | call to taint | +| instance_variables.rb:83:6:83:9 | foo3 [@field] | semmle.label | foo3 [@field] | +| instance_variables.rb:83:6:83:9 | foo3 [@field] | semmle.label | foo3 [@field] | | instance_variables.rb:83:6:83:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:83:6:83:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] : | semmle.label | foo5 [@field] : | -| instance_variables.rb:84:6:84:9 | foo5 [@field] : | semmle.label | foo5 [@field] : | +| instance_variables.rb:84:6:84:9 | foo5 [@field] | semmle.label | foo5 [@field] | +| instance_variables.rb:84:6:84:9 | foo5 [@field] | semmle.label | foo5 [@field] | | instance_variables.rb:84:6:84:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:84:6:84:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] : | semmle.label | foo6 [@field] : | -| instance_variables.rb:85:6:85:9 | foo6 [@field] : | semmle.label | foo6 [@field] : | +| instance_variables.rb:85:6:85:9 | foo6 [@field] | semmle.label | foo6 [@field] | +| instance_variables.rb:85:6:85:9 | foo6 [@field] | semmle.label | foo6 [@field] | | instance_variables.rb:85:6:85:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:85:6:85:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] : | semmle.label | [post] foo7 [@field] : | -| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] : | semmle.label | [post] foo7 [@field] : | -| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] : | semmle.label | [post] foo8 [@field] : | -| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] : | semmle.label | [post] foo8 [@field] : | -| instance_variables.rb:89:45:89:53 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:89:45:89:53 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:90:6:90:9 | foo7 [@field] : | semmle.label | foo7 [@field] : | -| instance_variables.rb:90:6:90:9 | foo7 [@field] : | semmle.label | foo7 [@field] : | +| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | semmle.label | [post] foo7 [@field] | +| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | semmle.label | [post] foo7 [@field] | +| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | semmle.label | [post] foo8 [@field] | +| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | semmle.label | [post] foo8 [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | semmle.label | call to taint | +| instance_variables.rb:89:45:89:53 | call to taint | semmle.label | call to taint | +| instance_variables.rb:90:6:90:9 | foo7 [@field] | semmle.label | foo7 [@field] | +| instance_variables.rb:90:6:90:9 | foo7 [@field] | semmle.label | foo7 [@field] | | instance_variables.rb:90:6:90:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:90:6:90:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:91:6:91:9 | foo8 [@field] : | semmle.label | foo8 [@field] : | -| instance_variables.rb:91:6:91:9 | foo8 [@field] : | semmle.label | foo8 [@field] : | +| instance_variables.rb:91:6:91:9 | foo8 [@field] | semmle.label | foo8 [@field] | +| instance_variables.rb:91:6:91:9 | foo8 [@field] | semmle.label | foo8 [@field] | | instance_variables.rb:91:6:91:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:91:6:91:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] : | semmle.label | [post] foo9 [@field] : | -| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] : | semmle.label | [post] foo9 [@field] : | -| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] : | semmle.label | [post] foo10 [@field] : | -| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] : | semmle.label | [post] foo10 [@field] : | -| instance_variables.rb:95:53:95:61 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:95:53:95:61 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:96:6:96:9 | foo9 [@field] : | semmle.label | foo9 [@field] : | -| instance_variables.rb:96:6:96:9 | foo9 [@field] : | semmle.label | foo9 [@field] : | +| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | semmle.label | [post] foo9 [@field] | +| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | semmle.label | [post] foo9 [@field] | +| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | semmle.label | [post] foo10 [@field] | +| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | semmle.label | [post] foo10 [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | semmle.label | call to taint | +| instance_variables.rb:95:53:95:61 | call to taint | semmle.label | call to taint | +| instance_variables.rb:96:6:96:9 | foo9 [@field] | semmle.label | foo9 [@field] | +| instance_variables.rb:96:6:96:9 | foo9 [@field] | semmle.label | foo9 [@field] | | instance_variables.rb:96:6:96:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:96:6:96:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] : | semmle.label | foo10 [@field] : | -| instance_variables.rb:97:6:97:10 | foo10 [@field] : | semmle.label | foo10 [@field] : | +| instance_variables.rb:97:6:97:10 | foo10 [@field] | semmle.label | foo10 [@field] | +| instance_variables.rb:97:6:97:10 | foo10 [@field] | semmle.label | foo10 [@field] | | instance_variables.rb:97:6:97:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:97:6:97:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:100:5:100:5 | [post] x [@field] : | semmle.label | [post] x [@field] : | -| instance_variables.rb:100:5:100:5 | [post] x [@field] : | semmle.label | [post] x [@field] : | -| instance_variables.rb:100:17:100:25 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:100:17:100:25 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] : | semmle.label | [post] foo11 [@field] : | -| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] : | semmle.label | [post] foo11 [@field] : | -| instance_variables.rb:105:6:105:10 | foo11 [@field] : | semmle.label | foo11 [@field] : | -| instance_variables.rb:105:6:105:10 | foo11 [@field] : | semmle.label | foo11 [@field] : | +| instance_variables.rb:100:5:100:5 | [post] x [@field] | semmle.label | [post] x [@field] | +| instance_variables.rb:100:5:100:5 | [post] x [@field] | semmle.label | [post] x [@field] | +| instance_variables.rb:100:17:100:25 | call to taint | semmle.label | call to taint | +| instance_variables.rb:100:17:100:25 | call to taint | semmle.label | call to taint | +| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | semmle.label | [post] foo11 [@field] | +| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | semmle.label | [post] foo11 [@field] | +| instance_variables.rb:105:6:105:10 | foo11 [@field] | semmle.label | foo11 [@field] | +| instance_variables.rb:105:6:105:10 | foo11 [@field] | semmle.label | foo11 [@field] | | instance_variables.rb:105:6:105:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:105:6:105:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] : | semmle.label | [post] foo12 [@field] : | -| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] : | semmle.label | [post] foo12 [@field] : | -| instance_variables.rb:109:6:109:10 | foo12 [@field] : | semmle.label | foo12 [@field] : | -| instance_variables.rb:109:6:109:10 | foo12 [@field] : | semmle.label | foo12 [@field] : | +| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | semmle.label | [post] foo12 [@field] | +| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | semmle.label | [post] foo12 [@field] | +| instance_variables.rb:109:6:109:10 | foo12 [@field] | semmle.label | foo12 [@field] | +| instance_variables.rb:109:6:109:10 | foo12 [@field] | semmle.label | foo12 [@field] | | instance_variables.rb:109:6:109:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:109:6:109:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] : | semmle.label | [post] foo13 [@field] : | -| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] : | semmle.label | [post] foo13 [@field] : | -| instance_variables.rb:114:6:114:10 | foo13 [@field] : | semmle.label | foo13 [@field] : | -| instance_variables.rb:114:6:114:10 | foo13 [@field] : | semmle.label | foo13 [@field] : | +| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | semmle.label | [post] foo13 [@field] | +| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | semmle.label | [post] foo13 [@field] | +| instance_variables.rb:114:6:114:10 | foo13 [@field] | semmle.label | foo13 [@field] | +| instance_variables.rb:114:6:114:10 | foo13 [@field] | semmle.label | foo13 [@field] | | instance_variables.rb:114:6:114:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:114:6:114:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:116:1:116:5 | foo15 [@field] : | semmle.label | foo15 [@field] : | -| instance_variables.rb:116:1:116:5 | foo15 [@field] : | semmle.label | foo15 [@field] : | -| instance_variables.rb:116:9:116:26 | call to new [@field] : | semmle.label | call to new [@field] : | -| instance_variables.rb:116:9:116:26 | call to new [@field] : | semmle.label | call to new [@field] : | -| instance_variables.rb:116:17:116:25 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:116:17:116:25 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:117:6:117:10 | foo15 [@field] : | semmle.label | foo15 [@field] : | -| instance_variables.rb:117:6:117:10 | foo15 [@field] : | semmle.label | foo15 [@field] : | +| instance_variables.rb:116:1:116:5 | foo15 [@field] | semmle.label | foo15 [@field] | +| instance_variables.rb:116:1:116:5 | foo15 [@field] | semmle.label | foo15 [@field] | +| instance_variables.rb:116:9:116:26 | call to new [@field] | semmle.label | call to new [@field] | +| instance_variables.rb:116:9:116:26 | call to new [@field] | semmle.label | call to new [@field] | +| instance_variables.rb:116:17:116:25 | call to taint | semmle.label | call to taint | +| instance_variables.rb:116:17:116:25 | call to taint | semmle.label | call to taint | +| instance_variables.rb:117:6:117:10 | foo15 [@field] | semmle.label | foo15 [@field] | +| instance_variables.rb:117:6:117:10 | foo15 [@field] | semmle.label | foo15 [@field] | | instance_variables.rb:117:6:117:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:117:6:117:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] : | semmle.label | [post] foo16 [@field] : | -| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] : | semmle.label | [post] foo16 [@field] : | +| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | semmle.label | [post] foo16 [@field] | +| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | semmle.label | [post] foo16 [@field] | | instance_variables.rb:119:6:119:37 | call to call_initialize | semmle.label | call to call_initialize | | instance_variables.rb:119:6:119:37 | call to call_initialize | semmle.label | call to call_initialize | -| instance_variables.rb:119:28:119:36 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:119:28:119:36 | call to taint : | semmle.label | call to taint : | -| instance_variables.rb:120:6:120:10 | foo16 [@field] : | semmle.label | foo16 [@field] : | -| instance_variables.rb:120:6:120:10 | foo16 [@field] : | semmle.label | foo16 [@field] : | +| instance_variables.rb:119:28:119:36 | call to taint | semmle.label | call to taint | +| instance_variables.rb:119:28:119:36 | call to taint | semmle.label | call to taint | +| instance_variables.rb:120:6:120:10 | foo16 [@field] | semmle.label | foo16 [@field] | +| instance_variables.rb:120:6:120:10 | foo16 [@field] | semmle.label | foo16 [@field] | | instance_variables.rb:120:6:120:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:120:6:120:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:121:1:121:3 | bar : | semmle.label | bar : | -| instance_variables.rb:121:1:121:3 | bar : | semmle.label | bar : | -| instance_variables.rb:121:7:121:24 | call to new : | semmle.label | call to new : | -| instance_variables.rb:121:7:121:24 | call to new : | semmle.label | call to new : | +| instance_variables.rb:121:1:121:3 | bar | semmle.label | bar | +| instance_variables.rb:121:1:121:3 | bar | semmle.label | bar | +| instance_variables.rb:121:7:121:24 | call to new | semmle.label | call to new | +| instance_variables.rb:121:7:121:24 | call to new | semmle.label | call to new | | instance_variables.rb:122:6:122:8 | bar | semmle.label | bar | | instance_variables.rb:122:6:122:8 | bar | semmle.label | bar | subpaths -| instance_variables.rb:28:20:28:24 | field : | instance_variables.rb:22:20:22:24 | field : | instance_variables.rb:23:9:23:14 | [post] self [@field] : | instance_variables.rb:28:9:28:25 | [post] self [@field] : | -| instance_variables.rb:28:20:28:24 | field : | instance_variables.rb:22:20:22:24 | field : | instance_variables.rb:23:9:23:14 | [post] self [@field] : | instance_variables.rb:28:9:28:25 | [post] self [@field] : | -| instance_variables.rb:33:13:33:13 | x : | instance_variables.rb:22:20:22:24 | field : | instance_variables.rb:23:9:23:14 | [post] self [@field] : | instance_variables.rb:33:9:33:14 | call to new [@field] : | -| instance_variables.rb:33:13:33:13 | x : | instance_variables.rb:22:20:22:24 | field : | instance_variables.rb:23:9:23:14 | [post] self [@field] : | instance_variables.rb:33:9:33:14 | call to new [@field] : | -| instance_variables.rb:36:10:36:23 | call to new [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:36:10:36:33 | call to get_field | -| instance_variables.rb:36:10:36:23 | call to new [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:36:10:36:33 | call to get_field | -| instance_variables.rb:36:14:36:22 | call to taint : | instance_variables.rb:22:20:22:24 | field : | instance_variables.rb:23:9:23:14 | [post] self [@field] : | instance_variables.rb:36:10:36:23 | call to new [@field] : | -| instance_variables.rb:36:14:36:22 | call to taint : | instance_variables.rb:22:20:22:24 | field : | instance_variables.rb:23:9:23:14 | [post] self [@field] : | instance_variables.rb:36:10:36:23 | call to new [@field] : | -| instance_variables.rb:39:6:39:23 | call to bar [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:39:6:39:33 | call to get_field | -| instance_variables.rb:39:6:39:23 | call to bar [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:39:6:39:33 | call to get_field | -| instance_variables.rb:39:14:39:22 | call to taint : | instance_variables.rb:31:18:31:18 | x : | instance_variables.rb:33:9:33:14 | call to new [@field] : | instance_variables.rb:39:6:39:23 | call to bar [@field] : | -| instance_variables.rb:39:14:39:22 | call to taint : | instance_variables.rb:31:18:31:18 | x : | instance_variables.rb:33:9:33:14 | call to new [@field] : | instance_variables.rb:39:6:39:23 | call to bar [@field] : | -| instance_variables.rb:54:15:54:23 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:54:1:54:3 | [post] foo [@field] : | -| instance_variables.rb:54:15:54:23 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:54:1:54:3 | [post] foo [@field] : | -| instance_variables.rb:55:6:55:8 | foo [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:55:6:55:18 | call to get_field | -| instance_variables.rb:55:6:55:8 | foo [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:55:6:55:18 | call to get_field | -| instance_variables.rb:58:15:58:22 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:58:1:58:3 | [post] bar [@field] : | -| instance_variables.rb:59:6:59:8 | bar [@field] : | instance_variables.rb:16:5:18:7 | self in inc_field [@field] : | instance_variables.rb:16:5:18:7 | self in inc_field [@field] : | instance_variables.rb:59:6:59:18 | call to inc_field | -| instance_variables.rb:59:6:59:8 | bar [@field] : | instance_variables.rb:16:5:18:7 | self in inc_field [@field] : | instance_variables.rb:17:9:17:14 | [post] self [@field] : | instance_variables.rb:59:6:59:18 | call to inc_field | -| instance_variables.rb:67:6:67:9 | foo2 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:67:6:67:19 | call to get_field | -| instance_variables.rb:67:6:67:9 | foo2 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:67:6:67:19 | call to get_field | -| instance_variables.rb:70:16:70:24 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] : | -| instance_variables.rb:70:16:70:24 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] : | -| instance_variables.rb:78:18:78:26 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] : | -| instance_variables.rb:78:18:78:26 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] : | -| instance_variables.rb:79:6:79:9 | foo5 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:79:6:79:19 | call to get_field | -| instance_variables.rb:79:6:79:9 | foo5 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:79:6:79:19 | call to get_field | -| instance_variables.rb:82:32:82:40 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] : | -| instance_variables.rb:82:32:82:40 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] : | -| instance_variables.rb:83:6:83:9 | foo3 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:83:6:83:19 | call to get_field | -| instance_variables.rb:83:6:83:9 | foo3 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:83:6:83:19 | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:84:6:84:19 | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:84:6:84:19 | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:85:6:85:19 | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:85:6:85:19 | call to get_field | -| instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] : | -| instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] : | -| instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] : | -| instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] : | -| instance_variables.rb:90:6:90:9 | foo7 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:90:6:90:19 | call to get_field | -| instance_variables.rb:90:6:90:9 | foo7 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:90:6:90:19 | call to get_field | -| instance_variables.rb:91:6:91:9 | foo8 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:91:6:91:19 | call to get_field | -| instance_variables.rb:91:6:91:9 | foo8 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:91:6:91:19 | call to get_field | -| instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] : | -| instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] : | -| instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] : | -| instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] : | -| instance_variables.rb:96:6:96:9 | foo9 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:96:6:96:19 | call to get_field | -| instance_variables.rb:96:6:96:9 | foo9 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:96:6:96:19 | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:97:6:97:20 | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:97:6:97:20 | call to get_field | -| instance_variables.rb:100:17:100:25 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:100:5:100:5 | [post] x [@field] : | -| instance_variables.rb:100:17:100:25 | call to taint : | instance_variables.rb:10:19:10:19 | x : | instance_variables.rb:11:9:11:14 | [post] self [@field] : | instance_variables.rb:100:5:100:5 | [post] x [@field] : | -| instance_variables.rb:105:6:105:10 | foo11 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:105:6:105:20 | call to get_field | -| instance_variables.rb:105:6:105:10 | foo11 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:105:6:105:20 | call to get_field | -| instance_variables.rb:109:6:109:10 | foo12 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:109:6:109:20 | call to get_field | -| instance_variables.rb:109:6:109:10 | foo12 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:109:6:109:20 | call to get_field | -| instance_variables.rb:114:6:114:10 | foo13 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:114:6:114:10 | foo13 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:116:17:116:25 | call to taint : | instance_variables.rb:22:20:22:24 | field : | instance_variables.rb:23:9:23:14 | [post] self [@field] : | instance_variables.rb:116:9:116:26 | call to new [@field] : | -| instance_variables.rb:116:17:116:25 | call to taint : | instance_variables.rb:22:20:22:24 | field : | instance_variables.rb:23:9:23:14 | [post] self [@field] : | instance_variables.rb:116:9:116:26 | call to new [@field] : | -| instance_variables.rb:117:6:117:10 | foo15 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:117:6:117:20 | call to get_field | -| instance_variables.rb:117:6:117:10 | foo15 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:117:6:117:20 | call to get_field | -| instance_variables.rb:119:28:119:36 | call to taint : | instance_variables.rb:27:25:27:29 | field : | instance_variables.rb:28:9:28:25 | [post] self [@field] : | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] : | -| instance_variables.rb:119:28:119:36 | call to taint : | instance_variables.rb:27:25:27:29 | field : | instance_variables.rb:28:9:28:25 | [post] self [@field] : | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] : | -| instance_variables.rb:120:6:120:10 | foo16 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:120:6:120:20 | call to get_field | -| instance_variables.rb:120:6:120:10 | foo16 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | instance_variables.rb:14:9:14:21 | return : | instance_variables.rb:120:6:120:20 | call to get_field | +| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:28:9:28:25 | [post] self [@field] | +| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:28:9:28:25 | [post] self [@field] | +| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:33:9:33:14 | call to new [@field] | +| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:33:9:33:14 | call to new [@field] | +| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:36:10:36:33 | call to get_field | +| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:36:10:36:33 | call to get_field | +| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:36:10:36:23 | call to new [@field] | +| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:36:10:36:23 | call to new [@field] | +| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:39:6:39:33 | call to get_field | +| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:39:6:39:33 | call to get_field | +| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:9:33:14 | call to new [@field] | instance_variables.rb:39:6:39:23 | call to bar [@field] | +| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:9:33:14 | call to new [@field] | instance_variables.rb:39:6:39:23 | call to bar [@field] | +| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:54:1:54:3 | [post] foo [@field] | +| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:54:1:54:3 | [post] foo [@field] | +| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:55:6:55:18 | call to get_field | +| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:55:6:55:18 | call to get_field | +| instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:58:1:58:3 | [post] bar [@field] | +| instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | +| instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:67:6:67:19 | call to get_field | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:67:6:67:19 | call to get_field | +| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | +| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | +| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | +| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | +| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:79:6:79:19 | call to get_field | +| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:79:6:79:19 | call to get_field | +| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | +| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | +| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:83:6:83:19 | call to get_field | +| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:83:6:83:19 | call to get_field | +| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:84:6:84:19 | call to get_field | +| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:84:6:84:19 | call to get_field | +| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:85:6:85:19 | call to get_field | +| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:85:6:85:19 | call to get_field | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | +| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:90:6:90:19 | call to get_field | +| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:90:6:90:19 | call to get_field | +| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:91:6:91:19 | call to get_field | +| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:91:6:91:19 | call to get_field | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | +| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:96:6:96:19 | call to get_field | +| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:96:6:96:19 | call to get_field | +| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:97:6:97:20 | call to get_field | +| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:97:6:97:20 | call to get_field | +| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:100:5:100:5 | [post] x [@field] | +| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:100:5:100:5 | [post] x [@field] | +| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:105:6:105:20 | call to get_field | +| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:105:6:105:20 | call to get_field | +| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:109:6:109:20 | call to get_field | +| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:109:6:109:20 | call to get_field | +| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:114:6:114:20 | call to get_field | +| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:114:6:114:20 | call to get_field | +| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:116:9:116:26 | call to new [@field] | +| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:116:9:116:26 | call to new [@field] | +| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:117:6:117:20 | call to get_field | +| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:117:6:117:20 | call to get_field | +| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | instance_variables.rb:28:9:28:25 | [post] self [@field] | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | +| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | instance_variables.rb:28:9:28:25 | [post] self [@field] | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | +| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:120:6:120:20 | call to get_field | +| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:120:6:120:20 | call to get_field | #select -| captured_variables.rb:2:20:2:20 | x | captured_variables.rb:5:20:5:30 | call to source : | captured_variables.rb:2:20:2:20 | x | $@ | captured_variables.rb:5:20:5:30 | call to source : | call to source : | -| captured_variables.rb:23:14:23:14 | x | captured_variables.rb:27:29:27:39 | call to source : | captured_variables.rb:23:14:23:14 | x | $@ | captured_variables.rb:27:29:27:39 | call to source : | call to source : | -| captured_variables.rb:34:14:34:14 | x | captured_variables.rb:38:27:38:37 | call to source : | captured_variables.rb:34:14:34:14 | x | $@ | captured_variables.rb:38:27:38:37 | call to source : | call to source : | -| instance_variables.rb:20:10:20:13 | @foo | instance_variables.rb:19:12:19:21 | call to taint : | instance_variables.rb:20:10:20:13 | @foo | $@ | instance_variables.rb:19:12:19:21 | call to taint : | call to taint : | -| instance_variables.rb:36:10:36:33 | call to get_field | instance_variables.rb:36:14:36:22 | call to taint : | instance_variables.rb:36:10:36:33 | call to get_field | $@ | instance_variables.rb:36:14:36:22 | call to taint : | call to taint : | -| instance_variables.rb:39:6:39:33 | call to get_field | instance_variables.rb:39:14:39:22 | call to taint : | instance_variables.rb:39:6:39:33 | call to get_field | $@ | instance_variables.rb:39:14:39:22 | call to taint : | call to taint : | -| instance_variables.rb:49:14:49:14 | x | instance_variables.rb:32:13:32:21 | call to taint : | instance_variables.rb:49:14:49:14 | x | $@ | instance_variables.rb:32:13:32:21 | call to taint : | call to taint : | -| instance_variables.rb:55:6:55:18 | call to get_field | instance_variables.rb:54:15:54:23 | call to taint : | instance_variables.rb:55:6:55:18 | call to get_field | $@ | instance_variables.rb:54:15:54:23 | call to taint : | call to taint : | -| instance_variables.rb:59:6:59:18 | call to inc_field | instance_variables.rb:58:15:58:22 | call to taint : | instance_variables.rb:59:6:59:18 | call to inc_field | $@ | instance_variables.rb:58:15:58:22 | call to taint : | call to taint : | -| instance_variables.rb:63:6:63:15 | call to field | instance_variables.rb:62:14:62:22 | call to taint : | instance_variables.rb:63:6:63:15 | call to field | $@ | instance_variables.rb:62:14:62:22 | call to taint : | call to taint : | -| instance_variables.rb:67:6:67:19 | call to get_field | instance_variables.rb:66:14:66:22 | call to taint : | instance_variables.rb:67:6:67:19 | call to get_field | $@ | instance_variables.rb:66:14:66:22 | call to taint : | call to taint : | -| instance_variables.rb:71:6:71:15 | call to field | instance_variables.rb:70:16:70:24 | call to taint : | instance_variables.rb:71:6:71:15 | call to field | $@ | instance_variables.rb:70:16:70:24 | call to taint : | call to taint : | -| instance_variables.rb:79:6:79:19 | call to get_field | instance_variables.rb:78:18:78:26 | call to taint : | instance_variables.rb:79:6:79:19 | call to get_field | $@ | instance_variables.rb:78:18:78:26 | call to taint : | call to taint : | -| instance_variables.rb:83:6:83:19 | call to get_field | instance_variables.rb:70:16:70:24 | call to taint : | instance_variables.rb:83:6:83:19 | call to get_field | $@ | instance_variables.rb:70:16:70:24 | call to taint : | call to taint : | -| instance_variables.rb:84:6:84:19 | call to get_field | instance_variables.rb:78:18:78:26 | call to taint : | instance_variables.rb:84:6:84:19 | call to get_field | $@ | instance_variables.rb:78:18:78:26 | call to taint : | call to taint : | -| instance_variables.rb:85:6:85:19 | call to get_field | instance_variables.rb:82:32:82:40 | call to taint : | instance_variables.rb:85:6:85:19 | call to get_field | $@ | instance_variables.rb:82:32:82:40 | call to taint : | call to taint : | -| instance_variables.rb:90:6:90:19 | call to get_field | instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:90:6:90:19 | call to get_field | $@ | instance_variables.rb:89:45:89:53 | call to taint : | call to taint : | -| instance_variables.rb:91:6:91:19 | call to get_field | instance_variables.rb:89:45:89:53 | call to taint : | instance_variables.rb:91:6:91:19 | call to get_field | $@ | instance_variables.rb:89:45:89:53 | call to taint : | call to taint : | -| instance_variables.rb:96:6:96:19 | call to get_field | instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:96:6:96:19 | call to get_field | $@ | instance_variables.rb:95:53:95:61 | call to taint : | call to taint : | -| instance_variables.rb:97:6:97:20 | call to get_field | instance_variables.rb:95:53:95:61 | call to taint : | instance_variables.rb:97:6:97:20 | call to get_field | $@ | instance_variables.rb:95:53:95:61 | call to taint : | call to taint : | -| instance_variables.rb:105:6:105:20 | call to get_field | instance_variables.rb:100:17:100:25 | call to taint : | instance_variables.rb:105:6:105:20 | call to get_field | $@ | instance_variables.rb:100:17:100:25 | call to taint : | call to taint : | -| instance_variables.rb:109:6:109:20 | call to get_field | instance_variables.rb:100:17:100:25 | call to taint : | instance_variables.rb:109:6:109:20 | call to get_field | $@ | instance_variables.rb:100:17:100:25 | call to taint : | call to taint : | -| instance_variables.rb:114:6:114:20 | call to get_field | instance_variables.rb:100:17:100:25 | call to taint : | instance_variables.rb:114:6:114:20 | call to get_field | $@ | instance_variables.rb:100:17:100:25 | call to taint : | call to taint : | -| instance_variables.rb:117:6:117:20 | call to get_field | instance_variables.rb:116:17:116:25 | call to taint : | instance_variables.rb:117:6:117:20 | call to get_field | $@ | instance_variables.rb:116:17:116:25 | call to taint : | call to taint : | -| instance_variables.rb:119:6:119:37 | call to call_initialize | instance_variables.rb:24:9:24:17 | call to taint : | instance_variables.rb:119:6:119:37 | call to call_initialize | $@ | instance_variables.rb:24:9:24:17 | call to taint : | call to taint : | -| instance_variables.rb:120:6:120:20 | call to get_field | instance_variables.rb:119:28:119:36 | call to taint : | instance_variables.rb:120:6:120:20 | call to get_field | $@ | instance_variables.rb:119:28:119:36 | call to taint : | call to taint : | -| instance_variables.rb:122:6:122:8 | bar | instance_variables.rb:43:9:43:17 | call to taint : | instance_variables.rb:122:6:122:8 | bar | $@ | instance_variables.rb:43:9:43:17 | call to taint : | call to taint : | +| captured_variables.rb:2:20:2:20 | x | captured_variables.rb:5:20:5:30 | call to source | captured_variables.rb:2:20:2:20 | x | $@ | captured_variables.rb:5:20:5:30 | call to source | call to source | +| captured_variables.rb:23:14:23:14 | x | captured_variables.rb:27:29:27:39 | call to source | captured_variables.rb:23:14:23:14 | x | $@ | captured_variables.rb:27:29:27:39 | call to source | call to source | +| captured_variables.rb:34:14:34:14 | x | captured_variables.rb:38:27:38:37 | call to source | captured_variables.rb:34:14:34:14 | x | $@ | captured_variables.rb:38:27:38:37 | call to source | call to source | +| instance_variables.rb:20:10:20:13 | @foo | instance_variables.rb:19:12:19:21 | call to taint | instance_variables.rb:20:10:20:13 | @foo | $@ | instance_variables.rb:19:12:19:21 | call to taint | call to taint | +| instance_variables.rb:36:10:36:33 | call to get_field | instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:36:10:36:33 | call to get_field | $@ | instance_variables.rb:36:14:36:22 | call to taint | call to taint | +| instance_variables.rb:39:6:39:33 | call to get_field | instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:39:6:39:33 | call to get_field | $@ | instance_variables.rb:39:14:39:22 | call to taint | call to taint | +| instance_variables.rb:49:14:49:14 | x | instance_variables.rb:32:13:32:21 | call to taint | instance_variables.rb:49:14:49:14 | x | $@ | instance_variables.rb:32:13:32:21 | call to taint | call to taint | +| instance_variables.rb:55:6:55:18 | call to get_field | instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:55:6:55:18 | call to get_field | $@ | instance_variables.rb:54:15:54:23 | call to taint | call to taint | +| instance_variables.rb:59:6:59:18 | call to inc_field | instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:59:6:59:18 | call to inc_field | $@ | instance_variables.rb:58:15:58:22 | call to taint | call to taint | +| instance_variables.rb:63:6:63:15 | call to field | instance_variables.rb:62:14:62:22 | call to taint | instance_variables.rb:63:6:63:15 | call to field | $@ | instance_variables.rb:62:14:62:22 | call to taint | call to taint | +| instance_variables.rb:67:6:67:19 | call to get_field | instance_variables.rb:66:14:66:22 | call to taint | instance_variables.rb:67:6:67:19 | call to get_field | $@ | instance_variables.rb:66:14:66:22 | call to taint | call to taint | +| instance_variables.rb:71:6:71:15 | call to field | instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:71:6:71:15 | call to field | $@ | instance_variables.rb:70:16:70:24 | call to taint | call to taint | +| instance_variables.rb:79:6:79:19 | call to get_field | instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:79:6:79:19 | call to get_field | $@ | instance_variables.rb:78:18:78:26 | call to taint | call to taint | +| instance_variables.rb:83:6:83:19 | call to get_field | instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:83:6:83:19 | call to get_field | $@ | instance_variables.rb:70:16:70:24 | call to taint | call to taint | +| instance_variables.rb:84:6:84:19 | call to get_field | instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:84:6:84:19 | call to get_field | $@ | instance_variables.rb:78:18:78:26 | call to taint | call to taint | +| instance_variables.rb:85:6:85:19 | call to get_field | instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:85:6:85:19 | call to get_field | $@ | instance_variables.rb:82:32:82:40 | call to taint | call to taint | +| instance_variables.rb:90:6:90:19 | call to get_field | instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:90:6:90:19 | call to get_field | $@ | instance_variables.rb:89:45:89:53 | call to taint | call to taint | +| instance_variables.rb:91:6:91:19 | call to get_field | instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:91:6:91:19 | call to get_field | $@ | instance_variables.rb:89:45:89:53 | call to taint | call to taint | +| instance_variables.rb:96:6:96:19 | call to get_field | instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:96:6:96:19 | call to get_field | $@ | instance_variables.rb:95:53:95:61 | call to taint | call to taint | +| instance_variables.rb:97:6:97:20 | call to get_field | instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:97:6:97:20 | call to get_field | $@ | instance_variables.rb:95:53:95:61 | call to taint | call to taint | +| instance_variables.rb:105:6:105:20 | call to get_field | instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:105:6:105:20 | call to get_field | $@ | instance_variables.rb:100:17:100:25 | call to taint | call to taint | +| instance_variables.rb:109:6:109:20 | call to get_field | instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:109:6:109:20 | call to get_field | $@ | instance_variables.rb:100:17:100:25 | call to taint | call to taint | +| instance_variables.rb:114:6:114:20 | call to get_field | instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:114:6:114:20 | call to get_field | $@ | instance_variables.rb:100:17:100:25 | call to taint | call to taint | +| instance_variables.rb:117:6:117:20 | call to get_field | instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:117:6:117:20 | call to get_field | $@ | instance_variables.rb:116:17:116:25 | call to taint | call to taint | +| instance_variables.rb:119:6:119:37 | call to call_initialize | instance_variables.rb:24:9:24:17 | call to taint | instance_variables.rb:119:6:119:37 | call to call_initialize | $@ | instance_variables.rb:24:9:24:17 | call to taint | call to taint | +| instance_variables.rb:120:6:120:20 | call to get_field | instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:120:6:120:20 | call to get_field | $@ | instance_variables.rb:119:28:119:36 | call to taint | call to taint | +| instance_variables.rb:122:6:122:8 | bar | instance_variables.rb:43:9:43:17 | call to taint | instance_variables.rb:122:6:122:8 | bar | $@ | instance_variables.rb:43:9:43:17 | call to taint | call to taint | diff --git a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected index 57c6d4c0627..fff890f80b9 100644 --- a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected @@ -1,2245 +1,2245 @@ failures edges -| hash_flow.rb:10:5:10:8 | hash [element 0] : | hash_flow.rb:30:10:30:13 | hash [element 0] : | -| hash_flow.rb:10:5:10:8 | hash [element :a] : | hash_flow.rb:22:10:22:13 | hash [element :a] : | -| hash_flow.rb:10:5:10:8 | hash [element :c] : | hash_flow.rb:24:10:24:13 | hash [element :c] : | -| hash_flow.rb:10:5:10:8 | hash [element e] : | hash_flow.rb:26:10:26:13 | hash [element e] : | -| hash_flow.rb:10:5:10:8 | hash [element g] : | hash_flow.rb:28:10:28:13 | hash [element g] : | -| hash_flow.rb:11:15:11:24 | call to taint : | hash_flow.rb:10:5:10:8 | hash [element :a] : | -| hash_flow.rb:13:12:13:21 | call to taint : | hash_flow.rb:10:5:10:8 | hash [element :c] : | -| hash_flow.rb:15:14:15:23 | call to taint : | hash_flow.rb:10:5:10:8 | hash [element e] : | -| hash_flow.rb:17:16:17:25 | call to taint : | hash_flow.rb:10:5:10:8 | hash [element g] : | -| hash_flow.rb:19:14:19:23 | call to taint : | hash_flow.rb:10:5:10:8 | hash [element 0] : | -| hash_flow.rb:22:10:22:13 | hash [element :a] : | hash_flow.rb:22:10:22:17 | ...[...] | -| hash_flow.rb:24:10:24:13 | hash [element :c] : | hash_flow.rb:24:10:24:17 | ...[...] | -| hash_flow.rb:26:10:26:13 | hash [element e] : | hash_flow.rb:26:10:26:18 | ...[...] | -| hash_flow.rb:28:10:28:13 | hash [element g] : | hash_flow.rb:28:10:28:18 | ...[...] | -| hash_flow.rb:30:10:30:13 | hash [element 0] : | hash_flow.rb:30:10:30:16 | ...[...] | -| hash_flow.rb:38:5:38:8 | [post] hash [element 0] : | hash_flow.rb:39:5:39:8 | hash [element 0] : | -| hash_flow.rb:38:15:38:24 | call to taint : | hash_flow.rb:38:5:38:8 | [post] hash [element 0] : | -| hash_flow.rb:39:5:39:8 | [post] hash [element 0] : | hash_flow.rb:40:5:40:8 | hash [element 0] : | -| hash_flow.rb:39:5:39:8 | hash [element 0] : | hash_flow.rb:39:5:39:8 | [post] hash [element 0] : | -| hash_flow.rb:40:5:40:8 | [post] hash [element 0] : | hash_flow.rb:41:5:41:8 | hash [element 0] : | -| hash_flow.rb:40:5:40:8 | [post] hash [element :a] : | hash_flow.rb:41:5:41:8 | hash [element :a] : | -| hash_flow.rb:40:5:40:8 | hash [element 0] : | hash_flow.rb:40:5:40:8 | [post] hash [element 0] : | -| hash_flow.rb:40:16:40:25 | call to taint : | hash_flow.rb:40:5:40:8 | [post] hash [element :a] : | -| hash_flow.rb:41:5:41:8 | [post] hash [element 0] : | hash_flow.rb:42:5:42:8 | hash [element 0] : | -| hash_flow.rb:41:5:41:8 | [post] hash [element :a] : | hash_flow.rb:42:5:42:8 | hash [element :a] : | -| hash_flow.rb:41:5:41:8 | hash [element 0] : | hash_flow.rb:41:5:41:8 | [post] hash [element 0] : | -| hash_flow.rb:41:5:41:8 | hash [element :a] : | hash_flow.rb:41:5:41:8 | [post] hash [element :a] : | -| hash_flow.rb:42:5:42:8 | [post] hash [element 0] : | hash_flow.rb:43:5:43:8 | hash [element 0] : | -| hash_flow.rb:42:5:42:8 | [post] hash [element :a] : | hash_flow.rb:43:5:43:8 | hash [element :a] : | -| hash_flow.rb:42:5:42:8 | [post] hash [element a] : | hash_flow.rb:43:5:43:8 | hash [element a] : | -| hash_flow.rb:42:5:42:8 | hash [element 0] : | hash_flow.rb:42:5:42:8 | [post] hash [element 0] : | -| hash_flow.rb:42:5:42:8 | hash [element :a] : | hash_flow.rb:42:5:42:8 | [post] hash [element :a] : | -| hash_flow.rb:42:17:42:26 | call to taint : | hash_flow.rb:42:5:42:8 | [post] hash [element a] : | -| hash_flow.rb:43:5:43:8 | [post] hash [element 0] : | hash_flow.rb:44:10:44:13 | hash [element 0] : | -| hash_flow.rb:43:5:43:8 | [post] hash [element :a] : | hash_flow.rb:46:10:46:13 | hash [element :a] : | -| hash_flow.rb:43:5:43:8 | [post] hash [element a] : | hash_flow.rb:48:10:48:13 | hash [element a] : | -| hash_flow.rb:43:5:43:8 | hash [element 0] : | hash_flow.rb:43:5:43:8 | [post] hash [element 0] : | -| hash_flow.rb:43:5:43:8 | hash [element :a] : | hash_flow.rb:43:5:43:8 | [post] hash [element :a] : | -| hash_flow.rb:43:5:43:8 | hash [element a] : | hash_flow.rb:43:5:43:8 | [post] hash [element a] : | -| hash_flow.rb:44:10:44:13 | hash [element 0] : | hash_flow.rb:44:10:44:16 | ...[...] | -| hash_flow.rb:46:10:46:13 | hash [element :a] : | hash_flow.rb:46:10:46:17 | ...[...] | -| hash_flow.rb:48:10:48:13 | hash [element a] : | hash_flow.rb:48:10:48:18 | ...[...] | -| hash_flow.rb:55:5:55:9 | hash1 [element :a] : | hash_flow.rb:56:10:56:14 | hash1 [element :a] : | -| hash_flow.rb:55:13:55:37 | ...[...] [element :a] : | hash_flow.rb:55:5:55:9 | hash1 [element :a] : | -| hash_flow.rb:55:21:55:30 | call to taint : | hash_flow.rb:55:13:55:37 | ...[...] [element :a] : | -| hash_flow.rb:56:10:56:14 | hash1 [element :a] : | hash_flow.rb:56:10:56:18 | ...[...] | -| hash_flow.rb:59:5:59:5 | x [element :a] : | hash_flow.rb:60:18:60:18 | x [element :a] : | -| hash_flow.rb:59:13:59:22 | call to taint : | hash_flow.rb:59:5:59:5 | x [element :a] : | -| hash_flow.rb:60:5:60:9 | hash2 [element :a] : | hash_flow.rb:61:10:61:14 | hash2 [element :a] : | -| hash_flow.rb:60:13:60:19 | ...[...] [element :a] : | hash_flow.rb:60:5:60:9 | hash2 [element :a] : | -| hash_flow.rb:60:18:60:18 | x [element :a] : | hash_flow.rb:60:13:60:19 | ...[...] [element :a] : | -| hash_flow.rb:61:10:61:14 | hash2 [element :a] : | hash_flow.rb:61:10:61:18 | ...[...] | -| hash_flow.rb:64:5:64:9 | hash3 [element] : | hash_flow.rb:65:10:65:14 | hash3 [element] : | -| hash_flow.rb:64:5:64:9 | hash3 [element] : | hash_flow.rb:66:10:66:14 | hash3 [element] : | -| hash_flow.rb:64:13:64:45 | ...[...] [element] : | hash_flow.rb:64:5:64:9 | hash3 [element] : | -| hash_flow.rb:64:24:64:33 | call to taint : | hash_flow.rb:64:13:64:45 | ...[...] [element] : | -| hash_flow.rb:65:10:65:14 | hash3 [element] : | hash_flow.rb:65:10:65:18 | ...[...] | -| hash_flow.rb:66:10:66:14 | hash3 [element] : | hash_flow.rb:66:10:66:18 | ...[...] | -| hash_flow.rb:68:5:68:9 | hash4 [element :a] : | hash_flow.rb:69:10:69:14 | hash4 [element :a] : | -| hash_flow.rb:68:13:68:39 | ...[...] [element :a] : | hash_flow.rb:68:5:68:9 | hash4 [element :a] : | -| hash_flow.rb:68:22:68:31 | call to taint : | hash_flow.rb:68:13:68:39 | ...[...] [element :a] : | -| hash_flow.rb:69:10:69:14 | hash4 [element :a] : | hash_flow.rb:69:10:69:18 | ...[...] | -| hash_flow.rb:72:5:72:9 | hash5 [element a] : | hash_flow.rb:73:10:73:14 | hash5 [element a] : | -| hash_flow.rb:72:13:72:45 | ...[...] [element a] : | hash_flow.rb:72:5:72:9 | hash5 [element a] : | -| hash_flow.rb:72:25:72:34 | call to taint : | hash_flow.rb:72:13:72:45 | ...[...] [element a] : | -| hash_flow.rb:73:10:73:14 | hash5 [element a] : | hash_flow.rb:73:10:73:19 | ...[...] | -| hash_flow.rb:76:5:76:9 | hash6 [element a] : | hash_flow.rb:77:10:77:14 | hash6 [element a] : | -| hash_flow.rb:76:13:76:47 | ...[...] [element a] : | hash_flow.rb:76:5:76:9 | hash6 [element a] : | -| hash_flow.rb:76:26:76:35 | call to taint : | hash_flow.rb:76:13:76:47 | ...[...] [element a] : | -| hash_flow.rb:77:10:77:14 | hash6 [element a] : | hash_flow.rb:77:10:77:19 | ...[...] | -| hash_flow.rb:84:5:84:9 | hash1 [element :a] : | hash_flow.rb:85:10:85:14 | hash1 [element :a] : | -| hash_flow.rb:84:13:84:42 | call to [] [element :a] : | hash_flow.rb:84:5:84:9 | hash1 [element :a] : | -| hash_flow.rb:84:26:84:35 | call to taint : | hash_flow.rb:84:13:84:42 | call to [] [element :a] : | -| hash_flow.rb:85:10:85:14 | hash1 [element :a] : | hash_flow.rb:85:10:85:18 | ...[...] | -| hash_flow.rb:92:5:92:8 | hash [element :a] : | hash_flow.rb:96:30:96:33 | hash [element :a] : | -| hash_flow.rb:93:15:93:24 | call to taint : | hash_flow.rb:92:5:92:8 | hash [element :a] : | -| hash_flow.rb:96:5:96:9 | hash2 [element :a] : | hash_flow.rb:97:10:97:14 | hash2 [element :a] : | -| hash_flow.rb:96:13:96:34 | call to try_convert [element :a] : | hash_flow.rb:96:5:96:9 | hash2 [element :a] : | -| hash_flow.rb:96:30:96:33 | hash [element :a] : | hash_flow.rb:96:13:96:34 | call to try_convert [element :a] : | -| hash_flow.rb:97:10:97:14 | hash2 [element :a] : | hash_flow.rb:97:10:97:18 | ...[...] | -| hash_flow.rb:105:5:105:5 | b : | hash_flow.rb:106:10:106:10 | b | -| hash_flow.rb:105:21:105:30 | __synth__0 : | hash_flow.rb:105:5:105:5 | b : | -| hash_flow.rb:105:21:105:30 | call to taint : | hash_flow.rb:105:21:105:30 | __synth__0 : | -| hash_flow.rb:113:5:113:5 | b : | hash_flow.rb:115:10:115:10 | b | -| hash_flow.rb:113:9:113:12 | [post] hash [element :a] : | hash_flow.rb:114:10:114:13 | hash [element :a] : | -| hash_flow.rb:113:9:113:34 | call to store : | hash_flow.rb:113:5:113:5 | b : | -| hash_flow.rb:113:24:113:33 | call to taint : | hash_flow.rb:113:9:113:12 | [post] hash [element :a] : | -| hash_flow.rb:113:24:113:33 | call to taint : | hash_flow.rb:113:9:113:34 | call to store : | -| hash_flow.rb:114:10:114:13 | hash [element :a] : | hash_flow.rb:114:10:114:17 | ...[...] | -| hash_flow.rb:118:5:118:5 | c : | hash_flow.rb:121:10:121:10 | c | -| hash_flow.rb:118:9:118:12 | [post] hash [element] : | hash_flow.rb:119:10:119:13 | hash [element] : | -| hash_flow.rb:118:9:118:12 | [post] hash [element] : | hash_flow.rb:120:10:120:13 | hash [element] : | -| hash_flow.rb:118:9:118:33 | call to store : | hash_flow.rb:118:5:118:5 | c : | -| hash_flow.rb:118:23:118:32 | call to taint : | hash_flow.rb:118:9:118:12 | [post] hash [element] : | -| hash_flow.rb:118:23:118:32 | call to taint : | hash_flow.rb:118:9:118:33 | call to store : | -| hash_flow.rb:119:10:119:13 | hash [element] : | hash_flow.rb:119:10:119:17 | ...[...] | -| hash_flow.rb:120:10:120:13 | hash [element] : | hash_flow.rb:120:10:120:17 | ...[...] | -| hash_flow.rb:127:5:127:8 | hash [element :a] : | hash_flow.rb:131:5:131:8 | hash [element :a] : | -| hash_flow.rb:127:5:127:8 | hash [element :a] : | hash_flow.rb:134:5:134:8 | hash [element :a] : | -| hash_flow.rb:128:15:128:24 | call to taint : | hash_flow.rb:127:5:127:8 | hash [element :a] : | -| hash_flow.rb:131:5:131:8 | hash [element :a] : | hash_flow.rb:131:18:131:29 | key_or_value : | -| hash_flow.rb:131:18:131:29 | key_or_value : | hash_flow.rb:132:14:132:25 | key_or_value | -| hash_flow.rb:134:5:134:8 | hash [element :a] : | hash_flow.rb:134:22:134:26 | value : | -| hash_flow.rb:134:22:134:26 | value : | hash_flow.rb:136:14:136:18 | value | -| hash_flow.rb:143:5:143:8 | hash [element :a] : | hash_flow.rb:147:9:147:12 | hash [element :a] : | -| hash_flow.rb:143:5:143:8 | hash [element :a] : | hash_flow.rb:151:9:151:12 | hash [element :a] : | -| hash_flow.rb:144:15:144:25 | call to taint : | hash_flow.rb:143:5:143:8 | hash [element :a] : | -| hash_flow.rb:147:5:147:5 | b [element 1] : | hash_flow.rb:149:10:149:10 | b [element 1] : | -| hash_flow.rb:147:5:147:5 | b [element 1] : | hash_flow.rb:150:10:150:10 | b [element 1] : | -| hash_flow.rb:147:9:147:12 | hash [element :a] : | hash_flow.rb:147:9:147:22 | call to assoc [element 1] : | -| hash_flow.rb:147:9:147:22 | call to assoc [element 1] : | hash_flow.rb:147:5:147:5 | b [element 1] : | -| hash_flow.rb:149:10:149:10 | b [element 1] : | hash_flow.rb:149:10:149:13 | ...[...] | -| hash_flow.rb:150:10:150:10 | b [element 1] : | hash_flow.rb:150:10:150:13 | ...[...] | -| hash_flow.rb:151:5:151:5 | c [element 1] : | hash_flow.rb:152:10:152:10 | c [element 1] : | -| hash_flow.rb:151:9:151:12 | hash [element :a] : | hash_flow.rb:151:9:151:21 | call to assoc [element 1] : | -| hash_flow.rb:151:9:151:21 | call to assoc [element 1] : | hash_flow.rb:151:5:151:5 | c [element 1] : | -| hash_flow.rb:152:10:152:10 | c [element 1] : | hash_flow.rb:152:10:152:13 | ...[...] | -| hash_flow.rb:169:5:169:8 | hash [element :a] : | hash_flow.rb:173:9:173:12 | hash [element :a] : | -| hash_flow.rb:170:15:170:25 | call to taint : | hash_flow.rb:169:5:169:8 | hash [element :a] : | -| hash_flow.rb:173:5:173:5 | a [element :a] : | hash_flow.rb:174:10:174:10 | a [element :a] : | -| hash_flow.rb:173:9:173:12 | hash [element :a] : | hash_flow.rb:173:9:173:20 | call to compact [element :a] : | -| hash_flow.rb:173:9:173:20 | call to compact [element :a] : | hash_flow.rb:173:5:173:5 | a [element :a] : | -| hash_flow.rb:174:10:174:10 | a [element :a] : | hash_flow.rb:174:10:174:14 | ...[...] | -| hash_flow.rb:181:5:181:8 | hash [element :a] : | hash_flow.rb:185:9:185:12 | hash [element :a] : | -| hash_flow.rb:182:15:182:25 | call to taint : | hash_flow.rb:181:5:181:8 | hash [element :a] : | -| hash_flow.rb:185:5:185:5 | a : | hash_flow.rb:186:10:186:10 | a | -| hash_flow.rb:185:9:185:12 | hash [element :a] : | hash_flow.rb:185:9:185:23 | call to delete : | -| hash_flow.rb:185:9:185:23 | call to delete : | hash_flow.rb:185:5:185:5 | a : | -| hash_flow.rb:193:5:193:8 | hash [element :a] : | hash_flow.rb:197:9:197:12 | hash [element :a] : | -| hash_flow.rb:194:15:194:25 | call to taint : | hash_flow.rb:193:5:193:8 | hash [element :a] : | -| hash_flow.rb:197:5:197:5 | a [element :a] : | hash_flow.rb:201:10:201:10 | a [element :a] : | -| hash_flow.rb:197:9:197:12 | [post] hash [element :a] : | hash_flow.rb:202:10:202:13 | hash [element :a] : | -| hash_flow.rb:197:9:197:12 | hash [element :a] : | hash_flow.rb:197:9:197:12 | [post] hash [element :a] : | -| hash_flow.rb:197:9:197:12 | hash [element :a] : | hash_flow.rb:197:9:200:7 | call to delete_if [element :a] : | -| hash_flow.rb:197:9:197:12 | hash [element :a] : | hash_flow.rb:197:33:197:37 | value : | -| hash_flow.rb:197:9:200:7 | call to delete_if [element :a] : | hash_flow.rb:197:5:197:5 | a [element :a] : | -| hash_flow.rb:197:33:197:37 | value : | hash_flow.rb:199:14:199:18 | value | -| hash_flow.rb:201:10:201:10 | a [element :a] : | hash_flow.rb:201:10:201:14 | ...[...] | -| hash_flow.rb:202:10:202:13 | hash [element :a] : | hash_flow.rb:202:10:202:17 | ...[...] | -| hash_flow.rb:209:5:209:8 | hash [element :a] : | hash_flow.rb:217:10:217:13 | hash [element :a] : | -| hash_flow.rb:209:5:209:8 | hash [element :c, element :d] : | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] : | -| hash_flow.rb:210:15:210:25 | call to taint : | hash_flow.rb:209:5:209:8 | hash [element :a] : | -| hash_flow.rb:213:19:213:29 | call to taint : | hash_flow.rb:209:5:209:8 | hash [element :c, element :d] : | -| hash_flow.rb:217:10:217:13 | hash [element :a] : | hash_flow.rb:217:10:217:21 | call to dig | -| hash_flow.rb:219:10:219:13 | hash [element :c, element :d] : | hash_flow.rb:219:10:219:24 | call to dig | -| hash_flow.rb:226:5:226:8 | hash [element :a] : | hash_flow.rb:230:9:230:12 | hash [element :a] : | -| hash_flow.rb:227:15:227:25 | call to taint : | hash_flow.rb:226:5:226:8 | hash [element :a] : | -| hash_flow.rb:230:5:230:5 | x [element :a] : | hash_flow.rb:234:10:234:10 | x [element :a] : | -| hash_flow.rb:230:9:230:12 | hash [element :a] : | hash_flow.rb:230:9:233:7 | call to each [element :a] : | -| hash_flow.rb:230:9:230:12 | hash [element :a] : | hash_flow.rb:230:28:230:32 | value : | -| hash_flow.rb:230:9:233:7 | call to each [element :a] : | hash_flow.rb:230:5:230:5 | x [element :a] : | -| hash_flow.rb:230:28:230:32 | value : | hash_flow.rb:232:14:232:18 | value | -| hash_flow.rb:234:10:234:10 | x [element :a] : | hash_flow.rb:234:10:234:14 | ...[...] | -| hash_flow.rb:241:5:241:8 | hash [element :a] : | hash_flow.rb:245:9:245:12 | hash [element :a] : | -| hash_flow.rb:242:15:242:25 | call to taint : | hash_flow.rb:241:5:241:8 | hash [element :a] : | -| hash_flow.rb:245:5:245:5 | x [element :a] : | hash_flow.rb:248:10:248:10 | x [element :a] : | -| hash_flow.rb:245:9:245:12 | hash [element :a] : | hash_flow.rb:245:9:247:7 | call to each_key [element :a] : | -| hash_flow.rb:245:9:247:7 | call to each_key [element :a] : | hash_flow.rb:245:5:245:5 | x [element :a] : | -| hash_flow.rb:248:10:248:10 | x [element :a] : | hash_flow.rb:248:10:248:14 | ...[...] | -| hash_flow.rb:255:5:255:8 | hash [element :a] : | hash_flow.rb:259:9:259:12 | hash [element :a] : | -| hash_flow.rb:256:15:256:25 | call to taint : | hash_flow.rb:255:5:255:8 | hash [element :a] : | -| hash_flow.rb:259:5:259:5 | x [element :a] : | hash_flow.rb:263:10:263:10 | x [element :a] : | -| hash_flow.rb:259:9:259:12 | hash [element :a] : | hash_flow.rb:259:9:262:7 | call to each_pair [element :a] : | -| hash_flow.rb:259:9:259:12 | hash [element :a] : | hash_flow.rb:259:33:259:37 | value : | -| hash_flow.rb:259:9:262:7 | call to each_pair [element :a] : | hash_flow.rb:259:5:259:5 | x [element :a] : | -| hash_flow.rb:259:33:259:37 | value : | hash_flow.rb:261:14:261:18 | value | -| hash_flow.rb:263:10:263:10 | x [element :a] : | hash_flow.rb:263:10:263:14 | ...[...] | -| hash_flow.rb:270:5:270:8 | hash [element :a] : | hash_flow.rb:274:9:274:12 | hash [element :a] : | -| hash_flow.rb:271:15:271:25 | call to taint : | hash_flow.rb:270:5:270:8 | hash [element :a] : | -| hash_flow.rb:274:5:274:5 | x [element :a] : | hash_flow.rb:277:10:277:10 | x [element :a] : | -| hash_flow.rb:274:9:274:12 | hash [element :a] : | hash_flow.rb:274:9:276:7 | call to each_value [element :a] : | -| hash_flow.rb:274:9:274:12 | hash [element :a] : | hash_flow.rb:274:29:274:33 | value : | -| hash_flow.rb:274:9:276:7 | call to each_value [element :a] : | hash_flow.rb:274:5:274:5 | x [element :a] : | -| hash_flow.rb:274:29:274:33 | value : | hash_flow.rb:275:14:275:18 | value | -| hash_flow.rb:277:10:277:10 | x [element :a] : | hash_flow.rb:277:10:277:14 | ...[...] | -| hash_flow.rb:284:5:284:8 | hash [element :c] : | hash_flow.rb:290:9:290:12 | hash [element :c] : | -| hash_flow.rb:287:15:287:25 | call to taint : | hash_flow.rb:284:5:284:8 | hash [element :c] : | -| hash_flow.rb:290:5:290:5 | x [element :c] : | hash_flow.rb:293:10:293:10 | x [element :c] : | -| hash_flow.rb:290:9:290:12 | hash [element :c] : | hash_flow.rb:290:9:290:28 | call to except [element :c] : | -| hash_flow.rb:290:9:290:28 | call to except [element :c] : | hash_flow.rb:290:5:290:5 | x [element :c] : | -| hash_flow.rb:293:10:293:10 | x [element :c] : | hash_flow.rb:293:10:293:14 | ...[...] | -| hash_flow.rb:300:5:300:8 | hash [element :a] : | hash_flow.rb:305:9:305:12 | hash [element :a] : | -| hash_flow.rb:300:5:300:8 | hash [element :a] : | hash_flow.rb:309:9:309:12 | hash [element :a] : | -| hash_flow.rb:300:5:300:8 | hash [element :a] : | hash_flow.rb:311:9:311:12 | hash [element :a] : | -| hash_flow.rb:300:5:300:8 | hash [element :a] : | hash_flow.rb:315:9:315:12 | hash [element :a] : | -| hash_flow.rb:300:5:300:8 | hash [element :c] : | hash_flow.rb:305:9:305:12 | hash [element :c] : | -| hash_flow.rb:300:5:300:8 | hash [element :c] : | hash_flow.rb:315:9:315:12 | hash [element :c] : | -| hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:300:5:300:8 | hash [element :a] : | -| hash_flow.rb:303:15:303:25 | call to taint : | hash_flow.rb:300:5:300:8 | hash [element :c] : | -| hash_flow.rb:305:5:305:5 | b : | hash_flow.rb:308:10:308:10 | b | -| hash_flow.rb:305:9:305:12 | hash [element :a] : | hash_flow.rb:305:9:307:7 | call to fetch : | -| hash_flow.rb:305:9:305:12 | hash [element :c] : | hash_flow.rb:305:9:307:7 | call to fetch : | -| hash_flow.rb:305:9:307:7 | call to fetch : | hash_flow.rb:305:5:305:5 | b : | -| hash_flow.rb:305:20:305:30 | call to taint : | hash_flow.rb:305:37:305:37 | x : | -| hash_flow.rb:305:37:305:37 | x : | hash_flow.rb:306:14:306:14 | x | -| hash_flow.rb:309:5:309:5 | b : | hash_flow.rb:310:10:310:10 | b | -| hash_flow.rb:309:9:309:12 | hash [element :a] : | hash_flow.rb:309:9:309:22 | call to fetch : | -| hash_flow.rb:309:9:309:22 | call to fetch : | hash_flow.rb:309:5:309:5 | b : | -| hash_flow.rb:311:5:311:5 | b : | hash_flow.rb:312:10:312:10 | b | -| hash_flow.rb:311:9:311:12 | hash [element :a] : | hash_flow.rb:311:9:311:35 | call to fetch : | -| hash_flow.rb:311:9:311:35 | call to fetch : | hash_flow.rb:311:5:311:5 | b : | -| hash_flow.rb:311:24:311:34 | call to taint : | hash_flow.rb:311:9:311:35 | call to fetch : | -| hash_flow.rb:313:5:313:5 | b : | hash_flow.rb:314:10:314:10 | b | -| hash_flow.rb:313:9:313:35 | call to fetch : | hash_flow.rb:313:5:313:5 | b : | -| hash_flow.rb:313:24:313:34 | call to taint : | hash_flow.rb:313:9:313:35 | call to fetch : | -| hash_flow.rb:315:5:315:5 | b : | hash_flow.rb:316:10:316:10 | b | -| hash_flow.rb:315:9:315:12 | hash [element :a] : | hash_flow.rb:315:9:315:34 | call to fetch : | -| hash_flow.rb:315:9:315:12 | hash [element :c] : | hash_flow.rb:315:9:315:34 | call to fetch : | -| hash_flow.rb:315:9:315:34 | call to fetch : | hash_flow.rb:315:5:315:5 | b : | -| hash_flow.rb:315:23:315:33 | call to taint : | hash_flow.rb:315:9:315:34 | call to fetch : | -| hash_flow.rb:322:5:322:8 | hash [element :a] : | hash_flow.rb:327:9:327:12 | hash [element :a] : | -| hash_flow.rb:322:5:322:8 | hash [element :a] : | hash_flow.rb:332:9:332:12 | hash [element :a] : | -| hash_flow.rb:322:5:322:8 | hash [element :a] : | hash_flow.rb:334:9:334:12 | hash [element :a] : | -| hash_flow.rb:322:5:322:8 | hash [element :c] : | hash_flow.rb:327:9:327:12 | hash [element :c] : | -| hash_flow.rb:322:5:322:8 | hash [element :c] : | hash_flow.rb:334:9:334:12 | hash [element :c] : | -| hash_flow.rb:323:15:323:25 | call to taint : | hash_flow.rb:322:5:322:8 | hash [element :a] : | -| hash_flow.rb:325:15:325:25 | call to taint : | hash_flow.rb:322:5:322:8 | hash [element :c] : | -| hash_flow.rb:327:5:327:5 | b [element] : | hash_flow.rb:331:10:331:10 | b [element] : | -| hash_flow.rb:327:9:327:12 | hash [element :a] : | hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | -| hash_flow.rb:327:9:327:12 | hash [element :c] : | hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | -| hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | hash_flow.rb:327:5:327:5 | b [element] : | -| hash_flow.rb:327:27:327:37 | call to taint : | hash_flow.rb:327:44:327:44 | x : | -| hash_flow.rb:327:44:327:44 | x : | hash_flow.rb:328:14:328:14 | x | -| hash_flow.rb:329:9:329:19 | call to taint : | hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | -| hash_flow.rb:331:10:331:10 | b [element] : | hash_flow.rb:331:10:331:13 | ...[...] | -| hash_flow.rb:332:5:332:5 | b [element] : | hash_flow.rb:333:10:333:10 | b [element] : | -| hash_flow.rb:332:9:332:12 | hash [element :a] : | hash_flow.rb:332:9:332:29 | call to fetch_values [element] : | -| hash_flow.rb:332:9:332:29 | call to fetch_values [element] : | hash_flow.rb:332:5:332:5 | b [element] : | -| hash_flow.rb:333:10:333:10 | b [element] : | hash_flow.rb:333:10:333:13 | ...[...] | -| hash_flow.rb:334:5:334:5 | b [element] : | hash_flow.rb:335:10:335:10 | b [element] : | -| hash_flow.rb:334:9:334:12 | hash [element :a] : | hash_flow.rb:334:9:334:31 | call to fetch_values [element] : | -| hash_flow.rb:334:9:334:12 | hash [element :c] : | hash_flow.rb:334:9:334:31 | call to fetch_values [element] : | -| hash_flow.rb:334:9:334:31 | call to fetch_values [element] : | hash_flow.rb:334:5:334:5 | b [element] : | -| hash_flow.rb:335:10:335:10 | b [element] : | hash_flow.rb:335:10:335:13 | ...[...] | -| hash_flow.rb:341:5:341:8 | hash [element :a] : | hash_flow.rb:346:9:346:12 | hash [element :a] : | -| hash_flow.rb:341:5:341:8 | hash [element :c] : | hash_flow.rb:346:9:346:12 | hash [element :c] : | -| hash_flow.rb:342:15:342:25 | call to taint : | hash_flow.rb:341:5:341:8 | hash [element :a] : | -| hash_flow.rb:344:15:344:25 | call to taint : | hash_flow.rb:341:5:341:8 | hash [element :c] : | -| hash_flow.rb:346:5:346:5 | b [element :a] : | hash_flow.rb:351:11:351:11 | b [element :a] : | -| hash_flow.rb:346:9:346:12 | hash [element :a] : | hash_flow.rb:346:9:350:7 | call to filter [element :a] : | -| hash_flow.rb:346:9:346:12 | hash [element :a] : | hash_flow.rb:346:30:346:34 | value : | -| hash_flow.rb:346:9:346:12 | hash [element :c] : | hash_flow.rb:346:30:346:34 | value : | -| hash_flow.rb:346:9:350:7 | call to filter [element :a] : | hash_flow.rb:346:5:346:5 | b [element :a] : | -| hash_flow.rb:346:30:346:34 | value : | hash_flow.rb:348:14:348:18 | value | -| hash_flow.rb:351:11:351:11 | b [element :a] : | hash_flow.rb:351:11:351:15 | ...[...] : | -| hash_flow.rb:351:11:351:15 | ...[...] : | hash_flow.rb:351:10:351:16 | ( ... ) | -| hash_flow.rb:357:5:357:8 | hash [element :a] : | hash_flow.rb:362:5:362:8 | hash [element :a] : | -| hash_flow.rb:357:5:357:8 | hash [element :c] : | hash_flow.rb:362:5:362:8 | hash [element :c] : | -| hash_flow.rb:358:15:358:25 | call to taint : | hash_flow.rb:357:5:357:8 | hash [element :a] : | -| hash_flow.rb:360:15:360:25 | call to taint : | hash_flow.rb:357:5:357:8 | hash [element :c] : | -| hash_flow.rb:362:5:362:8 | [post] hash [element :a] : | hash_flow.rb:367:11:367:14 | hash [element :a] : | -| hash_flow.rb:362:5:362:8 | hash [element :a] : | hash_flow.rb:362:5:362:8 | [post] hash [element :a] : | -| hash_flow.rb:362:5:362:8 | hash [element :a] : | hash_flow.rb:362:27:362:31 | value : | -| hash_flow.rb:362:5:362:8 | hash [element :c] : | hash_flow.rb:362:27:362:31 | value : | -| hash_flow.rb:362:27:362:31 | value : | hash_flow.rb:364:14:364:18 | value | -| hash_flow.rb:367:11:367:14 | hash [element :a] : | hash_flow.rb:367:11:367:18 | ...[...] : | -| hash_flow.rb:367:11:367:18 | ...[...] : | hash_flow.rb:367:10:367:19 | ( ... ) | -| hash_flow.rb:373:5:373:8 | hash [element :a] : | hash_flow.rb:378:9:378:12 | hash [element :a] : | -| hash_flow.rb:373:5:373:8 | hash [element :c] : | hash_flow.rb:378:9:378:12 | hash [element :c] : | -| hash_flow.rb:374:15:374:25 | call to taint : | hash_flow.rb:373:5:373:8 | hash [element :a] : | -| hash_flow.rb:376:15:376:25 | call to taint : | hash_flow.rb:373:5:373:8 | hash [element :c] : | -| hash_flow.rb:378:5:378:5 | b [element] : | hash_flow.rb:379:11:379:11 | b [element] : | -| hash_flow.rb:378:9:378:12 | hash [element :a] : | hash_flow.rb:378:9:378:20 | call to flatten [element] : | -| hash_flow.rb:378:9:378:12 | hash [element :c] : | hash_flow.rb:378:9:378:20 | call to flatten [element] : | -| hash_flow.rb:378:9:378:20 | call to flatten [element] : | hash_flow.rb:378:5:378:5 | b [element] : | -| hash_flow.rb:379:11:379:11 | b [element] : | hash_flow.rb:379:11:379:14 | ...[...] : | -| hash_flow.rb:379:11:379:14 | ...[...] : | hash_flow.rb:379:10:379:15 | ( ... ) | -| hash_flow.rb:385:5:385:8 | hash [element :a] : | hash_flow.rb:390:9:390:12 | hash [element :a] : | -| hash_flow.rb:385:5:385:8 | hash [element :c] : | hash_flow.rb:390:9:390:12 | hash [element :c] : | -| hash_flow.rb:386:15:386:25 | call to taint : | hash_flow.rb:385:5:385:8 | hash [element :a] : | -| hash_flow.rb:388:15:388:25 | call to taint : | hash_flow.rb:385:5:385:8 | hash [element :c] : | -| hash_flow.rb:390:5:390:5 | b [element :a] : | hash_flow.rb:396:11:396:11 | b [element :a] : | -| hash_flow.rb:390:9:390:12 | [post] hash [element :a] : | hash_flow.rb:395:11:395:14 | hash [element :a] : | -| hash_flow.rb:390:9:390:12 | hash [element :a] : | hash_flow.rb:390:9:390:12 | [post] hash [element :a] : | -| hash_flow.rb:390:9:390:12 | hash [element :a] : | hash_flow.rb:390:9:394:7 | call to keep_if [element :a] : | -| hash_flow.rb:390:9:390:12 | hash [element :a] : | hash_flow.rb:390:31:390:35 | value : | -| hash_flow.rb:390:9:390:12 | hash [element :c] : | hash_flow.rb:390:31:390:35 | value : | -| hash_flow.rb:390:9:394:7 | call to keep_if [element :a] : | hash_flow.rb:390:5:390:5 | b [element :a] : | -| hash_flow.rb:390:31:390:35 | value : | hash_flow.rb:392:14:392:18 | value | -| hash_flow.rb:395:11:395:14 | hash [element :a] : | hash_flow.rb:395:11:395:18 | ...[...] : | -| hash_flow.rb:395:11:395:18 | ...[...] : | hash_flow.rb:395:10:395:19 | ( ... ) | -| hash_flow.rb:396:11:396:11 | b [element :a] : | hash_flow.rb:396:11:396:15 | ...[...] : | -| hash_flow.rb:396:11:396:15 | ...[...] : | hash_flow.rb:396:10:396:16 | ( ... ) | -| hash_flow.rb:402:5:402:9 | hash1 [element :a] : | hash_flow.rb:412:12:412:16 | hash1 [element :a] : | -| hash_flow.rb:402:5:402:9 | hash1 [element :c] : | hash_flow.rb:412:12:412:16 | hash1 [element :c] : | -| hash_flow.rb:403:15:403:25 | call to taint : | hash_flow.rb:402:5:402:9 | hash1 [element :a] : | -| hash_flow.rb:405:15:405:25 | call to taint : | hash_flow.rb:402:5:402:9 | hash1 [element :c] : | -| hash_flow.rb:407:5:407:9 | hash2 [element :d] : | hash_flow.rb:412:24:412:28 | hash2 [element :d] : | -| hash_flow.rb:407:5:407:9 | hash2 [element :f] : | hash_flow.rb:412:24:412:28 | hash2 [element :f] : | -| hash_flow.rb:408:15:408:25 | call to taint : | hash_flow.rb:407:5:407:9 | hash2 [element :d] : | -| hash_flow.rb:410:15:410:25 | call to taint : | hash_flow.rb:407:5:407:9 | hash2 [element :f] : | -| hash_flow.rb:412:5:412:8 | hash [element :a] : | hash_flow.rb:417:11:417:14 | hash [element :a] : | -| hash_flow.rb:412:5:412:8 | hash [element :c] : | hash_flow.rb:419:11:419:14 | hash [element :c] : | -| hash_flow.rb:412:5:412:8 | hash [element :d] : | hash_flow.rb:420:11:420:14 | hash [element :d] : | -| hash_flow.rb:412:5:412:8 | hash [element :f] : | hash_flow.rb:422:11:422:14 | hash [element :f] : | -| hash_flow.rb:412:12:412:16 | hash1 [element :a] : | hash_flow.rb:412:12:416:7 | call to merge [element :a] : | -| hash_flow.rb:412:12:412:16 | hash1 [element :a] : | hash_flow.rb:412:40:412:48 | old_value : | -| hash_flow.rb:412:12:412:16 | hash1 [element :a] : | hash_flow.rb:412:51:412:59 | new_value : | -| hash_flow.rb:412:12:412:16 | hash1 [element :c] : | hash_flow.rb:412:12:416:7 | call to merge [element :c] : | -| hash_flow.rb:412:12:412:16 | hash1 [element :c] : | hash_flow.rb:412:40:412:48 | old_value : | -| hash_flow.rb:412:12:412:16 | hash1 [element :c] : | hash_flow.rb:412:51:412:59 | new_value : | -| hash_flow.rb:412:12:416:7 | call to merge [element :a] : | hash_flow.rb:412:5:412:8 | hash [element :a] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :c] : | hash_flow.rb:412:5:412:8 | hash [element :c] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :d] : | hash_flow.rb:412:5:412:8 | hash [element :d] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :f] : | hash_flow.rb:412:5:412:8 | hash [element :f] : | -| hash_flow.rb:412:24:412:28 | hash2 [element :d] : | hash_flow.rb:412:12:416:7 | call to merge [element :d] : | -| hash_flow.rb:412:24:412:28 | hash2 [element :d] : | hash_flow.rb:412:40:412:48 | old_value : | -| hash_flow.rb:412:24:412:28 | hash2 [element :d] : | hash_flow.rb:412:51:412:59 | new_value : | -| hash_flow.rb:412:24:412:28 | hash2 [element :f] : | hash_flow.rb:412:12:416:7 | call to merge [element :f] : | -| hash_flow.rb:412:24:412:28 | hash2 [element :f] : | hash_flow.rb:412:40:412:48 | old_value : | -| hash_flow.rb:412:24:412:28 | hash2 [element :f] : | hash_flow.rb:412:51:412:59 | new_value : | -| hash_flow.rb:412:40:412:48 | old_value : | hash_flow.rb:414:14:414:22 | old_value | -| hash_flow.rb:412:51:412:59 | new_value : | hash_flow.rb:415:14:415:22 | new_value | -| hash_flow.rb:417:11:417:14 | hash [element :a] : | hash_flow.rb:417:11:417:18 | ...[...] : | -| hash_flow.rb:417:11:417:18 | ...[...] : | hash_flow.rb:417:10:417:19 | ( ... ) | -| hash_flow.rb:419:11:419:14 | hash [element :c] : | hash_flow.rb:419:11:419:18 | ...[...] : | -| hash_flow.rb:419:11:419:18 | ...[...] : | hash_flow.rb:419:10:419:19 | ( ... ) | -| hash_flow.rb:420:11:420:14 | hash [element :d] : | hash_flow.rb:420:11:420:18 | ...[...] : | -| hash_flow.rb:420:11:420:18 | ...[...] : | hash_flow.rb:420:10:420:19 | ( ... ) | -| hash_flow.rb:422:11:422:14 | hash [element :f] : | hash_flow.rb:422:11:422:18 | ...[...] : | -| hash_flow.rb:422:11:422:18 | ...[...] : | hash_flow.rb:422:10:422:19 | ( ... ) | -| hash_flow.rb:428:5:428:9 | hash1 [element :a] : | hash_flow.rb:438:12:438:16 | hash1 [element :a] : | -| hash_flow.rb:428:5:428:9 | hash1 [element :c] : | hash_flow.rb:438:12:438:16 | hash1 [element :c] : | -| hash_flow.rb:429:15:429:25 | call to taint : | hash_flow.rb:428:5:428:9 | hash1 [element :a] : | -| hash_flow.rb:431:15:431:25 | call to taint : | hash_flow.rb:428:5:428:9 | hash1 [element :c] : | -| hash_flow.rb:433:5:433:9 | hash2 [element :d] : | hash_flow.rb:438:25:438:29 | hash2 [element :d] : | -| hash_flow.rb:433:5:433:9 | hash2 [element :f] : | hash_flow.rb:438:25:438:29 | hash2 [element :f] : | -| hash_flow.rb:434:15:434:25 | call to taint : | hash_flow.rb:433:5:433:9 | hash2 [element :d] : | -| hash_flow.rb:436:15:436:25 | call to taint : | hash_flow.rb:433:5:433:9 | hash2 [element :f] : | -| hash_flow.rb:438:5:438:8 | hash [element :a] : | hash_flow.rb:443:11:443:14 | hash [element :a] : | -| hash_flow.rb:438:5:438:8 | hash [element :c] : | hash_flow.rb:445:11:445:14 | hash [element :c] : | -| hash_flow.rb:438:5:438:8 | hash [element :d] : | hash_flow.rb:446:11:446:14 | hash [element :d] : | -| hash_flow.rb:438:5:438:8 | hash [element :f] : | hash_flow.rb:448:11:448:14 | hash [element :f] : | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] : | hash_flow.rb:450:11:450:15 | hash1 [element :a] : | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] : | hash_flow.rb:452:11:452:15 | hash1 [element :c] : | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] : | hash_flow.rb:453:11:453:15 | hash1 [element :d] : | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :f] : | hash_flow.rb:455:11:455:15 | hash1 [element :f] : | -| hash_flow.rb:438:12:438:16 | hash1 [element :a] : | hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] : | -| hash_flow.rb:438:12:438:16 | hash1 [element :a] : | hash_flow.rb:438:12:442:7 | call to merge! [element :a] : | -| hash_flow.rb:438:12:438:16 | hash1 [element :a] : | hash_flow.rb:438:41:438:49 | old_value : | -| hash_flow.rb:438:12:438:16 | hash1 [element :a] : | hash_flow.rb:438:52:438:60 | new_value : | -| hash_flow.rb:438:12:438:16 | hash1 [element :c] : | hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] : | -| hash_flow.rb:438:12:438:16 | hash1 [element :c] : | hash_flow.rb:438:12:442:7 | call to merge! [element :c] : | -| hash_flow.rb:438:12:438:16 | hash1 [element :c] : | hash_flow.rb:438:41:438:49 | old_value : | -| hash_flow.rb:438:12:438:16 | hash1 [element :c] : | hash_flow.rb:438:52:438:60 | new_value : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :a] : | hash_flow.rb:438:5:438:8 | hash [element :a] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :c] : | hash_flow.rb:438:5:438:8 | hash [element :c] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :d] : | hash_flow.rb:438:5:438:8 | hash [element :d] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :f] : | hash_flow.rb:438:5:438:8 | hash [element :f] : | -| hash_flow.rb:438:25:438:29 | hash2 [element :d] : | hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] : | -| hash_flow.rb:438:25:438:29 | hash2 [element :d] : | hash_flow.rb:438:12:442:7 | call to merge! [element :d] : | -| hash_flow.rb:438:25:438:29 | hash2 [element :d] : | hash_flow.rb:438:41:438:49 | old_value : | -| hash_flow.rb:438:25:438:29 | hash2 [element :d] : | hash_flow.rb:438:52:438:60 | new_value : | -| hash_flow.rb:438:25:438:29 | hash2 [element :f] : | hash_flow.rb:438:12:438:16 | [post] hash1 [element :f] : | -| hash_flow.rb:438:25:438:29 | hash2 [element :f] : | hash_flow.rb:438:12:442:7 | call to merge! [element :f] : | -| hash_flow.rb:438:25:438:29 | hash2 [element :f] : | hash_flow.rb:438:41:438:49 | old_value : | -| hash_flow.rb:438:25:438:29 | hash2 [element :f] : | hash_flow.rb:438:52:438:60 | new_value : | -| hash_flow.rb:438:41:438:49 | old_value : | hash_flow.rb:440:14:440:22 | old_value | -| hash_flow.rb:438:52:438:60 | new_value : | hash_flow.rb:441:14:441:22 | new_value | -| hash_flow.rb:443:11:443:14 | hash [element :a] : | hash_flow.rb:443:11:443:18 | ...[...] : | -| hash_flow.rb:443:11:443:18 | ...[...] : | hash_flow.rb:443:10:443:19 | ( ... ) | -| hash_flow.rb:445:11:445:14 | hash [element :c] : | hash_flow.rb:445:11:445:18 | ...[...] : | -| hash_flow.rb:445:11:445:18 | ...[...] : | hash_flow.rb:445:10:445:19 | ( ... ) | -| hash_flow.rb:446:11:446:14 | hash [element :d] : | hash_flow.rb:446:11:446:18 | ...[...] : | -| hash_flow.rb:446:11:446:18 | ...[...] : | hash_flow.rb:446:10:446:19 | ( ... ) | -| hash_flow.rb:448:11:448:14 | hash [element :f] : | hash_flow.rb:448:11:448:18 | ...[...] : | -| hash_flow.rb:448:11:448:18 | ...[...] : | hash_flow.rb:448:10:448:19 | ( ... ) | -| hash_flow.rb:450:11:450:15 | hash1 [element :a] : | hash_flow.rb:450:11:450:19 | ...[...] : | -| hash_flow.rb:450:11:450:19 | ...[...] : | hash_flow.rb:450:10:450:20 | ( ... ) | -| hash_flow.rb:452:11:452:15 | hash1 [element :c] : | hash_flow.rb:452:11:452:19 | ...[...] : | -| hash_flow.rb:452:11:452:19 | ...[...] : | hash_flow.rb:452:10:452:20 | ( ... ) | -| hash_flow.rb:453:11:453:15 | hash1 [element :d] : | hash_flow.rb:453:11:453:19 | ...[...] : | -| hash_flow.rb:453:11:453:19 | ...[...] : | hash_flow.rb:453:10:453:20 | ( ... ) | -| hash_flow.rb:455:11:455:15 | hash1 [element :f] : | hash_flow.rb:455:11:455:19 | ...[...] : | -| hash_flow.rb:455:11:455:19 | ...[...] : | hash_flow.rb:455:10:455:20 | ( ... ) | -| hash_flow.rb:461:5:461:8 | hash [element :a] : | hash_flow.rb:465:9:465:12 | hash [element :a] : | -| hash_flow.rb:462:15:462:25 | call to taint : | hash_flow.rb:461:5:461:8 | hash [element :a] : | -| hash_flow.rb:465:5:465:5 | b [element 1] : | hash_flow.rb:467:10:467:10 | b [element 1] : | -| hash_flow.rb:465:9:465:12 | hash [element :a] : | hash_flow.rb:465:9:465:22 | call to rassoc [element 1] : | -| hash_flow.rb:465:9:465:22 | call to rassoc [element 1] : | hash_flow.rb:465:5:465:5 | b [element 1] : | -| hash_flow.rb:467:10:467:10 | b [element 1] : | hash_flow.rb:467:10:467:13 | ...[...] | -| hash_flow.rb:473:5:473:8 | hash [element :a] : | hash_flow.rb:477:9:477:12 | hash [element :a] : | -| hash_flow.rb:474:15:474:25 | call to taint : | hash_flow.rb:473:5:473:8 | hash [element :a] : | -| hash_flow.rb:477:5:477:5 | b [element :a] : | hash_flow.rb:482:10:482:10 | b [element :a] : | -| hash_flow.rb:477:9:477:12 | hash [element :a] : | hash_flow.rb:477:9:481:7 | call to reject [element :a] : | -| hash_flow.rb:477:9:477:12 | hash [element :a] : | hash_flow.rb:477:29:477:33 | value : | -| hash_flow.rb:477:9:481:7 | call to reject [element :a] : | hash_flow.rb:477:5:477:5 | b [element :a] : | -| hash_flow.rb:477:29:477:33 | value : | hash_flow.rb:479:14:479:18 | value | -| hash_flow.rb:482:10:482:10 | b [element :a] : | hash_flow.rb:482:10:482:14 | ...[...] | -| hash_flow.rb:488:5:488:8 | hash [element :a] : | hash_flow.rb:492:9:492:12 | hash [element :a] : | -| hash_flow.rb:489:15:489:25 | call to taint : | hash_flow.rb:488:5:488:8 | hash [element :a] : | -| hash_flow.rb:492:5:492:5 | b [element :a] : | hash_flow.rb:497:10:497:10 | b [element :a] : | -| hash_flow.rb:492:9:492:12 | [post] hash [element :a] : | hash_flow.rb:498:10:498:13 | hash [element :a] : | -| hash_flow.rb:492:9:492:12 | hash [element :a] : | hash_flow.rb:492:9:492:12 | [post] hash [element :a] : | -| hash_flow.rb:492:9:492:12 | hash [element :a] : | hash_flow.rb:492:9:496:7 | call to reject! [element :a] : | -| hash_flow.rb:492:9:492:12 | hash [element :a] : | hash_flow.rb:492:30:492:34 | value : | -| hash_flow.rb:492:9:496:7 | call to reject! [element :a] : | hash_flow.rb:492:5:492:5 | b [element :a] : | -| hash_flow.rb:492:30:492:34 | value : | hash_flow.rb:494:14:494:18 | value | -| hash_flow.rb:497:10:497:10 | b [element :a] : | hash_flow.rb:497:10:497:14 | ...[...] | -| hash_flow.rb:498:10:498:13 | hash [element :a] : | hash_flow.rb:498:10:498:17 | ...[...] | -| hash_flow.rb:504:5:504:8 | hash [element :a] : | hash_flow.rb:512:19:512:22 | hash [element :a] : | -| hash_flow.rb:504:5:504:8 | hash [element :c] : | hash_flow.rb:512:19:512:22 | hash [element :c] : | -| hash_flow.rb:505:15:505:25 | call to taint : | hash_flow.rb:504:5:504:8 | hash [element :a] : | -| hash_flow.rb:507:15:507:25 | call to taint : | hash_flow.rb:504:5:504:8 | hash [element :c] : | -| hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] : | hash_flow.rb:513:11:513:15 | hash2 [element :a] : | -| hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] : | hash_flow.rb:515:11:515:15 | hash2 [element :c] : | -| hash_flow.rb:512:19:512:22 | hash [element :a] : | hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] : | -| hash_flow.rb:512:19:512:22 | hash [element :c] : | hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] : | -| hash_flow.rb:513:11:513:15 | hash2 [element :a] : | hash_flow.rb:513:11:513:19 | ...[...] : | -| hash_flow.rb:513:11:513:19 | ...[...] : | hash_flow.rb:513:10:513:20 | ( ... ) | -| hash_flow.rb:515:11:515:15 | hash2 [element :c] : | hash_flow.rb:515:11:515:19 | ...[...] : | -| hash_flow.rb:515:11:515:19 | ...[...] : | hash_flow.rb:515:10:515:20 | ( ... ) | -| hash_flow.rb:519:5:519:8 | hash [element :a] : | hash_flow.rb:524:9:524:12 | hash [element :a] : | -| hash_flow.rb:519:5:519:8 | hash [element :c] : | hash_flow.rb:524:9:524:12 | hash [element :c] : | -| hash_flow.rb:520:15:520:25 | call to taint : | hash_flow.rb:519:5:519:8 | hash [element :a] : | -| hash_flow.rb:522:15:522:25 | call to taint : | hash_flow.rb:519:5:519:8 | hash [element :c] : | -| hash_flow.rb:524:5:524:5 | b [element :a] : | hash_flow.rb:529:11:529:11 | b [element :a] : | -| hash_flow.rb:524:9:524:12 | hash [element :a] : | hash_flow.rb:524:9:528:7 | call to select [element :a] : | -| hash_flow.rb:524:9:524:12 | hash [element :a] : | hash_flow.rb:524:30:524:34 | value : | -| hash_flow.rb:524:9:524:12 | hash [element :c] : | hash_flow.rb:524:30:524:34 | value : | -| hash_flow.rb:524:9:528:7 | call to select [element :a] : | hash_flow.rb:524:5:524:5 | b [element :a] : | -| hash_flow.rb:524:30:524:34 | value : | hash_flow.rb:526:14:526:18 | value | -| hash_flow.rb:529:11:529:11 | b [element :a] : | hash_flow.rb:529:11:529:15 | ...[...] : | -| hash_flow.rb:529:11:529:15 | ...[...] : | hash_flow.rb:529:10:529:16 | ( ... ) | -| hash_flow.rb:535:5:535:8 | hash [element :a] : | hash_flow.rb:540:5:540:8 | hash [element :a] : | -| hash_flow.rb:535:5:535:8 | hash [element :c] : | hash_flow.rb:540:5:540:8 | hash [element :c] : | -| hash_flow.rb:536:15:536:25 | call to taint : | hash_flow.rb:535:5:535:8 | hash [element :a] : | -| hash_flow.rb:538:15:538:25 | call to taint : | hash_flow.rb:535:5:535:8 | hash [element :c] : | -| hash_flow.rb:540:5:540:8 | [post] hash [element :a] : | hash_flow.rb:545:11:545:14 | hash [element :a] : | -| hash_flow.rb:540:5:540:8 | hash [element :a] : | hash_flow.rb:540:5:540:8 | [post] hash [element :a] : | -| hash_flow.rb:540:5:540:8 | hash [element :a] : | hash_flow.rb:540:27:540:31 | value : | -| hash_flow.rb:540:5:540:8 | hash [element :c] : | hash_flow.rb:540:27:540:31 | value : | -| hash_flow.rb:540:27:540:31 | value : | hash_flow.rb:542:14:542:18 | value | -| hash_flow.rb:545:11:545:14 | hash [element :a] : | hash_flow.rb:545:11:545:18 | ...[...] : | -| hash_flow.rb:545:11:545:18 | ...[...] : | hash_flow.rb:545:10:545:19 | ( ... ) | -| hash_flow.rb:551:5:551:8 | hash [element :a] : | hash_flow.rb:556:9:556:12 | hash [element :a] : | -| hash_flow.rb:551:5:551:8 | hash [element :c] : | hash_flow.rb:556:9:556:12 | hash [element :c] : | -| hash_flow.rb:552:15:552:25 | call to taint : | hash_flow.rb:551:5:551:8 | hash [element :a] : | -| hash_flow.rb:554:15:554:25 | call to taint : | hash_flow.rb:551:5:551:8 | hash [element :c] : | -| hash_flow.rb:556:5:556:5 | b [element 1] : | hash_flow.rb:559:11:559:11 | b [element 1] : | -| hash_flow.rb:556:9:556:12 | [post] hash [element :a] : | hash_flow.rb:557:11:557:14 | hash [element :a] : | -| hash_flow.rb:556:9:556:12 | hash [element :a] : | hash_flow.rb:556:9:556:12 | [post] hash [element :a] : | -| hash_flow.rb:556:9:556:12 | hash [element :a] : | hash_flow.rb:556:9:556:18 | call to shift [element 1] : | -| hash_flow.rb:556:9:556:12 | hash [element :c] : | hash_flow.rb:556:9:556:18 | call to shift [element 1] : | -| hash_flow.rb:556:9:556:18 | call to shift [element 1] : | hash_flow.rb:556:5:556:5 | b [element 1] : | -| hash_flow.rb:557:11:557:14 | hash [element :a] : | hash_flow.rb:557:11:557:18 | ...[...] : | -| hash_flow.rb:557:11:557:18 | ...[...] : | hash_flow.rb:557:10:557:19 | ( ... ) | -| hash_flow.rb:559:11:559:11 | b [element 1] : | hash_flow.rb:559:11:559:14 | ...[...] : | -| hash_flow.rb:559:11:559:14 | ...[...] : | hash_flow.rb:559:10:559:15 | ( ... ) | -| hash_flow.rb:565:5:565:8 | hash [element :a] : | hash_flow.rb:570:9:570:12 | hash [element :a] : | -| hash_flow.rb:565:5:565:8 | hash [element :a] : | hash_flow.rb:575:9:575:12 | hash [element :a] : | -| hash_flow.rb:565:5:565:8 | hash [element :c] : | hash_flow.rb:575:9:575:12 | hash [element :c] : | -| hash_flow.rb:566:15:566:25 | call to taint : | hash_flow.rb:565:5:565:8 | hash [element :a] : | -| hash_flow.rb:568:15:568:25 | call to taint : | hash_flow.rb:565:5:565:8 | hash [element :c] : | -| hash_flow.rb:570:5:570:5 | b [element :a] : | hash_flow.rb:571:11:571:11 | b [element :a] : | -| hash_flow.rb:570:9:570:12 | hash [element :a] : | hash_flow.rb:570:9:570:26 | call to slice [element :a] : | -| hash_flow.rb:570:9:570:26 | call to slice [element :a] : | hash_flow.rb:570:5:570:5 | b [element :a] : | -| hash_flow.rb:571:11:571:11 | b [element :a] : | hash_flow.rb:571:11:571:15 | ...[...] : | -| hash_flow.rb:571:11:571:15 | ...[...] : | hash_flow.rb:571:10:571:16 | ( ... ) | -| hash_flow.rb:575:5:575:5 | c [element :a] : | hash_flow.rb:576:11:576:11 | c [element :a] : | -| hash_flow.rb:575:5:575:5 | c [element :c] : | hash_flow.rb:578:11:578:11 | c [element :c] : | -| hash_flow.rb:575:9:575:12 | hash [element :a] : | hash_flow.rb:575:9:575:25 | call to slice [element :a] : | -| hash_flow.rb:575:9:575:12 | hash [element :c] : | hash_flow.rb:575:9:575:25 | call to slice [element :c] : | -| hash_flow.rb:575:9:575:25 | call to slice [element :a] : | hash_flow.rb:575:5:575:5 | c [element :a] : | -| hash_flow.rb:575:9:575:25 | call to slice [element :c] : | hash_flow.rb:575:5:575:5 | c [element :c] : | -| hash_flow.rb:576:11:576:11 | c [element :a] : | hash_flow.rb:576:11:576:15 | ...[...] : | -| hash_flow.rb:576:11:576:15 | ...[...] : | hash_flow.rb:576:10:576:16 | ( ... ) | -| hash_flow.rb:578:11:578:11 | c [element :c] : | hash_flow.rb:578:11:578:15 | ...[...] : | -| hash_flow.rb:578:11:578:15 | ...[...] : | hash_flow.rb:578:10:578:16 | ( ... ) | -| hash_flow.rb:584:5:584:8 | hash [element :a] : | hash_flow.rb:589:9:589:12 | hash [element :a] : | -| hash_flow.rb:584:5:584:8 | hash [element :c] : | hash_flow.rb:589:9:589:12 | hash [element :c] : | -| hash_flow.rb:585:15:585:25 | call to taint : | hash_flow.rb:584:5:584:8 | hash [element :a] : | -| hash_flow.rb:587:15:587:25 | call to taint : | hash_flow.rb:584:5:584:8 | hash [element :c] : | -| hash_flow.rb:589:5:589:5 | a [element, element 1] : | hash_flow.rb:591:11:591:11 | a [element, element 1] : | -| hash_flow.rb:589:9:589:12 | hash [element :a] : | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] : | -| hash_flow.rb:589:9:589:12 | hash [element :c] : | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] : | -| hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] : | hash_flow.rb:589:5:589:5 | a [element, element 1] : | -| hash_flow.rb:591:11:591:11 | a [element, element 1] : | hash_flow.rb:591:11:591:14 | ...[...] [element 1] : | -| hash_flow.rb:591:11:591:14 | ...[...] [element 1] : | hash_flow.rb:591:11:591:17 | ...[...] : | -| hash_flow.rb:591:11:591:17 | ...[...] : | hash_flow.rb:591:10:591:18 | ( ... ) | -| hash_flow.rb:597:5:597:8 | hash [element :a] : | hash_flow.rb:602:9:602:12 | hash [element :a] : | -| hash_flow.rb:597:5:597:8 | hash [element :a] : | hash_flow.rb:607:9:607:12 | hash [element :a] : | -| hash_flow.rb:597:5:597:8 | hash [element :c] : | hash_flow.rb:602:9:602:12 | hash [element :c] : | -| hash_flow.rb:597:5:597:8 | hash [element :c] : | hash_flow.rb:607:9:607:12 | hash [element :c] : | -| hash_flow.rb:598:15:598:25 | call to taint : | hash_flow.rb:597:5:597:8 | hash [element :a] : | -| hash_flow.rb:600:15:600:25 | call to taint : | hash_flow.rb:597:5:597:8 | hash [element :c] : | -| hash_flow.rb:602:5:602:5 | a [element :a] : | hash_flow.rb:603:11:603:11 | a [element :a] : | -| hash_flow.rb:602:5:602:5 | a [element :c] : | hash_flow.rb:605:11:605:11 | a [element :c] : | -| hash_flow.rb:602:9:602:12 | hash [element :a] : | hash_flow.rb:602:9:602:17 | call to to_h [element :a] : | -| hash_flow.rb:602:9:602:12 | hash [element :c] : | hash_flow.rb:602:9:602:17 | call to to_h [element :c] : | -| hash_flow.rb:602:9:602:17 | call to to_h [element :a] : | hash_flow.rb:602:5:602:5 | a [element :a] : | -| hash_flow.rb:602:9:602:17 | call to to_h [element :c] : | hash_flow.rb:602:5:602:5 | a [element :c] : | -| hash_flow.rb:603:11:603:11 | a [element :a] : | hash_flow.rb:603:11:603:15 | ...[...] : | -| hash_flow.rb:603:11:603:15 | ...[...] : | hash_flow.rb:603:10:603:16 | ( ... ) | -| hash_flow.rb:605:11:605:11 | a [element :c] : | hash_flow.rb:605:11:605:15 | ...[...] : | -| hash_flow.rb:605:11:605:15 | ...[...] : | hash_flow.rb:605:10:605:16 | ( ... ) | -| hash_flow.rb:607:5:607:5 | b [element] : | hash_flow.rb:612:11:612:11 | b [element] : | -| hash_flow.rb:607:9:607:12 | hash [element :a] : | hash_flow.rb:607:28:607:32 | value : | -| hash_flow.rb:607:9:607:12 | hash [element :c] : | hash_flow.rb:607:28:607:32 | value : | -| hash_flow.rb:607:9:611:7 | call to to_h [element] : | hash_flow.rb:607:5:607:5 | b [element] : | -| hash_flow.rb:607:28:607:32 | value : | hash_flow.rb:609:14:609:18 | value | -| hash_flow.rb:610:14:610:24 | call to taint : | hash_flow.rb:607:9:611:7 | call to to_h [element] : | -| hash_flow.rb:612:11:612:11 | b [element] : | hash_flow.rb:612:11:612:15 | ...[...] : | -| hash_flow.rb:612:11:612:15 | ...[...] : | hash_flow.rb:612:10:612:16 | ( ... ) | -| hash_flow.rb:618:5:618:8 | hash [element :a] : | hash_flow.rb:623:9:623:12 | hash [element :a] : | -| hash_flow.rb:618:5:618:8 | hash [element :c] : | hash_flow.rb:623:9:623:12 | hash [element :c] : | -| hash_flow.rb:619:15:619:25 | call to taint : | hash_flow.rb:618:5:618:8 | hash [element :a] : | -| hash_flow.rb:621:15:621:25 | call to taint : | hash_flow.rb:618:5:618:8 | hash [element :c] : | -| hash_flow.rb:623:5:623:5 | a [element] : | hash_flow.rb:624:11:624:11 | a [element] : | -| hash_flow.rb:623:5:623:5 | a [element] : | hash_flow.rb:625:11:625:11 | a [element] : | -| hash_flow.rb:623:5:623:5 | a [element] : | hash_flow.rb:626:11:626:11 | a [element] : | -| hash_flow.rb:623:9:623:12 | hash [element :a] : | hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | -| hash_flow.rb:623:9:623:12 | hash [element :c] : | hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | -| hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | hash_flow.rb:623:5:623:5 | a [element] : | -| hash_flow.rb:624:11:624:11 | a [element] : | hash_flow.rb:624:11:624:16 | ...[...] : | -| hash_flow.rb:624:11:624:16 | ...[...] : | hash_flow.rb:624:10:624:17 | ( ... ) | -| hash_flow.rb:625:11:625:11 | a [element] : | hash_flow.rb:625:11:625:16 | ...[...] : | -| hash_flow.rb:625:11:625:16 | ...[...] : | hash_flow.rb:625:10:625:17 | ( ... ) | -| hash_flow.rb:626:11:626:11 | a [element] : | hash_flow.rb:626:11:626:16 | ...[...] : | -| hash_flow.rb:626:11:626:16 | ...[...] : | hash_flow.rb:626:10:626:17 | ( ... ) | -| hash_flow.rb:632:5:632:8 | hash [element :a] : | hash_flow.rb:639:5:639:8 | hash [element :a] : | -| hash_flow.rb:632:5:632:8 | hash [element :c] : | hash_flow.rb:639:5:639:8 | hash [element :c] : | -| hash_flow.rb:633:15:633:25 | call to taint : | hash_flow.rb:632:5:632:8 | hash [element :a] : | -| hash_flow.rb:635:15:635:25 | call to taint : | hash_flow.rb:632:5:632:8 | hash [element :c] : | -| hash_flow.rb:637:5:637:8 | [post] hash [element] : | hash_flow.rb:639:5:639:8 | hash [element] : | -| hash_flow.rb:637:5:637:8 | [post] hash [element] : | hash_flow.rb:640:11:640:14 | hash [element] : | -| hash_flow.rb:637:5:637:8 | [post] hash [element] : | hash_flow.rb:641:11:641:14 | hash [element] : | -| hash_flow.rb:637:5:637:8 | [post] hash [element] : | hash_flow.rb:642:11:642:14 | hash [element] : | -| hash_flow.rb:637:15:637:25 | call to taint : | hash_flow.rb:637:5:637:8 | [post] hash [element] : | -| hash_flow.rb:639:5:639:8 | [post] hash [element] : | hash_flow.rb:640:11:640:14 | hash [element] : | -| hash_flow.rb:639:5:639:8 | [post] hash [element] : | hash_flow.rb:641:11:641:14 | hash [element] : | -| hash_flow.rb:639:5:639:8 | [post] hash [element] : | hash_flow.rb:642:11:642:14 | hash [element] : | -| hash_flow.rb:639:5:639:8 | hash [element :a] : | hash_flow.rb:639:5:639:8 | [post] hash [element] : | -| hash_flow.rb:639:5:639:8 | hash [element :c] : | hash_flow.rb:639:5:639:8 | [post] hash [element] : | -| hash_flow.rb:639:5:639:8 | hash [element] : | hash_flow.rb:639:5:639:8 | [post] hash [element] : | -| hash_flow.rb:640:11:640:14 | hash [element] : | hash_flow.rb:640:11:640:19 | ...[...] : | -| hash_flow.rb:640:11:640:19 | ...[...] : | hash_flow.rb:640:10:640:20 | ( ... ) | -| hash_flow.rb:641:11:641:14 | hash [element] : | hash_flow.rb:641:11:641:19 | ...[...] : | -| hash_flow.rb:641:11:641:19 | ...[...] : | hash_flow.rb:641:10:641:20 | ( ... ) | -| hash_flow.rb:642:11:642:14 | hash [element] : | hash_flow.rb:642:11:642:19 | ...[...] : | -| hash_flow.rb:642:11:642:19 | ...[...] : | hash_flow.rb:642:10:642:20 | ( ... ) | -| hash_flow.rb:648:5:648:8 | hash [element :a] : | hash_flow.rb:653:9:653:12 | hash [element :a] : | -| hash_flow.rb:648:5:648:8 | hash [element :a] : | hash_flow.rb:657:11:657:14 | hash [element :a] : | -| hash_flow.rb:648:5:648:8 | hash [element :c] : | hash_flow.rb:653:9:653:12 | hash [element :c] : | -| hash_flow.rb:649:15:649:25 | call to taint : | hash_flow.rb:648:5:648:8 | hash [element :a] : | -| hash_flow.rb:651:15:651:25 | call to taint : | hash_flow.rb:648:5:648:8 | hash [element :c] : | -| hash_flow.rb:653:5:653:5 | b [element] : | hash_flow.rb:658:11:658:11 | b [element] : | -| hash_flow.rb:653:9:653:12 | hash [element :a] : | hash_flow.rb:653:35:653:39 | value : | -| hash_flow.rb:653:9:653:12 | hash [element :c] : | hash_flow.rb:653:35:653:39 | value : | -| hash_flow.rb:653:9:656:7 | call to transform_values [element] : | hash_flow.rb:653:5:653:5 | b [element] : | -| hash_flow.rb:653:35:653:39 | value : | hash_flow.rb:654:14:654:18 | value | -| hash_flow.rb:655:9:655:19 | call to taint : | hash_flow.rb:653:9:656:7 | call to transform_values [element] : | -| hash_flow.rb:657:11:657:14 | hash [element :a] : | hash_flow.rb:657:11:657:18 | ...[...] : | -| hash_flow.rb:657:11:657:18 | ...[...] : | hash_flow.rb:657:10:657:19 | ( ... ) | -| hash_flow.rb:658:11:658:11 | b [element] : | hash_flow.rb:658:11:658:15 | ...[...] : | -| hash_flow.rb:658:11:658:15 | ...[...] : | hash_flow.rb:658:10:658:16 | ( ... ) | -| hash_flow.rb:664:5:664:8 | hash [element :a] : | hash_flow.rb:669:5:669:8 | hash [element :a] : | -| hash_flow.rb:664:5:664:8 | hash [element :c] : | hash_flow.rb:669:5:669:8 | hash [element :c] : | -| hash_flow.rb:665:15:665:25 | call to taint : | hash_flow.rb:664:5:664:8 | hash [element :a] : | -| hash_flow.rb:667:15:667:25 | call to taint : | hash_flow.rb:664:5:664:8 | hash [element :c] : | -| hash_flow.rb:669:5:669:8 | [post] hash [element] : | hash_flow.rb:673:11:673:14 | hash [element] : | -| hash_flow.rb:669:5:669:8 | hash [element :a] : | hash_flow.rb:669:32:669:36 | value : | -| hash_flow.rb:669:5:669:8 | hash [element :c] : | hash_flow.rb:669:32:669:36 | value : | -| hash_flow.rb:669:32:669:36 | value : | hash_flow.rb:670:14:670:18 | value | -| hash_flow.rb:671:9:671:19 | call to taint : | hash_flow.rb:669:5:669:8 | [post] hash [element] : | -| hash_flow.rb:673:11:673:14 | hash [element] : | hash_flow.rb:673:11:673:18 | ...[...] : | -| hash_flow.rb:673:11:673:18 | ...[...] : | hash_flow.rb:673:10:673:19 | ( ... ) | -| hash_flow.rb:679:5:679:9 | hash1 [element :a] : | hash_flow.rb:689:12:689:16 | hash1 [element :a] : | -| hash_flow.rb:679:5:679:9 | hash1 [element :c] : | hash_flow.rb:689:12:689:16 | hash1 [element :c] : | -| hash_flow.rb:680:15:680:25 | call to taint : | hash_flow.rb:679:5:679:9 | hash1 [element :a] : | -| hash_flow.rb:682:15:682:25 | call to taint : | hash_flow.rb:679:5:679:9 | hash1 [element :c] : | -| hash_flow.rb:684:5:684:9 | hash2 [element :d] : | hash_flow.rb:689:25:689:29 | hash2 [element :d] : | -| hash_flow.rb:684:5:684:9 | hash2 [element :f] : | hash_flow.rb:689:25:689:29 | hash2 [element :f] : | -| hash_flow.rb:685:15:685:25 | call to taint : | hash_flow.rb:684:5:684:9 | hash2 [element :d] : | -| hash_flow.rb:687:15:687:25 | call to taint : | hash_flow.rb:684:5:684:9 | hash2 [element :f] : | -| hash_flow.rb:689:5:689:8 | hash [element :a] : | hash_flow.rb:694:11:694:14 | hash [element :a] : | -| hash_flow.rb:689:5:689:8 | hash [element :c] : | hash_flow.rb:696:11:696:14 | hash [element :c] : | -| hash_flow.rb:689:5:689:8 | hash [element :d] : | hash_flow.rb:697:11:697:14 | hash [element :d] : | -| hash_flow.rb:689:5:689:8 | hash [element :f] : | hash_flow.rb:699:11:699:14 | hash [element :f] : | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] : | hash_flow.rb:701:11:701:15 | hash1 [element :a] : | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] : | hash_flow.rb:703:11:703:15 | hash1 [element :c] : | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] : | hash_flow.rb:704:11:704:15 | hash1 [element :d] : | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :f] : | hash_flow.rb:706:11:706:15 | hash1 [element :f] : | -| hash_flow.rb:689:12:689:16 | hash1 [element :a] : | hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] : | -| hash_flow.rb:689:12:689:16 | hash1 [element :a] : | hash_flow.rb:689:12:693:7 | call to update [element :a] : | -| hash_flow.rb:689:12:689:16 | hash1 [element :a] : | hash_flow.rb:689:41:689:49 | old_value : | -| hash_flow.rb:689:12:689:16 | hash1 [element :a] : | hash_flow.rb:689:52:689:60 | new_value : | -| hash_flow.rb:689:12:689:16 | hash1 [element :c] : | hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] : | -| hash_flow.rb:689:12:689:16 | hash1 [element :c] : | hash_flow.rb:689:12:693:7 | call to update [element :c] : | -| hash_flow.rb:689:12:689:16 | hash1 [element :c] : | hash_flow.rb:689:41:689:49 | old_value : | -| hash_flow.rb:689:12:689:16 | hash1 [element :c] : | hash_flow.rb:689:52:689:60 | new_value : | -| hash_flow.rb:689:12:693:7 | call to update [element :a] : | hash_flow.rb:689:5:689:8 | hash [element :a] : | -| hash_flow.rb:689:12:693:7 | call to update [element :c] : | hash_flow.rb:689:5:689:8 | hash [element :c] : | -| hash_flow.rb:689:12:693:7 | call to update [element :d] : | hash_flow.rb:689:5:689:8 | hash [element :d] : | -| hash_flow.rb:689:12:693:7 | call to update [element :f] : | hash_flow.rb:689:5:689:8 | hash [element :f] : | -| hash_flow.rb:689:25:689:29 | hash2 [element :d] : | hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] : | -| hash_flow.rb:689:25:689:29 | hash2 [element :d] : | hash_flow.rb:689:12:693:7 | call to update [element :d] : | -| hash_flow.rb:689:25:689:29 | hash2 [element :d] : | hash_flow.rb:689:41:689:49 | old_value : | -| hash_flow.rb:689:25:689:29 | hash2 [element :d] : | hash_flow.rb:689:52:689:60 | new_value : | -| hash_flow.rb:689:25:689:29 | hash2 [element :f] : | hash_flow.rb:689:12:689:16 | [post] hash1 [element :f] : | -| hash_flow.rb:689:25:689:29 | hash2 [element :f] : | hash_flow.rb:689:12:693:7 | call to update [element :f] : | -| hash_flow.rb:689:25:689:29 | hash2 [element :f] : | hash_flow.rb:689:41:689:49 | old_value : | -| hash_flow.rb:689:25:689:29 | hash2 [element :f] : | hash_flow.rb:689:52:689:60 | new_value : | -| hash_flow.rb:689:41:689:49 | old_value : | hash_flow.rb:691:14:691:22 | old_value | -| hash_flow.rb:689:52:689:60 | new_value : | hash_flow.rb:692:14:692:22 | new_value | -| hash_flow.rb:694:11:694:14 | hash [element :a] : | hash_flow.rb:694:11:694:18 | ...[...] : | -| hash_flow.rb:694:11:694:18 | ...[...] : | hash_flow.rb:694:10:694:19 | ( ... ) | -| hash_flow.rb:696:11:696:14 | hash [element :c] : | hash_flow.rb:696:11:696:18 | ...[...] : | -| hash_flow.rb:696:11:696:18 | ...[...] : | hash_flow.rb:696:10:696:19 | ( ... ) | -| hash_flow.rb:697:11:697:14 | hash [element :d] : | hash_flow.rb:697:11:697:18 | ...[...] : | -| hash_flow.rb:697:11:697:18 | ...[...] : | hash_flow.rb:697:10:697:19 | ( ... ) | -| hash_flow.rb:699:11:699:14 | hash [element :f] : | hash_flow.rb:699:11:699:18 | ...[...] : | -| hash_flow.rb:699:11:699:18 | ...[...] : | hash_flow.rb:699:10:699:19 | ( ... ) | -| hash_flow.rb:701:11:701:15 | hash1 [element :a] : | hash_flow.rb:701:11:701:19 | ...[...] : | -| hash_flow.rb:701:11:701:19 | ...[...] : | hash_flow.rb:701:10:701:20 | ( ... ) | -| hash_flow.rb:703:11:703:15 | hash1 [element :c] : | hash_flow.rb:703:11:703:19 | ...[...] : | -| hash_flow.rb:703:11:703:19 | ...[...] : | hash_flow.rb:703:10:703:20 | ( ... ) | -| hash_flow.rb:704:11:704:15 | hash1 [element :d] : | hash_flow.rb:704:11:704:19 | ...[...] : | -| hash_flow.rb:704:11:704:19 | ...[...] : | hash_flow.rb:704:10:704:20 | ( ... ) | -| hash_flow.rb:706:11:706:15 | hash1 [element :f] : | hash_flow.rb:706:11:706:19 | ...[...] : | -| hash_flow.rb:706:11:706:19 | ...[...] : | hash_flow.rb:706:10:706:20 | ( ... ) | -| hash_flow.rb:712:5:712:8 | hash [element :a] : | hash_flow.rb:717:9:717:12 | hash [element :a] : | -| hash_flow.rb:712:5:712:8 | hash [element :c] : | hash_flow.rb:717:9:717:12 | hash [element :c] : | -| hash_flow.rb:713:15:713:25 | call to taint : | hash_flow.rb:712:5:712:8 | hash [element :a] : | -| hash_flow.rb:715:15:715:25 | call to taint : | hash_flow.rb:712:5:712:8 | hash [element :c] : | -| hash_flow.rb:717:5:717:5 | a [element] : | hash_flow.rb:718:11:718:11 | a [element] : | -| hash_flow.rb:717:9:717:12 | hash [element :a] : | hash_flow.rb:717:9:717:19 | call to values [element] : | -| hash_flow.rb:717:9:717:12 | hash [element :c] : | hash_flow.rb:717:9:717:19 | call to values [element] : | -| hash_flow.rb:717:9:717:19 | call to values [element] : | hash_flow.rb:717:5:717:5 | a [element] : | -| hash_flow.rb:718:11:718:11 | a [element] : | hash_flow.rb:718:11:718:14 | ...[...] : | -| hash_flow.rb:718:11:718:14 | ...[...] : | hash_flow.rb:718:10:718:15 | ( ... ) | -| hash_flow.rb:724:5:724:8 | hash [element :a] : | hash_flow.rb:729:9:729:12 | hash [element :a] : | -| hash_flow.rb:724:5:724:8 | hash [element :a] : | hash_flow.rb:731:9:731:12 | hash [element :a] : | -| hash_flow.rb:724:5:724:8 | hash [element :c] : | hash_flow.rb:731:9:731:12 | hash [element :c] : | -| hash_flow.rb:725:15:725:25 | call to taint : | hash_flow.rb:724:5:724:8 | hash [element :a] : | -| hash_flow.rb:727:15:727:25 | call to taint : | hash_flow.rb:724:5:724:8 | hash [element :c] : | -| hash_flow.rb:729:5:729:5 | b [element 0] : | hash_flow.rb:730:10:730:10 | b [element 0] : | -| hash_flow.rb:729:9:729:12 | hash [element :a] : | hash_flow.rb:729:9:729:26 | call to values_at [element 0] : | -| hash_flow.rb:729:9:729:26 | call to values_at [element 0] : | hash_flow.rb:729:5:729:5 | b [element 0] : | -| hash_flow.rb:730:10:730:10 | b [element 0] : | hash_flow.rb:730:10:730:13 | ...[...] | -| hash_flow.rb:731:5:731:5 | b [element] : | hash_flow.rb:732:10:732:10 | b [element] : | -| hash_flow.rb:731:9:731:12 | hash [element :a] : | hash_flow.rb:731:9:731:31 | call to fetch_values [element] : | -| hash_flow.rb:731:9:731:12 | hash [element :c] : | hash_flow.rb:731:9:731:31 | call to fetch_values [element] : | -| hash_flow.rb:731:9:731:31 | call to fetch_values [element] : | hash_flow.rb:731:5:731:5 | b [element] : | -| hash_flow.rb:732:10:732:10 | b [element] : | hash_flow.rb:732:10:732:13 | ...[...] | -| hash_flow.rb:738:5:738:9 | hash1 [element :a] : | hash_flow.rb:748:16:748:20 | hash1 [element :a] : | -| hash_flow.rb:738:5:738:9 | hash1 [element :c] : | hash_flow.rb:748:16:748:20 | hash1 [element :c] : | -| hash_flow.rb:739:15:739:25 | call to taint : | hash_flow.rb:738:5:738:9 | hash1 [element :a] : | -| hash_flow.rb:741:15:741:25 | call to taint : | hash_flow.rb:738:5:738:9 | hash1 [element :c] : | -| hash_flow.rb:743:5:743:9 | hash2 [element :d] : | hash_flow.rb:748:44:748:48 | hash2 [element :d] : | -| hash_flow.rb:743:5:743:9 | hash2 [element :f] : | hash_flow.rb:748:44:748:48 | hash2 [element :f] : | -| hash_flow.rb:744:15:744:25 | call to taint : | hash_flow.rb:743:5:743:9 | hash2 [element :d] : | -| hash_flow.rb:746:15:746:25 | call to taint : | hash_flow.rb:743:5:743:9 | hash2 [element :f] : | -| hash_flow.rb:748:5:748:8 | hash [element :a] : | hash_flow.rb:749:10:749:13 | hash [element :a] : | -| hash_flow.rb:748:5:748:8 | hash [element :c] : | hash_flow.rb:751:10:751:13 | hash [element :c] : | -| hash_flow.rb:748:5:748:8 | hash [element :d] : | hash_flow.rb:752:10:752:13 | hash [element :d] : | -| hash_flow.rb:748:5:748:8 | hash [element :f] : | hash_flow.rb:754:10:754:13 | hash [element :f] : | -| hash_flow.rb:748:5:748:8 | hash [element :g] : | hash_flow.rb:755:10:755:13 | hash [element :g] : | -| hash_flow.rb:748:14:748:20 | ** ... [element :a] : | hash_flow.rb:748:5:748:8 | hash [element :a] : | -| hash_flow.rb:748:14:748:20 | ** ... [element :c] : | hash_flow.rb:748:5:748:8 | hash [element :c] : | -| hash_flow.rb:748:16:748:20 | hash1 [element :a] : | hash_flow.rb:748:14:748:20 | ** ... [element :a] : | -| hash_flow.rb:748:16:748:20 | hash1 [element :c] : | hash_flow.rb:748:14:748:20 | ** ... [element :c] : | -| hash_flow.rb:748:29:748:39 | call to taint : | hash_flow.rb:748:5:748:8 | hash [element :g] : | -| hash_flow.rb:748:42:748:48 | ** ... [element :d] : | hash_flow.rb:748:5:748:8 | hash [element :d] : | -| hash_flow.rb:748:42:748:48 | ** ... [element :f] : | hash_flow.rb:748:5:748:8 | hash [element :f] : | -| hash_flow.rb:748:44:748:48 | hash2 [element :d] : | hash_flow.rb:748:42:748:48 | ** ... [element :d] : | -| hash_flow.rb:748:44:748:48 | hash2 [element :f] : | hash_flow.rb:748:42:748:48 | ** ... [element :f] : | -| hash_flow.rb:749:10:749:13 | hash [element :a] : | hash_flow.rb:749:10:749:17 | ...[...] | -| hash_flow.rb:751:10:751:13 | hash [element :c] : | hash_flow.rb:751:10:751:17 | ...[...] | -| hash_flow.rb:752:10:752:13 | hash [element :d] : | hash_flow.rb:752:10:752:17 | ...[...] | -| hash_flow.rb:754:10:754:13 | hash [element :f] : | hash_flow.rb:754:10:754:17 | ...[...] | -| hash_flow.rb:755:10:755:13 | hash [element :g] : | hash_flow.rb:755:10:755:17 | ...[...] | -| hash_flow.rb:762:5:762:8 | hash [element :a] : | hash_flow.rb:769:10:769:13 | hash [element :a] : | -| hash_flow.rb:762:5:762:8 | hash [element :c] : | hash_flow.rb:771:10:771:13 | hash [element :c] : | -| hash_flow.rb:762:5:762:8 | hash [element :c] : | hash_flow.rb:774:9:774:12 | hash [element :c] : | -| hash_flow.rb:762:5:762:8 | hash [element :d] : | hash_flow.rb:772:10:772:13 | hash [element :d] : | -| hash_flow.rb:763:15:763:25 | call to taint : | hash_flow.rb:762:5:762:8 | hash [element :a] : | -| hash_flow.rb:765:15:765:25 | call to taint : | hash_flow.rb:762:5:762:8 | hash [element :c] : | -| hash_flow.rb:766:15:766:25 | call to taint : | hash_flow.rb:762:5:762:8 | hash [element :d] : | -| hash_flow.rb:769:10:769:13 | hash [element :a] : | hash_flow.rb:769:10:769:17 | ...[...] | -| hash_flow.rb:771:10:771:13 | hash [element :c] : | hash_flow.rb:771:10:771:17 | ...[...] | -| hash_flow.rb:772:10:772:13 | hash [element :d] : | hash_flow.rb:772:10:772:17 | ...[...] | -| hash_flow.rb:774:5:774:5 | x [element :c] : | hash_flow.rb:778:10:778:10 | x [element :c] : | -| hash_flow.rb:774:9:774:12 | [post] hash [element :c] : | hash_flow.rb:783:10:783:13 | hash [element :c] : | -| hash_flow.rb:774:9:774:12 | hash [element :c] : | hash_flow.rb:774:9:774:12 | [post] hash [element :c] : | -| hash_flow.rb:774:9:774:12 | hash [element :c] : | hash_flow.rb:774:9:774:31 | call to except! [element :c] : | -| hash_flow.rb:774:9:774:31 | call to except! [element :c] : | hash_flow.rb:774:5:774:5 | x [element :c] : | -| hash_flow.rb:778:10:778:10 | x [element :c] : | hash_flow.rb:778:10:778:14 | ...[...] | -| hash_flow.rb:783:10:783:13 | hash [element :c] : | hash_flow.rb:783:10:783:17 | ...[...] | -| hash_flow.rb:790:5:790:9 | hash1 [element :a] : | hash_flow.rb:800:12:800:16 | hash1 [element :a] : | -| hash_flow.rb:790:5:790:9 | hash1 [element :c] : | hash_flow.rb:800:12:800:16 | hash1 [element :c] : | -| hash_flow.rb:791:15:791:25 | call to taint : | hash_flow.rb:790:5:790:9 | hash1 [element :a] : | -| hash_flow.rb:793:15:793:25 | call to taint : | hash_flow.rb:790:5:790:9 | hash1 [element :c] : | -| hash_flow.rb:795:5:795:9 | hash2 [element :d] : | hash_flow.rb:800:29:800:33 | hash2 [element :d] : | -| hash_flow.rb:795:5:795:9 | hash2 [element :f] : | hash_flow.rb:800:29:800:33 | hash2 [element :f] : | -| hash_flow.rb:796:15:796:25 | call to taint : | hash_flow.rb:795:5:795:9 | hash2 [element :d] : | -| hash_flow.rb:798:15:798:25 | call to taint : | hash_flow.rb:795:5:795:9 | hash2 [element :f] : | -| hash_flow.rb:800:5:800:8 | hash [element :a] : | hash_flow.rb:805:11:805:14 | hash [element :a] : | -| hash_flow.rb:800:5:800:8 | hash [element :c] : | hash_flow.rb:807:11:807:14 | hash [element :c] : | -| hash_flow.rb:800:5:800:8 | hash [element :d] : | hash_flow.rb:808:11:808:14 | hash [element :d] : | -| hash_flow.rb:800:5:800:8 | hash [element :f] : | hash_flow.rb:810:11:810:14 | hash [element :f] : | -| hash_flow.rb:800:12:800:16 | hash1 [element :a] : | hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] : | -| hash_flow.rb:800:12:800:16 | hash1 [element :a] : | hash_flow.rb:800:45:800:53 | old_value : | -| hash_flow.rb:800:12:800:16 | hash1 [element :a] : | hash_flow.rb:800:56:800:64 | new_value : | -| hash_flow.rb:800:12:800:16 | hash1 [element :c] : | hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] : | -| hash_flow.rb:800:12:800:16 | hash1 [element :c] : | hash_flow.rb:800:45:800:53 | old_value : | -| hash_flow.rb:800:12:800:16 | hash1 [element :c] : | hash_flow.rb:800:56:800:64 | new_value : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] : | hash_flow.rb:800:5:800:8 | hash [element :a] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] : | hash_flow.rb:800:5:800:8 | hash [element :c] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] : | hash_flow.rb:800:5:800:8 | hash [element :d] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] : | hash_flow.rb:800:5:800:8 | hash [element :f] : | -| hash_flow.rb:800:29:800:33 | hash2 [element :d] : | hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] : | -| hash_flow.rb:800:29:800:33 | hash2 [element :d] : | hash_flow.rb:800:45:800:53 | old_value : | -| hash_flow.rb:800:29:800:33 | hash2 [element :d] : | hash_flow.rb:800:56:800:64 | new_value : | -| hash_flow.rb:800:29:800:33 | hash2 [element :f] : | hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] : | -| hash_flow.rb:800:29:800:33 | hash2 [element :f] : | hash_flow.rb:800:45:800:53 | old_value : | -| hash_flow.rb:800:29:800:33 | hash2 [element :f] : | hash_flow.rb:800:56:800:64 | new_value : | -| hash_flow.rb:800:45:800:53 | old_value : | hash_flow.rb:802:14:802:22 | old_value | -| hash_flow.rb:800:56:800:64 | new_value : | hash_flow.rb:803:14:803:22 | new_value | -| hash_flow.rb:805:11:805:14 | hash [element :a] : | hash_flow.rb:805:11:805:18 | ...[...] : | -| hash_flow.rb:805:11:805:18 | ...[...] : | hash_flow.rb:805:10:805:19 | ( ... ) | -| hash_flow.rb:807:11:807:14 | hash [element :c] : | hash_flow.rb:807:11:807:18 | ...[...] : | -| hash_flow.rb:807:11:807:18 | ...[...] : | hash_flow.rb:807:10:807:19 | ( ... ) | -| hash_flow.rb:808:11:808:14 | hash [element :d] : | hash_flow.rb:808:11:808:18 | ...[...] : | -| hash_flow.rb:808:11:808:18 | ...[...] : | hash_flow.rb:808:10:808:19 | ( ... ) | -| hash_flow.rb:810:11:810:14 | hash [element :f] : | hash_flow.rb:810:11:810:18 | ...[...] : | -| hash_flow.rb:810:11:810:18 | ...[...] : | hash_flow.rb:810:10:810:19 | ( ... ) | -| hash_flow.rb:816:5:816:9 | hash1 [element :a] : | hash_flow.rb:826:12:826:16 | hash1 [element :a] : | -| hash_flow.rb:816:5:816:9 | hash1 [element :c] : | hash_flow.rb:826:12:826:16 | hash1 [element :c] : | -| hash_flow.rb:817:15:817:25 | call to taint : | hash_flow.rb:816:5:816:9 | hash1 [element :a] : | -| hash_flow.rb:819:15:819:25 | call to taint : | hash_flow.rb:816:5:816:9 | hash1 [element :c] : | -| hash_flow.rb:821:5:821:9 | hash2 [element :d] : | hash_flow.rb:826:30:826:34 | hash2 [element :d] : | -| hash_flow.rb:821:5:821:9 | hash2 [element :f] : | hash_flow.rb:826:30:826:34 | hash2 [element :f] : | -| hash_flow.rb:822:15:822:25 | call to taint : | hash_flow.rb:821:5:821:9 | hash2 [element :d] : | -| hash_flow.rb:824:15:824:25 | call to taint : | hash_flow.rb:821:5:821:9 | hash2 [element :f] : | -| hash_flow.rb:826:5:826:8 | hash [element :a] : | hash_flow.rb:831:11:831:14 | hash [element :a] : | -| hash_flow.rb:826:5:826:8 | hash [element :c] : | hash_flow.rb:833:11:833:14 | hash [element :c] : | -| hash_flow.rb:826:5:826:8 | hash [element :d] : | hash_flow.rb:834:11:834:14 | hash [element :d] : | -| hash_flow.rb:826:5:826:8 | hash [element :f] : | hash_flow.rb:836:11:836:14 | hash [element :f] : | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] : | hash_flow.rb:838:11:838:15 | hash1 [element :a] : | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] : | hash_flow.rb:840:11:840:15 | hash1 [element :c] : | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] : | hash_flow.rb:841:11:841:15 | hash1 [element :d] : | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :f] : | hash_flow.rb:843:11:843:15 | hash1 [element :f] : | -| hash_flow.rb:826:12:826:16 | hash1 [element :a] : | hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] : | -| hash_flow.rb:826:12:826:16 | hash1 [element :a] : | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] : | -| hash_flow.rb:826:12:826:16 | hash1 [element :a] : | hash_flow.rb:826:46:826:54 | old_value : | -| hash_flow.rb:826:12:826:16 | hash1 [element :a] : | hash_flow.rb:826:57:826:65 | new_value : | -| hash_flow.rb:826:12:826:16 | hash1 [element :c] : | hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] : | -| hash_flow.rb:826:12:826:16 | hash1 [element :c] : | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] : | -| hash_flow.rb:826:12:826:16 | hash1 [element :c] : | hash_flow.rb:826:46:826:54 | old_value : | -| hash_flow.rb:826:12:826:16 | hash1 [element :c] : | hash_flow.rb:826:57:826:65 | new_value : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] : | hash_flow.rb:826:5:826:8 | hash [element :a] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] : | hash_flow.rb:826:5:826:8 | hash [element :c] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] : | hash_flow.rb:826:5:826:8 | hash [element :d] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] : | hash_flow.rb:826:5:826:8 | hash [element :f] : | -| hash_flow.rb:826:30:826:34 | hash2 [element :d] : | hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] : | -| hash_flow.rb:826:30:826:34 | hash2 [element :d] : | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] : | -| hash_flow.rb:826:30:826:34 | hash2 [element :d] : | hash_flow.rb:826:46:826:54 | old_value : | -| hash_flow.rb:826:30:826:34 | hash2 [element :d] : | hash_flow.rb:826:57:826:65 | new_value : | -| hash_flow.rb:826:30:826:34 | hash2 [element :f] : | hash_flow.rb:826:12:826:16 | [post] hash1 [element :f] : | -| hash_flow.rb:826:30:826:34 | hash2 [element :f] : | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] : | -| hash_flow.rb:826:30:826:34 | hash2 [element :f] : | hash_flow.rb:826:46:826:54 | old_value : | -| hash_flow.rb:826:30:826:34 | hash2 [element :f] : | hash_flow.rb:826:57:826:65 | new_value : | -| hash_flow.rb:826:46:826:54 | old_value : | hash_flow.rb:828:14:828:22 | old_value | -| hash_flow.rb:826:57:826:65 | new_value : | hash_flow.rb:829:14:829:22 | new_value | -| hash_flow.rb:831:11:831:14 | hash [element :a] : | hash_flow.rb:831:11:831:18 | ...[...] : | -| hash_flow.rb:831:11:831:18 | ...[...] : | hash_flow.rb:831:10:831:19 | ( ... ) | -| hash_flow.rb:833:11:833:14 | hash [element :c] : | hash_flow.rb:833:11:833:18 | ...[...] : | -| hash_flow.rb:833:11:833:18 | ...[...] : | hash_flow.rb:833:10:833:19 | ( ... ) | -| hash_flow.rb:834:11:834:14 | hash [element :d] : | hash_flow.rb:834:11:834:18 | ...[...] : | -| hash_flow.rb:834:11:834:18 | ...[...] : | hash_flow.rb:834:10:834:19 | ( ... ) | -| hash_flow.rb:836:11:836:14 | hash [element :f] : | hash_flow.rb:836:11:836:18 | ...[...] : | -| hash_flow.rb:836:11:836:18 | ...[...] : | hash_flow.rb:836:10:836:19 | ( ... ) | -| hash_flow.rb:838:11:838:15 | hash1 [element :a] : | hash_flow.rb:838:11:838:19 | ...[...] : | -| hash_flow.rb:838:11:838:19 | ...[...] : | hash_flow.rb:838:10:838:20 | ( ... ) | -| hash_flow.rb:840:11:840:15 | hash1 [element :c] : | hash_flow.rb:840:11:840:19 | ...[...] : | -| hash_flow.rb:840:11:840:19 | ...[...] : | hash_flow.rb:840:10:840:20 | ( ... ) | -| hash_flow.rb:841:11:841:15 | hash1 [element :d] : | hash_flow.rb:841:11:841:19 | ...[...] : | -| hash_flow.rb:841:11:841:19 | ...[...] : | hash_flow.rb:841:10:841:20 | ( ... ) | -| hash_flow.rb:843:11:843:15 | hash1 [element :f] : | hash_flow.rb:843:11:843:19 | ...[...] : | -| hash_flow.rb:843:11:843:19 | ...[...] : | hash_flow.rb:843:10:843:20 | ( ... ) | -| hash_flow.rb:849:5:849:9 | hash1 [element :a] : | hash_flow.rb:860:13:860:17 | hash1 [element :a] : | -| hash_flow.rb:849:5:849:9 | hash1 [element :a] : | hash_flow.rb:869:13:869:17 | hash1 [element :a] : | -| hash_flow.rb:849:5:849:9 | hash1 [element :c] : | hash_flow.rb:860:13:860:17 | hash1 [element :c] : | -| hash_flow.rb:849:5:849:9 | hash1 [element :c] : | hash_flow.rb:869:13:869:17 | hash1 [element :c] : | -| hash_flow.rb:850:12:850:22 | call to taint : | hash_flow.rb:849:5:849:9 | hash1 [element :a] : | -| hash_flow.rb:852:12:852:22 | call to taint : | hash_flow.rb:849:5:849:9 | hash1 [element :c] : | -| hash_flow.rb:854:5:854:9 | hash2 [element :d] : | hash_flow.rb:860:33:860:37 | hash2 [element :d] : | -| hash_flow.rb:854:5:854:9 | hash2 [element :d] : | hash_flow.rb:869:33:869:37 | hash2 [element :d] : | -| hash_flow.rb:854:5:854:9 | hash2 [element :f] : | hash_flow.rb:860:33:860:37 | hash2 [element :f] : | -| hash_flow.rb:854:5:854:9 | hash2 [element :f] : | hash_flow.rb:869:33:869:37 | hash2 [element :f] : | -| hash_flow.rb:855:12:855:22 | call to taint : | hash_flow.rb:854:5:854:9 | hash2 [element :d] : | -| hash_flow.rb:857:12:857:22 | call to taint : | hash_flow.rb:854:5:854:9 | hash2 [element :f] : | -| hash_flow.rb:860:5:860:9 | hash3 [element :a] : | hash_flow.rb:861:11:861:15 | hash3 [element :a] : | -| hash_flow.rb:860:5:860:9 | hash3 [element :c] : | hash_flow.rb:863:11:863:15 | hash3 [element :c] : | -| hash_flow.rb:860:5:860:9 | hash3 [element :d] : | hash_flow.rb:864:11:864:15 | hash3 [element :d] : | -| hash_flow.rb:860:5:860:9 | hash3 [element :f] : | hash_flow.rb:866:11:866:15 | hash3 [element :f] : | -| hash_flow.rb:860:13:860:17 | hash1 [element :a] : | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] : | -| hash_flow.rb:860:13:860:17 | hash1 [element :c] : | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] : | hash_flow.rb:860:5:860:9 | hash3 [element :a] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] : | hash_flow.rb:860:5:860:9 | hash3 [element :c] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] : | hash_flow.rb:860:5:860:9 | hash3 [element :d] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] : | hash_flow.rb:860:5:860:9 | hash3 [element :f] : | -| hash_flow.rb:860:33:860:37 | hash2 [element :d] : | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] : | -| hash_flow.rb:860:33:860:37 | hash2 [element :f] : | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] : | -| hash_flow.rb:861:11:861:15 | hash3 [element :a] : | hash_flow.rb:861:11:861:19 | ...[...] : | -| hash_flow.rb:861:11:861:19 | ...[...] : | hash_flow.rb:861:10:861:20 | ( ... ) | -| hash_flow.rb:863:11:863:15 | hash3 [element :c] : | hash_flow.rb:863:11:863:19 | ...[...] : | -| hash_flow.rb:863:11:863:19 | ...[...] : | hash_flow.rb:863:10:863:20 | ( ... ) | -| hash_flow.rb:864:11:864:15 | hash3 [element :d] : | hash_flow.rb:864:11:864:19 | ...[...] : | -| hash_flow.rb:864:11:864:19 | ...[...] : | hash_flow.rb:864:10:864:20 | ( ... ) | -| hash_flow.rb:866:11:866:15 | hash3 [element :f] : | hash_flow.rb:866:11:866:19 | ...[...] : | -| hash_flow.rb:866:11:866:19 | ...[...] : | hash_flow.rb:866:10:866:20 | ( ... ) | -| hash_flow.rb:869:5:869:9 | hash4 [element :a] : | hash_flow.rb:870:11:870:15 | hash4 [element :a] : | -| hash_flow.rb:869:5:869:9 | hash4 [element :c] : | hash_flow.rb:872:11:872:15 | hash4 [element :c] : | -| hash_flow.rb:869:5:869:9 | hash4 [element :d] : | hash_flow.rb:873:11:873:15 | hash4 [element :d] : | -| hash_flow.rb:869:5:869:9 | hash4 [element :f] : | hash_flow.rb:875:11:875:15 | hash4 [element :f] : | -| hash_flow.rb:869:13:869:17 | hash1 [element :a] : | hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] : | -| hash_flow.rb:869:13:869:17 | hash1 [element :c] : | hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] : | hash_flow.rb:869:5:869:9 | hash4 [element :a] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] : | hash_flow.rb:869:5:869:9 | hash4 [element :c] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] : | hash_flow.rb:869:5:869:9 | hash4 [element :d] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] : | hash_flow.rb:869:5:869:9 | hash4 [element :f] : | -| hash_flow.rb:869:33:869:37 | hash2 [element :d] : | hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] : | -| hash_flow.rb:869:33:869:37 | hash2 [element :f] : | hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] : | -| hash_flow.rb:870:11:870:15 | hash4 [element :a] : | hash_flow.rb:870:11:870:19 | ...[...] : | -| hash_flow.rb:870:11:870:19 | ...[...] : | hash_flow.rb:870:10:870:20 | ( ... ) | -| hash_flow.rb:872:11:872:15 | hash4 [element :c] : | hash_flow.rb:872:11:872:19 | ...[...] : | -| hash_flow.rb:872:11:872:19 | ...[...] : | hash_flow.rb:872:10:872:20 | ( ... ) | -| hash_flow.rb:873:11:873:15 | hash4 [element :d] : | hash_flow.rb:873:11:873:19 | ...[...] : | -| hash_flow.rb:873:11:873:19 | ...[...] : | hash_flow.rb:873:10:873:20 | ( ... ) | -| hash_flow.rb:875:11:875:15 | hash4 [element :f] : | hash_flow.rb:875:11:875:19 | ...[...] : | -| hash_flow.rb:875:11:875:19 | ...[...] : | hash_flow.rb:875:10:875:20 | ( ... ) | -| hash_flow.rb:881:5:881:9 | hash1 [element :a] : | hash_flow.rb:892:12:892:16 | hash1 [element :a] : | -| hash_flow.rb:881:5:881:9 | hash1 [element :c] : | hash_flow.rb:892:12:892:16 | hash1 [element :c] : | -| hash_flow.rb:882:12:882:22 | call to taint : | hash_flow.rb:881:5:881:9 | hash1 [element :a] : | -| hash_flow.rb:884:12:884:22 | call to taint : | hash_flow.rb:881:5:881:9 | hash1 [element :c] : | -| hash_flow.rb:886:5:886:9 | hash2 [element :d] : | hash_flow.rb:892:33:892:37 | hash2 [element :d] : | -| hash_flow.rb:886:5:886:9 | hash2 [element :f] : | hash_flow.rb:892:33:892:37 | hash2 [element :f] : | -| hash_flow.rb:887:12:887:22 | call to taint : | hash_flow.rb:886:5:886:9 | hash2 [element :d] : | -| hash_flow.rb:889:12:889:22 | call to taint : | hash_flow.rb:886:5:886:9 | hash2 [element :f] : | -| hash_flow.rb:892:5:892:8 | hash [element :a] : | hash_flow.rb:893:11:893:14 | hash [element :a] : | -| hash_flow.rb:892:5:892:8 | hash [element :c] : | hash_flow.rb:895:11:895:14 | hash [element :c] : | -| hash_flow.rb:892:5:892:8 | hash [element :d] : | hash_flow.rb:896:11:896:14 | hash [element :d] : | -| hash_flow.rb:892:5:892:8 | hash [element :f] : | hash_flow.rb:898:11:898:14 | hash [element :f] : | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] : | hash_flow.rb:900:11:900:15 | hash1 [element :a] : | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] : | hash_flow.rb:902:11:902:15 | hash1 [element :c] : | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] : | hash_flow.rb:903:11:903:15 | hash1 [element :d] : | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :f] : | hash_flow.rb:905:11:905:15 | hash1 [element :f] : | -| hash_flow.rb:892:12:892:16 | hash1 [element :a] : | hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] : | -| hash_flow.rb:892:12:892:16 | hash1 [element :a] : | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] : | -| hash_flow.rb:892:12:892:16 | hash1 [element :c] : | hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] : | -| hash_flow.rb:892:12:892:16 | hash1 [element :c] : | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] : | hash_flow.rb:892:5:892:8 | hash [element :a] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] : | hash_flow.rb:892:5:892:8 | hash [element :c] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] : | hash_flow.rb:892:5:892:8 | hash [element :d] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] : | hash_flow.rb:892:5:892:8 | hash [element :f] : | -| hash_flow.rb:892:33:892:37 | hash2 [element :d] : | hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] : | -| hash_flow.rb:892:33:892:37 | hash2 [element :d] : | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] : | -| hash_flow.rb:892:33:892:37 | hash2 [element :f] : | hash_flow.rb:892:12:892:16 | [post] hash1 [element :f] : | -| hash_flow.rb:892:33:892:37 | hash2 [element :f] : | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] : | -| hash_flow.rb:893:11:893:14 | hash [element :a] : | hash_flow.rb:893:11:893:18 | ...[...] : | -| hash_flow.rb:893:11:893:18 | ...[...] : | hash_flow.rb:893:10:893:19 | ( ... ) | -| hash_flow.rb:895:11:895:14 | hash [element :c] : | hash_flow.rb:895:11:895:18 | ...[...] : | -| hash_flow.rb:895:11:895:18 | ...[...] : | hash_flow.rb:895:10:895:19 | ( ... ) | -| hash_flow.rb:896:11:896:14 | hash [element :d] : | hash_flow.rb:896:11:896:18 | ...[...] : | -| hash_flow.rb:896:11:896:18 | ...[...] : | hash_flow.rb:896:10:896:19 | ( ... ) | -| hash_flow.rb:898:11:898:14 | hash [element :f] : | hash_flow.rb:898:11:898:18 | ...[...] : | -| hash_flow.rb:898:11:898:18 | ...[...] : | hash_flow.rb:898:10:898:19 | ( ... ) | -| hash_flow.rb:900:11:900:15 | hash1 [element :a] : | hash_flow.rb:900:11:900:19 | ...[...] : | -| hash_flow.rb:900:11:900:19 | ...[...] : | hash_flow.rb:900:10:900:20 | ( ... ) | -| hash_flow.rb:902:11:902:15 | hash1 [element :c] : | hash_flow.rb:902:11:902:19 | ...[...] : | -| hash_flow.rb:902:11:902:19 | ...[...] : | hash_flow.rb:902:10:902:20 | ( ... ) | -| hash_flow.rb:903:11:903:15 | hash1 [element :d] : | hash_flow.rb:903:11:903:19 | ...[...] : | -| hash_flow.rb:903:11:903:19 | ...[...] : | hash_flow.rb:903:10:903:20 | ( ... ) | -| hash_flow.rb:905:11:905:15 | hash1 [element :f] : | hash_flow.rb:905:11:905:19 | ...[...] : | -| hash_flow.rb:905:11:905:19 | ...[...] : | hash_flow.rb:905:10:905:20 | ( ... ) | -| hash_flow.rb:911:5:911:9 | hash1 [element :a] : | hash_flow.rb:922:12:922:16 | hash1 [element :a] : | -| hash_flow.rb:911:5:911:9 | hash1 [element :c] : | hash_flow.rb:922:12:922:16 | hash1 [element :c] : | -| hash_flow.rb:912:12:912:22 | call to taint : | hash_flow.rb:911:5:911:9 | hash1 [element :a] : | -| hash_flow.rb:914:12:914:22 | call to taint : | hash_flow.rb:911:5:911:9 | hash1 [element :c] : | -| hash_flow.rb:916:5:916:9 | hash2 [element :d] : | hash_flow.rb:922:33:922:37 | hash2 [element :d] : | -| hash_flow.rb:916:5:916:9 | hash2 [element :f] : | hash_flow.rb:922:33:922:37 | hash2 [element :f] : | -| hash_flow.rb:917:12:917:22 | call to taint : | hash_flow.rb:916:5:916:9 | hash2 [element :d] : | -| hash_flow.rb:919:12:919:22 | call to taint : | hash_flow.rb:916:5:916:9 | hash2 [element :f] : | -| hash_flow.rb:922:5:922:8 | hash [element :a] : | hash_flow.rb:923:11:923:14 | hash [element :a] : | -| hash_flow.rb:922:5:922:8 | hash [element :c] : | hash_flow.rb:925:11:925:14 | hash [element :c] : | -| hash_flow.rb:922:5:922:8 | hash [element :d] : | hash_flow.rb:926:11:926:14 | hash [element :d] : | -| hash_flow.rb:922:5:922:8 | hash [element :f] : | hash_flow.rb:928:11:928:14 | hash [element :f] : | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] : | hash_flow.rb:930:11:930:15 | hash1 [element :a] : | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] : | hash_flow.rb:932:11:932:15 | hash1 [element :c] : | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] : | hash_flow.rb:933:11:933:15 | hash1 [element :d] : | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :f] : | hash_flow.rb:935:11:935:15 | hash1 [element :f] : | -| hash_flow.rb:922:12:922:16 | hash1 [element :a] : | hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] : | -| hash_flow.rb:922:12:922:16 | hash1 [element :a] : | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] : | -| hash_flow.rb:922:12:922:16 | hash1 [element :c] : | hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] : | -| hash_flow.rb:922:12:922:16 | hash1 [element :c] : | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] : | hash_flow.rb:922:5:922:8 | hash [element :a] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] : | hash_flow.rb:922:5:922:8 | hash [element :c] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] : | hash_flow.rb:922:5:922:8 | hash [element :d] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] : | hash_flow.rb:922:5:922:8 | hash [element :f] : | -| hash_flow.rb:922:33:922:37 | hash2 [element :d] : | hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] : | -| hash_flow.rb:922:33:922:37 | hash2 [element :d] : | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] : | -| hash_flow.rb:922:33:922:37 | hash2 [element :f] : | hash_flow.rb:922:12:922:16 | [post] hash1 [element :f] : | -| hash_flow.rb:922:33:922:37 | hash2 [element :f] : | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] : | -| hash_flow.rb:923:11:923:14 | hash [element :a] : | hash_flow.rb:923:11:923:18 | ...[...] : | -| hash_flow.rb:923:11:923:18 | ...[...] : | hash_flow.rb:923:10:923:19 | ( ... ) | -| hash_flow.rb:925:11:925:14 | hash [element :c] : | hash_flow.rb:925:11:925:18 | ...[...] : | -| hash_flow.rb:925:11:925:18 | ...[...] : | hash_flow.rb:925:10:925:19 | ( ... ) | -| hash_flow.rb:926:11:926:14 | hash [element :d] : | hash_flow.rb:926:11:926:18 | ...[...] : | -| hash_flow.rb:926:11:926:18 | ...[...] : | hash_flow.rb:926:10:926:19 | ( ... ) | -| hash_flow.rb:928:11:928:14 | hash [element :f] : | hash_flow.rb:928:11:928:18 | ...[...] : | -| hash_flow.rb:928:11:928:18 | ...[...] : | hash_flow.rb:928:10:928:19 | ( ... ) | -| hash_flow.rb:930:11:930:15 | hash1 [element :a] : | hash_flow.rb:930:11:930:19 | ...[...] : | -| hash_flow.rb:930:11:930:19 | ...[...] : | hash_flow.rb:930:10:930:20 | ( ... ) | -| hash_flow.rb:932:11:932:15 | hash1 [element :c] : | hash_flow.rb:932:11:932:19 | ...[...] : | -| hash_flow.rb:932:11:932:19 | ...[...] : | hash_flow.rb:932:10:932:20 | ( ... ) | -| hash_flow.rb:933:11:933:15 | hash1 [element :d] : | hash_flow.rb:933:11:933:19 | ...[...] : | -| hash_flow.rb:933:11:933:19 | ...[...] : | hash_flow.rb:933:10:933:20 | ( ... ) | -| hash_flow.rb:935:11:935:15 | hash1 [element :f] : | hash_flow.rb:935:11:935:19 | ...[...] : | -| hash_flow.rb:935:11:935:19 | ...[...] : | hash_flow.rb:935:10:935:20 | ( ... ) | -| hash_flow.rb:941:5:941:9 | hash1 [element :a] : | hash_flow.rb:952:12:952:16 | hash1 [element :a] : | -| hash_flow.rb:941:5:941:9 | hash1 [element :c] : | hash_flow.rb:952:12:952:16 | hash1 [element :c] : | -| hash_flow.rb:942:12:942:22 | call to taint : | hash_flow.rb:941:5:941:9 | hash1 [element :a] : | -| hash_flow.rb:944:12:944:22 | call to taint : | hash_flow.rb:941:5:941:9 | hash1 [element :c] : | -| hash_flow.rb:946:5:946:9 | hash2 [element :d] : | hash_flow.rb:952:33:952:37 | hash2 [element :d] : | -| hash_flow.rb:946:5:946:9 | hash2 [element :f] : | hash_flow.rb:952:33:952:37 | hash2 [element :f] : | -| hash_flow.rb:947:12:947:22 | call to taint : | hash_flow.rb:946:5:946:9 | hash2 [element :d] : | -| hash_flow.rb:949:12:949:22 | call to taint : | hash_flow.rb:946:5:946:9 | hash2 [element :f] : | -| hash_flow.rb:952:5:952:8 | hash [element :a] : | hash_flow.rb:953:11:953:14 | hash [element :a] : | -| hash_flow.rb:952:5:952:8 | hash [element :c] : | hash_flow.rb:955:11:955:14 | hash [element :c] : | -| hash_flow.rb:952:5:952:8 | hash [element :d] : | hash_flow.rb:956:11:956:14 | hash [element :d] : | -| hash_flow.rb:952:5:952:8 | hash [element :f] : | hash_flow.rb:958:11:958:14 | hash [element :f] : | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] : | hash_flow.rb:960:11:960:15 | hash1 [element :a] : | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] : | hash_flow.rb:962:11:962:15 | hash1 [element :c] : | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] : | hash_flow.rb:963:11:963:15 | hash1 [element :d] : | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :f] : | hash_flow.rb:965:11:965:15 | hash1 [element :f] : | -| hash_flow.rb:952:12:952:16 | hash1 [element :a] : | hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] : | -| hash_flow.rb:952:12:952:16 | hash1 [element :a] : | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] : | -| hash_flow.rb:952:12:952:16 | hash1 [element :c] : | hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] : | -| hash_flow.rb:952:12:952:16 | hash1 [element :c] : | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] : | hash_flow.rb:952:5:952:8 | hash [element :a] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] : | hash_flow.rb:952:5:952:8 | hash [element :c] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] : | hash_flow.rb:952:5:952:8 | hash [element :d] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] : | hash_flow.rb:952:5:952:8 | hash [element :f] : | -| hash_flow.rb:952:33:952:37 | hash2 [element :d] : | hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] : | -| hash_flow.rb:952:33:952:37 | hash2 [element :d] : | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] : | -| hash_flow.rb:952:33:952:37 | hash2 [element :f] : | hash_flow.rb:952:12:952:16 | [post] hash1 [element :f] : | -| hash_flow.rb:952:33:952:37 | hash2 [element :f] : | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] : | -| hash_flow.rb:953:11:953:14 | hash [element :a] : | hash_flow.rb:953:11:953:18 | ...[...] : | -| hash_flow.rb:953:11:953:18 | ...[...] : | hash_flow.rb:953:10:953:19 | ( ... ) | -| hash_flow.rb:955:11:955:14 | hash [element :c] : | hash_flow.rb:955:11:955:18 | ...[...] : | -| hash_flow.rb:955:11:955:18 | ...[...] : | hash_flow.rb:955:10:955:19 | ( ... ) | -| hash_flow.rb:956:11:956:14 | hash [element :d] : | hash_flow.rb:956:11:956:18 | ...[...] : | -| hash_flow.rb:956:11:956:18 | ...[...] : | hash_flow.rb:956:10:956:19 | ( ... ) | -| hash_flow.rb:958:11:958:14 | hash [element :f] : | hash_flow.rb:958:11:958:18 | ...[...] : | -| hash_flow.rb:958:11:958:18 | ...[...] : | hash_flow.rb:958:10:958:19 | ( ... ) | -| hash_flow.rb:960:11:960:15 | hash1 [element :a] : | hash_flow.rb:960:11:960:19 | ...[...] : | -| hash_flow.rb:960:11:960:19 | ...[...] : | hash_flow.rb:960:10:960:20 | ( ... ) | -| hash_flow.rb:962:11:962:15 | hash1 [element :c] : | hash_flow.rb:962:11:962:19 | ...[...] : | -| hash_flow.rb:962:11:962:19 | ...[...] : | hash_flow.rb:962:10:962:20 | ( ... ) | -| hash_flow.rb:963:11:963:15 | hash1 [element :d] : | hash_flow.rb:963:11:963:19 | ...[...] : | -| hash_flow.rb:963:11:963:19 | ...[...] : | hash_flow.rb:963:10:963:20 | ( ... ) | -| hash_flow.rb:965:11:965:15 | hash1 [element :f] : | hash_flow.rb:965:11:965:19 | ...[...] : | -| hash_flow.rb:965:11:965:19 | ...[...] : | hash_flow.rb:965:10:965:20 | ( ... ) | +| hash_flow.rb:10:5:10:8 | hash [element 0] | hash_flow.rb:30:10:30:13 | hash [element 0] | +| hash_flow.rb:10:5:10:8 | hash [element :a] | hash_flow.rb:22:10:22:13 | hash [element :a] | +| hash_flow.rb:10:5:10:8 | hash [element :c] | hash_flow.rb:24:10:24:13 | hash [element :c] | +| hash_flow.rb:10:5:10:8 | hash [element e] | hash_flow.rb:26:10:26:13 | hash [element e] | +| hash_flow.rb:10:5:10:8 | hash [element g] | hash_flow.rb:28:10:28:13 | hash [element g] | +| hash_flow.rb:11:15:11:24 | call to taint | hash_flow.rb:10:5:10:8 | hash [element :a] | +| hash_flow.rb:13:12:13:21 | call to taint | hash_flow.rb:10:5:10:8 | hash [element :c] | +| hash_flow.rb:15:14:15:23 | call to taint | hash_flow.rb:10:5:10:8 | hash [element e] | +| hash_flow.rb:17:16:17:25 | call to taint | hash_flow.rb:10:5:10:8 | hash [element g] | +| hash_flow.rb:19:14:19:23 | call to taint | hash_flow.rb:10:5:10:8 | hash [element 0] | +| hash_flow.rb:22:10:22:13 | hash [element :a] | hash_flow.rb:22:10:22:17 | ...[...] | +| hash_flow.rb:24:10:24:13 | hash [element :c] | hash_flow.rb:24:10:24:17 | ...[...] | +| hash_flow.rb:26:10:26:13 | hash [element e] | hash_flow.rb:26:10:26:18 | ...[...] | +| hash_flow.rb:28:10:28:13 | hash [element g] | hash_flow.rb:28:10:28:18 | ...[...] | +| hash_flow.rb:30:10:30:13 | hash [element 0] | hash_flow.rb:30:10:30:16 | ...[...] | +| hash_flow.rb:38:5:38:8 | [post] hash [element 0] | hash_flow.rb:39:5:39:8 | hash [element 0] | +| hash_flow.rb:38:15:38:24 | call to taint | hash_flow.rb:38:5:38:8 | [post] hash [element 0] | +| hash_flow.rb:39:5:39:8 | [post] hash [element 0] | hash_flow.rb:40:5:40:8 | hash [element 0] | +| hash_flow.rb:39:5:39:8 | hash [element 0] | hash_flow.rb:39:5:39:8 | [post] hash [element 0] | +| hash_flow.rb:40:5:40:8 | [post] hash [element 0] | hash_flow.rb:41:5:41:8 | hash [element 0] | +| hash_flow.rb:40:5:40:8 | [post] hash [element :a] | hash_flow.rb:41:5:41:8 | hash [element :a] | +| hash_flow.rb:40:5:40:8 | hash [element 0] | hash_flow.rb:40:5:40:8 | [post] hash [element 0] | +| hash_flow.rb:40:16:40:25 | call to taint | hash_flow.rb:40:5:40:8 | [post] hash [element :a] | +| hash_flow.rb:41:5:41:8 | [post] hash [element 0] | hash_flow.rb:42:5:42:8 | hash [element 0] | +| hash_flow.rb:41:5:41:8 | [post] hash [element :a] | hash_flow.rb:42:5:42:8 | hash [element :a] | +| hash_flow.rb:41:5:41:8 | hash [element 0] | hash_flow.rb:41:5:41:8 | [post] hash [element 0] | +| hash_flow.rb:41:5:41:8 | hash [element :a] | hash_flow.rb:41:5:41:8 | [post] hash [element :a] | +| hash_flow.rb:42:5:42:8 | [post] hash [element 0] | hash_flow.rb:43:5:43:8 | hash [element 0] | +| hash_flow.rb:42:5:42:8 | [post] hash [element :a] | hash_flow.rb:43:5:43:8 | hash [element :a] | +| hash_flow.rb:42:5:42:8 | [post] hash [element a] | hash_flow.rb:43:5:43:8 | hash [element a] | +| hash_flow.rb:42:5:42:8 | hash [element 0] | hash_flow.rb:42:5:42:8 | [post] hash [element 0] | +| hash_flow.rb:42:5:42:8 | hash [element :a] | hash_flow.rb:42:5:42:8 | [post] hash [element :a] | +| hash_flow.rb:42:17:42:26 | call to taint | hash_flow.rb:42:5:42:8 | [post] hash [element a] | +| hash_flow.rb:43:5:43:8 | [post] hash [element 0] | hash_flow.rb:44:10:44:13 | hash [element 0] | +| hash_flow.rb:43:5:43:8 | [post] hash [element :a] | hash_flow.rb:46:10:46:13 | hash [element :a] | +| hash_flow.rb:43:5:43:8 | [post] hash [element a] | hash_flow.rb:48:10:48:13 | hash [element a] | +| hash_flow.rb:43:5:43:8 | hash [element 0] | hash_flow.rb:43:5:43:8 | [post] hash [element 0] | +| hash_flow.rb:43:5:43:8 | hash [element :a] | hash_flow.rb:43:5:43:8 | [post] hash [element :a] | +| hash_flow.rb:43:5:43:8 | hash [element a] | hash_flow.rb:43:5:43:8 | [post] hash [element a] | +| hash_flow.rb:44:10:44:13 | hash [element 0] | hash_flow.rb:44:10:44:16 | ...[...] | +| hash_flow.rb:46:10:46:13 | hash [element :a] | hash_flow.rb:46:10:46:17 | ...[...] | +| hash_flow.rb:48:10:48:13 | hash [element a] | hash_flow.rb:48:10:48:18 | ...[...] | +| hash_flow.rb:55:5:55:9 | hash1 [element :a] | hash_flow.rb:56:10:56:14 | hash1 [element :a] | +| hash_flow.rb:55:13:55:37 | ...[...] [element :a] | hash_flow.rb:55:5:55:9 | hash1 [element :a] | +| hash_flow.rb:55:21:55:30 | call to taint | hash_flow.rb:55:13:55:37 | ...[...] [element :a] | +| hash_flow.rb:56:10:56:14 | hash1 [element :a] | hash_flow.rb:56:10:56:18 | ...[...] | +| hash_flow.rb:59:5:59:5 | x [element :a] | hash_flow.rb:60:18:60:18 | x [element :a] | +| hash_flow.rb:59:13:59:22 | call to taint | hash_flow.rb:59:5:59:5 | x [element :a] | +| hash_flow.rb:60:5:60:9 | hash2 [element :a] | hash_flow.rb:61:10:61:14 | hash2 [element :a] | +| hash_flow.rb:60:13:60:19 | ...[...] [element :a] | hash_flow.rb:60:5:60:9 | hash2 [element :a] | +| hash_flow.rb:60:18:60:18 | x [element :a] | hash_flow.rb:60:13:60:19 | ...[...] [element :a] | +| hash_flow.rb:61:10:61:14 | hash2 [element :a] | hash_flow.rb:61:10:61:18 | ...[...] | +| hash_flow.rb:64:5:64:9 | hash3 [element] | hash_flow.rb:65:10:65:14 | hash3 [element] | +| hash_flow.rb:64:5:64:9 | hash3 [element] | hash_flow.rb:66:10:66:14 | hash3 [element] | +| hash_flow.rb:64:13:64:45 | ...[...] [element] | hash_flow.rb:64:5:64:9 | hash3 [element] | +| hash_flow.rb:64:24:64:33 | call to taint | hash_flow.rb:64:13:64:45 | ...[...] [element] | +| hash_flow.rb:65:10:65:14 | hash3 [element] | hash_flow.rb:65:10:65:18 | ...[...] | +| hash_flow.rb:66:10:66:14 | hash3 [element] | hash_flow.rb:66:10:66:18 | ...[...] | +| hash_flow.rb:68:5:68:9 | hash4 [element :a] | hash_flow.rb:69:10:69:14 | hash4 [element :a] | +| hash_flow.rb:68:13:68:39 | ...[...] [element :a] | hash_flow.rb:68:5:68:9 | hash4 [element :a] | +| hash_flow.rb:68:22:68:31 | call to taint | hash_flow.rb:68:13:68:39 | ...[...] [element :a] | +| hash_flow.rb:69:10:69:14 | hash4 [element :a] | hash_flow.rb:69:10:69:18 | ...[...] | +| hash_flow.rb:72:5:72:9 | hash5 [element a] | hash_flow.rb:73:10:73:14 | hash5 [element a] | +| hash_flow.rb:72:13:72:45 | ...[...] [element a] | hash_flow.rb:72:5:72:9 | hash5 [element a] | +| hash_flow.rb:72:25:72:34 | call to taint | hash_flow.rb:72:13:72:45 | ...[...] [element a] | +| hash_flow.rb:73:10:73:14 | hash5 [element a] | hash_flow.rb:73:10:73:19 | ...[...] | +| hash_flow.rb:76:5:76:9 | hash6 [element a] | hash_flow.rb:77:10:77:14 | hash6 [element a] | +| hash_flow.rb:76:13:76:47 | ...[...] [element a] | hash_flow.rb:76:5:76:9 | hash6 [element a] | +| hash_flow.rb:76:26:76:35 | call to taint | hash_flow.rb:76:13:76:47 | ...[...] [element a] | +| hash_flow.rb:77:10:77:14 | hash6 [element a] | hash_flow.rb:77:10:77:19 | ...[...] | +| hash_flow.rb:84:5:84:9 | hash1 [element :a] | hash_flow.rb:85:10:85:14 | hash1 [element :a] | +| hash_flow.rb:84:13:84:42 | call to [] [element :a] | hash_flow.rb:84:5:84:9 | hash1 [element :a] | +| hash_flow.rb:84:26:84:35 | call to taint | hash_flow.rb:84:13:84:42 | call to [] [element :a] | +| hash_flow.rb:85:10:85:14 | hash1 [element :a] | hash_flow.rb:85:10:85:18 | ...[...] | +| hash_flow.rb:92:5:92:8 | hash [element :a] | hash_flow.rb:96:30:96:33 | hash [element :a] | +| hash_flow.rb:93:15:93:24 | call to taint | hash_flow.rb:92:5:92:8 | hash [element :a] | +| hash_flow.rb:96:5:96:9 | hash2 [element :a] | hash_flow.rb:97:10:97:14 | hash2 [element :a] | +| hash_flow.rb:96:13:96:34 | call to try_convert [element :a] | hash_flow.rb:96:5:96:9 | hash2 [element :a] | +| hash_flow.rb:96:30:96:33 | hash [element :a] | hash_flow.rb:96:13:96:34 | call to try_convert [element :a] | +| hash_flow.rb:97:10:97:14 | hash2 [element :a] | hash_flow.rb:97:10:97:18 | ...[...] | +| hash_flow.rb:105:5:105:5 | b | hash_flow.rb:106:10:106:10 | b | +| hash_flow.rb:105:21:105:30 | __synth__0 | hash_flow.rb:105:5:105:5 | b | +| hash_flow.rb:105:21:105:30 | call to taint | hash_flow.rb:105:21:105:30 | __synth__0 | +| hash_flow.rb:113:5:113:5 | b | hash_flow.rb:115:10:115:10 | b | +| hash_flow.rb:113:9:113:12 | [post] hash [element :a] | hash_flow.rb:114:10:114:13 | hash [element :a] | +| hash_flow.rb:113:9:113:34 | call to store | hash_flow.rb:113:5:113:5 | b | +| hash_flow.rb:113:24:113:33 | call to taint | hash_flow.rb:113:9:113:12 | [post] hash [element :a] | +| hash_flow.rb:113:24:113:33 | call to taint | hash_flow.rb:113:9:113:34 | call to store | +| hash_flow.rb:114:10:114:13 | hash [element :a] | hash_flow.rb:114:10:114:17 | ...[...] | +| hash_flow.rb:118:5:118:5 | c | hash_flow.rb:121:10:121:10 | c | +| hash_flow.rb:118:9:118:12 | [post] hash [element] | hash_flow.rb:119:10:119:13 | hash [element] | +| hash_flow.rb:118:9:118:12 | [post] hash [element] | hash_flow.rb:120:10:120:13 | hash [element] | +| hash_flow.rb:118:9:118:33 | call to store | hash_flow.rb:118:5:118:5 | c | +| hash_flow.rb:118:23:118:32 | call to taint | hash_flow.rb:118:9:118:12 | [post] hash [element] | +| hash_flow.rb:118:23:118:32 | call to taint | hash_flow.rb:118:9:118:33 | call to store | +| hash_flow.rb:119:10:119:13 | hash [element] | hash_flow.rb:119:10:119:17 | ...[...] | +| hash_flow.rb:120:10:120:13 | hash [element] | hash_flow.rb:120:10:120:17 | ...[...] | +| hash_flow.rb:127:5:127:8 | hash [element :a] | hash_flow.rb:131:5:131:8 | hash [element :a] | +| hash_flow.rb:127:5:127:8 | hash [element :a] | hash_flow.rb:134:5:134:8 | hash [element :a] | +| hash_flow.rb:128:15:128:24 | call to taint | hash_flow.rb:127:5:127:8 | hash [element :a] | +| hash_flow.rb:131:5:131:8 | hash [element :a] | hash_flow.rb:131:18:131:29 | key_or_value | +| hash_flow.rb:131:18:131:29 | key_or_value | hash_flow.rb:132:14:132:25 | key_or_value | +| hash_flow.rb:134:5:134:8 | hash [element :a] | hash_flow.rb:134:22:134:26 | value | +| hash_flow.rb:134:22:134:26 | value | hash_flow.rb:136:14:136:18 | value | +| hash_flow.rb:143:5:143:8 | hash [element :a] | hash_flow.rb:147:9:147:12 | hash [element :a] | +| hash_flow.rb:143:5:143:8 | hash [element :a] | hash_flow.rb:151:9:151:12 | hash [element :a] | +| hash_flow.rb:144:15:144:25 | call to taint | hash_flow.rb:143:5:143:8 | hash [element :a] | +| hash_flow.rb:147:5:147:5 | b [element 1] | hash_flow.rb:149:10:149:10 | b [element 1] | +| hash_flow.rb:147:5:147:5 | b [element 1] | hash_flow.rb:150:10:150:10 | b [element 1] | +| hash_flow.rb:147:9:147:12 | hash [element :a] | hash_flow.rb:147:9:147:22 | call to assoc [element 1] | +| hash_flow.rb:147:9:147:22 | call to assoc [element 1] | hash_flow.rb:147:5:147:5 | b [element 1] | +| hash_flow.rb:149:10:149:10 | b [element 1] | hash_flow.rb:149:10:149:13 | ...[...] | +| hash_flow.rb:150:10:150:10 | b [element 1] | hash_flow.rb:150:10:150:13 | ...[...] | +| hash_flow.rb:151:5:151:5 | c [element 1] | hash_flow.rb:152:10:152:10 | c [element 1] | +| hash_flow.rb:151:9:151:12 | hash [element :a] | hash_flow.rb:151:9:151:21 | call to assoc [element 1] | +| hash_flow.rb:151:9:151:21 | call to assoc [element 1] | hash_flow.rb:151:5:151:5 | c [element 1] | +| hash_flow.rb:152:10:152:10 | c [element 1] | hash_flow.rb:152:10:152:13 | ...[...] | +| hash_flow.rb:169:5:169:8 | hash [element :a] | hash_flow.rb:173:9:173:12 | hash [element :a] | +| hash_flow.rb:170:15:170:25 | call to taint | hash_flow.rb:169:5:169:8 | hash [element :a] | +| hash_flow.rb:173:5:173:5 | a [element :a] | hash_flow.rb:174:10:174:10 | a [element :a] | +| hash_flow.rb:173:9:173:12 | hash [element :a] | hash_flow.rb:173:9:173:20 | call to compact [element :a] | +| hash_flow.rb:173:9:173:20 | call to compact [element :a] | hash_flow.rb:173:5:173:5 | a [element :a] | +| hash_flow.rb:174:10:174:10 | a [element :a] | hash_flow.rb:174:10:174:14 | ...[...] | +| hash_flow.rb:181:5:181:8 | hash [element :a] | hash_flow.rb:185:9:185:12 | hash [element :a] | +| hash_flow.rb:182:15:182:25 | call to taint | hash_flow.rb:181:5:181:8 | hash [element :a] | +| hash_flow.rb:185:5:185:5 | a | hash_flow.rb:186:10:186:10 | a | +| hash_flow.rb:185:9:185:12 | hash [element :a] | hash_flow.rb:185:9:185:23 | call to delete | +| hash_flow.rb:185:9:185:23 | call to delete | hash_flow.rb:185:5:185:5 | a | +| hash_flow.rb:193:5:193:8 | hash [element :a] | hash_flow.rb:197:9:197:12 | hash [element :a] | +| hash_flow.rb:194:15:194:25 | call to taint | hash_flow.rb:193:5:193:8 | hash [element :a] | +| hash_flow.rb:197:5:197:5 | a [element :a] | hash_flow.rb:201:10:201:10 | a [element :a] | +| hash_flow.rb:197:9:197:12 | [post] hash [element :a] | hash_flow.rb:202:10:202:13 | hash [element :a] | +| hash_flow.rb:197:9:197:12 | hash [element :a] | hash_flow.rb:197:9:197:12 | [post] hash [element :a] | +| hash_flow.rb:197:9:197:12 | hash [element :a] | hash_flow.rb:197:9:200:7 | call to delete_if [element :a] | +| hash_flow.rb:197:9:197:12 | hash [element :a] | hash_flow.rb:197:33:197:37 | value | +| hash_flow.rb:197:9:200:7 | call to delete_if [element :a] | hash_flow.rb:197:5:197:5 | a [element :a] | +| hash_flow.rb:197:33:197:37 | value | hash_flow.rb:199:14:199:18 | value | +| hash_flow.rb:201:10:201:10 | a [element :a] | hash_flow.rb:201:10:201:14 | ...[...] | +| hash_flow.rb:202:10:202:13 | hash [element :a] | hash_flow.rb:202:10:202:17 | ...[...] | +| hash_flow.rb:209:5:209:8 | hash [element :a] | hash_flow.rb:217:10:217:13 | hash [element :a] | +| hash_flow.rb:209:5:209:8 | hash [element :c, element :d] | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] | +| hash_flow.rb:210:15:210:25 | call to taint | hash_flow.rb:209:5:209:8 | hash [element :a] | +| hash_flow.rb:213:19:213:29 | call to taint | hash_flow.rb:209:5:209:8 | hash [element :c, element :d] | +| hash_flow.rb:217:10:217:13 | hash [element :a] | hash_flow.rb:217:10:217:21 | call to dig | +| hash_flow.rb:219:10:219:13 | hash [element :c, element :d] | hash_flow.rb:219:10:219:24 | call to dig | +| hash_flow.rb:226:5:226:8 | hash [element :a] | hash_flow.rb:230:9:230:12 | hash [element :a] | +| hash_flow.rb:227:15:227:25 | call to taint | hash_flow.rb:226:5:226:8 | hash [element :a] | +| hash_flow.rb:230:5:230:5 | x [element :a] | hash_flow.rb:234:10:234:10 | x [element :a] | +| hash_flow.rb:230:9:230:12 | hash [element :a] | hash_flow.rb:230:9:233:7 | call to each [element :a] | +| hash_flow.rb:230:9:230:12 | hash [element :a] | hash_flow.rb:230:28:230:32 | value | +| hash_flow.rb:230:9:233:7 | call to each [element :a] | hash_flow.rb:230:5:230:5 | x [element :a] | +| hash_flow.rb:230:28:230:32 | value | hash_flow.rb:232:14:232:18 | value | +| hash_flow.rb:234:10:234:10 | x [element :a] | hash_flow.rb:234:10:234:14 | ...[...] | +| hash_flow.rb:241:5:241:8 | hash [element :a] | hash_flow.rb:245:9:245:12 | hash [element :a] | +| hash_flow.rb:242:15:242:25 | call to taint | hash_flow.rb:241:5:241:8 | hash [element :a] | +| hash_flow.rb:245:5:245:5 | x [element :a] | hash_flow.rb:248:10:248:10 | x [element :a] | +| hash_flow.rb:245:9:245:12 | hash [element :a] | hash_flow.rb:245:9:247:7 | call to each_key [element :a] | +| hash_flow.rb:245:9:247:7 | call to each_key [element :a] | hash_flow.rb:245:5:245:5 | x [element :a] | +| hash_flow.rb:248:10:248:10 | x [element :a] | hash_flow.rb:248:10:248:14 | ...[...] | +| hash_flow.rb:255:5:255:8 | hash [element :a] | hash_flow.rb:259:9:259:12 | hash [element :a] | +| hash_flow.rb:256:15:256:25 | call to taint | hash_flow.rb:255:5:255:8 | hash [element :a] | +| hash_flow.rb:259:5:259:5 | x [element :a] | hash_flow.rb:263:10:263:10 | x [element :a] | +| hash_flow.rb:259:9:259:12 | hash [element :a] | hash_flow.rb:259:9:262:7 | call to each_pair [element :a] | +| hash_flow.rb:259:9:259:12 | hash [element :a] | hash_flow.rb:259:33:259:37 | value | +| hash_flow.rb:259:9:262:7 | call to each_pair [element :a] | hash_flow.rb:259:5:259:5 | x [element :a] | +| hash_flow.rb:259:33:259:37 | value | hash_flow.rb:261:14:261:18 | value | +| hash_flow.rb:263:10:263:10 | x [element :a] | hash_flow.rb:263:10:263:14 | ...[...] | +| hash_flow.rb:270:5:270:8 | hash [element :a] | hash_flow.rb:274:9:274:12 | hash [element :a] | +| hash_flow.rb:271:15:271:25 | call to taint | hash_flow.rb:270:5:270:8 | hash [element :a] | +| hash_flow.rb:274:5:274:5 | x [element :a] | hash_flow.rb:277:10:277:10 | x [element :a] | +| hash_flow.rb:274:9:274:12 | hash [element :a] | hash_flow.rb:274:9:276:7 | call to each_value [element :a] | +| hash_flow.rb:274:9:274:12 | hash [element :a] | hash_flow.rb:274:29:274:33 | value | +| hash_flow.rb:274:9:276:7 | call to each_value [element :a] | hash_flow.rb:274:5:274:5 | x [element :a] | +| hash_flow.rb:274:29:274:33 | value | hash_flow.rb:275:14:275:18 | value | +| hash_flow.rb:277:10:277:10 | x [element :a] | hash_flow.rb:277:10:277:14 | ...[...] | +| hash_flow.rb:284:5:284:8 | hash [element :c] | hash_flow.rb:290:9:290:12 | hash [element :c] | +| hash_flow.rb:287:15:287:25 | call to taint | hash_flow.rb:284:5:284:8 | hash [element :c] | +| hash_flow.rb:290:5:290:5 | x [element :c] | hash_flow.rb:293:10:293:10 | x [element :c] | +| hash_flow.rb:290:9:290:12 | hash [element :c] | hash_flow.rb:290:9:290:28 | call to except [element :c] | +| hash_flow.rb:290:9:290:28 | call to except [element :c] | hash_flow.rb:290:5:290:5 | x [element :c] | +| hash_flow.rb:293:10:293:10 | x [element :c] | hash_flow.rb:293:10:293:14 | ...[...] | +| hash_flow.rb:300:5:300:8 | hash [element :a] | hash_flow.rb:305:9:305:12 | hash [element :a] | +| hash_flow.rb:300:5:300:8 | hash [element :a] | hash_flow.rb:309:9:309:12 | hash [element :a] | +| hash_flow.rb:300:5:300:8 | hash [element :a] | hash_flow.rb:311:9:311:12 | hash [element :a] | +| hash_flow.rb:300:5:300:8 | hash [element :a] | hash_flow.rb:315:9:315:12 | hash [element :a] | +| hash_flow.rb:300:5:300:8 | hash [element :c] | hash_flow.rb:305:9:305:12 | hash [element :c] | +| hash_flow.rb:300:5:300:8 | hash [element :c] | hash_flow.rb:315:9:315:12 | hash [element :c] | +| hash_flow.rb:301:15:301:25 | call to taint | hash_flow.rb:300:5:300:8 | hash [element :a] | +| hash_flow.rb:303:15:303:25 | call to taint | hash_flow.rb:300:5:300:8 | hash [element :c] | +| hash_flow.rb:305:5:305:5 | b | hash_flow.rb:308:10:308:10 | b | +| hash_flow.rb:305:9:305:12 | hash [element :a] | hash_flow.rb:305:9:307:7 | call to fetch | +| hash_flow.rb:305:9:305:12 | hash [element :c] | hash_flow.rb:305:9:307:7 | call to fetch | +| hash_flow.rb:305:9:307:7 | call to fetch | hash_flow.rb:305:5:305:5 | b | +| hash_flow.rb:305:20:305:30 | call to taint | hash_flow.rb:305:37:305:37 | x | +| hash_flow.rb:305:37:305:37 | x | hash_flow.rb:306:14:306:14 | x | +| hash_flow.rb:309:5:309:5 | b | hash_flow.rb:310:10:310:10 | b | +| hash_flow.rb:309:9:309:12 | hash [element :a] | hash_flow.rb:309:9:309:22 | call to fetch | +| hash_flow.rb:309:9:309:22 | call to fetch | hash_flow.rb:309:5:309:5 | b | +| hash_flow.rb:311:5:311:5 | b | hash_flow.rb:312:10:312:10 | b | +| hash_flow.rb:311:9:311:12 | hash [element :a] | hash_flow.rb:311:9:311:35 | call to fetch | +| hash_flow.rb:311:9:311:35 | call to fetch | hash_flow.rb:311:5:311:5 | b | +| hash_flow.rb:311:24:311:34 | call to taint | hash_flow.rb:311:9:311:35 | call to fetch | +| hash_flow.rb:313:5:313:5 | b | hash_flow.rb:314:10:314:10 | b | +| hash_flow.rb:313:9:313:35 | call to fetch | hash_flow.rb:313:5:313:5 | b | +| hash_flow.rb:313:24:313:34 | call to taint | hash_flow.rb:313:9:313:35 | call to fetch | +| hash_flow.rb:315:5:315:5 | b | hash_flow.rb:316:10:316:10 | b | +| hash_flow.rb:315:9:315:12 | hash [element :a] | hash_flow.rb:315:9:315:34 | call to fetch | +| hash_flow.rb:315:9:315:12 | hash [element :c] | hash_flow.rb:315:9:315:34 | call to fetch | +| hash_flow.rb:315:9:315:34 | call to fetch | hash_flow.rb:315:5:315:5 | b | +| hash_flow.rb:315:23:315:33 | call to taint | hash_flow.rb:315:9:315:34 | call to fetch | +| hash_flow.rb:322:5:322:8 | hash [element :a] | hash_flow.rb:327:9:327:12 | hash [element :a] | +| hash_flow.rb:322:5:322:8 | hash [element :a] | hash_flow.rb:332:9:332:12 | hash [element :a] | +| hash_flow.rb:322:5:322:8 | hash [element :a] | hash_flow.rb:334:9:334:12 | hash [element :a] | +| hash_flow.rb:322:5:322:8 | hash [element :c] | hash_flow.rb:327:9:327:12 | hash [element :c] | +| hash_flow.rb:322:5:322:8 | hash [element :c] | hash_flow.rb:334:9:334:12 | hash [element :c] | +| hash_flow.rb:323:15:323:25 | call to taint | hash_flow.rb:322:5:322:8 | hash [element :a] | +| hash_flow.rb:325:15:325:25 | call to taint | hash_flow.rb:322:5:322:8 | hash [element :c] | +| hash_flow.rb:327:5:327:5 | b [element] | hash_flow.rb:331:10:331:10 | b [element] | +| hash_flow.rb:327:9:327:12 | hash [element :a] | hash_flow.rb:327:9:330:7 | call to fetch_values [element] | +| hash_flow.rb:327:9:327:12 | hash [element :c] | hash_flow.rb:327:9:330:7 | call to fetch_values [element] | +| hash_flow.rb:327:9:330:7 | call to fetch_values [element] | hash_flow.rb:327:5:327:5 | b [element] | +| hash_flow.rb:327:27:327:37 | call to taint | hash_flow.rb:327:44:327:44 | x | +| hash_flow.rb:327:44:327:44 | x | hash_flow.rb:328:14:328:14 | x | +| hash_flow.rb:329:9:329:19 | call to taint | hash_flow.rb:327:9:330:7 | call to fetch_values [element] | +| hash_flow.rb:331:10:331:10 | b [element] | hash_flow.rb:331:10:331:13 | ...[...] | +| hash_flow.rb:332:5:332:5 | b [element] | hash_flow.rb:333:10:333:10 | b [element] | +| hash_flow.rb:332:9:332:12 | hash [element :a] | hash_flow.rb:332:9:332:29 | call to fetch_values [element] | +| hash_flow.rb:332:9:332:29 | call to fetch_values [element] | hash_flow.rb:332:5:332:5 | b [element] | +| hash_flow.rb:333:10:333:10 | b [element] | hash_flow.rb:333:10:333:13 | ...[...] | +| hash_flow.rb:334:5:334:5 | b [element] | hash_flow.rb:335:10:335:10 | b [element] | +| hash_flow.rb:334:9:334:12 | hash [element :a] | hash_flow.rb:334:9:334:31 | call to fetch_values [element] | +| hash_flow.rb:334:9:334:12 | hash [element :c] | hash_flow.rb:334:9:334:31 | call to fetch_values [element] | +| hash_flow.rb:334:9:334:31 | call to fetch_values [element] | hash_flow.rb:334:5:334:5 | b [element] | +| hash_flow.rb:335:10:335:10 | b [element] | hash_flow.rb:335:10:335:13 | ...[...] | +| hash_flow.rb:341:5:341:8 | hash [element :a] | hash_flow.rb:346:9:346:12 | hash [element :a] | +| hash_flow.rb:341:5:341:8 | hash [element :c] | hash_flow.rb:346:9:346:12 | hash [element :c] | +| hash_flow.rb:342:15:342:25 | call to taint | hash_flow.rb:341:5:341:8 | hash [element :a] | +| hash_flow.rb:344:15:344:25 | call to taint | hash_flow.rb:341:5:341:8 | hash [element :c] | +| hash_flow.rb:346:5:346:5 | b [element :a] | hash_flow.rb:351:11:351:11 | b [element :a] | +| hash_flow.rb:346:9:346:12 | hash [element :a] | hash_flow.rb:346:9:350:7 | call to filter [element :a] | +| hash_flow.rb:346:9:346:12 | hash [element :a] | hash_flow.rb:346:30:346:34 | value | +| hash_flow.rb:346:9:346:12 | hash [element :c] | hash_flow.rb:346:30:346:34 | value | +| hash_flow.rb:346:9:350:7 | call to filter [element :a] | hash_flow.rb:346:5:346:5 | b [element :a] | +| hash_flow.rb:346:30:346:34 | value | hash_flow.rb:348:14:348:18 | value | +| hash_flow.rb:351:11:351:11 | b [element :a] | hash_flow.rb:351:11:351:15 | ...[...] | +| hash_flow.rb:351:11:351:15 | ...[...] | hash_flow.rb:351:10:351:16 | ( ... ) | +| hash_flow.rb:357:5:357:8 | hash [element :a] | hash_flow.rb:362:5:362:8 | hash [element :a] | +| hash_flow.rb:357:5:357:8 | hash [element :c] | hash_flow.rb:362:5:362:8 | hash [element :c] | +| hash_flow.rb:358:15:358:25 | call to taint | hash_flow.rb:357:5:357:8 | hash [element :a] | +| hash_flow.rb:360:15:360:25 | call to taint | hash_flow.rb:357:5:357:8 | hash [element :c] | +| hash_flow.rb:362:5:362:8 | [post] hash [element :a] | hash_flow.rb:367:11:367:14 | hash [element :a] | +| hash_flow.rb:362:5:362:8 | hash [element :a] | hash_flow.rb:362:5:362:8 | [post] hash [element :a] | +| hash_flow.rb:362:5:362:8 | hash [element :a] | hash_flow.rb:362:27:362:31 | value | +| hash_flow.rb:362:5:362:8 | hash [element :c] | hash_flow.rb:362:27:362:31 | value | +| hash_flow.rb:362:27:362:31 | value | hash_flow.rb:364:14:364:18 | value | +| hash_flow.rb:367:11:367:14 | hash [element :a] | hash_flow.rb:367:11:367:18 | ...[...] | +| hash_flow.rb:367:11:367:18 | ...[...] | hash_flow.rb:367:10:367:19 | ( ... ) | +| hash_flow.rb:373:5:373:8 | hash [element :a] | hash_flow.rb:378:9:378:12 | hash [element :a] | +| hash_flow.rb:373:5:373:8 | hash [element :c] | hash_flow.rb:378:9:378:12 | hash [element :c] | +| hash_flow.rb:374:15:374:25 | call to taint | hash_flow.rb:373:5:373:8 | hash [element :a] | +| hash_flow.rb:376:15:376:25 | call to taint | hash_flow.rb:373:5:373:8 | hash [element :c] | +| hash_flow.rb:378:5:378:5 | b [element] | hash_flow.rb:379:11:379:11 | b [element] | +| hash_flow.rb:378:9:378:12 | hash [element :a] | hash_flow.rb:378:9:378:20 | call to flatten [element] | +| hash_flow.rb:378:9:378:12 | hash [element :c] | hash_flow.rb:378:9:378:20 | call to flatten [element] | +| hash_flow.rb:378:9:378:20 | call to flatten [element] | hash_flow.rb:378:5:378:5 | b [element] | +| hash_flow.rb:379:11:379:11 | b [element] | hash_flow.rb:379:11:379:14 | ...[...] | +| hash_flow.rb:379:11:379:14 | ...[...] | hash_flow.rb:379:10:379:15 | ( ... ) | +| hash_flow.rb:385:5:385:8 | hash [element :a] | hash_flow.rb:390:9:390:12 | hash [element :a] | +| hash_flow.rb:385:5:385:8 | hash [element :c] | hash_flow.rb:390:9:390:12 | hash [element :c] | +| hash_flow.rb:386:15:386:25 | call to taint | hash_flow.rb:385:5:385:8 | hash [element :a] | +| hash_flow.rb:388:15:388:25 | call to taint | hash_flow.rb:385:5:385:8 | hash [element :c] | +| hash_flow.rb:390:5:390:5 | b [element :a] | hash_flow.rb:396:11:396:11 | b [element :a] | +| hash_flow.rb:390:9:390:12 | [post] hash [element :a] | hash_flow.rb:395:11:395:14 | hash [element :a] | +| hash_flow.rb:390:9:390:12 | hash [element :a] | hash_flow.rb:390:9:390:12 | [post] hash [element :a] | +| hash_flow.rb:390:9:390:12 | hash [element :a] | hash_flow.rb:390:9:394:7 | call to keep_if [element :a] | +| hash_flow.rb:390:9:390:12 | hash [element :a] | hash_flow.rb:390:31:390:35 | value | +| hash_flow.rb:390:9:390:12 | hash [element :c] | hash_flow.rb:390:31:390:35 | value | +| hash_flow.rb:390:9:394:7 | call to keep_if [element :a] | hash_flow.rb:390:5:390:5 | b [element :a] | +| hash_flow.rb:390:31:390:35 | value | hash_flow.rb:392:14:392:18 | value | +| hash_flow.rb:395:11:395:14 | hash [element :a] | hash_flow.rb:395:11:395:18 | ...[...] | +| hash_flow.rb:395:11:395:18 | ...[...] | hash_flow.rb:395:10:395:19 | ( ... ) | +| hash_flow.rb:396:11:396:11 | b [element :a] | hash_flow.rb:396:11:396:15 | ...[...] | +| hash_flow.rb:396:11:396:15 | ...[...] | hash_flow.rb:396:10:396:16 | ( ... ) | +| hash_flow.rb:402:5:402:9 | hash1 [element :a] | hash_flow.rb:412:12:412:16 | hash1 [element :a] | +| hash_flow.rb:402:5:402:9 | hash1 [element :c] | hash_flow.rb:412:12:412:16 | hash1 [element :c] | +| hash_flow.rb:403:15:403:25 | call to taint | hash_flow.rb:402:5:402:9 | hash1 [element :a] | +| hash_flow.rb:405:15:405:25 | call to taint | hash_flow.rb:402:5:402:9 | hash1 [element :c] | +| hash_flow.rb:407:5:407:9 | hash2 [element :d] | hash_flow.rb:412:24:412:28 | hash2 [element :d] | +| hash_flow.rb:407:5:407:9 | hash2 [element :f] | hash_flow.rb:412:24:412:28 | hash2 [element :f] | +| hash_flow.rb:408:15:408:25 | call to taint | hash_flow.rb:407:5:407:9 | hash2 [element :d] | +| hash_flow.rb:410:15:410:25 | call to taint | hash_flow.rb:407:5:407:9 | hash2 [element :f] | +| hash_flow.rb:412:5:412:8 | hash [element :a] | hash_flow.rb:417:11:417:14 | hash [element :a] | +| hash_flow.rb:412:5:412:8 | hash [element :c] | hash_flow.rb:419:11:419:14 | hash [element :c] | +| hash_flow.rb:412:5:412:8 | hash [element :d] | hash_flow.rb:420:11:420:14 | hash [element :d] | +| hash_flow.rb:412:5:412:8 | hash [element :f] | hash_flow.rb:422:11:422:14 | hash [element :f] | +| hash_flow.rb:412:12:412:16 | hash1 [element :a] | hash_flow.rb:412:12:416:7 | call to merge [element :a] | +| hash_flow.rb:412:12:412:16 | hash1 [element :a] | hash_flow.rb:412:40:412:48 | old_value | +| hash_flow.rb:412:12:412:16 | hash1 [element :a] | hash_flow.rb:412:51:412:59 | new_value | +| hash_flow.rb:412:12:412:16 | hash1 [element :c] | hash_flow.rb:412:12:416:7 | call to merge [element :c] | +| hash_flow.rb:412:12:412:16 | hash1 [element :c] | hash_flow.rb:412:40:412:48 | old_value | +| hash_flow.rb:412:12:412:16 | hash1 [element :c] | hash_flow.rb:412:51:412:59 | new_value | +| hash_flow.rb:412:12:416:7 | call to merge [element :a] | hash_flow.rb:412:5:412:8 | hash [element :a] | +| hash_flow.rb:412:12:416:7 | call to merge [element :c] | hash_flow.rb:412:5:412:8 | hash [element :c] | +| hash_flow.rb:412:12:416:7 | call to merge [element :d] | hash_flow.rb:412:5:412:8 | hash [element :d] | +| hash_flow.rb:412:12:416:7 | call to merge [element :f] | hash_flow.rb:412:5:412:8 | hash [element :f] | +| hash_flow.rb:412:24:412:28 | hash2 [element :d] | hash_flow.rb:412:12:416:7 | call to merge [element :d] | +| hash_flow.rb:412:24:412:28 | hash2 [element :d] | hash_flow.rb:412:40:412:48 | old_value | +| hash_flow.rb:412:24:412:28 | hash2 [element :d] | hash_flow.rb:412:51:412:59 | new_value | +| hash_flow.rb:412:24:412:28 | hash2 [element :f] | hash_flow.rb:412:12:416:7 | call to merge [element :f] | +| hash_flow.rb:412:24:412:28 | hash2 [element :f] | hash_flow.rb:412:40:412:48 | old_value | +| hash_flow.rb:412:24:412:28 | hash2 [element :f] | hash_flow.rb:412:51:412:59 | new_value | +| hash_flow.rb:412:40:412:48 | old_value | hash_flow.rb:414:14:414:22 | old_value | +| hash_flow.rb:412:51:412:59 | new_value | hash_flow.rb:415:14:415:22 | new_value | +| hash_flow.rb:417:11:417:14 | hash [element :a] | hash_flow.rb:417:11:417:18 | ...[...] | +| hash_flow.rb:417:11:417:18 | ...[...] | hash_flow.rb:417:10:417:19 | ( ... ) | +| hash_flow.rb:419:11:419:14 | hash [element :c] | hash_flow.rb:419:11:419:18 | ...[...] | +| hash_flow.rb:419:11:419:18 | ...[...] | hash_flow.rb:419:10:419:19 | ( ... ) | +| hash_flow.rb:420:11:420:14 | hash [element :d] | hash_flow.rb:420:11:420:18 | ...[...] | +| hash_flow.rb:420:11:420:18 | ...[...] | hash_flow.rb:420:10:420:19 | ( ... ) | +| hash_flow.rb:422:11:422:14 | hash [element :f] | hash_flow.rb:422:11:422:18 | ...[...] | +| hash_flow.rb:422:11:422:18 | ...[...] | hash_flow.rb:422:10:422:19 | ( ... ) | +| hash_flow.rb:428:5:428:9 | hash1 [element :a] | hash_flow.rb:438:12:438:16 | hash1 [element :a] | +| hash_flow.rb:428:5:428:9 | hash1 [element :c] | hash_flow.rb:438:12:438:16 | hash1 [element :c] | +| hash_flow.rb:429:15:429:25 | call to taint | hash_flow.rb:428:5:428:9 | hash1 [element :a] | +| hash_flow.rb:431:15:431:25 | call to taint | hash_flow.rb:428:5:428:9 | hash1 [element :c] | +| hash_flow.rb:433:5:433:9 | hash2 [element :d] | hash_flow.rb:438:25:438:29 | hash2 [element :d] | +| hash_flow.rb:433:5:433:9 | hash2 [element :f] | hash_flow.rb:438:25:438:29 | hash2 [element :f] | +| hash_flow.rb:434:15:434:25 | call to taint | hash_flow.rb:433:5:433:9 | hash2 [element :d] | +| hash_flow.rb:436:15:436:25 | call to taint | hash_flow.rb:433:5:433:9 | hash2 [element :f] | +| hash_flow.rb:438:5:438:8 | hash [element :a] | hash_flow.rb:443:11:443:14 | hash [element :a] | +| hash_flow.rb:438:5:438:8 | hash [element :c] | hash_flow.rb:445:11:445:14 | hash [element :c] | +| hash_flow.rb:438:5:438:8 | hash [element :d] | hash_flow.rb:446:11:446:14 | hash [element :d] | +| hash_flow.rb:438:5:438:8 | hash [element :f] | hash_flow.rb:448:11:448:14 | hash [element :f] | +| hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] | hash_flow.rb:450:11:450:15 | hash1 [element :a] | +| hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] | hash_flow.rb:452:11:452:15 | hash1 [element :c] | +| hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] | hash_flow.rb:453:11:453:15 | hash1 [element :d] | +| hash_flow.rb:438:12:438:16 | [post] hash1 [element :f] | hash_flow.rb:455:11:455:15 | hash1 [element :f] | +| hash_flow.rb:438:12:438:16 | hash1 [element :a] | hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] | +| hash_flow.rb:438:12:438:16 | hash1 [element :a] | hash_flow.rb:438:12:442:7 | call to merge! [element :a] | +| hash_flow.rb:438:12:438:16 | hash1 [element :a] | hash_flow.rb:438:41:438:49 | old_value | +| hash_flow.rb:438:12:438:16 | hash1 [element :a] | hash_flow.rb:438:52:438:60 | new_value | +| hash_flow.rb:438:12:438:16 | hash1 [element :c] | hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] | +| hash_flow.rb:438:12:438:16 | hash1 [element :c] | hash_flow.rb:438:12:442:7 | call to merge! [element :c] | +| hash_flow.rb:438:12:438:16 | hash1 [element :c] | hash_flow.rb:438:41:438:49 | old_value | +| hash_flow.rb:438:12:438:16 | hash1 [element :c] | hash_flow.rb:438:52:438:60 | new_value | +| hash_flow.rb:438:12:442:7 | call to merge! [element :a] | hash_flow.rb:438:5:438:8 | hash [element :a] | +| hash_flow.rb:438:12:442:7 | call to merge! [element :c] | hash_flow.rb:438:5:438:8 | hash [element :c] | +| hash_flow.rb:438:12:442:7 | call to merge! [element :d] | hash_flow.rb:438:5:438:8 | hash [element :d] | +| hash_flow.rb:438:12:442:7 | call to merge! [element :f] | hash_flow.rb:438:5:438:8 | hash [element :f] | +| hash_flow.rb:438:25:438:29 | hash2 [element :d] | hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] | +| hash_flow.rb:438:25:438:29 | hash2 [element :d] | hash_flow.rb:438:12:442:7 | call to merge! [element :d] | +| hash_flow.rb:438:25:438:29 | hash2 [element :d] | hash_flow.rb:438:41:438:49 | old_value | +| hash_flow.rb:438:25:438:29 | hash2 [element :d] | hash_flow.rb:438:52:438:60 | new_value | +| hash_flow.rb:438:25:438:29 | hash2 [element :f] | hash_flow.rb:438:12:438:16 | [post] hash1 [element :f] | +| hash_flow.rb:438:25:438:29 | hash2 [element :f] | hash_flow.rb:438:12:442:7 | call to merge! [element :f] | +| hash_flow.rb:438:25:438:29 | hash2 [element :f] | hash_flow.rb:438:41:438:49 | old_value | +| hash_flow.rb:438:25:438:29 | hash2 [element :f] | hash_flow.rb:438:52:438:60 | new_value | +| hash_flow.rb:438:41:438:49 | old_value | hash_flow.rb:440:14:440:22 | old_value | +| hash_flow.rb:438:52:438:60 | new_value | hash_flow.rb:441:14:441:22 | new_value | +| hash_flow.rb:443:11:443:14 | hash [element :a] | hash_flow.rb:443:11:443:18 | ...[...] | +| hash_flow.rb:443:11:443:18 | ...[...] | hash_flow.rb:443:10:443:19 | ( ... ) | +| hash_flow.rb:445:11:445:14 | hash [element :c] | hash_flow.rb:445:11:445:18 | ...[...] | +| hash_flow.rb:445:11:445:18 | ...[...] | hash_flow.rb:445:10:445:19 | ( ... ) | +| hash_flow.rb:446:11:446:14 | hash [element :d] | hash_flow.rb:446:11:446:18 | ...[...] | +| hash_flow.rb:446:11:446:18 | ...[...] | hash_flow.rb:446:10:446:19 | ( ... ) | +| hash_flow.rb:448:11:448:14 | hash [element :f] | hash_flow.rb:448:11:448:18 | ...[...] | +| hash_flow.rb:448:11:448:18 | ...[...] | hash_flow.rb:448:10:448:19 | ( ... ) | +| hash_flow.rb:450:11:450:15 | hash1 [element :a] | hash_flow.rb:450:11:450:19 | ...[...] | +| hash_flow.rb:450:11:450:19 | ...[...] | hash_flow.rb:450:10:450:20 | ( ... ) | +| hash_flow.rb:452:11:452:15 | hash1 [element :c] | hash_flow.rb:452:11:452:19 | ...[...] | +| hash_flow.rb:452:11:452:19 | ...[...] | hash_flow.rb:452:10:452:20 | ( ... ) | +| hash_flow.rb:453:11:453:15 | hash1 [element :d] | hash_flow.rb:453:11:453:19 | ...[...] | +| hash_flow.rb:453:11:453:19 | ...[...] | hash_flow.rb:453:10:453:20 | ( ... ) | +| hash_flow.rb:455:11:455:15 | hash1 [element :f] | hash_flow.rb:455:11:455:19 | ...[...] | +| hash_flow.rb:455:11:455:19 | ...[...] | hash_flow.rb:455:10:455:20 | ( ... ) | +| hash_flow.rb:461:5:461:8 | hash [element :a] | hash_flow.rb:465:9:465:12 | hash [element :a] | +| hash_flow.rb:462:15:462:25 | call to taint | hash_flow.rb:461:5:461:8 | hash [element :a] | +| hash_flow.rb:465:5:465:5 | b [element 1] | hash_flow.rb:467:10:467:10 | b [element 1] | +| hash_flow.rb:465:9:465:12 | hash [element :a] | hash_flow.rb:465:9:465:22 | call to rassoc [element 1] | +| hash_flow.rb:465:9:465:22 | call to rassoc [element 1] | hash_flow.rb:465:5:465:5 | b [element 1] | +| hash_flow.rb:467:10:467:10 | b [element 1] | hash_flow.rb:467:10:467:13 | ...[...] | +| hash_flow.rb:473:5:473:8 | hash [element :a] | hash_flow.rb:477:9:477:12 | hash [element :a] | +| hash_flow.rb:474:15:474:25 | call to taint | hash_flow.rb:473:5:473:8 | hash [element :a] | +| hash_flow.rb:477:5:477:5 | b [element :a] | hash_flow.rb:482:10:482:10 | b [element :a] | +| hash_flow.rb:477:9:477:12 | hash [element :a] | hash_flow.rb:477:9:481:7 | call to reject [element :a] | +| hash_flow.rb:477:9:477:12 | hash [element :a] | hash_flow.rb:477:29:477:33 | value | +| hash_flow.rb:477:9:481:7 | call to reject [element :a] | hash_flow.rb:477:5:477:5 | b [element :a] | +| hash_flow.rb:477:29:477:33 | value | hash_flow.rb:479:14:479:18 | value | +| hash_flow.rb:482:10:482:10 | b [element :a] | hash_flow.rb:482:10:482:14 | ...[...] | +| hash_flow.rb:488:5:488:8 | hash [element :a] | hash_flow.rb:492:9:492:12 | hash [element :a] | +| hash_flow.rb:489:15:489:25 | call to taint | hash_flow.rb:488:5:488:8 | hash [element :a] | +| hash_flow.rb:492:5:492:5 | b [element :a] | hash_flow.rb:497:10:497:10 | b [element :a] | +| hash_flow.rb:492:9:492:12 | [post] hash [element :a] | hash_flow.rb:498:10:498:13 | hash [element :a] | +| hash_flow.rb:492:9:492:12 | hash [element :a] | hash_flow.rb:492:9:492:12 | [post] hash [element :a] | +| hash_flow.rb:492:9:492:12 | hash [element :a] | hash_flow.rb:492:9:496:7 | call to reject! [element :a] | +| hash_flow.rb:492:9:492:12 | hash [element :a] | hash_flow.rb:492:30:492:34 | value | +| hash_flow.rb:492:9:496:7 | call to reject! [element :a] | hash_flow.rb:492:5:492:5 | b [element :a] | +| hash_flow.rb:492:30:492:34 | value | hash_flow.rb:494:14:494:18 | value | +| hash_flow.rb:497:10:497:10 | b [element :a] | hash_flow.rb:497:10:497:14 | ...[...] | +| hash_flow.rb:498:10:498:13 | hash [element :a] | hash_flow.rb:498:10:498:17 | ...[...] | +| hash_flow.rb:504:5:504:8 | hash [element :a] | hash_flow.rb:512:19:512:22 | hash [element :a] | +| hash_flow.rb:504:5:504:8 | hash [element :c] | hash_flow.rb:512:19:512:22 | hash [element :c] | +| hash_flow.rb:505:15:505:25 | call to taint | hash_flow.rb:504:5:504:8 | hash [element :a] | +| hash_flow.rb:507:15:507:25 | call to taint | hash_flow.rb:504:5:504:8 | hash [element :c] | +| hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] | hash_flow.rb:513:11:513:15 | hash2 [element :a] | +| hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] | hash_flow.rb:515:11:515:15 | hash2 [element :c] | +| hash_flow.rb:512:19:512:22 | hash [element :a] | hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] | +| hash_flow.rb:512:19:512:22 | hash [element :c] | hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] | +| hash_flow.rb:513:11:513:15 | hash2 [element :a] | hash_flow.rb:513:11:513:19 | ...[...] | +| hash_flow.rb:513:11:513:19 | ...[...] | hash_flow.rb:513:10:513:20 | ( ... ) | +| hash_flow.rb:515:11:515:15 | hash2 [element :c] | hash_flow.rb:515:11:515:19 | ...[...] | +| hash_flow.rb:515:11:515:19 | ...[...] | hash_flow.rb:515:10:515:20 | ( ... ) | +| hash_flow.rb:519:5:519:8 | hash [element :a] | hash_flow.rb:524:9:524:12 | hash [element :a] | +| hash_flow.rb:519:5:519:8 | hash [element :c] | hash_flow.rb:524:9:524:12 | hash [element :c] | +| hash_flow.rb:520:15:520:25 | call to taint | hash_flow.rb:519:5:519:8 | hash [element :a] | +| hash_flow.rb:522:15:522:25 | call to taint | hash_flow.rb:519:5:519:8 | hash [element :c] | +| hash_flow.rb:524:5:524:5 | b [element :a] | hash_flow.rb:529:11:529:11 | b [element :a] | +| hash_flow.rb:524:9:524:12 | hash [element :a] | hash_flow.rb:524:9:528:7 | call to select [element :a] | +| hash_flow.rb:524:9:524:12 | hash [element :a] | hash_flow.rb:524:30:524:34 | value | +| hash_flow.rb:524:9:524:12 | hash [element :c] | hash_flow.rb:524:30:524:34 | value | +| hash_flow.rb:524:9:528:7 | call to select [element :a] | hash_flow.rb:524:5:524:5 | b [element :a] | +| hash_flow.rb:524:30:524:34 | value | hash_flow.rb:526:14:526:18 | value | +| hash_flow.rb:529:11:529:11 | b [element :a] | hash_flow.rb:529:11:529:15 | ...[...] | +| hash_flow.rb:529:11:529:15 | ...[...] | hash_flow.rb:529:10:529:16 | ( ... ) | +| hash_flow.rb:535:5:535:8 | hash [element :a] | hash_flow.rb:540:5:540:8 | hash [element :a] | +| hash_flow.rb:535:5:535:8 | hash [element :c] | hash_flow.rb:540:5:540:8 | hash [element :c] | +| hash_flow.rb:536:15:536:25 | call to taint | hash_flow.rb:535:5:535:8 | hash [element :a] | +| hash_flow.rb:538:15:538:25 | call to taint | hash_flow.rb:535:5:535:8 | hash [element :c] | +| hash_flow.rb:540:5:540:8 | [post] hash [element :a] | hash_flow.rb:545:11:545:14 | hash [element :a] | +| hash_flow.rb:540:5:540:8 | hash [element :a] | hash_flow.rb:540:5:540:8 | [post] hash [element :a] | +| hash_flow.rb:540:5:540:8 | hash [element :a] | hash_flow.rb:540:27:540:31 | value | +| hash_flow.rb:540:5:540:8 | hash [element :c] | hash_flow.rb:540:27:540:31 | value | +| hash_flow.rb:540:27:540:31 | value | hash_flow.rb:542:14:542:18 | value | +| hash_flow.rb:545:11:545:14 | hash [element :a] | hash_flow.rb:545:11:545:18 | ...[...] | +| hash_flow.rb:545:11:545:18 | ...[...] | hash_flow.rb:545:10:545:19 | ( ... ) | +| hash_flow.rb:551:5:551:8 | hash [element :a] | hash_flow.rb:556:9:556:12 | hash [element :a] | +| hash_flow.rb:551:5:551:8 | hash [element :c] | hash_flow.rb:556:9:556:12 | hash [element :c] | +| hash_flow.rb:552:15:552:25 | call to taint | hash_flow.rb:551:5:551:8 | hash [element :a] | +| hash_flow.rb:554:15:554:25 | call to taint | hash_flow.rb:551:5:551:8 | hash [element :c] | +| hash_flow.rb:556:5:556:5 | b [element 1] | hash_flow.rb:559:11:559:11 | b [element 1] | +| hash_flow.rb:556:9:556:12 | [post] hash [element :a] | hash_flow.rb:557:11:557:14 | hash [element :a] | +| hash_flow.rb:556:9:556:12 | hash [element :a] | hash_flow.rb:556:9:556:12 | [post] hash [element :a] | +| hash_flow.rb:556:9:556:12 | hash [element :a] | hash_flow.rb:556:9:556:18 | call to shift [element 1] | +| hash_flow.rb:556:9:556:12 | hash [element :c] | hash_flow.rb:556:9:556:18 | call to shift [element 1] | +| hash_flow.rb:556:9:556:18 | call to shift [element 1] | hash_flow.rb:556:5:556:5 | b [element 1] | +| hash_flow.rb:557:11:557:14 | hash [element :a] | hash_flow.rb:557:11:557:18 | ...[...] | +| hash_flow.rb:557:11:557:18 | ...[...] | hash_flow.rb:557:10:557:19 | ( ... ) | +| hash_flow.rb:559:11:559:11 | b [element 1] | hash_flow.rb:559:11:559:14 | ...[...] | +| hash_flow.rb:559:11:559:14 | ...[...] | hash_flow.rb:559:10:559:15 | ( ... ) | +| hash_flow.rb:565:5:565:8 | hash [element :a] | hash_flow.rb:570:9:570:12 | hash [element :a] | +| hash_flow.rb:565:5:565:8 | hash [element :a] | hash_flow.rb:575:9:575:12 | hash [element :a] | +| hash_flow.rb:565:5:565:8 | hash [element :c] | hash_flow.rb:575:9:575:12 | hash [element :c] | +| hash_flow.rb:566:15:566:25 | call to taint | hash_flow.rb:565:5:565:8 | hash [element :a] | +| hash_flow.rb:568:15:568:25 | call to taint | hash_flow.rb:565:5:565:8 | hash [element :c] | +| hash_flow.rb:570:5:570:5 | b [element :a] | hash_flow.rb:571:11:571:11 | b [element :a] | +| hash_flow.rb:570:9:570:12 | hash [element :a] | hash_flow.rb:570:9:570:26 | call to slice [element :a] | +| hash_flow.rb:570:9:570:26 | call to slice [element :a] | hash_flow.rb:570:5:570:5 | b [element :a] | +| hash_flow.rb:571:11:571:11 | b [element :a] | hash_flow.rb:571:11:571:15 | ...[...] | +| hash_flow.rb:571:11:571:15 | ...[...] | hash_flow.rb:571:10:571:16 | ( ... ) | +| hash_flow.rb:575:5:575:5 | c [element :a] | hash_flow.rb:576:11:576:11 | c [element :a] | +| hash_flow.rb:575:5:575:5 | c [element :c] | hash_flow.rb:578:11:578:11 | c [element :c] | +| hash_flow.rb:575:9:575:12 | hash [element :a] | hash_flow.rb:575:9:575:25 | call to slice [element :a] | +| hash_flow.rb:575:9:575:12 | hash [element :c] | hash_flow.rb:575:9:575:25 | call to slice [element :c] | +| hash_flow.rb:575:9:575:25 | call to slice [element :a] | hash_flow.rb:575:5:575:5 | c [element :a] | +| hash_flow.rb:575:9:575:25 | call to slice [element :c] | hash_flow.rb:575:5:575:5 | c [element :c] | +| hash_flow.rb:576:11:576:11 | c [element :a] | hash_flow.rb:576:11:576:15 | ...[...] | +| hash_flow.rb:576:11:576:15 | ...[...] | hash_flow.rb:576:10:576:16 | ( ... ) | +| hash_flow.rb:578:11:578:11 | c [element :c] | hash_flow.rb:578:11:578:15 | ...[...] | +| hash_flow.rb:578:11:578:15 | ...[...] | hash_flow.rb:578:10:578:16 | ( ... ) | +| hash_flow.rb:584:5:584:8 | hash [element :a] | hash_flow.rb:589:9:589:12 | hash [element :a] | +| hash_flow.rb:584:5:584:8 | hash [element :c] | hash_flow.rb:589:9:589:12 | hash [element :c] | +| hash_flow.rb:585:15:585:25 | call to taint | hash_flow.rb:584:5:584:8 | hash [element :a] | +| hash_flow.rb:587:15:587:25 | call to taint | hash_flow.rb:584:5:584:8 | hash [element :c] | +| hash_flow.rb:589:5:589:5 | a [element, element 1] | hash_flow.rb:591:11:591:11 | a [element, element 1] | +| hash_flow.rb:589:9:589:12 | hash [element :a] | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] | +| hash_flow.rb:589:9:589:12 | hash [element :c] | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] | +| hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] | hash_flow.rb:589:5:589:5 | a [element, element 1] | +| hash_flow.rb:591:11:591:11 | a [element, element 1] | hash_flow.rb:591:11:591:14 | ...[...] [element 1] | +| hash_flow.rb:591:11:591:14 | ...[...] [element 1] | hash_flow.rb:591:11:591:17 | ...[...] | +| hash_flow.rb:591:11:591:17 | ...[...] | hash_flow.rb:591:10:591:18 | ( ... ) | +| hash_flow.rb:597:5:597:8 | hash [element :a] | hash_flow.rb:602:9:602:12 | hash [element :a] | +| hash_flow.rb:597:5:597:8 | hash [element :a] | hash_flow.rb:607:9:607:12 | hash [element :a] | +| hash_flow.rb:597:5:597:8 | hash [element :c] | hash_flow.rb:602:9:602:12 | hash [element :c] | +| hash_flow.rb:597:5:597:8 | hash [element :c] | hash_flow.rb:607:9:607:12 | hash [element :c] | +| hash_flow.rb:598:15:598:25 | call to taint | hash_flow.rb:597:5:597:8 | hash [element :a] | +| hash_flow.rb:600:15:600:25 | call to taint | hash_flow.rb:597:5:597:8 | hash [element :c] | +| hash_flow.rb:602:5:602:5 | a [element :a] | hash_flow.rb:603:11:603:11 | a [element :a] | +| hash_flow.rb:602:5:602:5 | a [element :c] | hash_flow.rb:605:11:605:11 | a [element :c] | +| hash_flow.rb:602:9:602:12 | hash [element :a] | hash_flow.rb:602:9:602:17 | call to to_h [element :a] | +| hash_flow.rb:602:9:602:12 | hash [element :c] | hash_flow.rb:602:9:602:17 | call to to_h [element :c] | +| hash_flow.rb:602:9:602:17 | call to to_h [element :a] | hash_flow.rb:602:5:602:5 | a [element :a] | +| hash_flow.rb:602:9:602:17 | call to to_h [element :c] | hash_flow.rb:602:5:602:5 | a [element :c] | +| hash_flow.rb:603:11:603:11 | a [element :a] | hash_flow.rb:603:11:603:15 | ...[...] | +| hash_flow.rb:603:11:603:15 | ...[...] | hash_flow.rb:603:10:603:16 | ( ... ) | +| hash_flow.rb:605:11:605:11 | a [element :c] | hash_flow.rb:605:11:605:15 | ...[...] | +| hash_flow.rb:605:11:605:15 | ...[...] | hash_flow.rb:605:10:605:16 | ( ... ) | +| hash_flow.rb:607:5:607:5 | b [element] | hash_flow.rb:612:11:612:11 | b [element] | +| hash_flow.rb:607:9:607:12 | hash [element :a] | hash_flow.rb:607:28:607:32 | value | +| hash_flow.rb:607:9:607:12 | hash [element :c] | hash_flow.rb:607:28:607:32 | value | +| hash_flow.rb:607:9:611:7 | call to to_h [element] | hash_flow.rb:607:5:607:5 | b [element] | +| hash_flow.rb:607:28:607:32 | value | hash_flow.rb:609:14:609:18 | value | +| hash_flow.rb:610:14:610:24 | call to taint | hash_flow.rb:607:9:611:7 | call to to_h [element] | +| hash_flow.rb:612:11:612:11 | b [element] | hash_flow.rb:612:11:612:15 | ...[...] | +| hash_flow.rb:612:11:612:15 | ...[...] | hash_flow.rb:612:10:612:16 | ( ... ) | +| hash_flow.rb:618:5:618:8 | hash [element :a] | hash_flow.rb:623:9:623:12 | hash [element :a] | +| hash_flow.rb:618:5:618:8 | hash [element :c] | hash_flow.rb:623:9:623:12 | hash [element :c] | +| hash_flow.rb:619:15:619:25 | call to taint | hash_flow.rb:618:5:618:8 | hash [element :a] | +| hash_flow.rb:621:15:621:25 | call to taint | hash_flow.rb:618:5:618:8 | hash [element :c] | +| hash_flow.rb:623:5:623:5 | a [element] | hash_flow.rb:624:11:624:11 | a [element] | +| hash_flow.rb:623:5:623:5 | a [element] | hash_flow.rb:625:11:625:11 | a [element] | +| hash_flow.rb:623:5:623:5 | a [element] | hash_flow.rb:626:11:626:11 | a [element] | +| hash_flow.rb:623:9:623:12 | hash [element :a] | hash_flow.rb:623:9:623:45 | call to transform_keys [element] | +| hash_flow.rb:623:9:623:12 | hash [element :c] | hash_flow.rb:623:9:623:45 | call to transform_keys [element] | +| hash_flow.rb:623:9:623:45 | call to transform_keys [element] | hash_flow.rb:623:5:623:5 | a [element] | +| hash_flow.rb:624:11:624:11 | a [element] | hash_flow.rb:624:11:624:16 | ...[...] | +| hash_flow.rb:624:11:624:16 | ...[...] | hash_flow.rb:624:10:624:17 | ( ... ) | +| hash_flow.rb:625:11:625:11 | a [element] | hash_flow.rb:625:11:625:16 | ...[...] | +| hash_flow.rb:625:11:625:16 | ...[...] | hash_flow.rb:625:10:625:17 | ( ... ) | +| hash_flow.rb:626:11:626:11 | a [element] | hash_flow.rb:626:11:626:16 | ...[...] | +| hash_flow.rb:626:11:626:16 | ...[...] | hash_flow.rb:626:10:626:17 | ( ... ) | +| hash_flow.rb:632:5:632:8 | hash [element :a] | hash_flow.rb:639:5:639:8 | hash [element :a] | +| hash_flow.rb:632:5:632:8 | hash [element :c] | hash_flow.rb:639:5:639:8 | hash [element :c] | +| hash_flow.rb:633:15:633:25 | call to taint | hash_flow.rb:632:5:632:8 | hash [element :a] | +| hash_flow.rb:635:15:635:25 | call to taint | hash_flow.rb:632:5:632:8 | hash [element :c] | +| hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:639:5:639:8 | hash [element] | +| hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:640:11:640:14 | hash [element] | +| hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:641:11:641:14 | hash [element] | +| hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:642:11:642:14 | hash [element] | +| hash_flow.rb:637:15:637:25 | call to taint | hash_flow.rb:637:5:637:8 | [post] hash [element] | +| hash_flow.rb:639:5:639:8 | [post] hash [element] | hash_flow.rb:640:11:640:14 | hash [element] | +| hash_flow.rb:639:5:639:8 | [post] hash [element] | hash_flow.rb:641:11:641:14 | hash [element] | +| hash_flow.rb:639:5:639:8 | [post] hash [element] | hash_flow.rb:642:11:642:14 | hash [element] | +| hash_flow.rb:639:5:639:8 | hash [element :a] | hash_flow.rb:639:5:639:8 | [post] hash [element] | +| hash_flow.rb:639:5:639:8 | hash [element :c] | hash_flow.rb:639:5:639:8 | [post] hash [element] | +| hash_flow.rb:639:5:639:8 | hash [element] | hash_flow.rb:639:5:639:8 | [post] hash [element] | +| hash_flow.rb:640:11:640:14 | hash [element] | hash_flow.rb:640:11:640:19 | ...[...] | +| hash_flow.rb:640:11:640:19 | ...[...] | hash_flow.rb:640:10:640:20 | ( ... ) | +| hash_flow.rb:641:11:641:14 | hash [element] | hash_flow.rb:641:11:641:19 | ...[...] | +| hash_flow.rb:641:11:641:19 | ...[...] | hash_flow.rb:641:10:641:20 | ( ... ) | +| hash_flow.rb:642:11:642:14 | hash [element] | hash_flow.rb:642:11:642:19 | ...[...] | +| hash_flow.rb:642:11:642:19 | ...[...] | hash_flow.rb:642:10:642:20 | ( ... ) | +| hash_flow.rb:648:5:648:8 | hash [element :a] | hash_flow.rb:653:9:653:12 | hash [element :a] | +| hash_flow.rb:648:5:648:8 | hash [element :a] | hash_flow.rb:657:11:657:14 | hash [element :a] | +| hash_flow.rb:648:5:648:8 | hash [element :c] | hash_flow.rb:653:9:653:12 | hash [element :c] | +| hash_flow.rb:649:15:649:25 | call to taint | hash_flow.rb:648:5:648:8 | hash [element :a] | +| hash_flow.rb:651:15:651:25 | call to taint | hash_flow.rb:648:5:648:8 | hash [element :c] | +| hash_flow.rb:653:5:653:5 | b [element] | hash_flow.rb:658:11:658:11 | b [element] | +| hash_flow.rb:653:9:653:12 | hash [element :a] | hash_flow.rb:653:35:653:39 | value | +| hash_flow.rb:653:9:653:12 | hash [element :c] | hash_flow.rb:653:35:653:39 | value | +| hash_flow.rb:653:9:656:7 | call to transform_values [element] | hash_flow.rb:653:5:653:5 | b [element] | +| hash_flow.rb:653:35:653:39 | value | hash_flow.rb:654:14:654:18 | value | +| hash_flow.rb:655:9:655:19 | call to taint | hash_flow.rb:653:9:656:7 | call to transform_values [element] | +| hash_flow.rb:657:11:657:14 | hash [element :a] | hash_flow.rb:657:11:657:18 | ...[...] | +| hash_flow.rb:657:11:657:18 | ...[...] | hash_flow.rb:657:10:657:19 | ( ... ) | +| hash_flow.rb:658:11:658:11 | b [element] | hash_flow.rb:658:11:658:15 | ...[...] | +| hash_flow.rb:658:11:658:15 | ...[...] | hash_flow.rb:658:10:658:16 | ( ... ) | +| hash_flow.rb:664:5:664:8 | hash [element :a] | hash_flow.rb:669:5:669:8 | hash [element :a] | +| hash_flow.rb:664:5:664:8 | hash [element :c] | hash_flow.rb:669:5:669:8 | hash [element :c] | +| hash_flow.rb:665:15:665:25 | call to taint | hash_flow.rb:664:5:664:8 | hash [element :a] | +| hash_flow.rb:667:15:667:25 | call to taint | hash_flow.rb:664:5:664:8 | hash [element :c] | +| hash_flow.rb:669:5:669:8 | [post] hash [element] | hash_flow.rb:673:11:673:14 | hash [element] | +| hash_flow.rb:669:5:669:8 | hash [element :a] | hash_flow.rb:669:32:669:36 | value | +| hash_flow.rb:669:5:669:8 | hash [element :c] | hash_flow.rb:669:32:669:36 | value | +| hash_flow.rb:669:32:669:36 | value | hash_flow.rb:670:14:670:18 | value | +| hash_flow.rb:671:9:671:19 | call to taint | hash_flow.rb:669:5:669:8 | [post] hash [element] | +| hash_flow.rb:673:11:673:14 | hash [element] | hash_flow.rb:673:11:673:18 | ...[...] | +| hash_flow.rb:673:11:673:18 | ...[...] | hash_flow.rb:673:10:673:19 | ( ... ) | +| hash_flow.rb:679:5:679:9 | hash1 [element :a] | hash_flow.rb:689:12:689:16 | hash1 [element :a] | +| hash_flow.rb:679:5:679:9 | hash1 [element :c] | hash_flow.rb:689:12:689:16 | hash1 [element :c] | +| hash_flow.rb:680:15:680:25 | call to taint | hash_flow.rb:679:5:679:9 | hash1 [element :a] | +| hash_flow.rb:682:15:682:25 | call to taint | hash_flow.rb:679:5:679:9 | hash1 [element :c] | +| hash_flow.rb:684:5:684:9 | hash2 [element :d] | hash_flow.rb:689:25:689:29 | hash2 [element :d] | +| hash_flow.rb:684:5:684:9 | hash2 [element :f] | hash_flow.rb:689:25:689:29 | hash2 [element :f] | +| hash_flow.rb:685:15:685:25 | call to taint | hash_flow.rb:684:5:684:9 | hash2 [element :d] | +| hash_flow.rb:687:15:687:25 | call to taint | hash_flow.rb:684:5:684:9 | hash2 [element :f] | +| hash_flow.rb:689:5:689:8 | hash [element :a] | hash_flow.rb:694:11:694:14 | hash [element :a] | +| hash_flow.rb:689:5:689:8 | hash [element :c] | hash_flow.rb:696:11:696:14 | hash [element :c] | +| hash_flow.rb:689:5:689:8 | hash [element :d] | hash_flow.rb:697:11:697:14 | hash [element :d] | +| hash_flow.rb:689:5:689:8 | hash [element :f] | hash_flow.rb:699:11:699:14 | hash [element :f] | +| hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] | hash_flow.rb:701:11:701:15 | hash1 [element :a] | +| hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] | hash_flow.rb:703:11:703:15 | hash1 [element :c] | +| hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] | hash_flow.rb:704:11:704:15 | hash1 [element :d] | +| hash_flow.rb:689:12:689:16 | [post] hash1 [element :f] | hash_flow.rb:706:11:706:15 | hash1 [element :f] | +| hash_flow.rb:689:12:689:16 | hash1 [element :a] | hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] | +| hash_flow.rb:689:12:689:16 | hash1 [element :a] | hash_flow.rb:689:12:693:7 | call to update [element :a] | +| hash_flow.rb:689:12:689:16 | hash1 [element :a] | hash_flow.rb:689:41:689:49 | old_value | +| hash_flow.rb:689:12:689:16 | hash1 [element :a] | hash_flow.rb:689:52:689:60 | new_value | +| hash_flow.rb:689:12:689:16 | hash1 [element :c] | hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] | +| hash_flow.rb:689:12:689:16 | hash1 [element :c] | hash_flow.rb:689:12:693:7 | call to update [element :c] | +| hash_flow.rb:689:12:689:16 | hash1 [element :c] | hash_flow.rb:689:41:689:49 | old_value | +| hash_flow.rb:689:12:689:16 | hash1 [element :c] | hash_flow.rb:689:52:689:60 | new_value | +| hash_flow.rb:689:12:693:7 | call to update [element :a] | hash_flow.rb:689:5:689:8 | hash [element :a] | +| hash_flow.rb:689:12:693:7 | call to update [element :c] | hash_flow.rb:689:5:689:8 | hash [element :c] | +| hash_flow.rb:689:12:693:7 | call to update [element :d] | hash_flow.rb:689:5:689:8 | hash [element :d] | +| hash_flow.rb:689:12:693:7 | call to update [element :f] | hash_flow.rb:689:5:689:8 | hash [element :f] | +| hash_flow.rb:689:25:689:29 | hash2 [element :d] | hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] | +| hash_flow.rb:689:25:689:29 | hash2 [element :d] | hash_flow.rb:689:12:693:7 | call to update [element :d] | +| hash_flow.rb:689:25:689:29 | hash2 [element :d] | hash_flow.rb:689:41:689:49 | old_value | +| hash_flow.rb:689:25:689:29 | hash2 [element :d] | hash_flow.rb:689:52:689:60 | new_value | +| hash_flow.rb:689:25:689:29 | hash2 [element :f] | hash_flow.rb:689:12:689:16 | [post] hash1 [element :f] | +| hash_flow.rb:689:25:689:29 | hash2 [element :f] | hash_flow.rb:689:12:693:7 | call to update [element :f] | +| hash_flow.rb:689:25:689:29 | hash2 [element :f] | hash_flow.rb:689:41:689:49 | old_value | +| hash_flow.rb:689:25:689:29 | hash2 [element :f] | hash_flow.rb:689:52:689:60 | new_value | +| hash_flow.rb:689:41:689:49 | old_value | hash_flow.rb:691:14:691:22 | old_value | +| hash_flow.rb:689:52:689:60 | new_value | hash_flow.rb:692:14:692:22 | new_value | +| hash_flow.rb:694:11:694:14 | hash [element :a] | hash_flow.rb:694:11:694:18 | ...[...] | +| hash_flow.rb:694:11:694:18 | ...[...] | hash_flow.rb:694:10:694:19 | ( ... ) | +| hash_flow.rb:696:11:696:14 | hash [element :c] | hash_flow.rb:696:11:696:18 | ...[...] | +| hash_flow.rb:696:11:696:18 | ...[...] | hash_flow.rb:696:10:696:19 | ( ... ) | +| hash_flow.rb:697:11:697:14 | hash [element :d] | hash_flow.rb:697:11:697:18 | ...[...] | +| hash_flow.rb:697:11:697:18 | ...[...] | hash_flow.rb:697:10:697:19 | ( ... ) | +| hash_flow.rb:699:11:699:14 | hash [element :f] | hash_flow.rb:699:11:699:18 | ...[...] | +| hash_flow.rb:699:11:699:18 | ...[...] | hash_flow.rb:699:10:699:19 | ( ... ) | +| hash_flow.rb:701:11:701:15 | hash1 [element :a] | hash_flow.rb:701:11:701:19 | ...[...] | +| hash_flow.rb:701:11:701:19 | ...[...] | hash_flow.rb:701:10:701:20 | ( ... ) | +| hash_flow.rb:703:11:703:15 | hash1 [element :c] | hash_flow.rb:703:11:703:19 | ...[...] | +| hash_flow.rb:703:11:703:19 | ...[...] | hash_flow.rb:703:10:703:20 | ( ... ) | +| hash_flow.rb:704:11:704:15 | hash1 [element :d] | hash_flow.rb:704:11:704:19 | ...[...] | +| hash_flow.rb:704:11:704:19 | ...[...] | hash_flow.rb:704:10:704:20 | ( ... ) | +| hash_flow.rb:706:11:706:15 | hash1 [element :f] | hash_flow.rb:706:11:706:19 | ...[...] | +| hash_flow.rb:706:11:706:19 | ...[...] | hash_flow.rb:706:10:706:20 | ( ... ) | +| hash_flow.rb:712:5:712:8 | hash [element :a] | hash_flow.rb:717:9:717:12 | hash [element :a] | +| hash_flow.rb:712:5:712:8 | hash [element :c] | hash_flow.rb:717:9:717:12 | hash [element :c] | +| hash_flow.rb:713:15:713:25 | call to taint | hash_flow.rb:712:5:712:8 | hash [element :a] | +| hash_flow.rb:715:15:715:25 | call to taint | hash_flow.rb:712:5:712:8 | hash [element :c] | +| hash_flow.rb:717:5:717:5 | a [element] | hash_flow.rb:718:11:718:11 | a [element] | +| hash_flow.rb:717:9:717:12 | hash [element :a] | hash_flow.rb:717:9:717:19 | call to values [element] | +| hash_flow.rb:717:9:717:12 | hash [element :c] | hash_flow.rb:717:9:717:19 | call to values [element] | +| hash_flow.rb:717:9:717:19 | call to values [element] | hash_flow.rb:717:5:717:5 | a [element] | +| hash_flow.rb:718:11:718:11 | a [element] | hash_flow.rb:718:11:718:14 | ...[...] | +| hash_flow.rb:718:11:718:14 | ...[...] | hash_flow.rb:718:10:718:15 | ( ... ) | +| hash_flow.rb:724:5:724:8 | hash [element :a] | hash_flow.rb:729:9:729:12 | hash [element :a] | +| hash_flow.rb:724:5:724:8 | hash [element :a] | hash_flow.rb:731:9:731:12 | hash [element :a] | +| hash_flow.rb:724:5:724:8 | hash [element :c] | hash_flow.rb:731:9:731:12 | hash [element :c] | +| hash_flow.rb:725:15:725:25 | call to taint | hash_flow.rb:724:5:724:8 | hash [element :a] | +| hash_flow.rb:727:15:727:25 | call to taint | hash_flow.rb:724:5:724:8 | hash [element :c] | +| hash_flow.rb:729:5:729:5 | b [element 0] | hash_flow.rb:730:10:730:10 | b [element 0] | +| hash_flow.rb:729:9:729:12 | hash [element :a] | hash_flow.rb:729:9:729:26 | call to values_at [element 0] | +| hash_flow.rb:729:9:729:26 | call to values_at [element 0] | hash_flow.rb:729:5:729:5 | b [element 0] | +| hash_flow.rb:730:10:730:10 | b [element 0] | hash_flow.rb:730:10:730:13 | ...[...] | +| hash_flow.rb:731:5:731:5 | b [element] | hash_flow.rb:732:10:732:10 | b [element] | +| hash_flow.rb:731:9:731:12 | hash [element :a] | hash_flow.rb:731:9:731:31 | call to fetch_values [element] | +| hash_flow.rb:731:9:731:12 | hash [element :c] | hash_flow.rb:731:9:731:31 | call to fetch_values [element] | +| hash_flow.rb:731:9:731:31 | call to fetch_values [element] | hash_flow.rb:731:5:731:5 | b [element] | +| hash_flow.rb:732:10:732:10 | b [element] | hash_flow.rb:732:10:732:13 | ...[...] | +| hash_flow.rb:738:5:738:9 | hash1 [element :a] | hash_flow.rb:748:16:748:20 | hash1 [element :a] | +| hash_flow.rb:738:5:738:9 | hash1 [element :c] | hash_flow.rb:748:16:748:20 | hash1 [element :c] | +| hash_flow.rb:739:15:739:25 | call to taint | hash_flow.rb:738:5:738:9 | hash1 [element :a] | +| hash_flow.rb:741:15:741:25 | call to taint | hash_flow.rb:738:5:738:9 | hash1 [element :c] | +| hash_flow.rb:743:5:743:9 | hash2 [element :d] | hash_flow.rb:748:44:748:48 | hash2 [element :d] | +| hash_flow.rb:743:5:743:9 | hash2 [element :f] | hash_flow.rb:748:44:748:48 | hash2 [element :f] | +| hash_flow.rb:744:15:744:25 | call to taint | hash_flow.rb:743:5:743:9 | hash2 [element :d] | +| hash_flow.rb:746:15:746:25 | call to taint | hash_flow.rb:743:5:743:9 | hash2 [element :f] | +| hash_flow.rb:748:5:748:8 | hash [element :a] | hash_flow.rb:749:10:749:13 | hash [element :a] | +| hash_flow.rb:748:5:748:8 | hash [element :c] | hash_flow.rb:751:10:751:13 | hash [element :c] | +| hash_flow.rb:748:5:748:8 | hash [element :d] | hash_flow.rb:752:10:752:13 | hash [element :d] | +| hash_flow.rb:748:5:748:8 | hash [element :f] | hash_flow.rb:754:10:754:13 | hash [element :f] | +| hash_flow.rb:748:5:748:8 | hash [element :g] | hash_flow.rb:755:10:755:13 | hash [element :g] | +| hash_flow.rb:748:14:748:20 | ** ... [element :a] | hash_flow.rb:748:5:748:8 | hash [element :a] | +| hash_flow.rb:748:14:748:20 | ** ... [element :c] | hash_flow.rb:748:5:748:8 | hash [element :c] | +| hash_flow.rb:748:16:748:20 | hash1 [element :a] | hash_flow.rb:748:14:748:20 | ** ... [element :a] | +| hash_flow.rb:748:16:748:20 | hash1 [element :c] | hash_flow.rb:748:14:748:20 | ** ... [element :c] | +| hash_flow.rb:748:29:748:39 | call to taint | hash_flow.rb:748:5:748:8 | hash [element :g] | +| hash_flow.rb:748:42:748:48 | ** ... [element :d] | hash_flow.rb:748:5:748:8 | hash [element :d] | +| hash_flow.rb:748:42:748:48 | ** ... [element :f] | hash_flow.rb:748:5:748:8 | hash [element :f] | +| hash_flow.rb:748:44:748:48 | hash2 [element :d] | hash_flow.rb:748:42:748:48 | ** ... [element :d] | +| hash_flow.rb:748:44:748:48 | hash2 [element :f] | hash_flow.rb:748:42:748:48 | ** ... [element :f] | +| hash_flow.rb:749:10:749:13 | hash [element :a] | hash_flow.rb:749:10:749:17 | ...[...] | +| hash_flow.rb:751:10:751:13 | hash [element :c] | hash_flow.rb:751:10:751:17 | ...[...] | +| hash_flow.rb:752:10:752:13 | hash [element :d] | hash_flow.rb:752:10:752:17 | ...[...] | +| hash_flow.rb:754:10:754:13 | hash [element :f] | hash_flow.rb:754:10:754:17 | ...[...] | +| hash_flow.rb:755:10:755:13 | hash [element :g] | hash_flow.rb:755:10:755:17 | ...[...] | +| hash_flow.rb:762:5:762:8 | hash [element :a] | hash_flow.rb:769:10:769:13 | hash [element :a] | +| hash_flow.rb:762:5:762:8 | hash [element :c] | hash_flow.rb:771:10:771:13 | hash [element :c] | +| hash_flow.rb:762:5:762:8 | hash [element :c] | hash_flow.rb:774:9:774:12 | hash [element :c] | +| hash_flow.rb:762:5:762:8 | hash [element :d] | hash_flow.rb:772:10:772:13 | hash [element :d] | +| hash_flow.rb:763:15:763:25 | call to taint | hash_flow.rb:762:5:762:8 | hash [element :a] | +| hash_flow.rb:765:15:765:25 | call to taint | hash_flow.rb:762:5:762:8 | hash [element :c] | +| hash_flow.rb:766:15:766:25 | call to taint | hash_flow.rb:762:5:762:8 | hash [element :d] | +| hash_flow.rb:769:10:769:13 | hash [element :a] | hash_flow.rb:769:10:769:17 | ...[...] | +| hash_flow.rb:771:10:771:13 | hash [element :c] | hash_flow.rb:771:10:771:17 | ...[...] | +| hash_flow.rb:772:10:772:13 | hash [element :d] | hash_flow.rb:772:10:772:17 | ...[...] | +| hash_flow.rb:774:5:774:5 | x [element :c] | hash_flow.rb:778:10:778:10 | x [element :c] | +| hash_flow.rb:774:9:774:12 | [post] hash [element :c] | hash_flow.rb:783:10:783:13 | hash [element :c] | +| hash_flow.rb:774:9:774:12 | hash [element :c] | hash_flow.rb:774:9:774:12 | [post] hash [element :c] | +| hash_flow.rb:774:9:774:12 | hash [element :c] | hash_flow.rb:774:9:774:31 | call to except! [element :c] | +| hash_flow.rb:774:9:774:31 | call to except! [element :c] | hash_flow.rb:774:5:774:5 | x [element :c] | +| hash_flow.rb:778:10:778:10 | x [element :c] | hash_flow.rb:778:10:778:14 | ...[...] | +| hash_flow.rb:783:10:783:13 | hash [element :c] | hash_flow.rb:783:10:783:17 | ...[...] | +| hash_flow.rb:790:5:790:9 | hash1 [element :a] | hash_flow.rb:800:12:800:16 | hash1 [element :a] | +| hash_flow.rb:790:5:790:9 | hash1 [element :c] | hash_flow.rb:800:12:800:16 | hash1 [element :c] | +| hash_flow.rb:791:15:791:25 | call to taint | hash_flow.rb:790:5:790:9 | hash1 [element :a] | +| hash_flow.rb:793:15:793:25 | call to taint | hash_flow.rb:790:5:790:9 | hash1 [element :c] | +| hash_flow.rb:795:5:795:9 | hash2 [element :d] | hash_flow.rb:800:29:800:33 | hash2 [element :d] | +| hash_flow.rb:795:5:795:9 | hash2 [element :f] | hash_flow.rb:800:29:800:33 | hash2 [element :f] | +| hash_flow.rb:796:15:796:25 | call to taint | hash_flow.rb:795:5:795:9 | hash2 [element :d] | +| hash_flow.rb:798:15:798:25 | call to taint | hash_flow.rb:795:5:795:9 | hash2 [element :f] | +| hash_flow.rb:800:5:800:8 | hash [element :a] | hash_flow.rb:805:11:805:14 | hash [element :a] | +| hash_flow.rb:800:5:800:8 | hash [element :c] | hash_flow.rb:807:11:807:14 | hash [element :c] | +| hash_flow.rb:800:5:800:8 | hash [element :d] | hash_flow.rb:808:11:808:14 | hash [element :d] | +| hash_flow.rb:800:5:800:8 | hash [element :f] | hash_flow.rb:810:11:810:14 | hash [element :f] | +| hash_flow.rb:800:12:800:16 | hash1 [element :a] | hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] | +| hash_flow.rb:800:12:800:16 | hash1 [element :a] | hash_flow.rb:800:45:800:53 | old_value | +| hash_flow.rb:800:12:800:16 | hash1 [element :a] | hash_flow.rb:800:56:800:64 | new_value | +| hash_flow.rb:800:12:800:16 | hash1 [element :c] | hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] | +| hash_flow.rb:800:12:800:16 | hash1 [element :c] | hash_flow.rb:800:45:800:53 | old_value | +| hash_flow.rb:800:12:800:16 | hash1 [element :c] | hash_flow.rb:800:56:800:64 | new_value | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] | hash_flow.rb:800:5:800:8 | hash [element :a] | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] | hash_flow.rb:800:5:800:8 | hash [element :c] | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] | hash_flow.rb:800:5:800:8 | hash [element :d] | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] | hash_flow.rb:800:5:800:8 | hash [element :f] | +| hash_flow.rb:800:29:800:33 | hash2 [element :d] | hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] | +| hash_flow.rb:800:29:800:33 | hash2 [element :d] | hash_flow.rb:800:45:800:53 | old_value | +| hash_flow.rb:800:29:800:33 | hash2 [element :d] | hash_flow.rb:800:56:800:64 | new_value | +| hash_flow.rb:800:29:800:33 | hash2 [element :f] | hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] | +| hash_flow.rb:800:29:800:33 | hash2 [element :f] | hash_flow.rb:800:45:800:53 | old_value | +| hash_flow.rb:800:29:800:33 | hash2 [element :f] | hash_flow.rb:800:56:800:64 | new_value | +| hash_flow.rb:800:45:800:53 | old_value | hash_flow.rb:802:14:802:22 | old_value | +| hash_flow.rb:800:56:800:64 | new_value | hash_flow.rb:803:14:803:22 | new_value | +| hash_flow.rb:805:11:805:14 | hash [element :a] | hash_flow.rb:805:11:805:18 | ...[...] | +| hash_flow.rb:805:11:805:18 | ...[...] | hash_flow.rb:805:10:805:19 | ( ... ) | +| hash_flow.rb:807:11:807:14 | hash [element :c] | hash_flow.rb:807:11:807:18 | ...[...] | +| hash_flow.rb:807:11:807:18 | ...[...] | hash_flow.rb:807:10:807:19 | ( ... ) | +| hash_flow.rb:808:11:808:14 | hash [element :d] | hash_flow.rb:808:11:808:18 | ...[...] | +| hash_flow.rb:808:11:808:18 | ...[...] | hash_flow.rb:808:10:808:19 | ( ... ) | +| hash_flow.rb:810:11:810:14 | hash [element :f] | hash_flow.rb:810:11:810:18 | ...[...] | +| hash_flow.rb:810:11:810:18 | ...[...] | hash_flow.rb:810:10:810:19 | ( ... ) | +| hash_flow.rb:816:5:816:9 | hash1 [element :a] | hash_flow.rb:826:12:826:16 | hash1 [element :a] | +| hash_flow.rb:816:5:816:9 | hash1 [element :c] | hash_flow.rb:826:12:826:16 | hash1 [element :c] | +| hash_flow.rb:817:15:817:25 | call to taint | hash_flow.rb:816:5:816:9 | hash1 [element :a] | +| hash_flow.rb:819:15:819:25 | call to taint | hash_flow.rb:816:5:816:9 | hash1 [element :c] | +| hash_flow.rb:821:5:821:9 | hash2 [element :d] | hash_flow.rb:826:30:826:34 | hash2 [element :d] | +| hash_flow.rb:821:5:821:9 | hash2 [element :f] | hash_flow.rb:826:30:826:34 | hash2 [element :f] | +| hash_flow.rb:822:15:822:25 | call to taint | hash_flow.rb:821:5:821:9 | hash2 [element :d] | +| hash_flow.rb:824:15:824:25 | call to taint | hash_flow.rb:821:5:821:9 | hash2 [element :f] | +| hash_flow.rb:826:5:826:8 | hash [element :a] | hash_flow.rb:831:11:831:14 | hash [element :a] | +| hash_flow.rb:826:5:826:8 | hash [element :c] | hash_flow.rb:833:11:833:14 | hash [element :c] | +| hash_flow.rb:826:5:826:8 | hash [element :d] | hash_flow.rb:834:11:834:14 | hash [element :d] | +| hash_flow.rb:826:5:826:8 | hash [element :f] | hash_flow.rb:836:11:836:14 | hash [element :f] | +| hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] | hash_flow.rb:838:11:838:15 | hash1 [element :a] | +| hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] | hash_flow.rb:840:11:840:15 | hash1 [element :c] | +| hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] | hash_flow.rb:841:11:841:15 | hash1 [element :d] | +| hash_flow.rb:826:12:826:16 | [post] hash1 [element :f] | hash_flow.rb:843:11:843:15 | hash1 [element :f] | +| hash_flow.rb:826:12:826:16 | hash1 [element :a] | hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] | +| hash_flow.rb:826:12:826:16 | hash1 [element :a] | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] | +| hash_flow.rb:826:12:826:16 | hash1 [element :a] | hash_flow.rb:826:46:826:54 | old_value | +| hash_flow.rb:826:12:826:16 | hash1 [element :a] | hash_flow.rb:826:57:826:65 | new_value | +| hash_flow.rb:826:12:826:16 | hash1 [element :c] | hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] | +| hash_flow.rb:826:12:826:16 | hash1 [element :c] | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] | +| hash_flow.rb:826:12:826:16 | hash1 [element :c] | hash_flow.rb:826:46:826:54 | old_value | +| hash_flow.rb:826:12:826:16 | hash1 [element :c] | hash_flow.rb:826:57:826:65 | new_value | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] | hash_flow.rb:826:5:826:8 | hash [element :a] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] | hash_flow.rb:826:5:826:8 | hash [element :c] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] | hash_flow.rb:826:5:826:8 | hash [element :d] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] | hash_flow.rb:826:5:826:8 | hash [element :f] | +| hash_flow.rb:826:30:826:34 | hash2 [element :d] | hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] | +| hash_flow.rb:826:30:826:34 | hash2 [element :d] | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] | +| hash_flow.rb:826:30:826:34 | hash2 [element :d] | hash_flow.rb:826:46:826:54 | old_value | +| hash_flow.rb:826:30:826:34 | hash2 [element :d] | hash_flow.rb:826:57:826:65 | new_value | +| hash_flow.rb:826:30:826:34 | hash2 [element :f] | hash_flow.rb:826:12:826:16 | [post] hash1 [element :f] | +| hash_flow.rb:826:30:826:34 | hash2 [element :f] | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] | +| hash_flow.rb:826:30:826:34 | hash2 [element :f] | hash_flow.rb:826:46:826:54 | old_value | +| hash_flow.rb:826:30:826:34 | hash2 [element :f] | hash_flow.rb:826:57:826:65 | new_value | +| hash_flow.rb:826:46:826:54 | old_value | hash_flow.rb:828:14:828:22 | old_value | +| hash_flow.rb:826:57:826:65 | new_value | hash_flow.rb:829:14:829:22 | new_value | +| hash_flow.rb:831:11:831:14 | hash [element :a] | hash_flow.rb:831:11:831:18 | ...[...] | +| hash_flow.rb:831:11:831:18 | ...[...] | hash_flow.rb:831:10:831:19 | ( ... ) | +| hash_flow.rb:833:11:833:14 | hash [element :c] | hash_flow.rb:833:11:833:18 | ...[...] | +| hash_flow.rb:833:11:833:18 | ...[...] | hash_flow.rb:833:10:833:19 | ( ... ) | +| hash_flow.rb:834:11:834:14 | hash [element :d] | hash_flow.rb:834:11:834:18 | ...[...] | +| hash_flow.rb:834:11:834:18 | ...[...] | hash_flow.rb:834:10:834:19 | ( ... ) | +| hash_flow.rb:836:11:836:14 | hash [element :f] | hash_flow.rb:836:11:836:18 | ...[...] | +| hash_flow.rb:836:11:836:18 | ...[...] | hash_flow.rb:836:10:836:19 | ( ... ) | +| hash_flow.rb:838:11:838:15 | hash1 [element :a] | hash_flow.rb:838:11:838:19 | ...[...] | +| hash_flow.rb:838:11:838:19 | ...[...] | hash_flow.rb:838:10:838:20 | ( ... ) | +| hash_flow.rb:840:11:840:15 | hash1 [element :c] | hash_flow.rb:840:11:840:19 | ...[...] | +| hash_flow.rb:840:11:840:19 | ...[...] | hash_flow.rb:840:10:840:20 | ( ... ) | +| hash_flow.rb:841:11:841:15 | hash1 [element :d] | hash_flow.rb:841:11:841:19 | ...[...] | +| hash_flow.rb:841:11:841:19 | ...[...] | hash_flow.rb:841:10:841:20 | ( ... ) | +| hash_flow.rb:843:11:843:15 | hash1 [element :f] | hash_flow.rb:843:11:843:19 | ...[...] | +| hash_flow.rb:843:11:843:19 | ...[...] | hash_flow.rb:843:10:843:20 | ( ... ) | +| hash_flow.rb:849:5:849:9 | hash1 [element :a] | hash_flow.rb:860:13:860:17 | hash1 [element :a] | +| hash_flow.rb:849:5:849:9 | hash1 [element :a] | hash_flow.rb:869:13:869:17 | hash1 [element :a] | +| hash_flow.rb:849:5:849:9 | hash1 [element :c] | hash_flow.rb:860:13:860:17 | hash1 [element :c] | +| hash_flow.rb:849:5:849:9 | hash1 [element :c] | hash_flow.rb:869:13:869:17 | hash1 [element :c] | +| hash_flow.rb:850:12:850:22 | call to taint | hash_flow.rb:849:5:849:9 | hash1 [element :a] | +| hash_flow.rb:852:12:852:22 | call to taint | hash_flow.rb:849:5:849:9 | hash1 [element :c] | +| hash_flow.rb:854:5:854:9 | hash2 [element :d] | hash_flow.rb:860:33:860:37 | hash2 [element :d] | +| hash_flow.rb:854:5:854:9 | hash2 [element :d] | hash_flow.rb:869:33:869:37 | hash2 [element :d] | +| hash_flow.rb:854:5:854:9 | hash2 [element :f] | hash_flow.rb:860:33:860:37 | hash2 [element :f] | +| hash_flow.rb:854:5:854:9 | hash2 [element :f] | hash_flow.rb:869:33:869:37 | hash2 [element :f] | +| hash_flow.rb:855:12:855:22 | call to taint | hash_flow.rb:854:5:854:9 | hash2 [element :d] | +| hash_flow.rb:857:12:857:22 | call to taint | hash_flow.rb:854:5:854:9 | hash2 [element :f] | +| hash_flow.rb:860:5:860:9 | hash3 [element :a] | hash_flow.rb:861:11:861:15 | hash3 [element :a] | +| hash_flow.rb:860:5:860:9 | hash3 [element :c] | hash_flow.rb:863:11:863:15 | hash3 [element :c] | +| hash_flow.rb:860:5:860:9 | hash3 [element :d] | hash_flow.rb:864:11:864:15 | hash3 [element :d] | +| hash_flow.rb:860:5:860:9 | hash3 [element :f] | hash_flow.rb:866:11:866:15 | hash3 [element :f] | +| hash_flow.rb:860:13:860:17 | hash1 [element :a] | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] | +| hash_flow.rb:860:13:860:17 | hash1 [element :c] | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] | hash_flow.rb:860:5:860:9 | hash3 [element :a] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] | hash_flow.rb:860:5:860:9 | hash3 [element :c] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] | hash_flow.rb:860:5:860:9 | hash3 [element :d] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] | hash_flow.rb:860:5:860:9 | hash3 [element :f] | +| hash_flow.rb:860:33:860:37 | hash2 [element :d] | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] | +| hash_flow.rb:860:33:860:37 | hash2 [element :f] | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] | +| hash_flow.rb:861:11:861:15 | hash3 [element :a] | hash_flow.rb:861:11:861:19 | ...[...] | +| hash_flow.rb:861:11:861:19 | ...[...] | hash_flow.rb:861:10:861:20 | ( ... ) | +| hash_flow.rb:863:11:863:15 | hash3 [element :c] | hash_flow.rb:863:11:863:19 | ...[...] | +| hash_flow.rb:863:11:863:19 | ...[...] | hash_flow.rb:863:10:863:20 | ( ... ) | +| hash_flow.rb:864:11:864:15 | hash3 [element :d] | hash_flow.rb:864:11:864:19 | ...[...] | +| hash_flow.rb:864:11:864:19 | ...[...] | hash_flow.rb:864:10:864:20 | ( ... ) | +| hash_flow.rb:866:11:866:15 | hash3 [element :f] | hash_flow.rb:866:11:866:19 | ...[...] | +| hash_flow.rb:866:11:866:19 | ...[...] | hash_flow.rb:866:10:866:20 | ( ... ) | +| hash_flow.rb:869:5:869:9 | hash4 [element :a] | hash_flow.rb:870:11:870:15 | hash4 [element :a] | +| hash_flow.rb:869:5:869:9 | hash4 [element :c] | hash_flow.rb:872:11:872:15 | hash4 [element :c] | +| hash_flow.rb:869:5:869:9 | hash4 [element :d] | hash_flow.rb:873:11:873:15 | hash4 [element :d] | +| hash_flow.rb:869:5:869:9 | hash4 [element :f] | hash_flow.rb:875:11:875:15 | hash4 [element :f] | +| hash_flow.rb:869:13:869:17 | hash1 [element :a] | hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] | +| hash_flow.rb:869:13:869:17 | hash1 [element :c] | hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] | hash_flow.rb:869:5:869:9 | hash4 [element :a] | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] | hash_flow.rb:869:5:869:9 | hash4 [element :c] | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] | hash_flow.rb:869:5:869:9 | hash4 [element :d] | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] | hash_flow.rb:869:5:869:9 | hash4 [element :f] | +| hash_flow.rb:869:33:869:37 | hash2 [element :d] | hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] | +| hash_flow.rb:869:33:869:37 | hash2 [element :f] | hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] | +| hash_flow.rb:870:11:870:15 | hash4 [element :a] | hash_flow.rb:870:11:870:19 | ...[...] | +| hash_flow.rb:870:11:870:19 | ...[...] | hash_flow.rb:870:10:870:20 | ( ... ) | +| hash_flow.rb:872:11:872:15 | hash4 [element :c] | hash_flow.rb:872:11:872:19 | ...[...] | +| hash_flow.rb:872:11:872:19 | ...[...] | hash_flow.rb:872:10:872:20 | ( ... ) | +| hash_flow.rb:873:11:873:15 | hash4 [element :d] | hash_flow.rb:873:11:873:19 | ...[...] | +| hash_flow.rb:873:11:873:19 | ...[...] | hash_flow.rb:873:10:873:20 | ( ... ) | +| hash_flow.rb:875:11:875:15 | hash4 [element :f] | hash_flow.rb:875:11:875:19 | ...[...] | +| hash_flow.rb:875:11:875:19 | ...[...] | hash_flow.rb:875:10:875:20 | ( ... ) | +| hash_flow.rb:881:5:881:9 | hash1 [element :a] | hash_flow.rb:892:12:892:16 | hash1 [element :a] | +| hash_flow.rb:881:5:881:9 | hash1 [element :c] | hash_flow.rb:892:12:892:16 | hash1 [element :c] | +| hash_flow.rb:882:12:882:22 | call to taint | hash_flow.rb:881:5:881:9 | hash1 [element :a] | +| hash_flow.rb:884:12:884:22 | call to taint | hash_flow.rb:881:5:881:9 | hash1 [element :c] | +| hash_flow.rb:886:5:886:9 | hash2 [element :d] | hash_flow.rb:892:33:892:37 | hash2 [element :d] | +| hash_flow.rb:886:5:886:9 | hash2 [element :f] | hash_flow.rb:892:33:892:37 | hash2 [element :f] | +| hash_flow.rb:887:12:887:22 | call to taint | hash_flow.rb:886:5:886:9 | hash2 [element :d] | +| hash_flow.rb:889:12:889:22 | call to taint | hash_flow.rb:886:5:886:9 | hash2 [element :f] | +| hash_flow.rb:892:5:892:8 | hash [element :a] | hash_flow.rb:893:11:893:14 | hash [element :a] | +| hash_flow.rb:892:5:892:8 | hash [element :c] | hash_flow.rb:895:11:895:14 | hash [element :c] | +| hash_flow.rb:892:5:892:8 | hash [element :d] | hash_flow.rb:896:11:896:14 | hash [element :d] | +| hash_flow.rb:892:5:892:8 | hash [element :f] | hash_flow.rb:898:11:898:14 | hash [element :f] | +| hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] | hash_flow.rb:900:11:900:15 | hash1 [element :a] | +| hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] | hash_flow.rb:902:11:902:15 | hash1 [element :c] | +| hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] | hash_flow.rb:903:11:903:15 | hash1 [element :d] | +| hash_flow.rb:892:12:892:16 | [post] hash1 [element :f] | hash_flow.rb:905:11:905:15 | hash1 [element :f] | +| hash_flow.rb:892:12:892:16 | hash1 [element :a] | hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] | +| hash_flow.rb:892:12:892:16 | hash1 [element :a] | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] | +| hash_flow.rb:892:12:892:16 | hash1 [element :c] | hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] | +| hash_flow.rb:892:12:892:16 | hash1 [element :c] | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] | hash_flow.rb:892:5:892:8 | hash [element :a] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] | hash_flow.rb:892:5:892:8 | hash [element :c] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] | hash_flow.rb:892:5:892:8 | hash [element :d] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] | hash_flow.rb:892:5:892:8 | hash [element :f] | +| hash_flow.rb:892:33:892:37 | hash2 [element :d] | hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] | +| hash_flow.rb:892:33:892:37 | hash2 [element :d] | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] | +| hash_flow.rb:892:33:892:37 | hash2 [element :f] | hash_flow.rb:892:12:892:16 | [post] hash1 [element :f] | +| hash_flow.rb:892:33:892:37 | hash2 [element :f] | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] | +| hash_flow.rb:893:11:893:14 | hash [element :a] | hash_flow.rb:893:11:893:18 | ...[...] | +| hash_flow.rb:893:11:893:18 | ...[...] | hash_flow.rb:893:10:893:19 | ( ... ) | +| hash_flow.rb:895:11:895:14 | hash [element :c] | hash_flow.rb:895:11:895:18 | ...[...] | +| hash_flow.rb:895:11:895:18 | ...[...] | hash_flow.rb:895:10:895:19 | ( ... ) | +| hash_flow.rb:896:11:896:14 | hash [element :d] | hash_flow.rb:896:11:896:18 | ...[...] | +| hash_flow.rb:896:11:896:18 | ...[...] | hash_flow.rb:896:10:896:19 | ( ... ) | +| hash_flow.rb:898:11:898:14 | hash [element :f] | hash_flow.rb:898:11:898:18 | ...[...] | +| hash_flow.rb:898:11:898:18 | ...[...] | hash_flow.rb:898:10:898:19 | ( ... ) | +| hash_flow.rb:900:11:900:15 | hash1 [element :a] | hash_flow.rb:900:11:900:19 | ...[...] | +| hash_flow.rb:900:11:900:19 | ...[...] | hash_flow.rb:900:10:900:20 | ( ... ) | +| hash_flow.rb:902:11:902:15 | hash1 [element :c] | hash_flow.rb:902:11:902:19 | ...[...] | +| hash_flow.rb:902:11:902:19 | ...[...] | hash_flow.rb:902:10:902:20 | ( ... ) | +| hash_flow.rb:903:11:903:15 | hash1 [element :d] | hash_flow.rb:903:11:903:19 | ...[...] | +| hash_flow.rb:903:11:903:19 | ...[...] | hash_flow.rb:903:10:903:20 | ( ... ) | +| hash_flow.rb:905:11:905:15 | hash1 [element :f] | hash_flow.rb:905:11:905:19 | ...[...] | +| hash_flow.rb:905:11:905:19 | ...[...] | hash_flow.rb:905:10:905:20 | ( ... ) | +| hash_flow.rb:911:5:911:9 | hash1 [element :a] | hash_flow.rb:922:12:922:16 | hash1 [element :a] | +| hash_flow.rb:911:5:911:9 | hash1 [element :c] | hash_flow.rb:922:12:922:16 | hash1 [element :c] | +| hash_flow.rb:912:12:912:22 | call to taint | hash_flow.rb:911:5:911:9 | hash1 [element :a] | +| hash_flow.rb:914:12:914:22 | call to taint | hash_flow.rb:911:5:911:9 | hash1 [element :c] | +| hash_flow.rb:916:5:916:9 | hash2 [element :d] | hash_flow.rb:922:33:922:37 | hash2 [element :d] | +| hash_flow.rb:916:5:916:9 | hash2 [element :f] | hash_flow.rb:922:33:922:37 | hash2 [element :f] | +| hash_flow.rb:917:12:917:22 | call to taint | hash_flow.rb:916:5:916:9 | hash2 [element :d] | +| hash_flow.rb:919:12:919:22 | call to taint | hash_flow.rb:916:5:916:9 | hash2 [element :f] | +| hash_flow.rb:922:5:922:8 | hash [element :a] | hash_flow.rb:923:11:923:14 | hash [element :a] | +| hash_flow.rb:922:5:922:8 | hash [element :c] | hash_flow.rb:925:11:925:14 | hash [element :c] | +| hash_flow.rb:922:5:922:8 | hash [element :d] | hash_flow.rb:926:11:926:14 | hash [element :d] | +| hash_flow.rb:922:5:922:8 | hash [element :f] | hash_flow.rb:928:11:928:14 | hash [element :f] | +| hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] | hash_flow.rb:930:11:930:15 | hash1 [element :a] | +| hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] | hash_flow.rb:932:11:932:15 | hash1 [element :c] | +| hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] | hash_flow.rb:933:11:933:15 | hash1 [element :d] | +| hash_flow.rb:922:12:922:16 | [post] hash1 [element :f] | hash_flow.rb:935:11:935:15 | hash1 [element :f] | +| hash_flow.rb:922:12:922:16 | hash1 [element :a] | hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] | +| hash_flow.rb:922:12:922:16 | hash1 [element :a] | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] | +| hash_flow.rb:922:12:922:16 | hash1 [element :c] | hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] | +| hash_flow.rb:922:12:922:16 | hash1 [element :c] | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] | hash_flow.rb:922:5:922:8 | hash [element :a] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] | hash_flow.rb:922:5:922:8 | hash [element :c] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] | hash_flow.rb:922:5:922:8 | hash [element :d] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] | hash_flow.rb:922:5:922:8 | hash [element :f] | +| hash_flow.rb:922:33:922:37 | hash2 [element :d] | hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] | +| hash_flow.rb:922:33:922:37 | hash2 [element :d] | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] | +| hash_flow.rb:922:33:922:37 | hash2 [element :f] | hash_flow.rb:922:12:922:16 | [post] hash1 [element :f] | +| hash_flow.rb:922:33:922:37 | hash2 [element :f] | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] | +| hash_flow.rb:923:11:923:14 | hash [element :a] | hash_flow.rb:923:11:923:18 | ...[...] | +| hash_flow.rb:923:11:923:18 | ...[...] | hash_flow.rb:923:10:923:19 | ( ... ) | +| hash_flow.rb:925:11:925:14 | hash [element :c] | hash_flow.rb:925:11:925:18 | ...[...] | +| hash_flow.rb:925:11:925:18 | ...[...] | hash_flow.rb:925:10:925:19 | ( ... ) | +| hash_flow.rb:926:11:926:14 | hash [element :d] | hash_flow.rb:926:11:926:18 | ...[...] | +| hash_flow.rb:926:11:926:18 | ...[...] | hash_flow.rb:926:10:926:19 | ( ... ) | +| hash_flow.rb:928:11:928:14 | hash [element :f] | hash_flow.rb:928:11:928:18 | ...[...] | +| hash_flow.rb:928:11:928:18 | ...[...] | hash_flow.rb:928:10:928:19 | ( ... ) | +| hash_flow.rb:930:11:930:15 | hash1 [element :a] | hash_flow.rb:930:11:930:19 | ...[...] | +| hash_flow.rb:930:11:930:19 | ...[...] | hash_flow.rb:930:10:930:20 | ( ... ) | +| hash_flow.rb:932:11:932:15 | hash1 [element :c] | hash_flow.rb:932:11:932:19 | ...[...] | +| hash_flow.rb:932:11:932:19 | ...[...] | hash_flow.rb:932:10:932:20 | ( ... ) | +| hash_flow.rb:933:11:933:15 | hash1 [element :d] | hash_flow.rb:933:11:933:19 | ...[...] | +| hash_flow.rb:933:11:933:19 | ...[...] | hash_flow.rb:933:10:933:20 | ( ... ) | +| hash_flow.rb:935:11:935:15 | hash1 [element :f] | hash_flow.rb:935:11:935:19 | ...[...] | +| hash_flow.rb:935:11:935:19 | ...[...] | hash_flow.rb:935:10:935:20 | ( ... ) | +| hash_flow.rb:941:5:941:9 | hash1 [element :a] | hash_flow.rb:952:12:952:16 | hash1 [element :a] | +| hash_flow.rb:941:5:941:9 | hash1 [element :c] | hash_flow.rb:952:12:952:16 | hash1 [element :c] | +| hash_flow.rb:942:12:942:22 | call to taint | hash_flow.rb:941:5:941:9 | hash1 [element :a] | +| hash_flow.rb:944:12:944:22 | call to taint | hash_flow.rb:941:5:941:9 | hash1 [element :c] | +| hash_flow.rb:946:5:946:9 | hash2 [element :d] | hash_flow.rb:952:33:952:37 | hash2 [element :d] | +| hash_flow.rb:946:5:946:9 | hash2 [element :f] | hash_flow.rb:952:33:952:37 | hash2 [element :f] | +| hash_flow.rb:947:12:947:22 | call to taint | hash_flow.rb:946:5:946:9 | hash2 [element :d] | +| hash_flow.rb:949:12:949:22 | call to taint | hash_flow.rb:946:5:946:9 | hash2 [element :f] | +| hash_flow.rb:952:5:952:8 | hash [element :a] | hash_flow.rb:953:11:953:14 | hash [element :a] | +| hash_flow.rb:952:5:952:8 | hash [element :c] | hash_flow.rb:955:11:955:14 | hash [element :c] | +| hash_flow.rb:952:5:952:8 | hash [element :d] | hash_flow.rb:956:11:956:14 | hash [element :d] | +| hash_flow.rb:952:5:952:8 | hash [element :f] | hash_flow.rb:958:11:958:14 | hash [element :f] | +| hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] | hash_flow.rb:960:11:960:15 | hash1 [element :a] | +| hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] | hash_flow.rb:962:11:962:15 | hash1 [element :c] | +| hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] | hash_flow.rb:963:11:963:15 | hash1 [element :d] | +| hash_flow.rb:952:12:952:16 | [post] hash1 [element :f] | hash_flow.rb:965:11:965:15 | hash1 [element :f] | +| hash_flow.rb:952:12:952:16 | hash1 [element :a] | hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] | +| hash_flow.rb:952:12:952:16 | hash1 [element :a] | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] | +| hash_flow.rb:952:12:952:16 | hash1 [element :c] | hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] | +| hash_flow.rb:952:12:952:16 | hash1 [element :c] | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] | hash_flow.rb:952:5:952:8 | hash [element :a] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] | hash_flow.rb:952:5:952:8 | hash [element :c] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] | hash_flow.rb:952:5:952:8 | hash [element :d] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] | hash_flow.rb:952:5:952:8 | hash [element :f] | +| hash_flow.rb:952:33:952:37 | hash2 [element :d] | hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] | +| hash_flow.rb:952:33:952:37 | hash2 [element :d] | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] | +| hash_flow.rb:952:33:952:37 | hash2 [element :f] | hash_flow.rb:952:12:952:16 | [post] hash1 [element :f] | +| hash_flow.rb:952:33:952:37 | hash2 [element :f] | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] | +| hash_flow.rb:953:11:953:14 | hash [element :a] | hash_flow.rb:953:11:953:18 | ...[...] | +| hash_flow.rb:953:11:953:18 | ...[...] | hash_flow.rb:953:10:953:19 | ( ... ) | +| hash_flow.rb:955:11:955:14 | hash [element :c] | hash_flow.rb:955:11:955:18 | ...[...] | +| hash_flow.rb:955:11:955:18 | ...[...] | hash_flow.rb:955:10:955:19 | ( ... ) | +| hash_flow.rb:956:11:956:14 | hash [element :d] | hash_flow.rb:956:11:956:18 | ...[...] | +| hash_flow.rb:956:11:956:18 | ...[...] | hash_flow.rb:956:10:956:19 | ( ... ) | +| hash_flow.rb:958:11:958:14 | hash [element :f] | hash_flow.rb:958:11:958:18 | ...[...] | +| hash_flow.rb:958:11:958:18 | ...[...] | hash_flow.rb:958:10:958:19 | ( ... ) | +| hash_flow.rb:960:11:960:15 | hash1 [element :a] | hash_flow.rb:960:11:960:19 | ...[...] | +| hash_flow.rb:960:11:960:19 | ...[...] | hash_flow.rb:960:10:960:20 | ( ... ) | +| hash_flow.rb:962:11:962:15 | hash1 [element :c] | hash_flow.rb:962:11:962:19 | ...[...] | +| hash_flow.rb:962:11:962:19 | ...[...] | hash_flow.rb:962:10:962:20 | ( ... ) | +| hash_flow.rb:963:11:963:15 | hash1 [element :d] | hash_flow.rb:963:11:963:19 | ...[...] | +| hash_flow.rb:963:11:963:19 | ...[...] | hash_flow.rb:963:10:963:20 | ( ... ) | +| hash_flow.rb:965:11:965:15 | hash1 [element :f] | hash_flow.rb:965:11:965:19 | ...[...] | +| hash_flow.rb:965:11:965:19 | ...[...] | hash_flow.rb:965:10:965:20 | ( ... ) | nodes -| hash_flow.rb:10:5:10:8 | hash [element 0] : | semmle.label | hash [element 0] : | -| hash_flow.rb:10:5:10:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:10:5:10:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:10:5:10:8 | hash [element e] : | semmle.label | hash [element e] : | -| hash_flow.rb:10:5:10:8 | hash [element g] : | semmle.label | hash [element g] : | -| hash_flow.rb:11:15:11:24 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:13:12:13:21 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:15:14:15:23 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:17:16:17:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:19:14:19:23 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:22:10:22:13 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:10:5:10:8 | hash [element 0] | semmle.label | hash [element 0] | +| hash_flow.rb:10:5:10:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:10:5:10:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:10:5:10:8 | hash [element e] | semmle.label | hash [element e] | +| hash_flow.rb:10:5:10:8 | hash [element g] | semmle.label | hash [element g] | +| hash_flow.rb:11:15:11:24 | call to taint | semmle.label | call to taint | +| hash_flow.rb:13:12:13:21 | call to taint | semmle.label | call to taint | +| hash_flow.rb:15:14:15:23 | call to taint | semmle.label | call to taint | +| hash_flow.rb:17:16:17:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:19:14:19:23 | call to taint | semmle.label | call to taint | +| hash_flow.rb:22:10:22:13 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:22:10:22:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:24:10:24:13 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:24:10:24:13 | hash [element :c] | semmle.label | hash [element :c] | | hash_flow.rb:24:10:24:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:26:10:26:13 | hash [element e] : | semmle.label | hash [element e] : | +| hash_flow.rb:26:10:26:13 | hash [element e] | semmle.label | hash [element e] | | hash_flow.rb:26:10:26:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:28:10:28:13 | hash [element g] : | semmle.label | hash [element g] : | +| hash_flow.rb:28:10:28:13 | hash [element g] | semmle.label | hash [element g] | | hash_flow.rb:28:10:28:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:30:10:30:13 | hash [element 0] : | semmle.label | hash [element 0] : | +| hash_flow.rb:30:10:30:13 | hash [element 0] | semmle.label | hash [element 0] | | hash_flow.rb:30:10:30:16 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:38:5:38:8 | [post] hash [element 0] : | semmle.label | [post] hash [element 0] : | -| hash_flow.rb:38:15:38:24 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:39:5:39:8 | [post] hash [element 0] : | semmle.label | [post] hash [element 0] : | -| hash_flow.rb:39:5:39:8 | hash [element 0] : | semmle.label | hash [element 0] : | -| hash_flow.rb:40:5:40:8 | [post] hash [element 0] : | semmle.label | [post] hash [element 0] : | -| hash_flow.rb:40:5:40:8 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:40:5:40:8 | hash [element 0] : | semmle.label | hash [element 0] : | -| hash_flow.rb:40:16:40:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:41:5:41:8 | [post] hash [element 0] : | semmle.label | [post] hash [element 0] : | -| hash_flow.rb:41:5:41:8 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:41:5:41:8 | hash [element 0] : | semmle.label | hash [element 0] : | -| hash_flow.rb:41:5:41:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:42:5:42:8 | [post] hash [element 0] : | semmle.label | [post] hash [element 0] : | -| hash_flow.rb:42:5:42:8 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:42:5:42:8 | [post] hash [element a] : | semmle.label | [post] hash [element a] : | -| hash_flow.rb:42:5:42:8 | hash [element 0] : | semmle.label | hash [element 0] : | -| hash_flow.rb:42:5:42:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:42:17:42:26 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:43:5:43:8 | [post] hash [element 0] : | semmle.label | [post] hash [element 0] : | -| hash_flow.rb:43:5:43:8 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:43:5:43:8 | [post] hash [element a] : | semmle.label | [post] hash [element a] : | -| hash_flow.rb:43:5:43:8 | hash [element 0] : | semmle.label | hash [element 0] : | -| hash_flow.rb:43:5:43:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:43:5:43:8 | hash [element a] : | semmle.label | hash [element a] : | -| hash_flow.rb:44:10:44:13 | hash [element 0] : | semmle.label | hash [element 0] : | +| hash_flow.rb:38:5:38:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | +| hash_flow.rb:38:15:38:24 | call to taint | semmle.label | call to taint | +| hash_flow.rb:39:5:39:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | +| hash_flow.rb:39:5:39:8 | hash [element 0] | semmle.label | hash [element 0] | +| hash_flow.rb:40:5:40:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | +| hash_flow.rb:40:5:40:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:40:5:40:8 | hash [element 0] | semmle.label | hash [element 0] | +| hash_flow.rb:40:16:40:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:41:5:41:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | +| hash_flow.rb:41:5:41:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:41:5:41:8 | hash [element 0] | semmle.label | hash [element 0] | +| hash_flow.rb:41:5:41:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:42:5:42:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | +| hash_flow.rb:42:5:42:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:42:5:42:8 | [post] hash [element a] | semmle.label | [post] hash [element a] | +| hash_flow.rb:42:5:42:8 | hash [element 0] | semmle.label | hash [element 0] | +| hash_flow.rb:42:5:42:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:42:17:42:26 | call to taint | semmle.label | call to taint | +| hash_flow.rb:43:5:43:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | +| hash_flow.rb:43:5:43:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:43:5:43:8 | [post] hash [element a] | semmle.label | [post] hash [element a] | +| hash_flow.rb:43:5:43:8 | hash [element 0] | semmle.label | hash [element 0] | +| hash_flow.rb:43:5:43:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:43:5:43:8 | hash [element a] | semmle.label | hash [element a] | +| hash_flow.rb:44:10:44:13 | hash [element 0] | semmle.label | hash [element 0] | | hash_flow.rb:44:10:44:16 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:46:10:46:13 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:46:10:46:13 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:46:10:46:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:48:10:48:13 | hash [element a] : | semmle.label | hash [element a] : | +| hash_flow.rb:48:10:48:13 | hash [element a] | semmle.label | hash [element a] | | hash_flow.rb:48:10:48:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:55:5:55:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:55:13:55:37 | ...[...] [element :a] : | semmle.label | ...[...] [element :a] : | -| hash_flow.rb:55:21:55:30 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:56:10:56:14 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:55:5:55:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:55:13:55:37 | ...[...] [element :a] | semmle.label | ...[...] [element :a] | +| hash_flow.rb:55:21:55:30 | call to taint | semmle.label | call to taint | +| hash_flow.rb:56:10:56:14 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:56:10:56:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:59:5:59:5 | x [element :a] : | semmle.label | x [element :a] : | -| hash_flow.rb:59:13:59:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:60:5:60:9 | hash2 [element :a] : | semmle.label | hash2 [element :a] : | -| hash_flow.rb:60:13:60:19 | ...[...] [element :a] : | semmle.label | ...[...] [element :a] : | -| hash_flow.rb:60:18:60:18 | x [element :a] : | semmle.label | x [element :a] : | -| hash_flow.rb:61:10:61:14 | hash2 [element :a] : | semmle.label | hash2 [element :a] : | +| hash_flow.rb:59:5:59:5 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:59:13:59:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:60:5:60:9 | hash2 [element :a] | semmle.label | hash2 [element :a] | +| hash_flow.rb:60:13:60:19 | ...[...] [element :a] | semmle.label | ...[...] [element :a] | +| hash_flow.rb:60:18:60:18 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:61:10:61:14 | hash2 [element :a] | semmle.label | hash2 [element :a] | | hash_flow.rb:61:10:61:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:64:5:64:9 | hash3 [element] : | semmle.label | hash3 [element] : | -| hash_flow.rb:64:13:64:45 | ...[...] [element] : | semmle.label | ...[...] [element] : | -| hash_flow.rb:64:24:64:33 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:65:10:65:14 | hash3 [element] : | semmle.label | hash3 [element] : | +| hash_flow.rb:64:5:64:9 | hash3 [element] | semmle.label | hash3 [element] | +| hash_flow.rb:64:13:64:45 | ...[...] [element] | semmle.label | ...[...] [element] | +| hash_flow.rb:64:24:64:33 | call to taint | semmle.label | call to taint | +| hash_flow.rb:65:10:65:14 | hash3 [element] | semmle.label | hash3 [element] | | hash_flow.rb:65:10:65:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:66:10:66:14 | hash3 [element] : | semmle.label | hash3 [element] : | +| hash_flow.rb:66:10:66:14 | hash3 [element] | semmle.label | hash3 [element] | | hash_flow.rb:66:10:66:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:68:5:68:9 | hash4 [element :a] : | semmle.label | hash4 [element :a] : | -| hash_flow.rb:68:13:68:39 | ...[...] [element :a] : | semmle.label | ...[...] [element :a] : | -| hash_flow.rb:68:22:68:31 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:69:10:69:14 | hash4 [element :a] : | semmle.label | hash4 [element :a] : | +| hash_flow.rb:68:5:68:9 | hash4 [element :a] | semmle.label | hash4 [element :a] | +| hash_flow.rb:68:13:68:39 | ...[...] [element :a] | semmle.label | ...[...] [element :a] | +| hash_flow.rb:68:22:68:31 | call to taint | semmle.label | call to taint | +| hash_flow.rb:69:10:69:14 | hash4 [element :a] | semmle.label | hash4 [element :a] | | hash_flow.rb:69:10:69:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:72:5:72:9 | hash5 [element a] : | semmle.label | hash5 [element a] : | -| hash_flow.rb:72:13:72:45 | ...[...] [element a] : | semmle.label | ...[...] [element a] : | -| hash_flow.rb:72:25:72:34 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:73:10:73:14 | hash5 [element a] : | semmle.label | hash5 [element a] : | +| hash_flow.rb:72:5:72:9 | hash5 [element a] | semmle.label | hash5 [element a] | +| hash_flow.rb:72:13:72:45 | ...[...] [element a] | semmle.label | ...[...] [element a] | +| hash_flow.rb:72:25:72:34 | call to taint | semmle.label | call to taint | +| hash_flow.rb:73:10:73:14 | hash5 [element a] | semmle.label | hash5 [element a] | | hash_flow.rb:73:10:73:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:76:5:76:9 | hash6 [element a] : | semmle.label | hash6 [element a] : | -| hash_flow.rb:76:13:76:47 | ...[...] [element a] : | semmle.label | ...[...] [element a] : | -| hash_flow.rb:76:26:76:35 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:77:10:77:14 | hash6 [element a] : | semmle.label | hash6 [element a] : | +| hash_flow.rb:76:5:76:9 | hash6 [element a] | semmle.label | hash6 [element a] | +| hash_flow.rb:76:13:76:47 | ...[...] [element a] | semmle.label | ...[...] [element a] | +| hash_flow.rb:76:26:76:35 | call to taint | semmle.label | call to taint | +| hash_flow.rb:77:10:77:14 | hash6 [element a] | semmle.label | hash6 [element a] | | hash_flow.rb:77:10:77:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:84:5:84:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:84:13:84:42 | call to [] [element :a] : | semmle.label | call to [] [element :a] : | -| hash_flow.rb:84:26:84:35 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:85:10:85:14 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:84:5:84:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:84:13:84:42 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:84:26:84:35 | call to taint | semmle.label | call to taint | +| hash_flow.rb:85:10:85:14 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:85:10:85:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:92:5:92:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:93:15:93:24 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:96:5:96:9 | hash2 [element :a] : | semmle.label | hash2 [element :a] : | -| hash_flow.rb:96:13:96:34 | call to try_convert [element :a] : | semmle.label | call to try_convert [element :a] : | -| hash_flow.rb:96:30:96:33 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:97:10:97:14 | hash2 [element :a] : | semmle.label | hash2 [element :a] : | +| hash_flow.rb:92:5:92:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:93:15:93:24 | call to taint | semmle.label | call to taint | +| hash_flow.rb:96:5:96:9 | hash2 [element :a] | semmle.label | hash2 [element :a] | +| hash_flow.rb:96:13:96:34 | call to try_convert [element :a] | semmle.label | call to try_convert [element :a] | +| hash_flow.rb:96:30:96:33 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:97:10:97:14 | hash2 [element :a] | semmle.label | hash2 [element :a] | | hash_flow.rb:97:10:97:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:105:5:105:5 | b : | semmle.label | b : | -| hash_flow.rb:105:21:105:30 | __synth__0 : | semmle.label | __synth__0 : | -| hash_flow.rb:105:21:105:30 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:105:5:105:5 | b | semmle.label | b | +| hash_flow.rb:105:21:105:30 | __synth__0 | semmle.label | __synth__0 | +| hash_flow.rb:105:21:105:30 | call to taint | semmle.label | call to taint | | hash_flow.rb:106:10:106:10 | b | semmle.label | b | -| hash_flow.rb:113:5:113:5 | b : | semmle.label | b : | -| hash_flow.rb:113:9:113:12 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:113:9:113:34 | call to store : | semmle.label | call to store : | -| hash_flow.rb:113:24:113:33 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:114:10:114:13 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:113:5:113:5 | b | semmle.label | b | +| hash_flow.rb:113:9:113:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:113:9:113:34 | call to store | semmle.label | call to store | +| hash_flow.rb:113:24:113:33 | call to taint | semmle.label | call to taint | +| hash_flow.rb:114:10:114:13 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:114:10:114:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:115:10:115:10 | b | semmle.label | b | -| hash_flow.rb:118:5:118:5 | c : | semmle.label | c : | -| hash_flow.rb:118:9:118:12 | [post] hash [element] : | semmle.label | [post] hash [element] : | -| hash_flow.rb:118:9:118:33 | call to store : | semmle.label | call to store : | -| hash_flow.rb:118:23:118:32 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:119:10:119:13 | hash [element] : | semmle.label | hash [element] : | +| hash_flow.rb:118:5:118:5 | c | semmle.label | c | +| hash_flow.rb:118:9:118:12 | [post] hash [element] | semmle.label | [post] hash [element] | +| hash_flow.rb:118:9:118:33 | call to store | semmle.label | call to store | +| hash_flow.rb:118:23:118:32 | call to taint | semmle.label | call to taint | +| hash_flow.rb:119:10:119:13 | hash [element] | semmle.label | hash [element] | | hash_flow.rb:119:10:119:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:120:10:120:13 | hash [element] : | semmle.label | hash [element] : | +| hash_flow.rb:120:10:120:13 | hash [element] | semmle.label | hash [element] | | hash_flow.rb:120:10:120:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:121:10:121:10 | c | semmle.label | c | -| hash_flow.rb:127:5:127:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:128:15:128:24 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:131:5:131:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:131:18:131:29 | key_or_value : | semmle.label | key_or_value : | +| hash_flow.rb:127:5:127:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:128:15:128:24 | call to taint | semmle.label | call to taint | +| hash_flow.rb:131:5:131:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:131:18:131:29 | key_or_value | semmle.label | key_or_value | | hash_flow.rb:132:14:132:25 | key_or_value | semmle.label | key_or_value | -| hash_flow.rb:134:5:134:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:134:22:134:26 | value : | semmle.label | value : | +| hash_flow.rb:134:5:134:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:134:22:134:26 | value | semmle.label | value | | hash_flow.rb:136:14:136:18 | value | semmle.label | value | -| hash_flow.rb:143:5:143:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:144:15:144:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:147:5:147:5 | b [element 1] : | semmle.label | b [element 1] : | -| hash_flow.rb:147:9:147:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:147:9:147:22 | call to assoc [element 1] : | semmle.label | call to assoc [element 1] : | -| hash_flow.rb:149:10:149:10 | b [element 1] : | semmle.label | b [element 1] : | +| hash_flow.rb:143:5:143:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:144:15:144:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:147:5:147:5 | b [element 1] | semmle.label | b [element 1] | +| hash_flow.rb:147:9:147:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:147:9:147:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | +| hash_flow.rb:149:10:149:10 | b [element 1] | semmle.label | b [element 1] | | hash_flow.rb:149:10:149:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:150:10:150:10 | b [element 1] : | semmle.label | b [element 1] : | +| hash_flow.rb:150:10:150:10 | b [element 1] | semmle.label | b [element 1] | | hash_flow.rb:150:10:150:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:151:5:151:5 | c [element 1] : | semmle.label | c [element 1] : | -| hash_flow.rb:151:9:151:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:151:9:151:21 | call to assoc [element 1] : | semmle.label | call to assoc [element 1] : | -| hash_flow.rb:152:10:152:10 | c [element 1] : | semmle.label | c [element 1] : | +| hash_flow.rb:151:5:151:5 | c [element 1] | semmle.label | c [element 1] | +| hash_flow.rb:151:9:151:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:151:9:151:21 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | +| hash_flow.rb:152:10:152:10 | c [element 1] | semmle.label | c [element 1] | | hash_flow.rb:152:10:152:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:169:5:169:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:170:15:170:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:173:5:173:5 | a [element :a] : | semmle.label | a [element :a] : | -| hash_flow.rb:173:9:173:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:173:9:173:20 | call to compact [element :a] : | semmle.label | call to compact [element :a] : | -| hash_flow.rb:174:10:174:10 | a [element :a] : | semmle.label | a [element :a] : | +| hash_flow.rb:169:5:169:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:170:15:170:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:173:5:173:5 | a [element :a] | semmle.label | a [element :a] | +| hash_flow.rb:173:9:173:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:173:9:173:20 | call to compact [element :a] | semmle.label | call to compact [element :a] | +| hash_flow.rb:174:10:174:10 | a [element :a] | semmle.label | a [element :a] | | hash_flow.rb:174:10:174:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:181:5:181:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:182:15:182:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:185:5:185:5 | a : | semmle.label | a : | -| hash_flow.rb:185:9:185:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:185:9:185:23 | call to delete : | semmle.label | call to delete : | +| hash_flow.rb:181:5:181:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:182:15:182:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:185:5:185:5 | a | semmle.label | a | +| hash_flow.rb:185:9:185:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:185:9:185:23 | call to delete | semmle.label | call to delete | | hash_flow.rb:186:10:186:10 | a | semmle.label | a | -| hash_flow.rb:193:5:193:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:194:15:194:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:197:5:197:5 | a [element :a] : | semmle.label | a [element :a] : | -| hash_flow.rb:197:9:197:12 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:197:9:197:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:197:9:200:7 | call to delete_if [element :a] : | semmle.label | call to delete_if [element :a] : | -| hash_flow.rb:197:33:197:37 | value : | semmle.label | value : | +| hash_flow.rb:193:5:193:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:194:15:194:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:197:5:197:5 | a [element :a] | semmle.label | a [element :a] | +| hash_flow.rb:197:9:197:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:197:9:197:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:197:9:200:7 | call to delete_if [element :a] | semmle.label | call to delete_if [element :a] | +| hash_flow.rb:197:33:197:37 | value | semmle.label | value | | hash_flow.rb:199:14:199:18 | value | semmle.label | value | -| hash_flow.rb:201:10:201:10 | a [element :a] : | semmle.label | a [element :a] : | +| hash_flow.rb:201:10:201:10 | a [element :a] | semmle.label | a [element :a] | | hash_flow.rb:201:10:201:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:202:10:202:13 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:202:10:202:13 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:202:10:202:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:209:5:209:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:209:5:209:8 | hash [element :c, element :d] : | semmle.label | hash [element :c, element :d] : | -| hash_flow.rb:210:15:210:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:213:19:213:29 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:217:10:217:13 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:209:5:209:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:209:5:209:8 | hash [element :c, element :d] | semmle.label | hash [element :c, element :d] | +| hash_flow.rb:210:15:210:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:213:19:213:29 | call to taint | semmle.label | call to taint | +| hash_flow.rb:217:10:217:13 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:217:10:217:21 | call to dig | semmle.label | call to dig | -| hash_flow.rb:219:10:219:13 | hash [element :c, element :d] : | semmle.label | hash [element :c, element :d] : | +| hash_flow.rb:219:10:219:13 | hash [element :c, element :d] | semmle.label | hash [element :c, element :d] | | hash_flow.rb:219:10:219:24 | call to dig | semmle.label | call to dig | -| hash_flow.rb:226:5:226:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:227:15:227:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:230:5:230:5 | x [element :a] : | semmle.label | x [element :a] : | -| hash_flow.rb:230:9:230:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:230:9:233:7 | call to each [element :a] : | semmle.label | call to each [element :a] : | -| hash_flow.rb:230:28:230:32 | value : | semmle.label | value : | +| hash_flow.rb:226:5:226:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:227:15:227:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:230:5:230:5 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:230:9:230:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:230:9:233:7 | call to each [element :a] | semmle.label | call to each [element :a] | +| hash_flow.rb:230:28:230:32 | value | semmle.label | value | | hash_flow.rb:232:14:232:18 | value | semmle.label | value | -| hash_flow.rb:234:10:234:10 | x [element :a] : | semmle.label | x [element :a] : | +| hash_flow.rb:234:10:234:10 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:234:10:234:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:241:5:241:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:242:15:242:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:245:5:245:5 | x [element :a] : | semmle.label | x [element :a] : | -| hash_flow.rb:245:9:245:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:245:9:247:7 | call to each_key [element :a] : | semmle.label | call to each_key [element :a] : | -| hash_flow.rb:248:10:248:10 | x [element :a] : | semmle.label | x [element :a] : | +| hash_flow.rb:241:5:241:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:242:15:242:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:245:5:245:5 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:245:9:245:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:245:9:247:7 | call to each_key [element :a] | semmle.label | call to each_key [element :a] | +| hash_flow.rb:248:10:248:10 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:248:10:248:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:255:5:255:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:256:15:256:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:259:5:259:5 | x [element :a] : | semmle.label | x [element :a] : | -| hash_flow.rb:259:9:259:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:259:9:262:7 | call to each_pair [element :a] : | semmle.label | call to each_pair [element :a] : | -| hash_flow.rb:259:33:259:37 | value : | semmle.label | value : | +| hash_flow.rb:255:5:255:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:256:15:256:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:259:5:259:5 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:259:9:259:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:259:9:262:7 | call to each_pair [element :a] | semmle.label | call to each_pair [element :a] | +| hash_flow.rb:259:33:259:37 | value | semmle.label | value | | hash_flow.rb:261:14:261:18 | value | semmle.label | value | -| hash_flow.rb:263:10:263:10 | x [element :a] : | semmle.label | x [element :a] : | +| hash_flow.rb:263:10:263:10 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:263:10:263:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:270:5:270:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:271:15:271:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:274:5:274:5 | x [element :a] : | semmle.label | x [element :a] : | -| hash_flow.rb:274:9:274:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:274:9:276:7 | call to each_value [element :a] : | semmle.label | call to each_value [element :a] : | -| hash_flow.rb:274:29:274:33 | value : | semmle.label | value : | +| hash_flow.rb:270:5:270:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:271:15:271:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:274:5:274:5 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:274:9:274:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:274:9:276:7 | call to each_value [element :a] | semmle.label | call to each_value [element :a] | +| hash_flow.rb:274:29:274:33 | value | semmle.label | value | | hash_flow.rb:275:14:275:18 | value | semmle.label | value | -| hash_flow.rb:277:10:277:10 | x [element :a] : | semmle.label | x [element :a] : | +| hash_flow.rb:277:10:277:10 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:277:10:277:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:284:5:284:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:287:15:287:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:290:5:290:5 | x [element :c] : | semmle.label | x [element :c] : | -| hash_flow.rb:290:9:290:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:290:9:290:28 | call to except [element :c] : | semmle.label | call to except [element :c] : | -| hash_flow.rb:293:10:293:10 | x [element :c] : | semmle.label | x [element :c] : | +| hash_flow.rb:284:5:284:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:287:15:287:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:290:5:290:5 | x [element :c] | semmle.label | x [element :c] | +| hash_flow.rb:290:9:290:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:290:9:290:28 | call to except [element :c] | semmle.label | call to except [element :c] | +| hash_flow.rb:293:10:293:10 | x [element :c] | semmle.label | x [element :c] | | hash_flow.rb:293:10:293:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:300:5:300:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:300:5:300:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:301:15:301:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:303:15:303:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:305:5:305:5 | b : | semmle.label | b : | -| hash_flow.rb:305:9:305:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:305:9:305:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:305:9:307:7 | call to fetch : | semmle.label | call to fetch : | -| hash_flow.rb:305:20:305:30 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:305:37:305:37 | x : | semmle.label | x : | +| hash_flow.rb:300:5:300:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:300:5:300:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:301:15:301:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:303:15:303:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:305:5:305:5 | b | semmle.label | b | +| hash_flow.rb:305:9:305:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:305:9:305:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:305:9:307:7 | call to fetch | semmle.label | call to fetch | +| hash_flow.rb:305:20:305:30 | call to taint | semmle.label | call to taint | +| hash_flow.rb:305:37:305:37 | x | semmle.label | x | | hash_flow.rb:306:14:306:14 | x | semmle.label | x | | hash_flow.rb:308:10:308:10 | b | semmle.label | b | -| hash_flow.rb:309:5:309:5 | b : | semmle.label | b : | -| hash_flow.rb:309:9:309:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:309:9:309:22 | call to fetch : | semmle.label | call to fetch : | +| hash_flow.rb:309:5:309:5 | b | semmle.label | b | +| hash_flow.rb:309:9:309:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:309:9:309:22 | call to fetch | semmle.label | call to fetch | | hash_flow.rb:310:10:310:10 | b | semmle.label | b | -| hash_flow.rb:311:5:311:5 | b : | semmle.label | b : | -| hash_flow.rb:311:9:311:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:311:9:311:35 | call to fetch : | semmle.label | call to fetch : | -| hash_flow.rb:311:24:311:34 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:311:5:311:5 | b | semmle.label | b | +| hash_flow.rb:311:9:311:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:311:9:311:35 | call to fetch | semmle.label | call to fetch | +| hash_flow.rb:311:24:311:34 | call to taint | semmle.label | call to taint | | hash_flow.rb:312:10:312:10 | b | semmle.label | b | -| hash_flow.rb:313:5:313:5 | b : | semmle.label | b : | -| hash_flow.rb:313:9:313:35 | call to fetch : | semmle.label | call to fetch : | -| hash_flow.rb:313:24:313:34 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:313:5:313:5 | b | semmle.label | b | +| hash_flow.rb:313:9:313:35 | call to fetch | semmle.label | call to fetch | +| hash_flow.rb:313:24:313:34 | call to taint | semmle.label | call to taint | | hash_flow.rb:314:10:314:10 | b | semmle.label | b | -| hash_flow.rb:315:5:315:5 | b : | semmle.label | b : | -| hash_flow.rb:315:9:315:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:315:9:315:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:315:9:315:34 | call to fetch : | semmle.label | call to fetch : | -| hash_flow.rb:315:23:315:33 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:315:5:315:5 | b | semmle.label | b | +| hash_flow.rb:315:9:315:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:315:9:315:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:315:9:315:34 | call to fetch | semmle.label | call to fetch | +| hash_flow.rb:315:23:315:33 | call to taint | semmle.label | call to taint | | hash_flow.rb:316:10:316:10 | b | semmle.label | b | -| hash_flow.rb:322:5:322:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:322:5:322:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:323:15:323:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:325:15:325:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:327:5:327:5 | b [element] : | semmle.label | b [element] : | -| hash_flow.rb:327:9:327:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:327:9:327:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | semmle.label | call to fetch_values [element] : | -| hash_flow.rb:327:27:327:37 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:327:44:327:44 | x : | semmle.label | x : | +| hash_flow.rb:322:5:322:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:322:5:322:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:323:15:323:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:325:15:325:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:327:5:327:5 | b [element] | semmle.label | b [element] | +| hash_flow.rb:327:9:327:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:327:9:327:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:327:9:330:7 | call to fetch_values [element] | semmle.label | call to fetch_values [element] | +| hash_flow.rb:327:27:327:37 | call to taint | semmle.label | call to taint | +| hash_flow.rb:327:44:327:44 | x | semmle.label | x | | hash_flow.rb:328:14:328:14 | x | semmle.label | x | -| hash_flow.rb:329:9:329:19 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:331:10:331:10 | b [element] : | semmle.label | b [element] : | +| hash_flow.rb:329:9:329:19 | call to taint | semmle.label | call to taint | +| hash_flow.rb:331:10:331:10 | b [element] | semmle.label | b [element] | | hash_flow.rb:331:10:331:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:332:5:332:5 | b [element] : | semmle.label | b [element] : | -| hash_flow.rb:332:9:332:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:332:9:332:29 | call to fetch_values [element] : | semmle.label | call to fetch_values [element] : | -| hash_flow.rb:333:10:333:10 | b [element] : | semmle.label | b [element] : | +| hash_flow.rb:332:5:332:5 | b [element] | semmle.label | b [element] | +| hash_flow.rb:332:9:332:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:332:9:332:29 | call to fetch_values [element] | semmle.label | call to fetch_values [element] | +| hash_flow.rb:333:10:333:10 | b [element] | semmle.label | b [element] | | hash_flow.rb:333:10:333:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:334:5:334:5 | b [element] : | semmle.label | b [element] : | -| hash_flow.rb:334:9:334:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:334:9:334:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:334:9:334:31 | call to fetch_values [element] : | semmle.label | call to fetch_values [element] : | -| hash_flow.rb:335:10:335:10 | b [element] : | semmle.label | b [element] : | +| hash_flow.rb:334:5:334:5 | b [element] | semmle.label | b [element] | +| hash_flow.rb:334:9:334:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:334:9:334:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:334:9:334:31 | call to fetch_values [element] | semmle.label | call to fetch_values [element] | +| hash_flow.rb:335:10:335:10 | b [element] | semmle.label | b [element] | | hash_flow.rb:335:10:335:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:341:5:341:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:341:5:341:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:342:15:342:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:344:15:344:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:346:5:346:5 | b [element :a] : | semmle.label | b [element :a] : | -| hash_flow.rb:346:9:346:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:346:9:346:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:346:9:350:7 | call to filter [element :a] : | semmle.label | call to filter [element :a] : | -| hash_flow.rb:346:30:346:34 | value : | semmle.label | value : | +| hash_flow.rb:341:5:341:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:341:5:341:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:342:15:342:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:344:15:344:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:346:5:346:5 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:346:9:346:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:346:9:346:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:346:9:350:7 | call to filter [element :a] | semmle.label | call to filter [element :a] | +| hash_flow.rb:346:30:346:34 | value | semmle.label | value | | hash_flow.rb:348:14:348:18 | value | semmle.label | value | | hash_flow.rb:351:10:351:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:351:11:351:11 | b [element :a] : | semmle.label | b [element :a] : | -| hash_flow.rb:351:11:351:15 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:357:5:357:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:357:5:357:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:358:15:358:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:360:15:360:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:362:5:362:8 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:362:5:362:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:362:5:362:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:362:27:362:31 | value : | semmle.label | value : | +| hash_flow.rb:351:11:351:11 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:351:11:351:15 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:357:5:357:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:357:5:357:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:358:15:358:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:360:15:360:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:362:5:362:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:362:5:362:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:362:5:362:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:362:27:362:31 | value | semmle.label | value | | hash_flow.rb:364:14:364:18 | value | semmle.label | value | | hash_flow.rb:367:10:367:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:367:11:367:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:367:11:367:18 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:373:5:373:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:373:5:373:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:374:15:374:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:376:15:376:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:378:5:378:5 | b [element] : | semmle.label | b [element] : | -| hash_flow.rb:378:9:378:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:378:9:378:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:378:9:378:20 | call to flatten [element] : | semmle.label | call to flatten [element] : | +| hash_flow.rb:367:11:367:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:367:11:367:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:373:5:373:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:373:5:373:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:374:15:374:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:376:15:376:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:378:5:378:5 | b [element] | semmle.label | b [element] | +| hash_flow.rb:378:9:378:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:378:9:378:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:378:9:378:20 | call to flatten [element] | semmle.label | call to flatten [element] | | hash_flow.rb:379:10:379:15 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:379:11:379:11 | b [element] : | semmle.label | b [element] : | -| hash_flow.rb:379:11:379:14 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:385:5:385:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:385:5:385:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:386:15:386:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:388:15:388:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:390:5:390:5 | b [element :a] : | semmle.label | b [element :a] : | -| hash_flow.rb:390:9:390:12 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:390:9:390:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:390:9:390:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:390:9:394:7 | call to keep_if [element :a] : | semmle.label | call to keep_if [element :a] : | -| hash_flow.rb:390:31:390:35 | value : | semmle.label | value : | +| hash_flow.rb:379:11:379:11 | b [element] | semmle.label | b [element] | +| hash_flow.rb:379:11:379:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:385:5:385:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:385:5:385:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:386:15:386:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:388:15:388:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:390:5:390:5 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:390:9:390:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:390:9:390:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:390:9:390:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:390:9:394:7 | call to keep_if [element :a] | semmle.label | call to keep_if [element :a] | +| hash_flow.rb:390:31:390:35 | value | semmle.label | value | | hash_flow.rb:392:14:392:18 | value | semmle.label | value | | hash_flow.rb:395:10:395:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:395:11:395:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:395:11:395:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:395:11:395:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:395:11:395:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:396:10:396:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:396:11:396:11 | b [element :a] : | semmle.label | b [element :a] : | -| hash_flow.rb:396:11:396:15 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:402:5:402:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:402:5:402:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:403:15:403:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:405:15:405:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:407:5:407:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:407:5:407:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:408:15:408:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:410:15:410:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:412:5:412:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:412:5:412:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:412:5:412:8 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:412:5:412:8 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:412:12:412:16 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:412:12:412:16 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :a] : | semmle.label | call to merge [element :a] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :c] : | semmle.label | call to merge [element :c] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :d] : | semmle.label | call to merge [element :d] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :f] : | semmle.label | call to merge [element :f] : | -| hash_flow.rb:412:24:412:28 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:412:24:412:28 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:412:40:412:48 | old_value : | semmle.label | old_value : | -| hash_flow.rb:412:51:412:59 | new_value : | semmle.label | new_value : | +| hash_flow.rb:396:11:396:11 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:396:11:396:15 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:402:5:402:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:402:5:402:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:403:15:403:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:405:15:405:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:407:5:407:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:407:5:407:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:408:15:408:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:410:15:410:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:412:5:412:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:412:5:412:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:412:5:412:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:412:5:412:8 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:412:12:412:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:412:12:412:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:412:12:416:7 | call to merge [element :a] | semmle.label | call to merge [element :a] | +| hash_flow.rb:412:12:416:7 | call to merge [element :c] | semmle.label | call to merge [element :c] | +| hash_flow.rb:412:12:416:7 | call to merge [element :d] | semmle.label | call to merge [element :d] | +| hash_flow.rb:412:12:416:7 | call to merge [element :f] | semmle.label | call to merge [element :f] | +| hash_flow.rb:412:24:412:28 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:412:24:412:28 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:412:40:412:48 | old_value | semmle.label | old_value | +| hash_flow.rb:412:51:412:59 | new_value | semmle.label | new_value | | hash_flow.rb:414:14:414:22 | old_value | semmle.label | old_value | | hash_flow.rb:415:14:415:22 | new_value | semmle.label | new_value | | hash_flow.rb:417:10:417:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:417:11:417:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:417:11:417:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:417:11:417:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:417:11:417:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:419:10:419:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:419:11:419:14 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:419:11:419:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:419:11:419:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:419:11:419:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:420:10:420:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:420:11:420:14 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:420:11:420:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:420:11:420:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:420:11:420:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:422:10:422:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:422:11:422:14 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:422:11:422:18 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:428:5:428:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:428:5:428:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:429:15:429:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:431:15:431:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:433:5:433:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:433:5:433:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:434:15:434:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:436:15:436:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:438:5:438:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:438:5:438:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:438:5:438:8 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:438:5:438:8 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :f] : | semmle.label | [post] hash1 [element :f] : | -| hash_flow.rb:438:12:438:16 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:438:12:438:16 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :a] : | semmle.label | call to merge! [element :a] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :c] : | semmle.label | call to merge! [element :c] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :d] : | semmle.label | call to merge! [element :d] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :f] : | semmle.label | call to merge! [element :f] : | -| hash_flow.rb:438:25:438:29 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:438:25:438:29 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:438:41:438:49 | old_value : | semmle.label | old_value : | -| hash_flow.rb:438:52:438:60 | new_value : | semmle.label | new_value : | +| hash_flow.rb:422:11:422:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:422:11:422:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:428:5:428:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:428:5:428:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:429:15:429:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:431:15:431:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:433:5:433:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:433:5:433:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:434:15:434:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:436:15:436:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:438:5:438:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:438:5:438:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:438:5:438:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:438:5:438:8 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | +| hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | +| hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | +| hash_flow.rb:438:12:438:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | +| hash_flow.rb:438:12:438:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:438:12:438:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:438:12:442:7 | call to merge! [element :a] | semmle.label | call to merge! [element :a] | +| hash_flow.rb:438:12:442:7 | call to merge! [element :c] | semmle.label | call to merge! [element :c] | +| hash_flow.rb:438:12:442:7 | call to merge! [element :d] | semmle.label | call to merge! [element :d] | +| hash_flow.rb:438:12:442:7 | call to merge! [element :f] | semmle.label | call to merge! [element :f] | +| hash_flow.rb:438:25:438:29 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:438:25:438:29 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:438:41:438:49 | old_value | semmle.label | old_value | +| hash_flow.rb:438:52:438:60 | new_value | semmle.label | new_value | | hash_flow.rb:440:14:440:22 | old_value | semmle.label | old_value | | hash_flow.rb:441:14:441:22 | new_value | semmle.label | new_value | | hash_flow.rb:443:10:443:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:443:11:443:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:443:11:443:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:443:11:443:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:443:11:443:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:445:10:445:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:445:11:445:14 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:445:11:445:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:445:11:445:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:445:11:445:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:446:10:446:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:446:11:446:14 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:446:11:446:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:446:11:446:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:446:11:446:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:448:10:448:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:448:11:448:14 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:448:11:448:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:448:11:448:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:448:11:448:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:450:10:450:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:450:11:450:15 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:450:11:450:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:450:11:450:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:450:11:450:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:452:10:452:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:452:11:452:15 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:452:11:452:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:452:11:452:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:452:11:452:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:453:10:453:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:453:11:453:15 | hash1 [element :d] : | semmle.label | hash1 [element :d] : | -| hash_flow.rb:453:11:453:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:453:11:453:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:453:11:453:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:455:10:455:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:455:11:455:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | -| hash_flow.rb:455:11:455:19 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:461:5:461:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:462:15:462:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:465:5:465:5 | b [element 1] : | semmle.label | b [element 1] : | -| hash_flow.rb:465:9:465:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:465:9:465:22 | call to rassoc [element 1] : | semmle.label | call to rassoc [element 1] : | -| hash_flow.rb:467:10:467:10 | b [element 1] : | semmle.label | b [element 1] : | +| hash_flow.rb:455:11:455:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:455:11:455:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:461:5:461:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:462:15:462:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:465:5:465:5 | b [element 1] | semmle.label | b [element 1] | +| hash_flow.rb:465:9:465:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:465:9:465:22 | call to rassoc [element 1] | semmle.label | call to rassoc [element 1] | +| hash_flow.rb:467:10:467:10 | b [element 1] | semmle.label | b [element 1] | | hash_flow.rb:467:10:467:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:473:5:473:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:474:15:474:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:477:5:477:5 | b [element :a] : | semmle.label | b [element :a] : | -| hash_flow.rb:477:9:477:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:477:9:481:7 | call to reject [element :a] : | semmle.label | call to reject [element :a] : | -| hash_flow.rb:477:29:477:33 | value : | semmle.label | value : | +| hash_flow.rb:473:5:473:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:474:15:474:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:477:5:477:5 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:477:9:477:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:477:9:481:7 | call to reject [element :a] | semmle.label | call to reject [element :a] | +| hash_flow.rb:477:29:477:33 | value | semmle.label | value | | hash_flow.rb:479:14:479:18 | value | semmle.label | value | -| hash_flow.rb:482:10:482:10 | b [element :a] : | semmle.label | b [element :a] : | +| hash_flow.rb:482:10:482:10 | b [element :a] | semmle.label | b [element :a] | | hash_flow.rb:482:10:482:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:488:5:488:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:489:15:489:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:492:5:492:5 | b [element :a] : | semmle.label | b [element :a] : | -| hash_flow.rb:492:9:492:12 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:492:9:492:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:492:9:496:7 | call to reject! [element :a] : | semmle.label | call to reject! [element :a] : | -| hash_flow.rb:492:30:492:34 | value : | semmle.label | value : | +| hash_flow.rb:488:5:488:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:489:15:489:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:492:5:492:5 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:492:9:492:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:492:9:492:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:492:9:496:7 | call to reject! [element :a] | semmle.label | call to reject! [element :a] | +| hash_flow.rb:492:30:492:34 | value | semmle.label | value | | hash_flow.rb:494:14:494:18 | value | semmle.label | value | -| hash_flow.rb:497:10:497:10 | b [element :a] : | semmle.label | b [element :a] : | +| hash_flow.rb:497:10:497:10 | b [element :a] | semmle.label | b [element :a] | | hash_flow.rb:497:10:497:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:498:10:498:13 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:498:10:498:13 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:498:10:498:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:504:5:504:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:504:5:504:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:505:15:505:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:507:15:507:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] : | semmle.label | [post] hash2 [element :a] : | -| hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] : | semmle.label | [post] hash2 [element :c] : | -| hash_flow.rb:512:19:512:22 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:512:19:512:22 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:504:5:504:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:504:5:504:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:505:15:505:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:507:15:507:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] | semmle.label | [post] hash2 [element :a] | +| hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] | semmle.label | [post] hash2 [element :c] | +| hash_flow.rb:512:19:512:22 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:512:19:512:22 | hash [element :c] | semmle.label | hash [element :c] | | hash_flow.rb:513:10:513:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:513:11:513:15 | hash2 [element :a] : | semmle.label | hash2 [element :a] : | -| hash_flow.rb:513:11:513:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:513:11:513:15 | hash2 [element :a] | semmle.label | hash2 [element :a] | +| hash_flow.rb:513:11:513:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:515:10:515:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:515:11:515:15 | hash2 [element :c] : | semmle.label | hash2 [element :c] : | -| hash_flow.rb:515:11:515:19 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:519:5:519:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:519:5:519:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:520:15:520:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:522:15:522:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:524:5:524:5 | b [element :a] : | semmle.label | b [element :a] : | -| hash_flow.rb:524:9:524:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:524:9:524:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:524:9:528:7 | call to select [element :a] : | semmle.label | call to select [element :a] : | -| hash_flow.rb:524:30:524:34 | value : | semmle.label | value : | +| hash_flow.rb:515:11:515:15 | hash2 [element :c] | semmle.label | hash2 [element :c] | +| hash_flow.rb:515:11:515:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:519:5:519:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:519:5:519:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:520:15:520:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:522:15:522:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:524:5:524:5 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:524:9:524:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:524:9:524:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:524:9:528:7 | call to select [element :a] | semmle.label | call to select [element :a] | +| hash_flow.rb:524:30:524:34 | value | semmle.label | value | | hash_flow.rb:526:14:526:18 | value | semmle.label | value | | hash_flow.rb:529:10:529:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:529:11:529:11 | b [element :a] : | semmle.label | b [element :a] : | -| hash_flow.rb:529:11:529:15 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:535:5:535:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:535:5:535:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:536:15:536:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:538:15:538:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:540:5:540:8 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:540:5:540:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:540:5:540:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:540:27:540:31 | value : | semmle.label | value : | +| hash_flow.rb:529:11:529:11 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:529:11:529:15 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:535:5:535:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:535:5:535:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:536:15:536:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:538:15:538:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:540:5:540:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:540:5:540:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:540:5:540:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:540:27:540:31 | value | semmle.label | value | | hash_flow.rb:542:14:542:18 | value | semmle.label | value | | hash_flow.rb:545:10:545:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:545:11:545:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:545:11:545:18 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:551:5:551:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:551:5:551:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:552:15:552:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:554:15:554:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:556:5:556:5 | b [element 1] : | semmle.label | b [element 1] : | -| hash_flow.rb:556:9:556:12 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | -| hash_flow.rb:556:9:556:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:556:9:556:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:556:9:556:18 | call to shift [element 1] : | semmle.label | call to shift [element 1] : | +| hash_flow.rb:545:11:545:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:545:11:545:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:551:5:551:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:551:5:551:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:552:15:552:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:554:15:554:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:556:5:556:5 | b [element 1] | semmle.label | b [element 1] | +| hash_flow.rb:556:9:556:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:556:9:556:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:556:9:556:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:556:9:556:18 | call to shift [element 1] | semmle.label | call to shift [element 1] | | hash_flow.rb:557:10:557:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:557:11:557:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:557:11:557:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:557:11:557:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:557:11:557:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:559:10:559:15 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:559:11:559:11 | b [element 1] : | semmle.label | b [element 1] : | -| hash_flow.rb:559:11:559:14 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:565:5:565:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:565:5:565:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:566:15:566:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:568:15:568:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:570:5:570:5 | b [element :a] : | semmle.label | b [element :a] : | -| hash_flow.rb:570:9:570:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:570:9:570:26 | call to slice [element :a] : | semmle.label | call to slice [element :a] : | +| hash_flow.rb:559:11:559:11 | b [element 1] | semmle.label | b [element 1] | +| hash_flow.rb:559:11:559:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:565:5:565:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:565:5:565:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:566:15:566:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:568:15:568:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:570:5:570:5 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:570:9:570:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:570:9:570:26 | call to slice [element :a] | semmle.label | call to slice [element :a] | | hash_flow.rb:571:10:571:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:571:11:571:11 | b [element :a] : | semmle.label | b [element :a] : | -| hash_flow.rb:571:11:571:15 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:575:5:575:5 | c [element :a] : | semmle.label | c [element :a] : | -| hash_flow.rb:575:5:575:5 | c [element :c] : | semmle.label | c [element :c] : | -| hash_flow.rb:575:9:575:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:575:9:575:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:575:9:575:25 | call to slice [element :a] : | semmle.label | call to slice [element :a] : | -| hash_flow.rb:575:9:575:25 | call to slice [element :c] : | semmle.label | call to slice [element :c] : | +| hash_flow.rb:571:11:571:11 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:571:11:571:15 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:575:5:575:5 | c [element :a] | semmle.label | c [element :a] | +| hash_flow.rb:575:5:575:5 | c [element :c] | semmle.label | c [element :c] | +| hash_flow.rb:575:9:575:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:575:9:575:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:575:9:575:25 | call to slice [element :a] | semmle.label | call to slice [element :a] | +| hash_flow.rb:575:9:575:25 | call to slice [element :c] | semmle.label | call to slice [element :c] | | hash_flow.rb:576:10:576:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:576:11:576:11 | c [element :a] : | semmle.label | c [element :a] : | -| hash_flow.rb:576:11:576:15 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:576:11:576:11 | c [element :a] | semmle.label | c [element :a] | +| hash_flow.rb:576:11:576:15 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:578:10:578:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:578:11:578:11 | c [element :c] : | semmle.label | c [element :c] : | -| hash_flow.rb:578:11:578:15 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:584:5:584:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:584:5:584:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:585:15:585:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:587:15:587:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:589:5:589:5 | a [element, element 1] : | semmle.label | a [element, element 1] : | -| hash_flow.rb:589:9:589:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:589:9:589:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] : | semmle.label | call to to_a [element, element 1] : | +| hash_flow.rb:578:11:578:11 | c [element :c] | semmle.label | c [element :c] | +| hash_flow.rb:578:11:578:15 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:584:5:584:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:584:5:584:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:585:15:585:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:587:15:587:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:589:5:589:5 | a [element, element 1] | semmle.label | a [element, element 1] | +| hash_flow.rb:589:9:589:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:589:9:589:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] | semmle.label | call to to_a [element, element 1] | | hash_flow.rb:591:10:591:18 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:591:11:591:11 | a [element, element 1] : | semmle.label | a [element, element 1] : | -| hash_flow.rb:591:11:591:14 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| hash_flow.rb:591:11:591:17 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:597:5:597:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:597:5:597:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:598:15:598:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:600:15:600:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:602:5:602:5 | a [element :a] : | semmle.label | a [element :a] : | -| hash_flow.rb:602:5:602:5 | a [element :c] : | semmle.label | a [element :c] : | -| hash_flow.rb:602:9:602:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:602:9:602:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:602:9:602:17 | call to to_h [element :a] : | semmle.label | call to to_h [element :a] : | -| hash_flow.rb:602:9:602:17 | call to to_h [element :c] : | semmle.label | call to to_h [element :c] : | +| hash_flow.rb:591:11:591:11 | a [element, element 1] | semmle.label | a [element, element 1] | +| hash_flow.rb:591:11:591:14 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| hash_flow.rb:591:11:591:17 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:597:5:597:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:597:5:597:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:598:15:598:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:600:15:600:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:602:5:602:5 | a [element :a] | semmle.label | a [element :a] | +| hash_flow.rb:602:5:602:5 | a [element :c] | semmle.label | a [element :c] | +| hash_flow.rb:602:9:602:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:602:9:602:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:602:9:602:17 | call to to_h [element :a] | semmle.label | call to to_h [element :a] | +| hash_flow.rb:602:9:602:17 | call to to_h [element :c] | semmle.label | call to to_h [element :c] | | hash_flow.rb:603:10:603:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:603:11:603:11 | a [element :a] : | semmle.label | a [element :a] : | -| hash_flow.rb:603:11:603:15 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:603:11:603:11 | a [element :a] | semmle.label | a [element :a] | +| hash_flow.rb:603:11:603:15 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:605:10:605:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:605:11:605:11 | a [element :c] : | semmle.label | a [element :c] : | -| hash_flow.rb:605:11:605:15 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:607:5:607:5 | b [element] : | semmle.label | b [element] : | -| hash_flow.rb:607:9:607:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:607:9:607:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:607:9:611:7 | call to to_h [element] : | semmle.label | call to to_h [element] : | -| hash_flow.rb:607:28:607:32 | value : | semmle.label | value : | +| hash_flow.rb:605:11:605:11 | a [element :c] | semmle.label | a [element :c] | +| hash_flow.rb:605:11:605:15 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:607:5:607:5 | b [element] | semmle.label | b [element] | +| hash_flow.rb:607:9:607:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:607:9:607:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:607:9:611:7 | call to to_h [element] | semmle.label | call to to_h [element] | +| hash_flow.rb:607:28:607:32 | value | semmle.label | value | | hash_flow.rb:609:14:609:18 | value | semmle.label | value | -| hash_flow.rb:610:14:610:24 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:610:14:610:24 | call to taint | semmle.label | call to taint | | hash_flow.rb:612:10:612:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:612:11:612:11 | b [element] : | semmle.label | b [element] : | -| hash_flow.rb:612:11:612:15 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:618:5:618:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:618:5:618:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:619:15:619:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:621:15:621:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:623:5:623:5 | a [element] : | semmle.label | a [element] : | -| hash_flow.rb:623:9:623:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:623:9:623:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | semmle.label | call to transform_keys [element] : | +| hash_flow.rb:612:11:612:11 | b [element] | semmle.label | b [element] | +| hash_flow.rb:612:11:612:15 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:618:5:618:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:618:5:618:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:619:15:619:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:621:15:621:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:623:5:623:5 | a [element] | semmle.label | a [element] | +| hash_flow.rb:623:9:623:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:623:9:623:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:623:9:623:45 | call to transform_keys [element] | semmle.label | call to transform_keys [element] | | hash_flow.rb:624:10:624:17 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:624:11:624:11 | a [element] : | semmle.label | a [element] : | -| hash_flow.rb:624:11:624:16 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:624:11:624:11 | a [element] | semmle.label | a [element] | +| hash_flow.rb:624:11:624:16 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:625:10:625:17 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:625:11:625:11 | a [element] : | semmle.label | a [element] : | -| hash_flow.rb:625:11:625:16 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:625:11:625:11 | a [element] | semmle.label | a [element] | +| hash_flow.rb:625:11:625:16 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:626:10:626:17 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:626:11:626:11 | a [element] : | semmle.label | a [element] : | -| hash_flow.rb:626:11:626:16 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:632:5:632:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:632:5:632:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:633:15:633:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:635:15:635:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:637:5:637:8 | [post] hash [element] : | semmle.label | [post] hash [element] : | -| hash_flow.rb:637:15:637:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:639:5:639:8 | [post] hash [element] : | semmle.label | [post] hash [element] : | -| hash_flow.rb:639:5:639:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:639:5:639:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:639:5:639:8 | hash [element] : | semmle.label | hash [element] : | +| hash_flow.rb:626:11:626:11 | a [element] | semmle.label | a [element] | +| hash_flow.rb:626:11:626:16 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:632:5:632:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:632:5:632:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:633:15:633:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:635:15:635:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:637:5:637:8 | [post] hash [element] | semmle.label | [post] hash [element] | +| hash_flow.rb:637:15:637:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:639:5:639:8 | [post] hash [element] | semmle.label | [post] hash [element] | +| hash_flow.rb:639:5:639:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:639:5:639:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:639:5:639:8 | hash [element] | semmle.label | hash [element] | | hash_flow.rb:640:10:640:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:640:11:640:14 | hash [element] : | semmle.label | hash [element] : | -| hash_flow.rb:640:11:640:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:640:11:640:14 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:640:11:640:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:641:10:641:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:641:11:641:14 | hash [element] : | semmle.label | hash [element] : | -| hash_flow.rb:641:11:641:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:641:11:641:14 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:641:11:641:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:642:10:642:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:642:11:642:14 | hash [element] : | semmle.label | hash [element] : | -| hash_flow.rb:642:11:642:19 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:648:5:648:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:648:5:648:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:649:15:649:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:651:15:651:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:653:5:653:5 | b [element] : | semmle.label | b [element] : | -| hash_flow.rb:653:9:653:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:653:9:653:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:653:9:656:7 | call to transform_values [element] : | semmle.label | call to transform_values [element] : | -| hash_flow.rb:653:35:653:39 | value : | semmle.label | value : | +| hash_flow.rb:642:11:642:14 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:642:11:642:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:648:5:648:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:648:5:648:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:649:15:649:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:651:15:651:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:653:5:653:5 | b [element] | semmle.label | b [element] | +| hash_flow.rb:653:9:653:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:653:9:653:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:653:9:656:7 | call to transform_values [element] | semmle.label | call to transform_values [element] | +| hash_flow.rb:653:35:653:39 | value | semmle.label | value | | hash_flow.rb:654:14:654:18 | value | semmle.label | value | -| hash_flow.rb:655:9:655:19 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:655:9:655:19 | call to taint | semmle.label | call to taint | | hash_flow.rb:657:10:657:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:657:11:657:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:657:11:657:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:657:11:657:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:657:11:657:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:658:10:658:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:658:11:658:11 | b [element] : | semmle.label | b [element] : | -| hash_flow.rb:658:11:658:15 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:664:5:664:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:664:5:664:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:665:15:665:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:667:15:667:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:669:5:669:8 | [post] hash [element] : | semmle.label | [post] hash [element] : | -| hash_flow.rb:669:5:669:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:669:5:669:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:669:32:669:36 | value : | semmle.label | value : | +| hash_flow.rb:658:11:658:11 | b [element] | semmle.label | b [element] | +| hash_flow.rb:658:11:658:15 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:664:5:664:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:664:5:664:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:665:15:665:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:667:15:667:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:669:5:669:8 | [post] hash [element] | semmle.label | [post] hash [element] | +| hash_flow.rb:669:5:669:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:669:5:669:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:669:32:669:36 | value | semmle.label | value | | hash_flow.rb:670:14:670:18 | value | semmle.label | value | -| hash_flow.rb:671:9:671:19 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:671:9:671:19 | call to taint | semmle.label | call to taint | | hash_flow.rb:673:10:673:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:673:11:673:14 | hash [element] : | semmle.label | hash [element] : | -| hash_flow.rb:673:11:673:18 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:679:5:679:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:679:5:679:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:680:15:680:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:682:15:682:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:684:5:684:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:684:5:684:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:685:15:685:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:687:15:687:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:689:5:689:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:689:5:689:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:689:5:689:8 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:689:5:689:8 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :f] : | semmle.label | [post] hash1 [element :f] : | -| hash_flow.rb:689:12:689:16 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:689:12:689:16 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:689:12:693:7 | call to update [element :a] : | semmle.label | call to update [element :a] : | -| hash_flow.rb:689:12:693:7 | call to update [element :c] : | semmle.label | call to update [element :c] : | -| hash_flow.rb:689:12:693:7 | call to update [element :d] : | semmle.label | call to update [element :d] : | -| hash_flow.rb:689:12:693:7 | call to update [element :f] : | semmle.label | call to update [element :f] : | -| hash_flow.rb:689:25:689:29 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:689:25:689:29 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:689:41:689:49 | old_value : | semmle.label | old_value : | -| hash_flow.rb:689:52:689:60 | new_value : | semmle.label | new_value : | +| hash_flow.rb:673:11:673:14 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:673:11:673:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:679:5:679:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:679:5:679:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:680:15:680:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:682:15:682:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:684:5:684:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:684:5:684:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:685:15:685:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:687:15:687:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:689:5:689:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:689:5:689:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:689:5:689:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:689:5:689:8 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | +| hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | +| hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | +| hash_flow.rb:689:12:689:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | +| hash_flow.rb:689:12:689:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:689:12:689:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:689:12:693:7 | call to update [element :a] | semmle.label | call to update [element :a] | +| hash_flow.rb:689:12:693:7 | call to update [element :c] | semmle.label | call to update [element :c] | +| hash_flow.rb:689:12:693:7 | call to update [element :d] | semmle.label | call to update [element :d] | +| hash_flow.rb:689:12:693:7 | call to update [element :f] | semmle.label | call to update [element :f] | +| hash_flow.rb:689:25:689:29 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:689:25:689:29 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:689:41:689:49 | old_value | semmle.label | old_value | +| hash_flow.rb:689:52:689:60 | new_value | semmle.label | new_value | | hash_flow.rb:691:14:691:22 | old_value | semmle.label | old_value | | hash_flow.rb:692:14:692:22 | new_value | semmle.label | new_value | | hash_flow.rb:694:10:694:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:694:11:694:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:694:11:694:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:694:11:694:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:694:11:694:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:696:10:696:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:696:11:696:14 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:696:11:696:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:696:11:696:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:696:11:696:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:697:10:697:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:697:11:697:14 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:697:11:697:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:697:11:697:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:697:11:697:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:699:10:699:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:699:11:699:14 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:699:11:699:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:699:11:699:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:699:11:699:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:701:10:701:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:701:11:701:15 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:701:11:701:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:701:11:701:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:701:11:701:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:703:10:703:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:703:11:703:15 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:703:11:703:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:703:11:703:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:703:11:703:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:704:10:704:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:704:11:704:15 | hash1 [element :d] : | semmle.label | hash1 [element :d] : | -| hash_flow.rb:704:11:704:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:704:11:704:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:704:11:704:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:706:10:706:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:706:11:706:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | -| hash_flow.rb:706:11:706:19 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:712:5:712:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:712:5:712:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:713:15:713:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:715:15:715:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:717:5:717:5 | a [element] : | semmle.label | a [element] : | -| hash_flow.rb:717:9:717:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:717:9:717:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:717:9:717:19 | call to values [element] : | semmle.label | call to values [element] : | +| hash_flow.rb:706:11:706:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:706:11:706:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:712:5:712:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:712:5:712:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:713:15:713:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:715:15:715:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:717:5:717:5 | a [element] | semmle.label | a [element] | +| hash_flow.rb:717:9:717:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:717:9:717:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:717:9:717:19 | call to values [element] | semmle.label | call to values [element] | | hash_flow.rb:718:10:718:15 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:718:11:718:11 | a [element] : | semmle.label | a [element] : | -| hash_flow.rb:718:11:718:14 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:724:5:724:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:724:5:724:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:725:15:725:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:727:15:727:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:729:5:729:5 | b [element 0] : | semmle.label | b [element 0] : | -| hash_flow.rb:729:9:729:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:729:9:729:26 | call to values_at [element 0] : | semmle.label | call to values_at [element 0] : | -| hash_flow.rb:730:10:730:10 | b [element 0] : | semmle.label | b [element 0] : | +| hash_flow.rb:718:11:718:11 | a [element] | semmle.label | a [element] | +| hash_flow.rb:718:11:718:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:724:5:724:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:724:5:724:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:725:15:725:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:727:15:727:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:729:5:729:5 | b [element 0] | semmle.label | b [element 0] | +| hash_flow.rb:729:9:729:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:729:9:729:26 | call to values_at [element 0] | semmle.label | call to values_at [element 0] | +| hash_flow.rb:730:10:730:10 | b [element 0] | semmle.label | b [element 0] | | hash_flow.rb:730:10:730:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:731:5:731:5 | b [element] : | semmle.label | b [element] : | -| hash_flow.rb:731:9:731:12 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:731:9:731:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:731:9:731:31 | call to fetch_values [element] : | semmle.label | call to fetch_values [element] : | -| hash_flow.rb:732:10:732:10 | b [element] : | semmle.label | b [element] : | +| hash_flow.rb:731:5:731:5 | b [element] | semmle.label | b [element] | +| hash_flow.rb:731:9:731:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:731:9:731:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:731:9:731:31 | call to fetch_values [element] | semmle.label | call to fetch_values [element] | +| hash_flow.rb:732:10:732:10 | b [element] | semmle.label | b [element] | | hash_flow.rb:732:10:732:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:738:5:738:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:738:5:738:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:739:15:739:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:741:15:741:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:743:5:743:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:743:5:743:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:744:15:744:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:746:15:746:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:748:5:748:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:748:5:748:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:748:5:748:8 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:748:5:748:8 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:748:5:748:8 | hash [element :g] : | semmle.label | hash [element :g] : | -| hash_flow.rb:748:14:748:20 | ** ... [element :a] : | semmle.label | ** ... [element :a] : | -| hash_flow.rb:748:14:748:20 | ** ... [element :c] : | semmle.label | ** ... [element :c] : | -| hash_flow.rb:748:16:748:20 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:748:16:748:20 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:748:29:748:39 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:748:42:748:48 | ** ... [element :d] : | semmle.label | ** ... [element :d] : | -| hash_flow.rb:748:42:748:48 | ** ... [element :f] : | semmle.label | ** ... [element :f] : | -| hash_flow.rb:748:44:748:48 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:748:44:748:48 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:749:10:749:13 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:738:5:738:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:738:5:738:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:739:15:739:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:741:15:741:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:743:5:743:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:743:5:743:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:744:15:744:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:746:15:746:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:748:5:748:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:748:5:748:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:748:5:748:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:748:5:748:8 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:748:5:748:8 | hash [element :g] | semmle.label | hash [element :g] | +| hash_flow.rb:748:14:748:20 | ** ... [element :a] | semmle.label | ** ... [element :a] | +| hash_flow.rb:748:14:748:20 | ** ... [element :c] | semmle.label | ** ... [element :c] | +| hash_flow.rb:748:16:748:20 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:748:16:748:20 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:748:29:748:39 | call to taint | semmle.label | call to taint | +| hash_flow.rb:748:42:748:48 | ** ... [element :d] | semmle.label | ** ... [element :d] | +| hash_flow.rb:748:42:748:48 | ** ... [element :f] | semmle.label | ** ... [element :f] | +| hash_flow.rb:748:44:748:48 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:748:44:748:48 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:749:10:749:13 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:749:10:749:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:751:10:751:13 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:751:10:751:13 | hash [element :c] | semmle.label | hash [element :c] | | hash_flow.rb:751:10:751:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:752:10:752:13 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:752:10:752:13 | hash [element :d] | semmle.label | hash [element :d] | | hash_flow.rb:752:10:752:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:754:10:754:13 | hash [element :f] : | semmle.label | hash [element :f] : | +| hash_flow.rb:754:10:754:13 | hash [element :f] | semmle.label | hash [element :f] | | hash_flow.rb:754:10:754:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:755:10:755:13 | hash [element :g] : | semmle.label | hash [element :g] : | +| hash_flow.rb:755:10:755:13 | hash [element :g] | semmle.label | hash [element :g] | | hash_flow.rb:755:10:755:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:762:5:762:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:762:5:762:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:762:5:762:8 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:763:15:763:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:765:15:765:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:766:15:766:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:769:10:769:13 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:762:5:762:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:762:5:762:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:762:5:762:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:763:15:763:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:765:15:765:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:766:15:766:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:769:10:769:13 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:769:10:769:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:771:10:771:13 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:771:10:771:13 | hash [element :c] | semmle.label | hash [element :c] | | hash_flow.rb:771:10:771:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:772:10:772:13 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:772:10:772:13 | hash [element :d] | semmle.label | hash [element :d] | | hash_flow.rb:772:10:772:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:774:5:774:5 | x [element :c] : | semmle.label | x [element :c] : | -| hash_flow.rb:774:9:774:12 | [post] hash [element :c] : | semmle.label | [post] hash [element :c] : | -| hash_flow.rb:774:9:774:12 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:774:9:774:31 | call to except! [element :c] : | semmle.label | call to except! [element :c] : | -| hash_flow.rb:778:10:778:10 | x [element :c] : | semmle.label | x [element :c] : | +| hash_flow.rb:774:5:774:5 | x [element :c] | semmle.label | x [element :c] | +| hash_flow.rb:774:9:774:12 | [post] hash [element :c] | semmle.label | [post] hash [element :c] | +| hash_flow.rb:774:9:774:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:774:9:774:31 | call to except! [element :c] | semmle.label | call to except! [element :c] | +| hash_flow.rb:778:10:778:10 | x [element :c] | semmle.label | x [element :c] | | hash_flow.rb:778:10:778:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:783:10:783:13 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:783:10:783:13 | hash [element :c] | semmle.label | hash [element :c] | | hash_flow.rb:783:10:783:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:790:5:790:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:790:5:790:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:791:15:791:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:793:15:793:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:795:5:795:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:795:5:795:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:796:15:796:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:798:15:798:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:800:5:800:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:800:5:800:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:800:5:800:8 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:800:5:800:8 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:800:12:800:16 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:800:12:800:16 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] : | semmle.label | call to deep_merge [element :a] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] : | semmle.label | call to deep_merge [element :c] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] : | semmle.label | call to deep_merge [element :d] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] : | semmle.label | call to deep_merge [element :f] : | -| hash_flow.rb:800:29:800:33 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:800:29:800:33 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:800:45:800:53 | old_value : | semmle.label | old_value : | -| hash_flow.rb:800:56:800:64 | new_value : | semmle.label | new_value : | +| hash_flow.rb:790:5:790:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:790:5:790:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:791:15:791:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:793:15:793:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:795:5:795:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:795:5:795:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:796:15:796:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:798:15:798:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:800:5:800:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:800:5:800:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:800:5:800:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:800:5:800:8 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:800:12:800:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:800:12:800:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] | semmle.label | call to deep_merge [element :a] | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] | semmle.label | call to deep_merge [element :c] | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] | semmle.label | call to deep_merge [element :d] | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] | semmle.label | call to deep_merge [element :f] | +| hash_flow.rb:800:29:800:33 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:800:29:800:33 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:800:45:800:53 | old_value | semmle.label | old_value | +| hash_flow.rb:800:56:800:64 | new_value | semmle.label | new_value | | hash_flow.rb:802:14:802:22 | old_value | semmle.label | old_value | | hash_flow.rb:803:14:803:22 | new_value | semmle.label | new_value | | hash_flow.rb:805:10:805:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:805:11:805:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:805:11:805:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:805:11:805:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:805:11:805:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:807:10:807:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:807:11:807:14 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:807:11:807:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:807:11:807:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:807:11:807:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:808:10:808:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:808:11:808:14 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:808:11:808:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:808:11:808:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:808:11:808:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:810:10:810:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:810:11:810:14 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:810:11:810:18 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:816:5:816:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:816:5:816:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:817:15:817:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:819:15:819:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:821:5:821:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:821:5:821:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:822:15:822:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:824:15:824:25 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:826:5:826:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:826:5:826:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:826:5:826:8 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:826:5:826:8 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :f] : | semmle.label | [post] hash1 [element :f] : | -| hash_flow.rb:826:12:826:16 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:826:12:826:16 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] : | semmle.label | call to deep_merge! [element :a] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] : | semmle.label | call to deep_merge! [element :c] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] : | semmle.label | call to deep_merge! [element :d] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] : | semmle.label | call to deep_merge! [element :f] : | -| hash_flow.rb:826:30:826:34 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:826:30:826:34 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:826:46:826:54 | old_value : | semmle.label | old_value : | -| hash_flow.rb:826:57:826:65 | new_value : | semmle.label | new_value : | +| hash_flow.rb:810:11:810:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:810:11:810:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:816:5:816:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:816:5:816:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:817:15:817:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:819:15:819:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:821:5:821:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:821:5:821:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:822:15:822:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:824:15:824:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:826:5:826:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:826:5:826:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:826:5:826:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:826:5:826:8 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | +| hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | +| hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | +| hash_flow.rb:826:12:826:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | +| hash_flow.rb:826:12:826:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:826:12:826:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] | semmle.label | call to deep_merge! [element :a] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] | semmle.label | call to deep_merge! [element :c] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] | semmle.label | call to deep_merge! [element :d] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] | semmle.label | call to deep_merge! [element :f] | +| hash_flow.rb:826:30:826:34 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:826:30:826:34 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:826:46:826:54 | old_value | semmle.label | old_value | +| hash_flow.rb:826:57:826:65 | new_value | semmle.label | new_value | | hash_flow.rb:828:14:828:22 | old_value | semmle.label | old_value | | hash_flow.rb:829:14:829:22 | new_value | semmle.label | new_value | | hash_flow.rb:831:10:831:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:831:11:831:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:831:11:831:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:831:11:831:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:831:11:831:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:833:10:833:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:833:11:833:14 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:833:11:833:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:833:11:833:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:833:11:833:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:834:10:834:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:834:11:834:14 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:834:11:834:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:834:11:834:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:834:11:834:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:836:10:836:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:836:11:836:14 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:836:11:836:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:836:11:836:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:836:11:836:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:838:10:838:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:838:11:838:15 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:838:11:838:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:838:11:838:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:838:11:838:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:840:10:840:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:840:11:840:15 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:840:11:840:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:840:11:840:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:840:11:840:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:841:10:841:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:841:11:841:15 | hash1 [element :d] : | semmle.label | hash1 [element :d] : | -| hash_flow.rb:841:11:841:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:841:11:841:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:841:11:841:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:843:10:843:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:843:11:843:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | -| hash_flow.rb:843:11:843:19 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:849:5:849:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:849:5:849:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:850:12:850:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:852:12:852:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:854:5:854:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:854:5:854:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:855:12:855:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:857:12:857:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:860:5:860:9 | hash3 [element :a] : | semmle.label | hash3 [element :a] : | -| hash_flow.rb:860:5:860:9 | hash3 [element :c] : | semmle.label | hash3 [element :c] : | -| hash_flow.rb:860:5:860:9 | hash3 [element :d] : | semmle.label | hash3 [element :d] : | -| hash_flow.rb:860:5:860:9 | hash3 [element :f] : | semmle.label | hash3 [element :f] : | -| hash_flow.rb:860:13:860:17 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:860:13:860:17 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] : | semmle.label | call to reverse_merge [element :a] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] : | semmle.label | call to reverse_merge [element :c] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] : | semmle.label | call to reverse_merge [element :d] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] : | semmle.label | call to reverse_merge [element :f] : | -| hash_flow.rb:860:33:860:37 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:860:33:860:37 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | +| hash_flow.rb:843:11:843:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:843:11:843:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:849:5:849:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:849:5:849:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:850:12:850:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:852:12:852:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:854:5:854:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:854:5:854:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:855:12:855:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:857:12:857:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:860:5:860:9 | hash3 [element :a] | semmle.label | hash3 [element :a] | +| hash_flow.rb:860:5:860:9 | hash3 [element :c] | semmle.label | hash3 [element :c] | +| hash_flow.rb:860:5:860:9 | hash3 [element :d] | semmle.label | hash3 [element :d] | +| hash_flow.rb:860:5:860:9 | hash3 [element :f] | semmle.label | hash3 [element :f] | +| hash_flow.rb:860:13:860:17 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:860:13:860:17 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] | semmle.label | call to reverse_merge [element :a] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] | semmle.label | call to reverse_merge [element :c] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] | semmle.label | call to reverse_merge [element :d] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] | semmle.label | call to reverse_merge [element :f] | +| hash_flow.rb:860:33:860:37 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:860:33:860:37 | hash2 [element :f] | semmle.label | hash2 [element :f] | | hash_flow.rb:861:10:861:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:861:11:861:15 | hash3 [element :a] : | semmle.label | hash3 [element :a] : | -| hash_flow.rb:861:11:861:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:861:11:861:15 | hash3 [element :a] | semmle.label | hash3 [element :a] | +| hash_flow.rb:861:11:861:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:863:10:863:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:863:11:863:15 | hash3 [element :c] : | semmle.label | hash3 [element :c] : | -| hash_flow.rb:863:11:863:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:863:11:863:15 | hash3 [element :c] | semmle.label | hash3 [element :c] | +| hash_flow.rb:863:11:863:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:864:10:864:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:864:11:864:15 | hash3 [element :d] : | semmle.label | hash3 [element :d] : | -| hash_flow.rb:864:11:864:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:864:11:864:15 | hash3 [element :d] | semmle.label | hash3 [element :d] | +| hash_flow.rb:864:11:864:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:866:10:866:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:866:11:866:15 | hash3 [element :f] : | semmle.label | hash3 [element :f] : | -| hash_flow.rb:866:11:866:19 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:869:5:869:9 | hash4 [element :a] : | semmle.label | hash4 [element :a] : | -| hash_flow.rb:869:5:869:9 | hash4 [element :c] : | semmle.label | hash4 [element :c] : | -| hash_flow.rb:869:5:869:9 | hash4 [element :d] : | semmle.label | hash4 [element :d] : | -| hash_flow.rb:869:5:869:9 | hash4 [element :f] : | semmle.label | hash4 [element :f] : | -| hash_flow.rb:869:13:869:17 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:869:13:869:17 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] : | semmle.label | call to with_defaults [element :a] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] : | semmle.label | call to with_defaults [element :c] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] : | semmle.label | call to with_defaults [element :d] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] : | semmle.label | call to with_defaults [element :f] : | -| hash_flow.rb:869:33:869:37 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:869:33:869:37 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | +| hash_flow.rb:866:11:866:15 | hash3 [element :f] | semmle.label | hash3 [element :f] | +| hash_flow.rb:866:11:866:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:869:5:869:9 | hash4 [element :a] | semmle.label | hash4 [element :a] | +| hash_flow.rb:869:5:869:9 | hash4 [element :c] | semmle.label | hash4 [element :c] | +| hash_flow.rb:869:5:869:9 | hash4 [element :d] | semmle.label | hash4 [element :d] | +| hash_flow.rb:869:5:869:9 | hash4 [element :f] | semmle.label | hash4 [element :f] | +| hash_flow.rb:869:13:869:17 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:869:13:869:17 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] | semmle.label | call to with_defaults [element :a] | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] | semmle.label | call to with_defaults [element :c] | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] | semmle.label | call to with_defaults [element :d] | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] | semmle.label | call to with_defaults [element :f] | +| hash_flow.rb:869:33:869:37 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:869:33:869:37 | hash2 [element :f] | semmle.label | hash2 [element :f] | | hash_flow.rb:870:10:870:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:870:11:870:15 | hash4 [element :a] : | semmle.label | hash4 [element :a] : | -| hash_flow.rb:870:11:870:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:870:11:870:15 | hash4 [element :a] | semmle.label | hash4 [element :a] | +| hash_flow.rb:870:11:870:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:872:10:872:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:872:11:872:15 | hash4 [element :c] : | semmle.label | hash4 [element :c] : | -| hash_flow.rb:872:11:872:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:872:11:872:15 | hash4 [element :c] | semmle.label | hash4 [element :c] | +| hash_flow.rb:872:11:872:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:873:10:873:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:873:11:873:15 | hash4 [element :d] : | semmle.label | hash4 [element :d] : | -| hash_flow.rb:873:11:873:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:873:11:873:15 | hash4 [element :d] | semmle.label | hash4 [element :d] | +| hash_flow.rb:873:11:873:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:875:10:875:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:875:11:875:15 | hash4 [element :f] : | semmle.label | hash4 [element :f] : | -| hash_flow.rb:875:11:875:19 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:881:5:881:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:881:5:881:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:882:12:882:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:884:12:884:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:886:5:886:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:886:5:886:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:887:12:887:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:889:12:889:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:892:5:892:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:892:5:892:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:892:5:892:8 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:892:5:892:8 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :f] : | semmle.label | [post] hash1 [element :f] : | -| hash_flow.rb:892:12:892:16 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:892:12:892:16 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] : | semmle.label | call to reverse_merge! [element :a] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] : | semmle.label | call to reverse_merge! [element :c] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] : | semmle.label | call to reverse_merge! [element :d] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] : | semmle.label | call to reverse_merge! [element :f] : | -| hash_flow.rb:892:33:892:37 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:892:33:892:37 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | +| hash_flow.rb:875:11:875:15 | hash4 [element :f] | semmle.label | hash4 [element :f] | +| hash_flow.rb:875:11:875:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:881:5:881:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:881:5:881:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:882:12:882:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:884:12:884:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:886:5:886:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:886:5:886:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:887:12:887:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:889:12:889:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:892:5:892:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:892:5:892:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:892:5:892:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:892:5:892:8 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | +| hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | +| hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | +| hash_flow.rb:892:12:892:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | +| hash_flow.rb:892:12:892:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:892:12:892:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] | semmle.label | call to reverse_merge! [element :a] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] | semmle.label | call to reverse_merge! [element :c] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] | semmle.label | call to reverse_merge! [element :d] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] | semmle.label | call to reverse_merge! [element :f] | +| hash_flow.rb:892:33:892:37 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:892:33:892:37 | hash2 [element :f] | semmle.label | hash2 [element :f] | | hash_flow.rb:893:10:893:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:893:11:893:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:893:11:893:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:893:11:893:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:893:11:893:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:895:10:895:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:895:11:895:14 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:895:11:895:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:895:11:895:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:895:11:895:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:896:10:896:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:896:11:896:14 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:896:11:896:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:896:11:896:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:896:11:896:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:898:10:898:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:898:11:898:14 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:898:11:898:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:898:11:898:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:898:11:898:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:900:10:900:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:900:11:900:15 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:900:11:900:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:900:11:900:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:900:11:900:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:902:10:902:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:902:11:902:15 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:902:11:902:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:902:11:902:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:902:11:902:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:903:10:903:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:903:11:903:15 | hash1 [element :d] : | semmle.label | hash1 [element :d] : | -| hash_flow.rb:903:11:903:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:903:11:903:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:903:11:903:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:905:10:905:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:905:11:905:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | -| hash_flow.rb:905:11:905:19 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:911:5:911:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:911:5:911:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:912:12:912:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:914:12:914:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:916:5:916:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:916:5:916:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:917:12:917:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:919:12:919:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:922:5:922:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:922:5:922:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:922:5:922:8 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:922:5:922:8 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :f] : | semmle.label | [post] hash1 [element :f] : | -| hash_flow.rb:922:12:922:16 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:922:12:922:16 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] : | semmle.label | call to with_defaults! [element :a] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] : | semmle.label | call to with_defaults! [element :c] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] : | semmle.label | call to with_defaults! [element :d] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] : | semmle.label | call to with_defaults! [element :f] : | -| hash_flow.rb:922:33:922:37 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:922:33:922:37 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | +| hash_flow.rb:905:11:905:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:905:11:905:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:911:5:911:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:911:5:911:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:912:12:912:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:914:12:914:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:916:5:916:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:916:5:916:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:917:12:917:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:919:12:919:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:922:5:922:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:922:5:922:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:922:5:922:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:922:5:922:8 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | +| hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | +| hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | +| hash_flow.rb:922:12:922:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | +| hash_flow.rb:922:12:922:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:922:12:922:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] | semmle.label | call to with_defaults! [element :a] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] | semmle.label | call to with_defaults! [element :c] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] | semmle.label | call to with_defaults! [element :d] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] | semmle.label | call to with_defaults! [element :f] | +| hash_flow.rb:922:33:922:37 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:922:33:922:37 | hash2 [element :f] | semmle.label | hash2 [element :f] | | hash_flow.rb:923:10:923:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:923:11:923:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:923:11:923:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:923:11:923:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:923:11:923:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:925:10:925:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:925:11:925:14 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:925:11:925:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:925:11:925:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:925:11:925:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:926:10:926:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:926:11:926:14 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:926:11:926:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:926:11:926:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:926:11:926:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:928:10:928:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:928:11:928:14 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:928:11:928:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:928:11:928:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:928:11:928:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:930:10:930:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:930:11:930:15 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:930:11:930:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:930:11:930:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:930:11:930:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:932:10:932:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:932:11:932:15 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:932:11:932:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:932:11:932:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:932:11:932:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:933:10:933:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:933:11:933:15 | hash1 [element :d] : | semmle.label | hash1 [element :d] : | -| hash_flow.rb:933:11:933:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:933:11:933:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:933:11:933:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:935:10:935:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:935:11:935:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | -| hash_flow.rb:935:11:935:19 | ...[...] : | semmle.label | ...[...] : | -| hash_flow.rb:941:5:941:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:941:5:941:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:942:12:942:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:944:12:944:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:946:5:946:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:946:5:946:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | -| hash_flow.rb:947:12:947:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:949:12:949:22 | call to taint : | semmle.label | call to taint : | -| hash_flow.rb:952:5:952:8 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:952:5:952:8 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:952:5:952:8 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:952:5:952:8 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :f] : | semmle.label | [post] hash1 [element :f] : | -| hash_flow.rb:952:12:952:16 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:952:12:952:16 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] : | semmle.label | call to with_defaults! [element :a] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] : | semmle.label | call to with_defaults! [element :c] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] : | semmle.label | call to with_defaults! [element :d] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] : | semmle.label | call to with_defaults! [element :f] : | -| hash_flow.rb:952:33:952:37 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | -| hash_flow.rb:952:33:952:37 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | +| hash_flow.rb:935:11:935:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:935:11:935:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:941:5:941:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:941:5:941:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:942:12:942:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:944:12:944:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:946:5:946:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:946:5:946:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:947:12:947:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:949:12:949:22 | call to taint | semmle.label | call to taint | +| hash_flow.rb:952:5:952:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:952:5:952:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:952:5:952:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:952:5:952:8 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | +| hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | +| hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | +| hash_flow.rb:952:12:952:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | +| hash_flow.rb:952:12:952:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:952:12:952:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] | semmle.label | call to with_defaults! [element :a] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] | semmle.label | call to with_defaults! [element :c] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] | semmle.label | call to with_defaults! [element :d] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] | semmle.label | call to with_defaults! [element :f] | +| hash_flow.rb:952:33:952:37 | hash2 [element :d] | semmle.label | hash2 [element :d] | +| hash_flow.rb:952:33:952:37 | hash2 [element :f] | semmle.label | hash2 [element :f] | | hash_flow.rb:953:10:953:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:953:11:953:14 | hash [element :a] : | semmle.label | hash [element :a] : | -| hash_flow.rb:953:11:953:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:953:11:953:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:953:11:953:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:955:10:955:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:955:11:955:14 | hash [element :c] : | semmle.label | hash [element :c] : | -| hash_flow.rb:955:11:955:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:955:11:955:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:955:11:955:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:956:10:956:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:956:11:956:14 | hash [element :d] : | semmle.label | hash [element :d] : | -| hash_flow.rb:956:11:956:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:956:11:956:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:956:11:956:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:958:10:958:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:958:11:958:14 | hash [element :f] : | semmle.label | hash [element :f] : | -| hash_flow.rb:958:11:958:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:958:11:958:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:958:11:958:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:960:10:960:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:960:11:960:15 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | -| hash_flow.rb:960:11:960:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:960:11:960:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:960:11:960:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:962:10:962:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:962:11:962:15 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | -| hash_flow.rb:962:11:962:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:962:11:962:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:962:11:962:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:963:10:963:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:963:11:963:15 | hash1 [element :d] : | semmle.label | hash1 [element :d] : | -| hash_flow.rb:963:11:963:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:963:11:963:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:963:11:963:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:965:10:965:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:965:11:965:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | -| hash_flow.rb:965:11:965:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:965:11:965:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:965:11:965:19 | ...[...] | semmle.label | ...[...] | subpaths #select -| hash_flow.rb:22:10:22:17 | ...[...] | hash_flow.rb:11:15:11:24 | call to taint : | hash_flow.rb:22:10:22:17 | ...[...] | $@ | hash_flow.rb:11:15:11:24 | call to taint : | call to taint : | -| hash_flow.rb:24:10:24:17 | ...[...] | hash_flow.rb:13:12:13:21 | call to taint : | hash_flow.rb:24:10:24:17 | ...[...] | $@ | hash_flow.rb:13:12:13:21 | call to taint : | call to taint : | -| hash_flow.rb:26:10:26:18 | ...[...] | hash_flow.rb:15:14:15:23 | call to taint : | hash_flow.rb:26:10:26:18 | ...[...] | $@ | hash_flow.rb:15:14:15:23 | call to taint : | call to taint : | -| hash_flow.rb:28:10:28:18 | ...[...] | hash_flow.rb:17:16:17:25 | call to taint : | hash_flow.rb:28:10:28:18 | ...[...] | $@ | hash_flow.rb:17:16:17:25 | call to taint : | call to taint : | -| hash_flow.rb:30:10:30:16 | ...[...] | hash_flow.rb:19:14:19:23 | call to taint : | hash_flow.rb:30:10:30:16 | ...[...] | $@ | hash_flow.rb:19:14:19:23 | call to taint : | call to taint : | -| hash_flow.rb:44:10:44:16 | ...[...] | hash_flow.rb:38:15:38:24 | call to taint : | hash_flow.rb:44:10:44:16 | ...[...] | $@ | hash_flow.rb:38:15:38:24 | call to taint : | call to taint : | -| hash_flow.rb:46:10:46:17 | ...[...] | hash_flow.rb:40:16:40:25 | call to taint : | hash_flow.rb:46:10:46:17 | ...[...] | $@ | hash_flow.rb:40:16:40:25 | call to taint : | call to taint : | -| hash_flow.rb:48:10:48:18 | ...[...] | hash_flow.rb:42:17:42:26 | call to taint : | hash_flow.rb:48:10:48:18 | ...[...] | $@ | hash_flow.rb:42:17:42:26 | call to taint : | call to taint : | -| hash_flow.rb:56:10:56:18 | ...[...] | hash_flow.rb:55:21:55:30 | call to taint : | hash_flow.rb:56:10:56:18 | ...[...] | $@ | hash_flow.rb:55:21:55:30 | call to taint : | call to taint : | -| hash_flow.rb:61:10:61:18 | ...[...] | hash_flow.rb:59:13:59:22 | call to taint : | hash_flow.rb:61:10:61:18 | ...[...] | $@ | hash_flow.rb:59:13:59:22 | call to taint : | call to taint : | -| hash_flow.rb:65:10:65:18 | ...[...] | hash_flow.rb:64:24:64:33 | call to taint : | hash_flow.rb:65:10:65:18 | ...[...] | $@ | hash_flow.rb:64:24:64:33 | call to taint : | call to taint : | -| hash_flow.rb:66:10:66:18 | ...[...] | hash_flow.rb:64:24:64:33 | call to taint : | hash_flow.rb:66:10:66:18 | ...[...] | $@ | hash_flow.rb:64:24:64:33 | call to taint : | call to taint : | -| hash_flow.rb:69:10:69:18 | ...[...] | hash_flow.rb:68:22:68:31 | call to taint : | hash_flow.rb:69:10:69:18 | ...[...] | $@ | hash_flow.rb:68:22:68:31 | call to taint : | call to taint : | -| hash_flow.rb:73:10:73:19 | ...[...] | hash_flow.rb:72:25:72:34 | call to taint : | hash_flow.rb:73:10:73:19 | ...[...] | $@ | hash_flow.rb:72:25:72:34 | call to taint : | call to taint : | -| hash_flow.rb:77:10:77:19 | ...[...] | hash_flow.rb:76:26:76:35 | call to taint : | hash_flow.rb:77:10:77:19 | ...[...] | $@ | hash_flow.rb:76:26:76:35 | call to taint : | call to taint : | -| hash_flow.rb:85:10:85:18 | ...[...] | hash_flow.rb:84:26:84:35 | call to taint : | hash_flow.rb:85:10:85:18 | ...[...] | $@ | hash_flow.rb:84:26:84:35 | call to taint : | call to taint : | -| hash_flow.rb:97:10:97:18 | ...[...] | hash_flow.rb:93:15:93:24 | call to taint : | hash_flow.rb:97:10:97:18 | ...[...] | $@ | hash_flow.rb:93:15:93:24 | call to taint : | call to taint : | -| hash_flow.rb:106:10:106:10 | b | hash_flow.rb:105:21:105:30 | call to taint : | hash_flow.rb:106:10:106:10 | b | $@ | hash_flow.rb:105:21:105:30 | call to taint : | call to taint : | -| hash_flow.rb:114:10:114:17 | ...[...] | hash_flow.rb:113:24:113:33 | call to taint : | hash_flow.rb:114:10:114:17 | ...[...] | $@ | hash_flow.rb:113:24:113:33 | call to taint : | call to taint : | -| hash_flow.rb:115:10:115:10 | b | hash_flow.rb:113:24:113:33 | call to taint : | hash_flow.rb:115:10:115:10 | b | $@ | hash_flow.rb:113:24:113:33 | call to taint : | call to taint : | -| hash_flow.rb:119:10:119:17 | ...[...] | hash_flow.rb:118:23:118:32 | call to taint : | hash_flow.rb:119:10:119:17 | ...[...] | $@ | hash_flow.rb:118:23:118:32 | call to taint : | call to taint : | -| hash_flow.rb:120:10:120:17 | ...[...] | hash_flow.rb:118:23:118:32 | call to taint : | hash_flow.rb:120:10:120:17 | ...[...] | $@ | hash_flow.rb:118:23:118:32 | call to taint : | call to taint : | -| hash_flow.rb:121:10:121:10 | c | hash_flow.rb:118:23:118:32 | call to taint : | hash_flow.rb:121:10:121:10 | c | $@ | hash_flow.rb:118:23:118:32 | call to taint : | call to taint : | -| hash_flow.rb:132:14:132:25 | key_or_value | hash_flow.rb:128:15:128:24 | call to taint : | hash_flow.rb:132:14:132:25 | key_or_value | $@ | hash_flow.rb:128:15:128:24 | call to taint : | call to taint : | -| hash_flow.rb:136:14:136:18 | value | hash_flow.rb:128:15:128:24 | call to taint : | hash_flow.rb:136:14:136:18 | value | $@ | hash_flow.rb:128:15:128:24 | call to taint : | call to taint : | -| hash_flow.rb:149:10:149:13 | ...[...] | hash_flow.rb:144:15:144:25 | call to taint : | hash_flow.rb:149:10:149:13 | ...[...] | $@ | hash_flow.rb:144:15:144:25 | call to taint : | call to taint : | -| hash_flow.rb:150:10:150:13 | ...[...] | hash_flow.rb:144:15:144:25 | call to taint : | hash_flow.rb:150:10:150:13 | ...[...] | $@ | hash_flow.rb:144:15:144:25 | call to taint : | call to taint : | -| hash_flow.rb:152:10:152:13 | ...[...] | hash_flow.rb:144:15:144:25 | call to taint : | hash_flow.rb:152:10:152:13 | ...[...] | $@ | hash_flow.rb:144:15:144:25 | call to taint : | call to taint : | -| hash_flow.rb:174:10:174:14 | ...[...] | hash_flow.rb:170:15:170:25 | call to taint : | hash_flow.rb:174:10:174:14 | ...[...] | $@ | hash_flow.rb:170:15:170:25 | call to taint : | call to taint : | -| hash_flow.rb:186:10:186:10 | a | hash_flow.rb:182:15:182:25 | call to taint : | hash_flow.rb:186:10:186:10 | a | $@ | hash_flow.rb:182:15:182:25 | call to taint : | call to taint : | -| hash_flow.rb:199:14:199:18 | value | hash_flow.rb:194:15:194:25 | call to taint : | hash_flow.rb:199:14:199:18 | value | $@ | hash_flow.rb:194:15:194:25 | call to taint : | call to taint : | -| hash_flow.rb:201:10:201:14 | ...[...] | hash_flow.rb:194:15:194:25 | call to taint : | hash_flow.rb:201:10:201:14 | ...[...] | $@ | hash_flow.rb:194:15:194:25 | call to taint : | call to taint : | -| hash_flow.rb:202:10:202:17 | ...[...] | hash_flow.rb:194:15:194:25 | call to taint : | hash_flow.rb:202:10:202:17 | ...[...] | $@ | hash_flow.rb:194:15:194:25 | call to taint : | call to taint : | -| hash_flow.rb:217:10:217:21 | call to dig | hash_flow.rb:210:15:210:25 | call to taint : | hash_flow.rb:217:10:217:21 | call to dig | $@ | hash_flow.rb:210:15:210:25 | call to taint : | call to taint : | -| hash_flow.rb:219:10:219:24 | call to dig | hash_flow.rb:213:19:213:29 | call to taint : | hash_flow.rb:219:10:219:24 | call to dig | $@ | hash_flow.rb:213:19:213:29 | call to taint : | call to taint : | -| hash_flow.rb:232:14:232:18 | value | hash_flow.rb:227:15:227:25 | call to taint : | hash_flow.rb:232:14:232:18 | value | $@ | hash_flow.rb:227:15:227:25 | call to taint : | call to taint : | -| hash_flow.rb:234:10:234:14 | ...[...] | hash_flow.rb:227:15:227:25 | call to taint : | hash_flow.rb:234:10:234:14 | ...[...] | $@ | hash_flow.rb:227:15:227:25 | call to taint : | call to taint : | -| hash_flow.rb:248:10:248:14 | ...[...] | hash_flow.rb:242:15:242:25 | call to taint : | hash_flow.rb:248:10:248:14 | ...[...] | $@ | hash_flow.rb:242:15:242:25 | call to taint : | call to taint : | -| hash_flow.rb:261:14:261:18 | value | hash_flow.rb:256:15:256:25 | call to taint : | hash_flow.rb:261:14:261:18 | value | $@ | hash_flow.rb:256:15:256:25 | call to taint : | call to taint : | -| hash_flow.rb:263:10:263:14 | ...[...] | hash_flow.rb:256:15:256:25 | call to taint : | hash_flow.rb:263:10:263:14 | ...[...] | $@ | hash_flow.rb:256:15:256:25 | call to taint : | call to taint : | -| hash_flow.rb:275:14:275:18 | value | hash_flow.rb:271:15:271:25 | call to taint : | hash_flow.rb:275:14:275:18 | value | $@ | hash_flow.rb:271:15:271:25 | call to taint : | call to taint : | -| hash_flow.rb:277:10:277:14 | ...[...] | hash_flow.rb:271:15:271:25 | call to taint : | hash_flow.rb:277:10:277:14 | ...[...] | $@ | hash_flow.rb:271:15:271:25 | call to taint : | call to taint : | -| hash_flow.rb:293:10:293:14 | ...[...] | hash_flow.rb:287:15:287:25 | call to taint : | hash_flow.rb:293:10:293:14 | ...[...] | $@ | hash_flow.rb:287:15:287:25 | call to taint : | call to taint : | -| hash_flow.rb:306:14:306:14 | x | hash_flow.rb:305:20:305:30 | call to taint : | hash_flow.rb:306:14:306:14 | x | $@ | hash_flow.rb:305:20:305:30 | call to taint : | call to taint : | -| hash_flow.rb:308:10:308:10 | b | hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:308:10:308:10 | b | $@ | hash_flow.rb:301:15:301:25 | call to taint : | call to taint : | -| hash_flow.rb:308:10:308:10 | b | hash_flow.rb:303:15:303:25 | call to taint : | hash_flow.rb:308:10:308:10 | b | $@ | hash_flow.rb:303:15:303:25 | call to taint : | call to taint : | -| hash_flow.rb:310:10:310:10 | b | hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:310:10:310:10 | b | $@ | hash_flow.rb:301:15:301:25 | call to taint : | call to taint : | -| hash_flow.rb:312:10:312:10 | b | hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:312:10:312:10 | b | $@ | hash_flow.rb:301:15:301:25 | call to taint : | call to taint : | -| hash_flow.rb:312:10:312:10 | b | hash_flow.rb:311:24:311:34 | call to taint : | hash_flow.rb:312:10:312:10 | b | $@ | hash_flow.rb:311:24:311:34 | call to taint : | call to taint : | -| hash_flow.rb:314:10:314:10 | b | hash_flow.rb:313:24:313:34 | call to taint : | hash_flow.rb:314:10:314:10 | b | $@ | hash_flow.rb:313:24:313:34 | call to taint : | call to taint : | -| hash_flow.rb:316:10:316:10 | b | hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:316:10:316:10 | b | $@ | hash_flow.rb:301:15:301:25 | call to taint : | call to taint : | -| hash_flow.rb:316:10:316:10 | b | hash_flow.rb:303:15:303:25 | call to taint : | hash_flow.rb:316:10:316:10 | b | $@ | hash_flow.rb:303:15:303:25 | call to taint : | call to taint : | -| hash_flow.rb:316:10:316:10 | b | hash_flow.rb:315:23:315:33 | call to taint : | hash_flow.rb:316:10:316:10 | b | $@ | hash_flow.rb:315:23:315:33 | call to taint : | call to taint : | -| hash_flow.rb:328:14:328:14 | x | hash_flow.rb:327:27:327:37 | call to taint : | hash_flow.rb:328:14:328:14 | x | $@ | hash_flow.rb:327:27:327:37 | call to taint : | call to taint : | -| hash_flow.rb:331:10:331:13 | ...[...] | hash_flow.rb:323:15:323:25 | call to taint : | hash_flow.rb:331:10:331:13 | ...[...] | $@ | hash_flow.rb:323:15:323:25 | call to taint : | call to taint : | -| hash_flow.rb:331:10:331:13 | ...[...] | hash_flow.rb:325:15:325:25 | call to taint : | hash_flow.rb:331:10:331:13 | ...[...] | $@ | hash_flow.rb:325:15:325:25 | call to taint : | call to taint : | -| hash_flow.rb:331:10:331:13 | ...[...] | hash_flow.rb:329:9:329:19 | call to taint : | hash_flow.rb:331:10:331:13 | ...[...] | $@ | hash_flow.rb:329:9:329:19 | call to taint : | call to taint : | -| hash_flow.rb:333:10:333:13 | ...[...] | hash_flow.rb:323:15:323:25 | call to taint : | hash_flow.rb:333:10:333:13 | ...[...] | $@ | hash_flow.rb:323:15:323:25 | call to taint : | call to taint : | -| hash_flow.rb:335:10:335:13 | ...[...] | hash_flow.rb:323:15:323:25 | call to taint : | hash_flow.rb:335:10:335:13 | ...[...] | $@ | hash_flow.rb:323:15:323:25 | call to taint : | call to taint : | -| hash_flow.rb:335:10:335:13 | ...[...] | hash_flow.rb:325:15:325:25 | call to taint : | hash_flow.rb:335:10:335:13 | ...[...] | $@ | hash_flow.rb:325:15:325:25 | call to taint : | call to taint : | -| hash_flow.rb:348:14:348:18 | value | hash_flow.rb:342:15:342:25 | call to taint : | hash_flow.rb:348:14:348:18 | value | $@ | hash_flow.rb:342:15:342:25 | call to taint : | call to taint : | -| hash_flow.rb:348:14:348:18 | value | hash_flow.rb:344:15:344:25 | call to taint : | hash_flow.rb:348:14:348:18 | value | $@ | hash_flow.rb:344:15:344:25 | call to taint : | call to taint : | -| hash_flow.rb:351:10:351:16 | ( ... ) | hash_flow.rb:342:15:342:25 | call to taint : | hash_flow.rb:351:10:351:16 | ( ... ) | $@ | hash_flow.rb:342:15:342:25 | call to taint : | call to taint : | -| hash_flow.rb:364:14:364:18 | value | hash_flow.rb:358:15:358:25 | call to taint : | hash_flow.rb:364:14:364:18 | value | $@ | hash_flow.rb:358:15:358:25 | call to taint : | call to taint : | -| hash_flow.rb:364:14:364:18 | value | hash_flow.rb:360:15:360:25 | call to taint : | hash_flow.rb:364:14:364:18 | value | $@ | hash_flow.rb:360:15:360:25 | call to taint : | call to taint : | -| hash_flow.rb:367:10:367:19 | ( ... ) | hash_flow.rb:358:15:358:25 | call to taint : | hash_flow.rb:367:10:367:19 | ( ... ) | $@ | hash_flow.rb:358:15:358:25 | call to taint : | call to taint : | -| hash_flow.rb:379:10:379:15 | ( ... ) | hash_flow.rb:374:15:374:25 | call to taint : | hash_flow.rb:379:10:379:15 | ( ... ) | $@ | hash_flow.rb:374:15:374:25 | call to taint : | call to taint : | -| hash_flow.rb:379:10:379:15 | ( ... ) | hash_flow.rb:376:15:376:25 | call to taint : | hash_flow.rb:379:10:379:15 | ( ... ) | $@ | hash_flow.rb:376:15:376:25 | call to taint : | call to taint : | -| hash_flow.rb:392:14:392:18 | value | hash_flow.rb:386:15:386:25 | call to taint : | hash_flow.rb:392:14:392:18 | value | $@ | hash_flow.rb:386:15:386:25 | call to taint : | call to taint : | -| hash_flow.rb:392:14:392:18 | value | hash_flow.rb:388:15:388:25 | call to taint : | hash_flow.rb:392:14:392:18 | value | $@ | hash_flow.rb:388:15:388:25 | call to taint : | call to taint : | -| hash_flow.rb:395:10:395:19 | ( ... ) | hash_flow.rb:386:15:386:25 | call to taint : | hash_flow.rb:395:10:395:19 | ( ... ) | $@ | hash_flow.rb:386:15:386:25 | call to taint : | call to taint : | -| hash_flow.rb:396:10:396:16 | ( ... ) | hash_flow.rb:386:15:386:25 | call to taint : | hash_flow.rb:396:10:396:16 | ( ... ) | $@ | hash_flow.rb:386:15:386:25 | call to taint : | call to taint : | -| hash_flow.rb:414:14:414:22 | old_value | hash_flow.rb:403:15:403:25 | call to taint : | hash_flow.rb:414:14:414:22 | old_value | $@ | hash_flow.rb:403:15:403:25 | call to taint : | call to taint : | -| hash_flow.rb:414:14:414:22 | old_value | hash_flow.rb:405:15:405:25 | call to taint : | hash_flow.rb:414:14:414:22 | old_value | $@ | hash_flow.rb:405:15:405:25 | call to taint : | call to taint : | -| hash_flow.rb:414:14:414:22 | old_value | hash_flow.rb:408:15:408:25 | call to taint : | hash_flow.rb:414:14:414:22 | old_value | $@ | hash_flow.rb:408:15:408:25 | call to taint : | call to taint : | -| hash_flow.rb:414:14:414:22 | old_value | hash_flow.rb:410:15:410:25 | call to taint : | hash_flow.rb:414:14:414:22 | old_value | $@ | hash_flow.rb:410:15:410:25 | call to taint : | call to taint : | -| hash_flow.rb:415:14:415:22 | new_value | hash_flow.rb:403:15:403:25 | call to taint : | hash_flow.rb:415:14:415:22 | new_value | $@ | hash_flow.rb:403:15:403:25 | call to taint : | call to taint : | -| hash_flow.rb:415:14:415:22 | new_value | hash_flow.rb:405:15:405:25 | call to taint : | hash_flow.rb:415:14:415:22 | new_value | $@ | hash_flow.rb:405:15:405:25 | call to taint : | call to taint : | -| hash_flow.rb:415:14:415:22 | new_value | hash_flow.rb:408:15:408:25 | call to taint : | hash_flow.rb:415:14:415:22 | new_value | $@ | hash_flow.rb:408:15:408:25 | call to taint : | call to taint : | -| hash_flow.rb:415:14:415:22 | new_value | hash_flow.rb:410:15:410:25 | call to taint : | hash_flow.rb:415:14:415:22 | new_value | $@ | hash_flow.rb:410:15:410:25 | call to taint : | call to taint : | -| hash_flow.rb:417:10:417:19 | ( ... ) | hash_flow.rb:403:15:403:25 | call to taint : | hash_flow.rb:417:10:417:19 | ( ... ) | $@ | hash_flow.rb:403:15:403:25 | call to taint : | call to taint : | -| hash_flow.rb:419:10:419:19 | ( ... ) | hash_flow.rb:405:15:405:25 | call to taint : | hash_flow.rb:419:10:419:19 | ( ... ) | $@ | hash_flow.rb:405:15:405:25 | call to taint : | call to taint : | -| hash_flow.rb:420:10:420:19 | ( ... ) | hash_flow.rb:408:15:408:25 | call to taint : | hash_flow.rb:420:10:420:19 | ( ... ) | $@ | hash_flow.rb:408:15:408:25 | call to taint : | call to taint : | -| hash_flow.rb:422:10:422:19 | ( ... ) | hash_flow.rb:410:15:410:25 | call to taint : | hash_flow.rb:422:10:422:19 | ( ... ) | $@ | hash_flow.rb:410:15:410:25 | call to taint : | call to taint : | -| hash_flow.rb:440:14:440:22 | old_value | hash_flow.rb:429:15:429:25 | call to taint : | hash_flow.rb:440:14:440:22 | old_value | $@ | hash_flow.rb:429:15:429:25 | call to taint : | call to taint : | -| hash_flow.rb:440:14:440:22 | old_value | hash_flow.rb:431:15:431:25 | call to taint : | hash_flow.rb:440:14:440:22 | old_value | $@ | hash_flow.rb:431:15:431:25 | call to taint : | call to taint : | -| hash_flow.rb:440:14:440:22 | old_value | hash_flow.rb:434:15:434:25 | call to taint : | hash_flow.rb:440:14:440:22 | old_value | $@ | hash_flow.rb:434:15:434:25 | call to taint : | call to taint : | -| hash_flow.rb:440:14:440:22 | old_value | hash_flow.rb:436:15:436:25 | call to taint : | hash_flow.rb:440:14:440:22 | old_value | $@ | hash_flow.rb:436:15:436:25 | call to taint : | call to taint : | -| hash_flow.rb:441:14:441:22 | new_value | hash_flow.rb:429:15:429:25 | call to taint : | hash_flow.rb:441:14:441:22 | new_value | $@ | hash_flow.rb:429:15:429:25 | call to taint : | call to taint : | -| hash_flow.rb:441:14:441:22 | new_value | hash_flow.rb:431:15:431:25 | call to taint : | hash_flow.rb:441:14:441:22 | new_value | $@ | hash_flow.rb:431:15:431:25 | call to taint : | call to taint : | -| hash_flow.rb:441:14:441:22 | new_value | hash_flow.rb:434:15:434:25 | call to taint : | hash_flow.rb:441:14:441:22 | new_value | $@ | hash_flow.rb:434:15:434:25 | call to taint : | call to taint : | -| hash_flow.rb:441:14:441:22 | new_value | hash_flow.rb:436:15:436:25 | call to taint : | hash_flow.rb:441:14:441:22 | new_value | $@ | hash_flow.rb:436:15:436:25 | call to taint : | call to taint : | -| hash_flow.rb:443:10:443:19 | ( ... ) | hash_flow.rb:429:15:429:25 | call to taint : | hash_flow.rb:443:10:443:19 | ( ... ) | $@ | hash_flow.rb:429:15:429:25 | call to taint : | call to taint : | -| hash_flow.rb:445:10:445:19 | ( ... ) | hash_flow.rb:431:15:431:25 | call to taint : | hash_flow.rb:445:10:445:19 | ( ... ) | $@ | hash_flow.rb:431:15:431:25 | call to taint : | call to taint : | -| hash_flow.rb:446:10:446:19 | ( ... ) | hash_flow.rb:434:15:434:25 | call to taint : | hash_flow.rb:446:10:446:19 | ( ... ) | $@ | hash_flow.rb:434:15:434:25 | call to taint : | call to taint : | -| hash_flow.rb:448:10:448:19 | ( ... ) | hash_flow.rb:436:15:436:25 | call to taint : | hash_flow.rb:448:10:448:19 | ( ... ) | $@ | hash_flow.rb:436:15:436:25 | call to taint : | call to taint : | -| hash_flow.rb:450:10:450:20 | ( ... ) | hash_flow.rb:429:15:429:25 | call to taint : | hash_flow.rb:450:10:450:20 | ( ... ) | $@ | hash_flow.rb:429:15:429:25 | call to taint : | call to taint : | -| hash_flow.rb:452:10:452:20 | ( ... ) | hash_flow.rb:431:15:431:25 | call to taint : | hash_flow.rb:452:10:452:20 | ( ... ) | $@ | hash_flow.rb:431:15:431:25 | call to taint : | call to taint : | -| hash_flow.rb:453:10:453:20 | ( ... ) | hash_flow.rb:434:15:434:25 | call to taint : | hash_flow.rb:453:10:453:20 | ( ... ) | $@ | hash_flow.rb:434:15:434:25 | call to taint : | call to taint : | -| hash_flow.rb:455:10:455:20 | ( ... ) | hash_flow.rb:436:15:436:25 | call to taint : | hash_flow.rb:455:10:455:20 | ( ... ) | $@ | hash_flow.rb:436:15:436:25 | call to taint : | call to taint : | -| hash_flow.rb:467:10:467:13 | ...[...] | hash_flow.rb:462:15:462:25 | call to taint : | hash_flow.rb:467:10:467:13 | ...[...] | $@ | hash_flow.rb:462:15:462:25 | call to taint : | call to taint : | -| hash_flow.rb:479:14:479:18 | value | hash_flow.rb:474:15:474:25 | call to taint : | hash_flow.rb:479:14:479:18 | value | $@ | hash_flow.rb:474:15:474:25 | call to taint : | call to taint : | -| hash_flow.rb:482:10:482:14 | ...[...] | hash_flow.rb:474:15:474:25 | call to taint : | hash_flow.rb:482:10:482:14 | ...[...] | $@ | hash_flow.rb:474:15:474:25 | call to taint : | call to taint : | -| hash_flow.rb:494:14:494:18 | value | hash_flow.rb:489:15:489:25 | call to taint : | hash_flow.rb:494:14:494:18 | value | $@ | hash_flow.rb:489:15:489:25 | call to taint : | call to taint : | -| hash_flow.rb:497:10:497:14 | ...[...] | hash_flow.rb:489:15:489:25 | call to taint : | hash_flow.rb:497:10:497:14 | ...[...] | $@ | hash_flow.rb:489:15:489:25 | call to taint : | call to taint : | -| hash_flow.rb:498:10:498:17 | ...[...] | hash_flow.rb:489:15:489:25 | call to taint : | hash_flow.rb:498:10:498:17 | ...[...] | $@ | hash_flow.rb:489:15:489:25 | call to taint : | call to taint : | -| hash_flow.rb:513:10:513:20 | ( ... ) | hash_flow.rb:505:15:505:25 | call to taint : | hash_flow.rb:513:10:513:20 | ( ... ) | $@ | hash_flow.rb:505:15:505:25 | call to taint : | call to taint : | -| hash_flow.rb:515:10:515:20 | ( ... ) | hash_flow.rb:507:15:507:25 | call to taint : | hash_flow.rb:515:10:515:20 | ( ... ) | $@ | hash_flow.rb:507:15:507:25 | call to taint : | call to taint : | -| hash_flow.rb:526:14:526:18 | value | hash_flow.rb:520:15:520:25 | call to taint : | hash_flow.rb:526:14:526:18 | value | $@ | hash_flow.rb:520:15:520:25 | call to taint : | call to taint : | -| hash_flow.rb:526:14:526:18 | value | hash_flow.rb:522:15:522:25 | call to taint : | hash_flow.rb:526:14:526:18 | value | $@ | hash_flow.rb:522:15:522:25 | call to taint : | call to taint : | -| hash_flow.rb:529:10:529:16 | ( ... ) | hash_flow.rb:520:15:520:25 | call to taint : | hash_flow.rb:529:10:529:16 | ( ... ) | $@ | hash_flow.rb:520:15:520:25 | call to taint : | call to taint : | -| hash_flow.rb:542:14:542:18 | value | hash_flow.rb:536:15:536:25 | call to taint : | hash_flow.rb:542:14:542:18 | value | $@ | hash_flow.rb:536:15:536:25 | call to taint : | call to taint : | -| hash_flow.rb:542:14:542:18 | value | hash_flow.rb:538:15:538:25 | call to taint : | hash_flow.rb:542:14:542:18 | value | $@ | hash_flow.rb:538:15:538:25 | call to taint : | call to taint : | -| hash_flow.rb:545:10:545:19 | ( ... ) | hash_flow.rb:536:15:536:25 | call to taint : | hash_flow.rb:545:10:545:19 | ( ... ) | $@ | hash_flow.rb:536:15:536:25 | call to taint : | call to taint : | -| hash_flow.rb:557:10:557:19 | ( ... ) | hash_flow.rb:552:15:552:25 | call to taint : | hash_flow.rb:557:10:557:19 | ( ... ) | $@ | hash_flow.rb:552:15:552:25 | call to taint : | call to taint : | -| hash_flow.rb:559:10:559:15 | ( ... ) | hash_flow.rb:552:15:552:25 | call to taint : | hash_flow.rb:559:10:559:15 | ( ... ) | $@ | hash_flow.rb:552:15:552:25 | call to taint : | call to taint : | -| hash_flow.rb:559:10:559:15 | ( ... ) | hash_flow.rb:554:15:554:25 | call to taint : | hash_flow.rb:559:10:559:15 | ( ... ) | $@ | hash_flow.rb:554:15:554:25 | call to taint : | call to taint : | -| hash_flow.rb:571:10:571:16 | ( ... ) | hash_flow.rb:566:15:566:25 | call to taint : | hash_flow.rb:571:10:571:16 | ( ... ) | $@ | hash_flow.rb:566:15:566:25 | call to taint : | call to taint : | -| hash_flow.rb:576:10:576:16 | ( ... ) | hash_flow.rb:566:15:566:25 | call to taint : | hash_flow.rb:576:10:576:16 | ( ... ) | $@ | hash_flow.rb:566:15:566:25 | call to taint : | call to taint : | -| hash_flow.rb:578:10:578:16 | ( ... ) | hash_flow.rb:568:15:568:25 | call to taint : | hash_flow.rb:578:10:578:16 | ( ... ) | $@ | hash_flow.rb:568:15:568:25 | call to taint : | call to taint : | -| hash_flow.rb:591:10:591:18 | ( ... ) | hash_flow.rb:585:15:585:25 | call to taint : | hash_flow.rb:591:10:591:18 | ( ... ) | $@ | hash_flow.rb:585:15:585:25 | call to taint : | call to taint : | -| hash_flow.rb:591:10:591:18 | ( ... ) | hash_flow.rb:587:15:587:25 | call to taint : | hash_flow.rb:591:10:591:18 | ( ... ) | $@ | hash_flow.rb:587:15:587:25 | call to taint : | call to taint : | -| hash_flow.rb:603:10:603:16 | ( ... ) | hash_flow.rb:598:15:598:25 | call to taint : | hash_flow.rb:603:10:603:16 | ( ... ) | $@ | hash_flow.rb:598:15:598:25 | call to taint : | call to taint : | -| hash_flow.rb:605:10:605:16 | ( ... ) | hash_flow.rb:600:15:600:25 | call to taint : | hash_flow.rb:605:10:605:16 | ( ... ) | $@ | hash_flow.rb:600:15:600:25 | call to taint : | call to taint : | -| hash_flow.rb:609:14:609:18 | value | hash_flow.rb:598:15:598:25 | call to taint : | hash_flow.rb:609:14:609:18 | value | $@ | hash_flow.rb:598:15:598:25 | call to taint : | call to taint : | -| hash_flow.rb:609:14:609:18 | value | hash_flow.rb:600:15:600:25 | call to taint : | hash_flow.rb:609:14:609:18 | value | $@ | hash_flow.rb:600:15:600:25 | call to taint : | call to taint : | -| hash_flow.rb:612:10:612:16 | ( ... ) | hash_flow.rb:610:14:610:24 | call to taint : | hash_flow.rb:612:10:612:16 | ( ... ) | $@ | hash_flow.rb:610:14:610:24 | call to taint : | call to taint : | -| hash_flow.rb:624:10:624:17 | ( ... ) | hash_flow.rb:619:15:619:25 | call to taint : | hash_flow.rb:624:10:624:17 | ( ... ) | $@ | hash_flow.rb:619:15:619:25 | call to taint : | call to taint : | -| hash_flow.rb:624:10:624:17 | ( ... ) | hash_flow.rb:621:15:621:25 | call to taint : | hash_flow.rb:624:10:624:17 | ( ... ) | $@ | hash_flow.rb:621:15:621:25 | call to taint : | call to taint : | -| hash_flow.rb:625:10:625:17 | ( ... ) | hash_flow.rb:619:15:619:25 | call to taint : | hash_flow.rb:625:10:625:17 | ( ... ) | $@ | hash_flow.rb:619:15:619:25 | call to taint : | call to taint : | -| hash_flow.rb:625:10:625:17 | ( ... ) | hash_flow.rb:621:15:621:25 | call to taint : | hash_flow.rb:625:10:625:17 | ( ... ) | $@ | hash_flow.rb:621:15:621:25 | call to taint : | call to taint : | -| hash_flow.rb:626:10:626:17 | ( ... ) | hash_flow.rb:619:15:619:25 | call to taint : | hash_flow.rb:626:10:626:17 | ( ... ) | $@ | hash_flow.rb:619:15:619:25 | call to taint : | call to taint : | -| hash_flow.rb:626:10:626:17 | ( ... ) | hash_flow.rb:621:15:621:25 | call to taint : | hash_flow.rb:626:10:626:17 | ( ... ) | $@ | hash_flow.rb:621:15:621:25 | call to taint : | call to taint : | -| hash_flow.rb:640:10:640:20 | ( ... ) | hash_flow.rb:633:15:633:25 | call to taint : | hash_flow.rb:640:10:640:20 | ( ... ) | $@ | hash_flow.rb:633:15:633:25 | call to taint : | call to taint : | -| hash_flow.rb:640:10:640:20 | ( ... ) | hash_flow.rb:635:15:635:25 | call to taint : | hash_flow.rb:640:10:640:20 | ( ... ) | $@ | hash_flow.rb:635:15:635:25 | call to taint : | call to taint : | -| hash_flow.rb:640:10:640:20 | ( ... ) | hash_flow.rb:637:15:637:25 | call to taint : | hash_flow.rb:640:10:640:20 | ( ... ) | $@ | hash_flow.rb:637:15:637:25 | call to taint : | call to taint : | -| hash_flow.rb:641:10:641:20 | ( ... ) | hash_flow.rb:633:15:633:25 | call to taint : | hash_flow.rb:641:10:641:20 | ( ... ) | $@ | hash_flow.rb:633:15:633:25 | call to taint : | call to taint : | -| hash_flow.rb:641:10:641:20 | ( ... ) | hash_flow.rb:635:15:635:25 | call to taint : | hash_flow.rb:641:10:641:20 | ( ... ) | $@ | hash_flow.rb:635:15:635:25 | call to taint : | call to taint : | -| hash_flow.rb:641:10:641:20 | ( ... ) | hash_flow.rb:637:15:637:25 | call to taint : | hash_flow.rb:641:10:641:20 | ( ... ) | $@ | hash_flow.rb:637:15:637:25 | call to taint : | call to taint : | -| hash_flow.rb:642:10:642:20 | ( ... ) | hash_flow.rb:633:15:633:25 | call to taint : | hash_flow.rb:642:10:642:20 | ( ... ) | $@ | hash_flow.rb:633:15:633:25 | call to taint : | call to taint : | -| hash_flow.rb:642:10:642:20 | ( ... ) | hash_flow.rb:635:15:635:25 | call to taint : | hash_flow.rb:642:10:642:20 | ( ... ) | $@ | hash_flow.rb:635:15:635:25 | call to taint : | call to taint : | -| hash_flow.rb:642:10:642:20 | ( ... ) | hash_flow.rb:637:15:637:25 | call to taint : | hash_flow.rb:642:10:642:20 | ( ... ) | $@ | hash_flow.rb:637:15:637:25 | call to taint : | call to taint : | -| hash_flow.rb:654:14:654:18 | value | hash_flow.rb:649:15:649:25 | call to taint : | hash_flow.rb:654:14:654:18 | value | $@ | hash_flow.rb:649:15:649:25 | call to taint : | call to taint : | -| hash_flow.rb:654:14:654:18 | value | hash_flow.rb:651:15:651:25 | call to taint : | hash_flow.rb:654:14:654:18 | value | $@ | hash_flow.rb:651:15:651:25 | call to taint : | call to taint : | -| hash_flow.rb:657:10:657:19 | ( ... ) | hash_flow.rb:649:15:649:25 | call to taint : | hash_flow.rb:657:10:657:19 | ( ... ) | $@ | hash_flow.rb:649:15:649:25 | call to taint : | call to taint : | -| hash_flow.rb:658:10:658:16 | ( ... ) | hash_flow.rb:655:9:655:19 | call to taint : | hash_flow.rb:658:10:658:16 | ( ... ) | $@ | hash_flow.rb:655:9:655:19 | call to taint : | call to taint : | -| hash_flow.rb:670:14:670:18 | value | hash_flow.rb:665:15:665:25 | call to taint : | hash_flow.rb:670:14:670:18 | value | $@ | hash_flow.rb:665:15:665:25 | call to taint : | call to taint : | -| hash_flow.rb:670:14:670:18 | value | hash_flow.rb:667:15:667:25 | call to taint : | hash_flow.rb:670:14:670:18 | value | $@ | hash_flow.rb:667:15:667:25 | call to taint : | call to taint : | -| hash_flow.rb:673:10:673:19 | ( ... ) | hash_flow.rb:671:9:671:19 | call to taint : | hash_flow.rb:673:10:673:19 | ( ... ) | $@ | hash_flow.rb:671:9:671:19 | call to taint : | call to taint : | -| hash_flow.rb:691:14:691:22 | old_value | hash_flow.rb:680:15:680:25 | call to taint : | hash_flow.rb:691:14:691:22 | old_value | $@ | hash_flow.rb:680:15:680:25 | call to taint : | call to taint : | -| hash_flow.rb:691:14:691:22 | old_value | hash_flow.rb:682:15:682:25 | call to taint : | hash_flow.rb:691:14:691:22 | old_value | $@ | hash_flow.rb:682:15:682:25 | call to taint : | call to taint : | -| hash_flow.rb:691:14:691:22 | old_value | hash_flow.rb:685:15:685:25 | call to taint : | hash_flow.rb:691:14:691:22 | old_value | $@ | hash_flow.rb:685:15:685:25 | call to taint : | call to taint : | -| hash_flow.rb:691:14:691:22 | old_value | hash_flow.rb:687:15:687:25 | call to taint : | hash_flow.rb:691:14:691:22 | old_value | $@ | hash_flow.rb:687:15:687:25 | call to taint : | call to taint : | -| hash_flow.rb:692:14:692:22 | new_value | hash_flow.rb:680:15:680:25 | call to taint : | hash_flow.rb:692:14:692:22 | new_value | $@ | hash_flow.rb:680:15:680:25 | call to taint : | call to taint : | -| hash_flow.rb:692:14:692:22 | new_value | hash_flow.rb:682:15:682:25 | call to taint : | hash_flow.rb:692:14:692:22 | new_value | $@ | hash_flow.rb:682:15:682:25 | call to taint : | call to taint : | -| hash_flow.rb:692:14:692:22 | new_value | hash_flow.rb:685:15:685:25 | call to taint : | hash_flow.rb:692:14:692:22 | new_value | $@ | hash_flow.rb:685:15:685:25 | call to taint : | call to taint : | -| hash_flow.rb:692:14:692:22 | new_value | hash_flow.rb:687:15:687:25 | call to taint : | hash_flow.rb:692:14:692:22 | new_value | $@ | hash_flow.rb:687:15:687:25 | call to taint : | call to taint : | -| hash_flow.rb:694:10:694:19 | ( ... ) | hash_flow.rb:680:15:680:25 | call to taint : | hash_flow.rb:694:10:694:19 | ( ... ) | $@ | hash_flow.rb:680:15:680:25 | call to taint : | call to taint : | -| hash_flow.rb:696:10:696:19 | ( ... ) | hash_flow.rb:682:15:682:25 | call to taint : | hash_flow.rb:696:10:696:19 | ( ... ) | $@ | hash_flow.rb:682:15:682:25 | call to taint : | call to taint : | -| hash_flow.rb:697:10:697:19 | ( ... ) | hash_flow.rb:685:15:685:25 | call to taint : | hash_flow.rb:697:10:697:19 | ( ... ) | $@ | hash_flow.rb:685:15:685:25 | call to taint : | call to taint : | -| hash_flow.rb:699:10:699:19 | ( ... ) | hash_flow.rb:687:15:687:25 | call to taint : | hash_flow.rb:699:10:699:19 | ( ... ) | $@ | hash_flow.rb:687:15:687:25 | call to taint : | call to taint : | -| hash_flow.rb:701:10:701:20 | ( ... ) | hash_flow.rb:680:15:680:25 | call to taint : | hash_flow.rb:701:10:701:20 | ( ... ) | $@ | hash_flow.rb:680:15:680:25 | call to taint : | call to taint : | -| hash_flow.rb:703:10:703:20 | ( ... ) | hash_flow.rb:682:15:682:25 | call to taint : | hash_flow.rb:703:10:703:20 | ( ... ) | $@ | hash_flow.rb:682:15:682:25 | call to taint : | call to taint : | -| hash_flow.rb:704:10:704:20 | ( ... ) | hash_flow.rb:685:15:685:25 | call to taint : | hash_flow.rb:704:10:704:20 | ( ... ) | $@ | hash_flow.rb:685:15:685:25 | call to taint : | call to taint : | -| hash_flow.rb:706:10:706:20 | ( ... ) | hash_flow.rb:687:15:687:25 | call to taint : | hash_flow.rb:706:10:706:20 | ( ... ) | $@ | hash_flow.rb:687:15:687:25 | call to taint : | call to taint : | -| hash_flow.rb:718:10:718:15 | ( ... ) | hash_flow.rb:713:15:713:25 | call to taint : | hash_flow.rb:718:10:718:15 | ( ... ) | $@ | hash_flow.rb:713:15:713:25 | call to taint : | call to taint : | -| hash_flow.rb:718:10:718:15 | ( ... ) | hash_flow.rb:715:15:715:25 | call to taint : | hash_flow.rb:718:10:718:15 | ( ... ) | $@ | hash_flow.rb:715:15:715:25 | call to taint : | call to taint : | -| hash_flow.rb:730:10:730:13 | ...[...] | hash_flow.rb:725:15:725:25 | call to taint : | hash_flow.rb:730:10:730:13 | ...[...] | $@ | hash_flow.rb:725:15:725:25 | call to taint : | call to taint : | -| hash_flow.rb:732:10:732:13 | ...[...] | hash_flow.rb:725:15:725:25 | call to taint : | hash_flow.rb:732:10:732:13 | ...[...] | $@ | hash_flow.rb:725:15:725:25 | call to taint : | call to taint : | -| hash_flow.rb:732:10:732:13 | ...[...] | hash_flow.rb:727:15:727:25 | call to taint : | hash_flow.rb:732:10:732:13 | ...[...] | $@ | hash_flow.rb:727:15:727:25 | call to taint : | call to taint : | -| hash_flow.rb:749:10:749:17 | ...[...] | hash_flow.rb:739:15:739:25 | call to taint : | hash_flow.rb:749:10:749:17 | ...[...] | $@ | hash_flow.rb:739:15:739:25 | call to taint : | call to taint : | -| hash_flow.rb:751:10:751:17 | ...[...] | hash_flow.rb:741:15:741:25 | call to taint : | hash_flow.rb:751:10:751:17 | ...[...] | $@ | hash_flow.rb:741:15:741:25 | call to taint : | call to taint : | -| hash_flow.rb:752:10:752:17 | ...[...] | hash_flow.rb:744:15:744:25 | call to taint : | hash_flow.rb:752:10:752:17 | ...[...] | $@ | hash_flow.rb:744:15:744:25 | call to taint : | call to taint : | -| hash_flow.rb:754:10:754:17 | ...[...] | hash_flow.rb:746:15:746:25 | call to taint : | hash_flow.rb:754:10:754:17 | ...[...] | $@ | hash_flow.rb:746:15:746:25 | call to taint : | call to taint : | -| hash_flow.rb:755:10:755:17 | ...[...] | hash_flow.rb:748:29:748:39 | call to taint : | hash_flow.rb:755:10:755:17 | ...[...] | $@ | hash_flow.rb:748:29:748:39 | call to taint : | call to taint : | -| hash_flow.rb:769:10:769:17 | ...[...] | hash_flow.rb:763:15:763:25 | call to taint : | hash_flow.rb:769:10:769:17 | ...[...] | $@ | hash_flow.rb:763:15:763:25 | call to taint : | call to taint : | -| hash_flow.rb:771:10:771:17 | ...[...] | hash_flow.rb:765:15:765:25 | call to taint : | hash_flow.rb:771:10:771:17 | ...[...] | $@ | hash_flow.rb:765:15:765:25 | call to taint : | call to taint : | -| hash_flow.rb:772:10:772:17 | ...[...] | hash_flow.rb:766:15:766:25 | call to taint : | hash_flow.rb:772:10:772:17 | ...[...] | $@ | hash_flow.rb:766:15:766:25 | call to taint : | call to taint : | -| hash_flow.rb:778:10:778:14 | ...[...] | hash_flow.rb:765:15:765:25 | call to taint : | hash_flow.rb:778:10:778:14 | ...[...] | $@ | hash_flow.rb:765:15:765:25 | call to taint : | call to taint : | -| hash_flow.rb:783:10:783:17 | ...[...] | hash_flow.rb:765:15:765:25 | call to taint : | hash_flow.rb:783:10:783:17 | ...[...] | $@ | hash_flow.rb:765:15:765:25 | call to taint : | call to taint : | -| hash_flow.rb:802:14:802:22 | old_value | hash_flow.rb:791:15:791:25 | call to taint : | hash_flow.rb:802:14:802:22 | old_value | $@ | hash_flow.rb:791:15:791:25 | call to taint : | call to taint : | -| hash_flow.rb:802:14:802:22 | old_value | hash_flow.rb:793:15:793:25 | call to taint : | hash_flow.rb:802:14:802:22 | old_value | $@ | hash_flow.rb:793:15:793:25 | call to taint : | call to taint : | -| hash_flow.rb:802:14:802:22 | old_value | hash_flow.rb:796:15:796:25 | call to taint : | hash_flow.rb:802:14:802:22 | old_value | $@ | hash_flow.rb:796:15:796:25 | call to taint : | call to taint : | -| hash_flow.rb:802:14:802:22 | old_value | hash_flow.rb:798:15:798:25 | call to taint : | hash_flow.rb:802:14:802:22 | old_value | $@ | hash_flow.rb:798:15:798:25 | call to taint : | call to taint : | -| hash_flow.rb:803:14:803:22 | new_value | hash_flow.rb:791:15:791:25 | call to taint : | hash_flow.rb:803:14:803:22 | new_value | $@ | hash_flow.rb:791:15:791:25 | call to taint : | call to taint : | -| hash_flow.rb:803:14:803:22 | new_value | hash_flow.rb:793:15:793:25 | call to taint : | hash_flow.rb:803:14:803:22 | new_value | $@ | hash_flow.rb:793:15:793:25 | call to taint : | call to taint : | -| hash_flow.rb:803:14:803:22 | new_value | hash_flow.rb:796:15:796:25 | call to taint : | hash_flow.rb:803:14:803:22 | new_value | $@ | hash_flow.rb:796:15:796:25 | call to taint : | call to taint : | -| hash_flow.rb:803:14:803:22 | new_value | hash_flow.rb:798:15:798:25 | call to taint : | hash_flow.rb:803:14:803:22 | new_value | $@ | hash_flow.rb:798:15:798:25 | call to taint : | call to taint : | -| hash_flow.rb:805:10:805:19 | ( ... ) | hash_flow.rb:791:15:791:25 | call to taint : | hash_flow.rb:805:10:805:19 | ( ... ) | $@ | hash_flow.rb:791:15:791:25 | call to taint : | call to taint : | -| hash_flow.rb:807:10:807:19 | ( ... ) | hash_flow.rb:793:15:793:25 | call to taint : | hash_flow.rb:807:10:807:19 | ( ... ) | $@ | hash_flow.rb:793:15:793:25 | call to taint : | call to taint : | -| hash_flow.rb:808:10:808:19 | ( ... ) | hash_flow.rb:796:15:796:25 | call to taint : | hash_flow.rb:808:10:808:19 | ( ... ) | $@ | hash_flow.rb:796:15:796:25 | call to taint : | call to taint : | -| hash_flow.rb:810:10:810:19 | ( ... ) | hash_flow.rb:798:15:798:25 | call to taint : | hash_flow.rb:810:10:810:19 | ( ... ) | $@ | hash_flow.rb:798:15:798:25 | call to taint : | call to taint : | -| hash_flow.rb:828:14:828:22 | old_value | hash_flow.rb:817:15:817:25 | call to taint : | hash_flow.rb:828:14:828:22 | old_value | $@ | hash_flow.rb:817:15:817:25 | call to taint : | call to taint : | -| hash_flow.rb:828:14:828:22 | old_value | hash_flow.rb:819:15:819:25 | call to taint : | hash_flow.rb:828:14:828:22 | old_value | $@ | hash_flow.rb:819:15:819:25 | call to taint : | call to taint : | -| hash_flow.rb:828:14:828:22 | old_value | hash_flow.rb:822:15:822:25 | call to taint : | hash_flow.rb:828:14:828:22 | old_value | $@ | hash_flow.rb:822:15:822:25 | call to taint : | call to taint : | -| hash_flow.rb:828:14:828:22 | old_value | hash_flow.rb:824:15:824:25 | call to taint : | hash_flow.rb:828:14:828:22 | old_value | $@ | hash_flow.rb:824:15:824:25 | call to taint : | call to taint : | -| hash_flow.rb:829:14:829:22 | new_value | hash_flow.rb:817:15:817:25 | call to taint : | hash_flow.rb:829:14:829:22 | new_value | $@ | hash_flow.rb:817:15:817:25 | call to taint : | call to taint : | -| hash_flow.rb:829:14:829:22 | new_value | hash_flow.rb:819:15:819:25 | call to taint : | hash_flow.rb:829:14:829:22 | new_value | $@ | hash_flow.rb:819:15:819:25 | call to taint : | call to taint : | -| hash_flow.rb:829:14:829:22 | new_value | hash_flow.rb:822:15:822:25 | call to taint : | hash_flow.rb:829:14:829:22 | new_value | $@ | hash_flow.rb:822:15:822:25 | call to taint : | call to taint : | -| hash_flow.rb:829:14:829:22 | new_value | hash_flow.rb:824:15:824:25 | call to taint : | hash_flow.rb:829:14:829:22 | new_value | $@ | hash_flow.rb:824:15:824:25 | call to taint : | call to taint : | -| hash_flow.rb:831:10:831:19 | ( ... ) | hash_flow.rb:817:15:817:25 | call to taint : | hash_flow.rb:831:10:831:19 | ( ... ) | $@ | hash_flow.rb:817:15:817:25 | call to taint : | call to taint : | -| hash_flow.rb:833:10:833:19 | ( ... ) | hash_flow.rb:819:15:819:25 | call to taint : | hash_flow.rb:833:10:833:19 | ( ... ) | $@ | hash_flow.rb:819:15:819:25 | call to taint : | call to taint : | -| hash_flow.rb:834:10:834:19 | ( ... ) | hash_flow.rb:822:15:822:25 | call to taint : | hash_flow.rb:834:10:834:19 | ( ... ) | $@ | hash_flow.rb:822:15:822:25 | call to taint : | call to taint : | -| hash_flow.rb:836:10:836:19 | ( ... ) | hash_flow.rb:824:15:824:25 | call to taint : | hash_flow.rb:836:10:836:19 | ( ... ) | $@ | hash_flow.rb:824:15:824:25 | call to taint : | call to taint : | -| hash_flow.rb:838:10:838:20 | ( ... ) | hash_flow.rb:817:15:817:25 | call to taint : | hash_flow.rb:838:10:838:20 | ( ... ) | $@ | hash_flow.rb:817:15:817:25 | call to taint : | call to taint : | -| hash_flow.rb:840:10:840:20 | ( ... ) | hash_flow.rb:819:15:819:25 | call to taint : | hash_flow.rb:840:10:840:20 | ( ... ) | $@ | hash_flow.rb:819:15:819:25 | call to taint : | call to taint : | -| hash_flow.rb:841:10:841:20 | ( ... ) | hash_flow.rb:822:15:822:25 | call to taint : | hash_flow.rb:841:10:841:20 | ( ... ) | $@ | hash_flow.rb:822:15:822:25 | call to taint : | call to taint : | -| hash_flow.rb:843:10:843:20 | ( ... ) | hash_flow.rb:824:15:824:25 | call to taint : | hash_flow.rb:843:10:843:20 | ( ... ) | $@ | hash_flow.rb:824:15:824:25 | call to taint : | call to taint : | -| hash_flow.rb:861:10:861:20 | ( ... ) | hash_flow.rb:850:12:850:22 | call to taint : | hash_flow.rb:861:10:861:20 | ( ... ) | $@ | hash_flow.rb:850:12:850:22 | call to taint : | call to taint : | -| hash_flow.rb:863:10:863:20 | ( ... ) | hash_flow.rb:852:12:852:22 | call to taint : | hash_flow.rb:863:10:863:20 | ( ... ) | $@ | hash_flow.rb:852:12:852:22 | call to taint : | call to taint : | -| hash_flow.rb:864:10:864:20 | ( ... ) | hash_flow.rb:855:12:855:22 | call to taint : | hash_flow.rb:864:10:864:20 | ( ... ) | $@ | hash_flow.rb:855:12:855:22 | call to taint : | call to taint : | -| hash_flow.rb:866:10:866:20 | ( ... ) | hash_flow.rb:857:12:857:22 | call to taint : | hash_flow.rb:866:10:866:20 | ( ... ) | $@ | hash_flow.rb:857:12:857:22 | call to taint : | call to taint : | -| hash_flow.rb:870:10:870:20 | ( ... ) | hash_flow.rb:850:12:850:22 | call to taint : | hash_flow.rb:870:10:870:20 | ( ... ) | $@ | hash_flow.rb:850:12:850:22 | call to taint : | call to taint : | -| hash_flow.rb:872:10:872:20 | ( ... ) | hash_flow.rb:852:12:852:22 | call to taint : | hash_flow.rb:872:10:872:20 | ( ... ) | $@ | hash_flow.rb:852:12:852:22 | call to taint : | call to taint : | -| hash_flow.rb:873:10:873:20 | ( ... ) | hash_flow.rb:855:12:855:22 | call to taint : | hash_flow.rb:873:10:873:20 | ( ... ) | $@ | hash_flow.rb:855:12:855:22 | call to taint : | call to taint : | -| hash_flow.rb:875:10:875:20 | ( ... ) | hash_flow.rb:857:12:857:22 | call to taint : | hash_flow.rb:875:10:875:20 | ( ... ) | $@ | hash_flow.rb:857:12:857:22 | call to taint : | call to taint : | -| hash_flow.rb:893:10:893:19 | ( ... ) | hash_flow.rb:882:12:882:22 | call to taint : | hash_flow.rb:893:10:893:19 | ( ... ) | $@ | hash_flow.rb:882:12:882:22 | call to taint : | call to taint : | -| hash_flow.rb:895:10:895:19 | ( ... ) | hash_flow.rb:884:12:884:22 | call to taint : | hash_flow.rb:895:10:895:19 | ( ... ) | $@ | hash_flow.rb:884:12:884:22 | call to taint : | call to taint : | -| hash_flow.rb:896:10:896:19 | ( ... ) | hash_flow.rb:887:12:887:22 | call to taint : | hash_flow.rb:896:10:896:19 | ( ... ) | $@ | hash_flow.rb:887:12:887:22 | call to taint : | call to taint : | -| hash_flow.rb:898:10:898:19 | ( ... ) | hash_flow.rb:889:12:889:22 | call to taint : | hash_flow.rb:898:10:898:19 | ( ... ) | $@ | hash_flow.rb:889:12:889:22 | call to taint : | call to taint : | -| hash_flow.rb:900:10:900:20 | ( ... ) | hash_flow.rb:882:12:882:22 | call to taint : | hash_flow.rb:900:10:900:20 | ( ... ) | $@ | hash_flow.rb:882:12:882:22 | call to taint : | call to taint : | -| hash_flow.rb:902:10:902:20 | ( ... ) | hash_flow.rb:884:12:884:22 | call to taint : | hash_flow.rb:902:10:902:20 | ( ... ) | $@ | hash_flow.rb:884:12:884:22 | call to taint : | call to taint : | -| hash_flow.rb:903:10:903:20 | ( ... ) | hash_flow.rb:887:12:887:22 | call to taint : | hash_flow.rb:903:10:903:20 | ( ... ) | $@ | hash_flow.rb:887:12:887:22 | call to taint : | call to taint : | -| hash_flow.rb:905:10:905:20 | ( ... ) | hash_flow.rb:889:12:889:22 | call to taint : | hash_flow.rb:905:10:905:20 | ( ... ) | $@ | hash_flow.rb:889:12:889:22 | call to taint : | call to taint : | -| hash_flow.rb:923:10:923:19 | ( ... ) | hash_flow.rb:912:12:912:22 | call to taint : | hash_flow.rb:923:10:923:19 | ( ... ) | $@ | hash_flow.rb:912:12:912:22 | call to taint : | call to taint : | -| hash_flow.rb:925:10:925:19 | ( ... ) | hash_flow.rb:914:12:914:22 | call to taint : | hash_flow.rb:925:10:925:19 | ( ... ) | $@ | hash_flow.rb:914:12:914:22 | call to taint : | call to taint : | -| hash_flow.rb:926:10:926:19 | ( ... ) | hash_flow.rb:917:12:917:22 | call to taint : | hash_flow.rb:926:10:926:19 | ( ... ) | $@ | hash_flow.rb:917:12:917:22 | call to taint : | call to taint : | -| hash_flow.rb:928:10:928:19 | ( ... ) | hash_flow.rb:919:12:919:22 | call to taint : | hash_flow.rb:928:10:928:19 | ( ... ) | $@ | hash_flow.rb:919:12:919:22 | call to taint : | call to taint : | -| hash_flow.rb:930:10:930:20 | ( ... ) | hash_flow.rb:912:12:912:22 | call to taint : | hash_flow.rb:930:10:930:20 | ( ... ) | $@ | hash_flow.rb:912:12:912:22 | call to taint : | call to taint : | -| hash_flow.rb:932:10:932:20 | ( ... ) | hash_flow.rb:914:12:914:22 | call to taint : | hash_flow.rb:932:10:932:20 | ( ... ) | $@ | hash_flow.rb:914:12:914:22 | call to taint : | call to taint : | -| hash_flow.rb:933:10:933:20 | ( ... ) | hash_flow.rb:917:12:917:22 | call to taint : | hash_flow.rb:933:10:933:20 | ( ... ) | $@ | hash_flow.rb:917:12:917:22 | call to taint : | call to taint : | -| hash_flow.rb:935:10:935:20 | ( ... ) | hash_flow.rb:919:12:919:22 | call to taint : | hash_flow.rb:935:10:935:20 | ( ... ) | $@ | hash_flow.rb:919:12:919:22 | call to taint : | call to taint : | -| hash_flow.rb:953:10:953:19 | ( ... ) | hash_flow.rb:942:12:942:22 | call to taint : | hash_flow.rb:953:10:953:19 | ( ... ) | $@ | hash_flow.rb:942:12:942:22 | call to taint : | call to taint : | -| hash_flow.rb:955:10:955:19 | ( ... ) | hash_flow.rb:944:12:944:22 | call to taint : | hash_flow.rb:955:10:955:19 | ( ... ) | $@ | hash_flow.rb:944:12:944:22 | call to taint : | call to taint : | -| hash_flow.rb:956:10:956:19 | ( ... ) | hash_flow.rb:947:12:947:22 | call to taint : | hash_flow.rb:956:10:956:19 | ( ... ) | $@ | hash_flow.rb:947:12:947:22 | call to taint : | call to taint : | -| hash_flow.rb:958:10:958:19 | ( ... ) | hash_flow.rb:949:12:949:22 | call to taint : | hash_flow.rb:958:10:958:19 | ( ... ) | $@ | hash_flow.rb:949:12:949:22 | call to taint : | call to taint : | -| hash_flow.rb:960:10:960:20 | ( ... ) | hash_flow.rb:942:12:942:22 | call to taint : | hash_flow.rb:960:10:960:20 | ( ... ) | $@ | hash_flow.rb:942:12:942:22 | call to taint : | call to taint : | -| hash_flow.rb:962:10:962:20 | ( ... ) | hash_flow.rb:944:12:944:22 | call to taint : | hash_flow.rb:962:10:962:20 | ( ... ) | $@ | hash_flow.rb:944:12:944:22 | call to taint : | call to taint : | -| hash_flow.rb:963:10:963:20 | ( ... ) | hash_flow.rb:947:12:947:22 | call to taint : | hash_flow.rb:963:10:963:20 | ( ... ) | $@ | hash_flow.rb:947:12:947:22 | call to taint : | call to taint : | -| hash_flow.rb:965:10:965:20 | ( ... ) | hash_flow.rb:949:12:949:22 | call to taint : | hash_flow.rb:965:10:965:20 | ( ... ) | $@ | hash_flow.rb:949:12:949:22 | call to taint : | call to taint : | +| hash_flow.rb:22:10:22:17 | ...[...] | hash_flow.rb:11:15:11:24 | call to taint | hash_flow.rb:22:10:22:17 | ...[...] | $@ | hash_flow.rb:11:15:11:24 | call to taint | call to taint | +| hash_flow.rb:24:10:24:17 | ...[...] | hash_flow.rb:13:12:13:21 | call to taint | hash_flow.rb:24:10:24:17 | ...[...] | $@ | hash_flow.rb:13:12:13:21 | call to taint | call to taint | +| hash_flow.rb:26:10:26:18 | ...[...] | hash_flow.rb:15:14:15:23 | call to taint | hash_flow.rb:26:10:26:18 | ...[...] | $@ | hash_flow.rb:15:14:15:23 | call to taint | call to taint | +| hash_flow.rb:28:10:28:18 | ...[...] | hash_flow.rb:17:16:17:25 | call to taint | hash_flow.rb:28:10:28:18 | ...[...] | $@ | hash_flow.rb:17:16:17:25 | call to taint | call to taint | +| hash_flow.rb:30:10:30:16 | ...[...] | hash_flow.rb:19:14:19:23 | call to taint | hash_flow.rb:30:10:30:16 | ...[...] | $@ | hash_flow.rb:19:14:19:23 | call to taint | call to taint | +| hash_flow.rb:44:10:44:16 | ...[...] | hash_flow.rb:38:15:38:24 | call to taint | hash_flow.rb:44:10:44:16 | ...[...] | $@ | hash_flow.rb:38:15:38:24 | call to taint | call to taint | +| hash_flow.rb:46:10:46:17 | ...[...] | hash_flow.rb:40:16:40:25 | call to taint | hash_flow.rb:46:10:46:17 | ...[...] | $@ | hash_flow.rb:40:16:40:25 | call to taint | call to taint | +| hash_flow.rb:48:10:48:18 | ...[...] | hash_flow.rb:42:17:42:26 | call to taint | hash_flow.rb:48:10:48:18 | ...[...] | $@ | hash_flow.rb:42:17:42:26 | call to taint | call to taint | +| hash_flow.rb:56:10:56:18 | ...[...] | hash_flow.rb:55:21:55:30 | call to taint | hash_flow.rb:56:10:56:18 | ...[...] | $@ | hash_flow.rb:55:21:55:30 | call to taint | call to taint | +| hash_flow.rb:61:10:61:18 | ...[...] | hash_flow.rb:59:13:59:22 | call to taint | hash_flow.rb:61:10:61:18 | ...[...] | $@ | hash_flow.rb:59:13:59:22 | call to taint | call to taint | +| hash_flow.rb:65:10:65:18 | ...[...] | hash_flow.rb:64:24:64:33 | call to taint | hash_flow.rb:65:10:65:18 | ...[...] | $@ | hash_flow.rb:64:24:64:33 | call to taint | call to taint | +| hash_flow.rb:66:10:66:18 | ...[...] | hash_flow.rb:64:24:64:33 | call to taint | hash_flow.rb:66:10:66:18 | ...[...] | $@ | hash_flow.rb:64:24:64:33 | call to taint | call to taint | +| hash_flow.rb:69:10:69:18 | ...[...] | hash_flow.rb:68:22:68:31 | call to taint | hash_flow.rb:69:10:69:18 | ...[...] | $@ | hash_flow.rb:68:22:68:31 | call to taint | call to taint | +| hash_flow.rb:73:10:73:19 | ...[...] | hash_flow.rb:72:25:72:34 | call to taint | hash_flow.rb:73:10:73:19 | ...[...] | $@ | hash_flow.rb:72:25:72:34 | call to taint | call to taint | +| hash_flow.rb:77:10:77:19 | ...[...] | hash_flow.rb:76:26:76:35 | call to taint | hash_flow.rb:77:10:77:19 | ...[...] | $@ | hash_flow.rb:76:26:76:35 | call to taint | call to taint | +| hash_flow.rb:85:10:85:18 | ...[...] | hash_flow.rb:84:26:84:35 | call to taint | hash_flow.rb:85:10:85:18 | ...[...] | $@ | hash_flow.rb:84:26:84:35 | call to taint | call to taint | +| hash_flow.rb:97:10:97:18 | ...[...] | hash_flow.rb:93:15:93:24 | call to taint | hash_flow.rb:97:10:97:18 | ...[...] | $@ | hash_flow.rb:93:15:93:24 | call to taint | call to taint | +| hash_flow.rb:106:10:106:10 | b | hash_flow.rb:105:21:105:30 | call to taint | hash_flow.rb:106:10:106:10 | b | $@ | hash_flow.rb:105:21:105:30 | call to taint | call to taint | +| hash_flow.rb:114:10:114:17 | ...[...] | hash_flow.rb:113:24:113:33 | call to taint | hash_flow.rb:114:10:114:17 | ...[...] | $@ | hash_flow.rb:113:24:113:33 | call to taint | call to taint | +| hash_flow.rb:115:10:115:10 | b | hash_flow.rb:113:24:113:33 | call to taint | hash_flow.rb:115:10:115:10 | b | $@ | hash_flow.rb:113:24:113:33 | call to taint | call to taint | +| hash_flow.rb:119:10:119:17 | ...[...] | hash_flow.rb:118:23:118:32 | call to taint | hash_flow.rb:119:10:119:17 | ...[...] | $@ | hash_flow.rb:118:23:118:32 | call to taint | call to taint | +| hash_flow.rb:120:10:120:17 | ...[...] | hash_flow.rb:118:23:118:32 | call to taint | hash_flow.rb:120:10:120:17 | ...[...] | $@ | hash_flow.rb:118:23:118:32 | call to taint | call to taint | +| hash_flow.rb:121:10:121:10 | c | hash_flow.rb:118:23:118:32 | call to taint | hash_flow.rb:121:10:121:10 | c | $@ | hash_flow.rb:118:23:118:32 | call to taint | call to taint | +| hash_flow.rb:132:14:132:25 | key_or_value | hash_flow.rb:128:15:128:24 | call to taint | hash_flow.rb:132:14:132:25 | key_or_value | $@ | hash_flow.rb:128:15:128:24 | call to taint | call to taint | +| hash_flow.rb:136:14:136:18 | value | hash_flow.rb:128:15:128:24 | call to taint | hash_flow.rb:136:14:136:18 | value | $@ | hash_flow.rb:128:15:128:24 | call to taint | call to taint | +| hash_flow.rb:149:10:149:13 | ...[...] | hash_flow.rb:144:15:144:25 | call to taint | hash_flow.rb:149:10:149:13 | ...[...] | $@ | hash_flow.rb:144:15:144:25 | call to taint | call to taint | +| hash_flow.rb:150:10:150:13 | ...[...] | hash_flow.rb:144:15:144:25 | call to taint | hash_flow.rb:150:10:150:13 | ...[...] | $@ | hash_flow.rb:144:15:144:25 | call to taint | call to taint | +| hash_flow.rb:152:10:152:13 | ...[...] | hash_flow.rb:144:15:144:25 | call to taint | hash_flow.rb:152:10:152:13 | ...[...] | $@ | hash_flow.rb:144:15:144:25 | call to taint | call to taint | +| hash_flow.rb:174:10:174:14 | ...[...] | hash_flow.rb:170:15:170:25 | call to taint | hash_flow.rb:174:10:174:14 | ...[...] | $@ | hash_flow.rb:170:15:170:25 | call to taint | call to taint | +| hash_flow.rb:186:10:186:10 | a | hash_flow.rb:182:15:182:25 | call to taint | hash_flow.rb:186:10:186:10 | a | $@ | hash_flow.rb:182:15:182:25 | call to taint | call to taint | +| hash_flow.rb:199:14:199:18 | value | hash_flow.rb:194:15:194:25 | call to taint | hash_flow.rb:199:14:199:18 | value | $@ | hash_flow.rb:194:15:194:25 | call to taint | call to taint | +| hash_flow.rb:201:10:201:14 | ...[...] | hash_flow.rb:194:15:194:25 | call to taint | hash_flow.rb:201:10:201:14 | ...[...] | $@ | hash_flow.rb:194:15:194:25 | call to taint | call to taint | +| hash_flow.rb:202:10:202:17 | ...[...] | hash_flow.rb:194:15:194:25 | call to taint | hash_flow.rb:202:10:202:17 | ...[...] | $@ | hash_flow.rb:194:15:194:25 | call to taint | call to taint | +| hash_flow.rb:217:10:217:21 | call to dig | hash_flow.rb:210:15:210:25 | call to taint | hash_flow.rb:217:10:217:21 | call to dig | $@ | hash_flow.rb:210:15:210:25 | call to taint | call to taint | +| hash_flow.rb:219:10:219:24 | call to dig | hash_flow.rb:213:19:213:29 | call to taint | hash_flow.rb:219:10:219:24 | call to dig | $@ | hash_flow.rb:213:19:213:29 | call to taint | call to taint | +| hash_flow.rb:232:14:232:18 | value | hash_flow.rb:227:15:227:25 | call to taint | hash_flow.rb:232:14:232:18 | value | $@ | hash_flow.rb:227:15:227:25 | call to taint | call to taint | +| hash_flow.rb:234:10:234:14 | ...[...] | hash_flow.rb:227:15:227:25 | call to taint | hash_flow.rb:234:10:234:14 | ...[...] | $@ | hash_flow.rb:227:15:227:25 | call to taint | call to taint | +| hash_flow.rb:248:10:248:14 | ...[...] | hash_flow.rb:242:15:242:25 | call to taint | hash_flow.rb:248:10:248:14 | ...[...] | $@ | hash_flow.rb:242:15:242:25 | call to taint | call to taint | +| hash_flow.rb:261:14:261:18 | value | hash_flow.rb:256:15:256:25 | call to taint | hash_flow.rb:261:14:261:18 | value | $@ | hash_flow.rb:256:15:256:25 | call to taint | call to taint | +| hash_flow.rb:263:10:263:14 | ...[...] | hash_flow.rb:256:15:256:25 | call to taint | hash_flow.rb:263:10:263:14 | ...[...] | $@ | hash_flow.rb:256:15:256:25 | call to taint | call to taint | +| hash_flow.rb:275:14:275:18 | value | hash_flow.rb:271:15:271:25 | call to taint | hash_flow.rb:275:14:275:18 | value | $@ | hash_flow.rb:271:15:271:25 | call to taint | call to taint | +| hash_flow.rb:277:10:277:14 | ...[...] | hash_flow.rb:271:15:271:25 | call to taint | hash_flow.rb:277:10:277:14 | ...[...] | $@ | hash_flow.rb:271:15:271:25 | call to taint | call to taint | +| hash_flow.rb:293:10:293:14 | ...[...] | hash_flow.rb:287:15:287:25 | call to taint | hash_flow.rb:293:10:293:14 | ...[...] | $@ | hash_flow.rb:287:15:287:25 | call to taint | call to taint | +| hash_flow.rb:306:14:306:14 | x | hash_flow.rb:305:20:305:30 | call to taint | hash_flow.rb:306:14:306:14 | x | $@ | hash_flow.rb:305:20:305:30 | call to taint | call to taint | +| hash_flow.rb:308:10:308:10 | b | hash_flow.rb:301:15:301:25 | call to taint | hash_flow.rb:308:10:308:10 | b | $@ | hash_flow.rb:301:15:301:25 | call to taint | call to taint | +| hash_flow.rb:308:10:308:10 | b | hash_flow.rb:303:15:303:25 | call to taint | hash_flow.rb:308:10:308:10 | b | $@ | hash_flow.rb:303:15:303:25 | call to taint | call to taint | +| hash_flow.rb:310:10:310:10 | b | hash_flow.rb:301:15:301:25 | call to taint | hash_flow.rb:310:10:310:10 | b | $@ | hash_flow.rb:301:15:301:25 | call to taint | call to taint | +| hash_flow.rb:312:10:312:10 | b | hash_flow.rb:301:15:301:25 | call to taint | hash_flow.rb:312:10:312:10 | b | $@ | hash_flow.rb:301:15:301:25 | call to taint | call to taint | +| hash_flow.rb:312:10:312:10 | b | hash_flow.rb:311:24:311:34 | call to taint | hash_flow.rb:312:10:312:10 | b | $@ | hash_flow.rb:311:24:311:34 | call to taint | call to taint | +| hash_flow.rb:314:10:314:10 | b | hash_flow.rb:313:24:313:34 | call to taint | hash_flow.rb:314:10:314:10 | b | $@ | hash_flow.rb:313:24:313:34 | call to taint | call to taint | +| hash_flow.rb:316:10:316:10 | b | hash_flow.rb:301:15:301:25 | call to taint | hash_flow.rb:316:10:316:10 | b | $@ | hash_flow.rb:301:15:301:25 | call to taint | call to taint | +| hash_flow.rb:316:10:316:10 | b | hash_flow.rb:303:15:303:25 | call to taint | hash_flow.rb:316:10:316:10 | b | $@ | hash_flow.rb:303:15:303:25 | call to taint | call to taint | +| hash_flow.rb:316:10:316:10 | b | hash_flow.rb:315:23:315:33 | call to taint | hash_flow.rb:316:10:316:10 | b | $@ | hash_flow.rb:315:23:315:33 | call to taint | call to taint | +| hash_flow.rb:328:14:328:14 | x | hash_flow.rb:327:27:327:37 | call to taint | hash_flow.rb:328:14:328:14 | x | $@ | hash_flow.rb:327:27:327:37 | call to taint | call to taint | +| hash_flow.rb:331:10:331:13 | ...[...] | hash_flow.rb:323:15:323:25 | call to taint | hash_flow.rb:331:10:331:13 | ...[...] | $@ | hash_flow.rb:323:15:323:25 | call to taint | call to taint | +| hash_flow.rb:331:10:331:13 | ...[...] | hash_flow.rb:325:15:325:25 | call to taint | hash_flow.rb:331:10:331:13 | ...[...] | $@ | hash_flow.rb:325:15:325:25 | call to taint | call to taint | +| hash_flow.rb:331:10:331:13 | ...[...] | hash_flow.rb:329:9:329:19 | call to taint | hash_flow.rb:331:10:331:13 | ...[...] | $@ | hash_flow.rb:329:9:329:19 | call to taint | call to taint | +| hash_flow.rb:333:10:333:13 | ...[...] | hash_flow.rb:323:15:323:25 | call to taint | hash_flow.rb:333:10:333:13 | ...[...] | $@ | hash_flow.rb:323:15:323:25 | call to taint | call to taint | +| hash_flow.rb:335:10:335:13 | ...[...] | hash_flow.rb:323:15:323:25 | call to taint | hash_flow.rb:335:10:335:13 | ...[...] | $@ | hash_flow.rb:323:15:323:25 | call to taint | call to taint | +| hash_flow.rb:335:10:335:13 | ...[...] | hash_flow.rb:325:15:325:25 | call to taint | hash_flow.rb:335:10:335:13 | ...[...] | $@ | hash_flow.rb:325:15:325:25 | call to taint | call to taint | +| hash_flow.rb:348:14:348:18 | value | hash_flow.rb:342:15:342:25 | call to taint | hash_flow.rb:348:14:348:18 | value | $@ | hash_flow.rb:342:15:342:25 | call to taint | call to taint | +| hash_flow.rb:348:14:348:18 | value | hash_flow.rb:344:15:344:25 | call to taint | hash_flow.rb:348:14:348:18 | value | $@ | hash_flow.rb:344:15:344:25 | call to taint | call to taint | +| hash_flow.rb:351:10:351:16 | ( ... ) | hash_flow.rb:342:15:342:25 | call to taint | hash_flow.rb:351:10:351:16 | ( ... ) | $@ | hash_flow.rb:342:15:342:25 | call to taint | call to taint | +| hash_flow.rb:364:14:364:18 | value | hash_flow.rb:358:15:358:25 | call to taint | hash_flow.rb:364:14:364:18 | value | $@ | hash_flow.rb:358:15:358:25 | call to taint | call to taint | +| hash_flow.rb:364:14:364:18 | value | hash_flow.rb:360:15:360:25 | call to taint | hash_flow.rb:364:14:364:18 | value | $@ | hash_flow.rb:360:15:360:25 | call to taint | call to taint | +| hash_flow.rb:367:10:367:19 | ( ... ) | hash_flow.rb:358:15:358:25 | call to taint | hash_flow.rb:367:10:367:19 | ( ... ) | $@ | hash_flow.rb:358:15:358:25 | call to taint | call to taint | +| hash_flow.rb:379:10:379:15 | ( ... ) | hash_flow.rb:374:15:374:25 | call to taint | hash_flow.rb:379:10:379:15 | ( ... ) | $@ | hash_flow.rb:374:15:374:25 | call to taint | call to taint | +| hash_flow.rb:379:10:379:15 | ( ... ) | hash_flow.rb:376:15:376:25 | call to taint | hash_flow.rb:379:10:379:15 | ( ... ) | $@ | hash_flow.rb:376:15:376:25 | call to taint | call to taint | +| hash_flow.rb:392:14:392:18 | value | hash_flow.rb:386:15:386:25 | call to taint | hash_flow.rb:392:14:392:18 | value | $@ | hash_flow.rb:386:15:386:25 | call to taint | call to taint | +| hash_flow.rb:392:14:392:18 | value | hash_flow.rb:388:15:388:25 | call to taint | hash_flow.rb:392:14:392:18 | value | $@ | hash_flow.rb:388:15:388:25 | call to taint | call to taint | +| hash_flow.rb:395:10:395:19 | ( ... ) | hash_flow.rb:386:15:386:25 | call to taint | hash_flow.rb:395:10:395:19 | ( ... ) | $@ | hash_flow.rb:386:15:386:25 | call to taint | call to taint | +| hash_flow.rb:396:10:396:16 | ( ... ) | hash_flow.rb:386:15:386:25 | call to taint | hash_flow.rb:396:10:396:16 | ( ... ) | $@ | hash_flow.rb:386:15:386:25 | call to taint | call to taint | +| hash_flow.rb:414:14:414:22 | old_value | hash_flow.rb:403:15:403:25 | call to taint | hash_flow.rb:414:14:414:22 | old_value | $@ | hash_flow.rb:403:15:403:25 | call to taint | call to taint | +| hash_flow.rb:414:14:414:22 | old_value | hash_flow.rb:405:15:405:25 | call to taint | hash_flow.rb:414:14:414:22 | old_value | $@ | hash_flow.rb:405:15:405:25 | call to taint | call to taint | +| hash_flow.rb:414:14:414:22 | old_value | hash_flow.rb:408:15:408:25 | call to taint | hash_flow.rb:414:14:414:22 | old_value | $@ | hash_flow.rb:408:15:408:25 | call to taint | call to taint | +| hash_flow.rb:414:14:414:22 | old_value | hash_flow.rb:410:15:410:25 | call to taint | hash_flow.rb:414:14:414:22 | old_value | $@ | hash_flow.rb:410:15:410:25 | call to taint | call to taint | +| hash_flow.rb:415:14:415:22 | new_value | hash_flow.rb:403:15:403:25 | call to taint | hash_flow.rb:415:14:415:22 | new_value | $@ | hash_flow.rb:403:15:403:25 | call to taint | call to taint | +| hash_flow.rb:415:14:415:22 | new_value | hash_flow.rb:405:15:405:25 | call to taint | hash_flow.rb:415:14:415:22 | new_value | $@ | hash_flow.rb:405:15:405:25 | call to taint | call to taint | +| hash_flow.rb:415:14:415:22 | new_value | hash_flow.rb:408:15:408:25 | call to taint | hash_flow.rb:415:14:415:22 | new_value | $@ | hash_flow.rb:408:15:408:25 | call to taint | call to taint | +| hash_flow.rb:415:14:415:22 | new_value | hash_flow.rb:410:15:410:25 | call to taint | hash_flow.rb:415:14:415:22 | new_value | $@ | hash_flow.rb:410:15:410:25 | call to taint | call to taint | +| hash_flow.rb:417:10:417:19 | ( ... ) | hash_flow.rb:403:15:403:25 | call to taint | hash_flow.rb:417:10:417:19 | ( ... ) | $@ | hash_flow.rb:403:15:403:25 | call to taint | call to taint | +| hash_flow.rb:419:10:419:19 | ( ... ) | hash_flow.rb:405:15:405:25 | call to taint | hash_flow.rb:419:10:419:19 | ( ... ) | $@ | hash_flow.rb:405:15:405:25 | call to taint | call to taint | +| hash_flow.rb:420:10:420:19 | ( ... ) | hash_flow.rb:408:15:408:25 | call to taint | hash_flow.rb:420:10:420:19 | ( ... ) | $@ | hash_flow.rb:408:15:408:25 | call to taint | call to taint | +| hash_flow.rb:422:10:422:19 | ( ... ) | hash_flow.rb:410:15:410:25 | call to taint | hash_flow.rb:422:10:422:19 | ( ... ) | $@ | hash_flow.rb:410:15:410:25 | call to taint | call to taint | +| hash_flow.rb:440:14:440:22 | old_value | hash_flow.rb:429:15:429:25 | call to taint | hash_flow.rb:440:14:440:22 | old_value | $@ | hash_flow.rb:429:15:429:25 | call to taint | call to taint | +| hash_flow.rb:440:14:440:22 | old_value | hash_flow.rb:431:15:431:25 | call to taint | hash_flow.rb:440:14:440:22 | old_value | $@ | hash_flow.rb:431:15:431:25 | call to taint | call to taint | +| hash_flow.rb:440:14:440:22 | old_value | hash_flow.rb:434:15:434:25 | call to taint | hash_flow.rb:440:14:440:22 | old_value | $@ | hash_flow.rb:434:15:434:25 | call to taint | call to taint | +| hash_flow.rb:440:14:440:22 | old_value | hash_flow.rb:436:15:436:25 | call to taint | hash_flow.rb:440:14:440:22 | old_value | $@ | hash_flow.rb:436:15:436:25 | call to taint | call to taint | +| hash_flow.rb:441:14:441:22 | new_value | hash_flow.rb:429:15:429:25 | call to taint | hash_flow.rb:441:14:441:22 | new_value | $@ | hash_flow.rb:429:15:429:25 | call to taint | call to taint | +| hash_flow.rb:441:14:441:22 | new_value | hash_flow.rb:431:15:431:25 | call to taint | hash_flow.rb:441:14:441:22 | new_value | $@ | hash_flow.rb:431:15:431:25 | call to taint | call to taint | +| hash_flow.rb:441:14:441:22 | new_value | hash_flow.rb:434:15:434:25 | call to taint | hash_flow.rb:441:14:441:22 | new_value | $@ | hash_flow.rb:434:15:434:25 | call to taint | call to taint | +| hash_flow.rb:441:14:441:22 | new_value | hash_flow.rb:436:15:436:25 | call to taint | hash_flow.rb:441:14:441:22 | new_value | $@ | hash_flow.rb:436:15:436:25 | call to taint | call to taint | +| hash_flow.rb:443:10:443:19 | ( ... ) | hash_flow.rb:429:15:429:25 | call to taint | hash_flow.rb:443:10:443:19 | ( ... ) | $@ | hash_flow.rb:429:15:429:25 | call to taint | call to taint | +| hash_flow.rb:445:10:445:19 | ( ... ) | hash_flow.rb:431:15:431:25 | call to taint | hash_flow.rb:445:10:445:19 | ( ... ) | $@ | hash_flow.rb:431:15:431:25 | call to taint | call to taint | +| hash_flow.rb:446:10:446:19 | ( ... ) | hash_flow.rb:434:15:434:25 | call to taint | hash_flow.rb:446:10:446:19 | ( ... ) | $@ | hash_flow.rb:434:15:434:25 | call to taint | call to taint | +| hash_flow.rb:448:10:448:19 | ( ... ) | hash_flow.rb:436:15:436:25 | call to taint | hash_flow.rb:448:10:448:19 | ( ... ) | $@ | hash_flow.rb:436:15:436:25 | call to taint | call to taint | +| hash_flow.rb:450:10:450:20 | ( ... ) | hash_flow.rb:429:15:429:25 | call to taint | hash_flow.rb:450:10:450:20 | ( ... ) | $@ | hash_flow.rb:429:15:429:25 | call to taint | call to taint | +| hash_flow.rb:452:10:452:20 | ( ... ) | hash_flow.rb:431:15:431:25 | call to taint | hash_flow.rb:452:10:452:20 | ( ... ) | $@ | hash_flow.rb:431:15:431:25 | call to taint | call to taint | +| hash_flow.rb:453:10:453:20 | ( ... ) | hash_flow.rb:434:15:434:25 | call to taint | hash_flow.rb:453:10:453:20 | ( ... ) | $@ | hash_flow.rb:434:15:434:25 | call to taint | call to taint | +| hash_flow.rb:455:10:455:20 | ( ... ) | hash_flow.rb:436:15:436:25 | call to taint | hash_flow.rb:455:10:455:20 | ( ... ) | $@ | hash_flow.rb:436:15:436:25 | call to taint | call to taint | +| hash_flow.rb:467:10:467:13 | ...[...] | hash_flow.rb:462:15:462:25 | call to taint | hash_flow.rb:467:10:467:13 | ...[...] | $@ | hash_flow.rb:462:15:462:25 | call to taint | call to taint | +| hash_flow.rb:479:14:479:18 | value | hash_flow.rb:474:15:474:25 | call to taint | hash_flow.rb:479:14:479:18 | value | $@ | hash_flow.rb:474:15:474:25 | call to taint | call to taint | +| hash_flow.rb:482:10:482:14 | ...[...] | hash_flow.rb:474:15:474:25 | call to taint | hash_flow.rb:482:10:482:14 | ...[...] | $@ | hash_flow.rb:474:15:474:25 | call to taint | call to taint | +| hash_flow.rb:494:14:494:18 | value | hash_flow.rb:489:15:489:25 | call to taint | hash_flow.rb:494:14:494:18 | value | $@ | hash_flow.rb:489:15:489:25 | call to taint | call to taint | +| hash_flow.rb:497:10:497:14 | ...[...] | hash_flow.rb:489:15:489:25 | call to taint | hash_flow.rb:497:10:497:14 | ...[...] | $@ | hash_flow.rb:489:15:489:25 | call to taint | call to taint | +| hash_flow.rb:498:10:498:17 | ...[...] | hash_flow.rb:489:15:489:25 | call to taint | hash_flow.rb:498:10:498:17 | ...[...] | $@ | hash_flow.rb:489:15:489:25 | call to taint | call to taint | +| hash_flow.rb:513:10:513:20 | ( ... ) | hash_flow.rb:505:15:505:25 | call to taint | hash_flow.rb:513:10:513:20 | ( ... ) | $@ | hash_flow.rb:505:15:505:25 | call to taint | call to taint | +| hash_flow.rb:515:10:515:20 | ( ... ) | hash_flow.rb:507:15:507:25 | call to taint | hash_flow.rb:515:10:515:20 | ( ... ) | $@ | hash_flow.rb:507:15:507:25 | call to taint | call to taint | +| hash_flow.rb:526:14:526:18 | value | hash_flow.rb:520:15:520:25 | call to taint | hash_flow.rb:526:14:526:18 | value | $@ | hash_flow.rb:520:15:520:25 | call to taint | call to taint | +| hash_flow.rb:526:14:526:18 | value | hash_flow.rb:522:15:522:25 | call to taint | hash_flow.rb:526:14:526:18 | value | $@ | hash_flow.rb:522:15:522:25 | call to taint | call to taint | +| hash_flow.rb:529:10:529:16 | ( ... ) | hash_flow.rb:520:15:520:25 | call to taint | hash_flow.rb:529:10:529:16 | ( ... ) | $@ | hash_flow.rb:520:15:520:25 | call to taint | call to taint | +| hash_flow.rb:542:14:542:18 | value | hash_flow.rb:536:15:536:25 | call to taint | hash_flow.rb:542:14:542:18 | value | $@ | hash_flow.rb:536:15:536:25 | call to taint | call to taint | +| hash_flow.rb:542:14:542:18 | value | hash_flow.rb:538:15:538:25 | call to taint | hash_flow.rb:542:14:542:18 | value | $@ | hash_flow.rb:538:15:538:25 | call to taint | call to taint | +| hash_flow.rb:545:10:545:19 | ( ... ) | hash_flow.rb:536:15:536:25 | call to taint | hash_flow.rb:545:10:545:19 | ( ... ) | $@ | hash_flow.rb:536:15:536:25 | call to taint | call to taint | +| hash_flow.rb:557:10:557:19 | ( ... ) | hash_flow.rb:552:15:552:25 | call to taint | hash_flow.rb:557:10:557:19 | ( ... ) | $@ | hash_flow.rb:552:15:552:25 | call to taint | call to taint | +| hash_flow.rb:559:10:559:15 | ( ... ) | hash_flow.rb:552:15:552:25 | call to taint | hash_flow.rb:559:10:559:15 | ( ... ) | $@ | hash_flow.rb:552:15:552:25 | call to taint | call to taint | +| hash_flow.rb:559:10:559:15 | ( ... ) | hash_flow.rb:554:15:554:25 | call to taint | hash_flow.rb:559:10:559:15 | ( ... ) | $@ | hash_flow.rb:554:15:554:25 | call to taint | call to taint | +| hash_flow.rb:571:10:571:16 | ( ... ) | hash_flow.rb:566:15:566:25 | call to taint | hash_flow.rb:571:10:571:16 | ( ... ) | $@ | hash_flow.rb:566:15:566:25 | call to taint | call to taint | +| hash_flow.rb:576:10:576:16 | ( ... ) | hash_flow.rb:566:15:566:25 | call to taint | hash_flow.rb:576:10:576:16 | ( ... ) | $@ | hash_flow.rb:566:15:566:25 | call to taint | call to taint | +| hash_flow.rb:578:10:578:16 | ( ... ) | hash_flow.rb:568:15:568:25 | call to taint | hash_flow.rb:578:10:578:16 | ( ... ) | $@ | hash_flow.rb:568:15:568:25 | call to taint | call to taint | +| hash_flow.rb:591:10:591:18 | ( ... ) | hash_flow.rb:585:15:585:25 | call to taint | hash_flow.rb:591:10:591:18 | ( ... ) | $@ | hash_flow.rb:585:15:585:25 | call to taint | call to taint | +| hash_flow.rb:591:10:591:18 | ( ... ) | hash_flow.rb:587:15:587:25 | call to taint | hash_flow.rb:591:10:591:18 | ( ... ) | $@ | hash_flow.rb:587:15:587:25 | call to taint | call to taint | +| hash_flow.rb:603:10:603:16 | ( ... ) | hash_flow.rb:598:15:598:25 | call to taint | hash_flow.rb:603:10:603:16 | ( ... ) | $@ | hash_flow.rb:598:15:598:25 | call to taint | call to taint | +| hash_flow.rb:605:10:605:16 | ( ... ) | hash_flow.rb:600:15:600:25 | call to taint | hash_flow.rb:605:10:605:16 | ( ... ) | $@ | hash_flow.rb:600:15:600:25 | call to taint | call to taint | +| hash_flow.rb:609:14:609:18 | value | hash_flow.rb:598:15:598:25 | call to taint | hash_flow.rb:609:14:609:18 | value | $@ | hash_flow.rb:598:15:598:25 | call to taint | call to taint | +| hash_flow.rb:609:14:609:18 | value | hash_flow.rb:600:15:600:25 | call to taint | hash_flow.rb:609:14:609:18 | value | $@ | hash_flow.rb:600:15:600:25 | call to taint | call to taint | +| hash_flow.rb:612:10:612:16 | ( ... ) | hash_flow.rb:610:14:610:24 | call to taint | hash_flow.rb:612:10:612:16 | ( ... ) | $@ | hash_flow.rb:610:14:610:24 | call to taint | call to taint | +| hash_flow.rb:624:10:624:17 | ( ... ) | hash_flow.rb:619:15:619:25 | call to taint | hash_flow.rb:624:10:624:17 | ( ... ) | $@ | hash_flow.rb:619:15:619:25 | call to taint | call to taint | +| hash_flow.rb:624:10:624:17 | ( ... ) | hash_flow.rb:621:15:621:25 | call to taint | hash_flow.rb:624:10:624:17 | ( ... ) | $@ | hash_flow.rb:621:15:621:25 | call to taint | call to taint | +| hash_flow.rb:625:10:625:17 | ( ... ) | hash_flow.rb:619:15:619:25 | call to taint | hash_flow.rb:625:10:625:17 | ( ... ) | $@ | hash_flow.rb:619:15:619:25 | call to taint | call to taint | +| hash_flow.rb:625:10:625:17 | ( ... ) | hash_flow.rb:621:15:621:25 | call to taint | hash_flow.rb:625:10:625:17 | ( ... ) | $@ | hash_flow.rb:621:15:621:25 | call to taint | call to taint | +| hash_flow.rb:626:10:626:17 | ( ... ) | hash_flow.rb:619:15:619:25 | call to taint | hash_flow.rb:626:10:626:17 | ( ... ) | $@ | hash_flow.rb:619:15:619:25 | call to taint | call to taint | +| hash_flow.rb:626:10:626:17 | ( ... ) | hash_flow.rb:621:15:621:25 | call to taint | hash_flow.rb:626:10:626:17 | ( ... ) | $@ | hash_flow.rb:621:15:621:25 | call to taint | call to taint | +| hash_flow.rb:640:10:640:20 | ( ... ) | hash_flow.rb:633:15:633:25 | call to taint | hash_flow.rb:640:10:640:20 | ( ... ) | $@ | hash_flow.rb:633:15:633:25 | call to taint | call to taint | +| hash_flow.rb:640:10:640:20 | ( ... ) | hash_flow.rb:635:15:635:25 | call to taint | hash_flow.rb:640:10:640:20 | ( ... ) | $@ | hash_flow.rb:635:15:635:25 | call to taint | call to taint | +| hash_flow.rb:640:10:640:20 | ( ... ) | hash_flow.rb:637:15:637:25 | call to taint | hash_flow.rb:640:10:640:20 | ( ... ) | $@ | hash_flow.rb:637:15:637:25 | call to taint | call to taint | +| hash_flow.rb:641:10:641:20 | ( ... ) | hash_flow.rb:633:15:633:25 | call to taint | hash_flow.rb:641:10:641:20 | ( ... ) | $@ | hash_flow.rb:633:15:633:25 | call to taint | call to taint | +| hash_flow.rb:641:10:641:20 | ( ... ) | hash_flow.rb:635:15:635:25 | call to taint | hash_flow.rb:641:10:641:20 | ( ... ) | $@ | hash_flow.rb:635:15:635:25 | call to taint | call to taint | +| hash_flow.rb:641:10:641:20 | ( ... ) | hash_flow.rb:637:15:637:25 | call to taint | hash_flow.rb:641:10:641:20 | ( ... ) | $@ | hash_flow.rb:637:15:637:25 | call to taint | call to taint | +| hash_flow.rb:642:10:642:20 | ( ... ) | hash_flow.rb:633:15:633:25 | call to taint | hash_flow.rb:642:10:642:20 | ( ... ) | $@ | hash_flow.rb:633:15:633:25 | call to taint | call to taint | +| hash_flow.rb:642:10:642:20 | ( ... ) | hash_flow.rb:635:15:635:25 | call to taint | hash_flow.rb:642:10:642:20 | ( ... ) | $@ | hash_flow.rb:635:15:635:25 | call to taint | call to taint | +| hash_flow.rb:642:10:642:20 | ( ... ) | hash_flow.rb:637:15:637:25 | call to taint | hash_flow.rb:642:10:642:20 | ( ... ) | $@ | hash_flow.rb:637:15:637:25 | call to taint | call to taint | +| hash_flow.rb:654:14:654:18 | value | hash_flow.rb:649:15:649:25 | call to taint | hash_flow.rb:654:14:654:18 | value | $@ | hash_flow.rb:649:15:649:25 | call to taint | call to taint | +| hash_flow.rb:654:14:654:18 | value | hash_flow.rb:651:15:651:25 | call to taint | hash_flow.rb:654:14:654:18 | value | $@ | hash_flow.rb:651:15:651:25 | call to taint | call to taint | +| hash_flow.rb:657:10:657:19 | ( ... ) | hash_flow.rb:649:15:649:25 | call to taint | hash_flow.rb:657:10:657:19 | ( ... ) | $@ | hash_flow.rb:649:15:649:25 | call to taint | call to taint | +| hash_flow.rb:658:10:658:16 | ( ... ) | hash_flow.rb:655:9:655:19 | call to taint | hash_flow.rb:658:10:658:16 | ( ... ) | $@ | hash_flow.rb:655:9:655:19 | call to taint | call to taint | +| hash_flow.rb:670:14:670:18 | value | hash_flow.rb:665:15:665:25 | call to taint | hash_flow.rb:670:14:670:18 | value | $@ | hash_flow.rb:665:15:665:25 | call to taint | call to taint | +| hash_flow.rb:670:14:670:18 | value | hash_flow.rb:667:15:667:25 | call to taint | hash_flow.rb:670:14:670:18 | value | $@ | hash_flow.rb:667:15:667:25 | call to taint | call to taint | +| hash_flow.rb:673:10:673:19 | ( ... ) | hash_flow.rb:671:9:671:19 | call to taint | hash_flow.rb:673:10:673:19 | ( ... ) | $@ | hash_flow.rb:671:9:671:19 | call to taint | call to taint | +| hash_flow.rb:691:14:691:22 | old_value | hash_flow.rb:680:15:680:25 | call to taint | hash_flow.rb:691:14:691:22 | old_value | $@ | hash_flow.rb:680:15:680:25 | call to taint | call to taint | +| hash_flow.rb:691:14:691:22 | old_value | hash_flow.rb:682:15:682:25 | call to taint | hash_flow.rb:691:14:691:22 | old_value | $@ | hash_flow.rb:682:15:682:25 | call to taint | call to taint | +| hash_flow.rb:691:14:691:22 | old_value | hash_flow.rb:685:15:685:25 | call to taint | hash_flow.rb:691:14:691:22 | old_value | $@ | hash_flow.rb:685:15:685:25 | call to taint | call to taint | +| hash_flow.rb:691:14:691:22 | old_value | hash_flow.rb:687:15:687:25 | call to taint | hash_flow.rb:691:14:691:22 | old_value | $@ | hash_flow.rb:687:15:687:25 | call to taint | call to taint | +| hash_flow.rb:692:14:692:22 | new_value | hash_flow.rb:680:15:680:25 | call to taint | hash_flow.rb:692:14:692:22 | new_value | $@ | hash_flow.rb:680:15:680:25 | call to taint | call to taint | +| hash_flow.rb:692:14:692:22 | new_value | hash_flow.rb:682:15:682:25 | call to taint | hash_flow.rb:692:14:692:22 | new_value | $@ | hash_flow.rb:682:15:682:25 | call to taint | call to taint | +| hash_flow.rb:692:14:692:22 | new_value | hash_flow.rb:685:15:685:25 | call to taint | hash_flow.rb:692:14:692:22 | new_value | $@ | hash_flow.rb:685:15:685:25 | call to taint | call to taint | +| hash_flow.rb:692:14:692:22 | new_value | hash_flow.rb:687:15:687:25 | call to taint | hash_flow.rb:692:14:692:22 | new_value | $@ | hash_flow.rb:687:15:687:25 | call to taint | call to taint | +| hash_flow.rb:694:10:694:19 | ( ... ) | hash_flow.rb:680:15:680:25 | call to taint | hash_flow.rb:694:10:694:19 | ( ... ) | $@ | hash_flow.rb:680:15:680:25 | call to taint | call to taint | +| hash_flow.rb:696:10:696:19 | ( ... ) | hash_flow.rb:682:15:682:25 | call to taint | hash_flow.rb:696:10:696:19 | ( ... ) | $@ | hash_flow.rb:682:15:682:25 | call to taint | call to taint | +| hash_flow.rb:697:10:697:19 | ( ... ) | hash_flow.rb:685:15:685:25 | call to taint | hash_flow.rb:697:10:697:19 | ( ... ) | $@ | hash_flow.rb:685:15:685:25 | call to taint | call to taint | +| hash_flow.rb:699:10:699:19 | ( ... ) | hash_flow.rb:687:15:687:25 | call to taint | hash_flow.rb:699:10:699:19 | ( ... ) | $@ | hash_flow.rb:687:15:687:25 | call to taint | call to taint | +| hash_flow.rb:701:10:701:20 | ( ... ) | hash_flow.rb:680:15:680:25 | call to taint | hash_flow.rb:701:10:701:20 | ( ... ) | $@ | hash_flow.rb:680:15:680:25 | call to taint | call to taint | +| hash_flow.rb:703:10:703:20 | ( ... ) | hash_flow.rb:682:15:682:25 | call to taint | hash_flow.rb:703:10:703:20 | ( ... ) | $@ | hash_flow.rb:682:15:682:25 | call to taint | call to taint | +| hash_flow.rb:704:10:704:20 | ( ... ) | hash_flow.rb:685:15:685:25 | call to taint | hash_flow.rb:704:10:704:20 | ( ... ) | $@ | hash_flow.rb:685:15:685:25 | call to taint | call to taint | +| hash_flow.rb:706:10:706:20 | ( ... ) | hash_flow.rb:687:15:687:25 | call to taint | hash_flow.rb:706:10:706:20 | ( ... ) | $@ | hash_flow.rb:687:15:687:25 | call to taint | call to taint | +| hash_flow.rb:718:10:718:15 | ( ... ) | hash_flow.rb:713:15:713:25 | call to taint | hash_flow.rb:718:10:718:15 | ( ... ) | $@ | hash_flow.rb:713:15:713:25 | call to taint | call to taint | +| hash_flow.rb:718:10:718:15 | ( ... ) | hash_flow.rb:715:15:715:25 | call to taint | hash_flow.rb:718:10:718:15 | ( ... ) | $@ | hash_flow.rb:715:15:715:25 | call to taint | call to taint | +| hash_flow.rb:730:10:730:13 | ...[...] | hash_flow.rb:725:15:725:25 | call to taint | hash_flow.rb:730:10:730:13 | ...[...] | $@ | hash_flow.rb:725:15:725:25 | call to taint | call to taint | +| hash_flow.rb:732:10:732:13 | ...[...] | hash_flow.rb:725:15:725:25 | call to taint | hash_flow.rb:732:10:732:13 | ...[...] | $@ | hash_flow.rb:725:15:725:25 | call to taint | call to taint | +| hash_flow.rb:732:10:732:13 | ...[...] | hash_flow.rb:727:15:727:25 | call to taint | hash_flow.rb:732:10:732:13 | ...[...] | $@ | hash_flow.rb:727:15:727:25 | call to taint | call to taint | +| hash_flow.rb:749:10:749:17 | ...[...] | hash_flow.rb:739:15:739:25 | call to taint | hash_flow.rb:749:10:749:17 | ...[...] | $@ | hash_flow.rb:739:15:739:25 | call to taint | call to taint | +| hash_flow.rb:751:10:751:17 | ...[...] | hash_flow.rb:741:15:741:25 | call to taint | hash_flow.rb:751:10:751:17 | ...[...] | $@ | hash_flow.rb:741:15:741:25 | call to taint | call to taint | +| hash_flow.rb:752:10:752:17 | ...[...] | hash_flow.rb:744:15:744:25 | call to taint | hash_flow.rb:752:10:752:17 | ...[...] | $@ | hash_flow.rb:744:15:744:25 | call to taint | call to taint | +| hash_flow.rb:754:10:754:17 | ...[...] | hash_flow.rb:746:15:746:25 | call to taint | hash_flow.rb:754:10:754:17 | ...[...] | $@ | hash_flow.rb:746:15:746:25 | call to taint | call to taint | +| hash_flow.rb:755:10:755:17 | ...[...] | hash_flow.rb:748:29:748:39 | call to taint | hash_flow.rb:755:10:755:17 | ...[...] | $@ | hash_flow.rb:748:29:748:39 | call to taint | call to taint | +| hash_flow.rb:769:10:769:17 | ...[...] | hash_flow.rb:763:15:763:25 | call to taint | hash_flow.rb:769:10:769:17 | ...[...] | $@ | hash_flow.rb:763:15:763:25 | call to taint | call to taint | +| hash_flow.rb:771:10:771:17 | ...[...] | hash_flow.rb:765:15:765:25 | call to taint | hash_flow.rb:771:10:771:17 | ...[...] | $@ | hash_flow.rb:765:15:765:25 | call to taint | call to taint | +| hash_flow.rb:772:10:772:17 | ...[...] | hash_flow.rb:766:15:766:25 | call to taint | hash_flow.rb:772:10:772:17 | ...[...] | $@ | hash_flow.rb:766:15:766:25 | call to taint | call to taint | +| hash_flow.rb:778:10:778:14 | ...[...] | hash_flow.rb:765:15:765:25 | call to taint | hash_flow.rb:778:10:778:14 | ...[...] | $@ | hash_flow.rb:765:15:765:25 | call to taint | call to taint | +| hash_flow.rb:783:10:783:17 | ...[...] | hash_flow.rb:765:15:765:25 | call to taint | hash_flow.rb:783:10:783:17 | ...[...] | $@ | hash_flow.rb:765:15:765:25 | call to taint | call to taint | +| hash_flow.rb:802:14:802:22 | old_value | hash_flow.rb:791:15:791:25 | call to taint | hash_flow.rb:802:14:802:22 | old_value | $@ | hash_flow.rb:791:15:791:25 | call to taint | call to taint | +| hash_flow.rb:802:14:802:22 | old_value | hash_flow.rb:793:15:793:25 | call to taint | hash_flow.rb:802:14:802:22 | old_value | $@ | hash_flow.rb:793:15:793:25 | call to taint | call to taint | +| hash_flow.rb:802:14:802:22 | old_value | hash_flow.rb:796:15:796:25 | call to taint | hash_flow.rb:802:14:802:22 | old_value | $@ | hash_flow.rb:796:15:796:25 | call to taint | call to taint | +| hash_flow.rb:802:14:802:22 | old_value | hash_flow.rb:798:15:798:25 | call to taint | hash_flow.rb:802:14:802:22 | old_value | $@ | hash_flow.rb:798:15:798:25 | call to taint | call to taint | +| hash_flow.rb:803:14:803:22 | new_value | hash_flow.rb:791:15:791:25 | call to taint | hash_flow.rb:803:14:803:22 | new_value | $@ | hash_flow.rb:791:15:791:25 | call to taint | call to taint | +| hash_flow.rb:803:14:803:22 | new_value | hash_flow.rb:793:15:793:25 | call to taint | hash_flow.rb:803:14:803:22 | new_value | $@ | hash_flow.rb:793:15:793:25 | call to taint | call to taint | +| hash_flow.rb:803:14:803:22 | new_value | hash_flow.rb:796:15:796:25 | call to taint | hash_flow.rb:803:14:803:22 | new_value | $@ | hash_flow.rb:796:15:796:25 | call to taint | call to taint | +| hash_flow.rb:803:14:803:22 | new_value | hash_flow.rb:798:15:798:25 | call to taint | hash_flow.rb:803:14:803:22 | new_value | $@ | hash_flow.rb:798:15:798:25 | call to taint | call to taint | +| hash_flow.rb:805:10:805:19 | ( ... ) | hash_flow.rb:791:15:791:25 | call to taint | hash_flow.rb:805:10:805:19 | ( ... ) | $@ | hash_flow.rb:791:15:791:25 | call to taint | call to taint | +| hash_flow.rb:807:10:807:19 | ( ... ) | hash_flow.rb:793:15:793:25 | call to taint | hash_flow.rb:807:10:807:19 | ( ... ) | $@ | hash_flow.rb:793:15:793:25 | call to taint | call to taint | +| hash_flow.rb:808:10:808:19 | ( ... ) | hash_flow.rb:796:15:796:25 | call to taint | hash_flow.rb:808:10:808:19 | ( ... ) | $@ | hash_flow.rb:796:15:796:25 | call to taint | call to taint | +| hash_flow.rb:810:10:810:19 | ( ... ) | hash_flow.rb:798:15:798:25 | call to taint | hash_flow.rb:810:10:810:19 | ( ... ) | $@ | hash_flow.rb:798:15:798:25 | call to taint | call to taint | +| hash_flow.rb:828:14:828:22 | old_value | hash_flow.rb:817:15:817:25 | call to taint | hash_flow.rb:828:14:828:22 | old_value | $@ | hash_flow.rb:817:15:817:25 | call to taint | call to taint | +| hash_flow.rb:828:14:828:22 | old_value | hash_flow.rb:819:15:819:25 | call to taint | hash_flow.rb:828:14:828:22 | old_value | $@ | hash_flow.rb:819:15:819:25 | call to taint | call to taint | +| hash_flow.rb:828:14:828:22 | old_value | hash_flow.rb:822:15:822:25 | call to taint | hash_flow.rb:828:14:828:22 | old_value | $@ | hash_flow.rb:822:15:822:25 | call to taint | call to taint | +| hash_flow.rb:828:14:828:22 | old_value | hash_flow.rb:824:15:824:25 | call to taint | hash_flow.rb:828:14:828:22 | old_value | $@ | hash_flow.rb:824:15:824:25 | call to taint | call to taint | +| hash_flow.rb:829:14:829:22 | new_value | hash_flow.rb:817:15:817:25 | call to taint | hash_flow.rb:829:14:829:22 | new_value | $@ | hash_flow.rb:817:15:817:25 | call to taint | call to taint | +| hash_flow.rb:829:14:829:22 | new_value | hash_flow.rb:819:15:819:25 | call to taint | hash_flow.rb:829:14:829:22 | new_value | $@ | hash_flow.rb:819:15:819:25 | call to taint | call to taint | +| hash_flow.rb:829:14:829:22 | new_value | hash_flow.rb:822:15:822:25 | call to taint | hash_flow.rb:829:14:829:22 | new_value | $@ | hash_flow.rb:822:15:822:25 | call to taint | call to taint | +| hash_flow.rb:829:14:829:22 | new_value | hash_flow.rb:824:15:824:25 | call to taint | hash_flow.rb:829:14:829:22 | new_value | $@ | hash_flow.rb:824:15:824:25 | call to taint | call to taint | +| hash_flow.rb:831:10:831:19 | ( ... ) | hash_flow.rb:817:15:817:25 | call to taint | hash_flow.rb:831:10:831:19 | ( ... ) | $@ | hash_flow.rb:817:15:817:25 | call to taint | call to taint | +| hash_flow.rb:833:10:833:19 | ( ... ) | hash_flow.rb:819:15:819:25 | call to taint | hash_flow.rb:833:10:833:19 | ( ... ) | $@ | hash_flow.rb:819:15:819:25 | call to taint | call to taint | +| hash_flow.rb:834:10:834:19 | ( ... ) | hash_flow.rb:822:15:822:25 | call to taint | hash_flow.rb:834:10:834:19 | ( ... ) | $@ | hash_flow.rb:822:15:822:25 | call to taint | call to taint | +| hash_flow.rb:836:10:836:19 | ( ... ) | hash_flow.rb:824:15:824:25 | call to taint | hash_flow.rb:836:10:836:19 | ( ... ) | $@ | hash_flow.rb:824:15:824:25 | call to taint | call to taint | +| hash_flow.rb:838:10:838:20 | ( ... ) | hash_flow.rb:817:15:817:25 | call to taint | hash_flow.rb:838:10:838:20 | ( ... ) | $@ | hash_flow.rb:817:15:817:25 | call to taint | call to taint | +| hash_flow.rb:840:10:840:20 | ( ... ) | hash_flow.rb:819:15:819:25 | call to taint | hash_flow.rb:840:10:840:20 | ( ... ) | $@ | hash_flow.rb:819:15:819:25 | call to taint | call to taint | +| hash_flow.rb:841:10:841:20 | ( ... ) | hash_flow.rb:822:15:822:25 | call to taint | hash_flow.rb:841:10:841:20 | ( ... ) | $@ | hash_flow.rb:822:15:822:25 | call to taint | call to taint | +| hash_flow.rb:843:10:843:20 | ( ... ) | hash_flow.rb:824:15:824:25 | call to taint | hash_flow.rb:843:10:843:20 | ( ... ) | $@ | hash_flow.rb:824:15:824:25 | call to taint | call to taint | +| hash_flow.rb:861:10:861:20 | ( ... ) | hash_flow.rb:850:12:850:22 | call to taint | hash_flow.rb:861:10:861:20 | ( ... ) | $@ | hash_flow.rb:850:12:850:22 | call to taint | call to taint | +| hash_flow.rb:863:10:863:20 | ( ... ) | hash_flow.rb:852:12:852:22 | call to taint | hash_flow.rb:863:10:863:20 | ( ... ) | $@ | hash_flow.rb:852:12:852:22 | call to taint | call to taint | +| hash_flow.rb:864:10:864:20 | ( ... ) | hash_flow.rb:855:12:855:22 | call to taint | hash_flow.rb:864:10:864:20 | ( ... ) | $@ | hash_flow.rb:855:12:855:22 | call to taint | call to taint | +| hash_flow.rb:866:10:866:20 | ( ... ) | hash_flow.rb:857:12:857:22 | call to taint | hash_flow.rb:866:10:866:20 | ( ... ) | $@ | hash_flow.rb:857:12:857:22 | call to taint | call to taint | +| hash_flow.rb:870:10:870:20 | ( ... ) | hash_flow.rb:850:12:850:22 | call to taint | hash_flow.rb:870:10:870:20 | ( ... ) | $@ | hash_flow.rb:850:12:850:22 | call to taint | call to taint | +| hash_flow.rb:872:10:872:20 | ( ... ) | hash_flow.rb:852:12:852:22 | call to taint | hash_flow.rb:872:10:872:20 | ( ... ) | $@ | hash_flow.rb:852:12:852:22 | call to taint | call to taint | +| hash_flow.rb:873:10:873:20 | ( ... ) | hash_flow.rb:855:12:855:22 | call to taint | hash_flow.rb:873:10:873:20 | ( ... ) | $@ | hash_flow.rb:855:12:855:22 | call to taint | call to taint | +| hash_flow.rb:875:10:875:20 | ( ... ) | hash_flow.rb:857:12:857:22 | call to taint | hash_flow.rb:875:10:875:20 | ( ... ) | $@ | hash_flow.rb:857:12:857:22 | call to taint | call to taint | +| hash_flow.rb:893:10:893:19 | ( ... ) | hash_flow.rb:882:12:882:22 | call to taint | hash_flow.rb:893:10:893:19 | ( ... ) | $@ | hash_flow.rb:882:12:882:22 | call to taint | call to taint | +| hash_flow.rb:895:10:895:19 | ( ... ) | hash_flow.rb:884:12:884:22 | call to taint | hash_flow.rb:895:10:895:19 | ( ... ) | $@ | hash_flow.rb:884:12:884:22 | call to taint | call to taint | +| hash_flow.rb:896:10:896:19 | ( ... ) | hash_flow.rb:887:12:887:22 | call to taint | hash_flow.rb:896:10:896:19 | ( ... ) | $@ | hash_flow.rb:887:12:887:22 | call to taint | call to taint | +| hash_flow.rb:898:10:898:19 | ( ... ) | hash_flow.rb:889:12:889:22 | call to taint | hash_flow.rb:898:10:898:19 | ( ... ) | $@ | hash_flow.rb:889:12:889:22 | call to taint | call to taint | +| hash_flow.rb:900:10:900:20 | ( ... ) | hash_flow.rb:882:12:882:22 | call to taint | hash_flow.rb:900:10:900:20 | ( ... ) | $@ | hash_flow.rb:882:12:882:22 | call to taint | call to taint | +| hash_flow.rb:902:10:902:20 | ( ... ) | hash_flow.rb:884:12:884:22 | call to taint | hash_flow.rb:902:10:902:20 | ( ... ) | $@ | hash_flow.rb:884:12:884:22 | call to taint | call to taint | +| hash_flow.rb:903:10:903:20 | ( ... ) | hash_flow.rb:887:12:887:22 | call to taint | hash_flow.rb:903:10:903:20 | ( ... ) | $@ | hash_flow.rb:887:12:887:22 | call to taint | call to taint | +| hash_flow.rb:905:10:905:20 | ( ... ) | hash_flow.rb:889:12:889:22 | call to taint | hash_flow.rb:905:10:905:20 | ( ... ) | $@ | hash_flow.rb:889:12:889:22 | call to taint | call to taint | +| hash_flow.rb:923:10:923:19 | ( ... ) | hash_flow.rb:912:12:912:22 | call to taint | hash_flow.rb:923:10:923:19 | ( ... ) | $@ | hash_flow.rb:912:12:912:22 | call to taint | call to taint | +| hash_flow.rb:925:10:925:19 | ( ... ) | hash_flow.rb:914:12:914:22 | call to taint | hash_flow.rb:925:10:925:19 | ( ... ) | $@ | hash_flow.rb:914:12:914:22 | call to taint | call to taint | +| hash_flow.rb:926:10:926:19 | ( ... ) | hash_flow.rb:917:12:917:22 | call to taint | hash_flow.rb:926:10:926:19 | ( ... ) | $@ | hash_flow.rb:917:12:917:22 | call to taint | call to taint | +| hash_flow.rb:928:10:928:19 | ( ... ) | hash_flow.rb:919:12:919:22 | call to taint | hash_flow.rb:928:10:928:19 | ( ... ) | $@ | hash_flow.rb:919:12:919:22 | call to taint | call to taint | +| hash_flow.rb:930:10:930:20 | ( ... ) | hash_flow.rb:912:12:912:22 | call to taint | hash_flow.rb:930:10:930:20 | ( ... ) | $@ | hash_flow.rb:912:12:912:22 | call to taint | call to taint | +| hash_flow.rb:932:10:932:20 | ( ... ) | hash_flow.rb:914:12:914:22 | call to taint | hash_flow.rb:932:10:932:20 | ( ... ) | $@ | hash_flow.rb:914:12:914:22 | call to taint | call to taint | +| hash_flow.rb:933:10:933:20 | ( ... ) | hash_flow.rb:917:12:917:22 | call to taint | hash_flow.rb:933:10:933:20 | ( ... ) | $@ | hash_flow.rb:917:12:917:22 | call to taint | call to taint | +| hash_flow.rb:935:10:935:20 | ( ... ) | hash_flow.rb:919:12:919:22 | call to taint | hash_flow.rb:935:10:935:20 | ( ... ) | $@ | hash_flow.rb:919:12:919:22 | call to taint | call to taint | +| hash_flow.rb:953:10:953:19 | ( ... ) | hash_flow.rb:942:12:942:22 | call to taint | hash_flow.rb:953:10:953:19 | ( ... ) | $@ | hash_flow.rb:942:12:942:22 | call to taint | call to taint | +| hash_flow.rb:955:10:955:19 | ( ... ) | hash_flow.rb:944:12:944:22 | call to taint | hash_flow.rb:955:10:955:19 | ( ... ) | $@ | hash_flow.rb:944:12:944:22 | call to taint | call to taint | +| hash_flow.rb:956:10:956:19 | ( ... ) | hash_flow.rb:947:12:947:22 | call to taint | hash_flow.rb:956:10:956:19 | ( ... ) | $@ | hash_flow.rb:947:12:947:22 | call to taint | call to taint | +| hash_flow.rb:958:10:958:19 | ( ... ) | hash_flow.rb:949:12:949:22 | call to taint | hash_flow.rb:958:10:958:19 | ( ... ) | $@ | hash_flow.rb:949:12:949:22 | call to taint | call to taint | +| hash_flow.rb:960:10:960:20 | ( ... ) | hash_flow.rb:942:12:942:22 | call to taint | hash_flow.rb:960:10:960:20 | ( ... ) | $@ | hash_flow.rb:942:12:942:22 | call to taint | call to taint | +| hash_flow.rb:962:10:962:20 | ( ... ) | hash_flow.rb:944:12:944:22 | call to taint | hash_flow.rb:962:10:962:20 | ( ... ) | $@ | hash_flow.rb:944:12:944:22 | call to taint | call to taint | +| hash_flow.rb:963:10:963:20 | ( ... ) | hash_flow.rb:947:12:947:22 | call to taint | hash_flow.rb:963:10:963:20 | ( ... ) | $@ | hash_flow.rb:947:12:947:22 | call to taint | call to taint | +| hash_flow.rb:965:10:965:20 | ( ... ) | hash_flow.rb:949:12:949:22 | call to taint | hash_flow.rb:965:10:965:20 | ( ... ) | $@ | hash_flow.rb:949:12:949:22 | call to taint | call to taint | diff --git a/ruby/ql/test/library-tests/dataflow/helpers/dataflow.expected b/ruby/ql/test/library-tests/dataflow/helpers/dataflow.expected index 299a840e94c..fb2043d9759 100644 --- a/ruby/ql/test/library-tests/dataflow/helpers/dataflow.expected +++ b/ruby/ql/test/library-tests/dataflow/helpers/dataflow.expected @@ -127,11 +127,28 @@ getModuleLevelSelf getAnImmediateReference | file://:0:0:0:0 | Array | tst.rb:59:15:59:21 | Array | | file://:0:0:0:0 | Hash | tst.rb:60:14:60:45 | Hash | +| tst.rb:1:1:6:3 | C1 | tst.rb:1:1:6:3 | self (C1) | | tst.rb:1:1:6:3 | C1 | tst.rb:8:12:8:13 | C1 | +| tst.rb:8:1:11:3 | C2 | tst.rb:8:1:11:3 | self (C2) | | tst.rb:8:1:11:3 | C2 | tst.rb:27:12:27:13 | C2 | +| tst.rb:13:1:18:3 | Mixin | tst.rb:13:1:18:3 | self (Mixin) | +| tst.rb:13:1:18:3 | Mixin | tst.rb:16:5:17:7 | self in m1s | | tst.rb:13:1:18:3 | Mixin | tst.rb:28:13:28:17 | Mixin | +| tst.rb:20:1:25:3 | Mixin2 | tst.rb:20:1:25:3 | self (Mixin2) | +| tst.rb:20:1:25:3 | Mixin2 | tst.rb:23:5:24:7 | self in m2s | | tst.rb:20:1:25:3 | Mixin2 | tst.rb:29:13:29:18 | Mixin2 | +| tst.rb:27:1:35:3 | C3 | tst.rb:27:1:35:3 | self (C3) | +| tst.rb:27:1:35:3 | C3 | tst.rb:32:9:33:11 | self in c3_self1 | +| tst.rb:27:1:35:3 | C3 | tst.rb:37:1:38:3 | self in c3_self2 | | tst.rb:27:1:35:3 | C3 | tst.rb:37:5:37:6 | C3 | +| tst.rb:40:1:47:3 | N1 | tst.rb:40:1:47:3 | self (N1) | +| tst.rb:41:5:42:7 | N1::XY1 | tst.rb:41:5:42:7 | self (XY1) | +| tst.rb:43:5:46:7 | N1::N2 | tst.rb:43:5:46:7 | self (N2) | +| tst.rb:44:9:45:11 | N1::N2::XY2 | tst.rb:44:9:45:11 | self (XY2) | +| tst.rb:49:1:51:3 | N2 | tst.rb:49:1:51:3 | self (N2) | +| tst.rb:49:1:51:3 | N2 | tst.rb:52:1:55:3 | self (N2) | +| tst.rb:53:5:54:7 | N2::XY3 | tst.rb:53:5:54:7 | self (XY3) | +| tst.rb:57:1:62:3 | Nodes | tst.rb:57:1:62:3 | self (Nodes) | getOwnInstanceMethod | tst.rb:1:1:6:3 | C1 | c1 | tst.rb:2:5:5:7 | c1 | | tst.rb:8:1:11:3 | C2 | c2 | tst.rb:9:5:10:7 | c2 | diff --git a/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected b/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected index b824d6d37a1..b5ad38dfcbb 100644 --- a/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected +++ b/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected @@ -1,217 +1,217 @@ failures edges -| local_dataflow.rb:78:3:78:3 | z : | local_dataflow.rb:89:8:89:8 | z | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:79:13:79:13 | b : | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:80:8:80:8 | a : | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:81:9:81:9 | c : | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:81:13:81:13 | d : | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:81:16:81:16 | e : | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:85:13:85:13 | f : | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:86:18:86:18 | g : | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:87:10:87:10 | x : | -| local_dataflow.rb:79:13:79:13 | b : | local_dataflow.rb:79:25:79:25 | b | -| local_dataflow.rb:80:8:80:8 | a : | local_dataflow.rb:80:29:80:29 | a | -| local_dataflow.rb:81:9:81:9 | c : | local_dataflow.rb:82:12:82:12 | c | -| local_dataflow.rb:81:13:81:13 | d : | local_dataflow.rb:83:12:83:12 | d | -| local_dataflow.rb:81:16:81:16 | e : | local_dataflow.rb:84:12:84:12 | e | -| local_dataflow.rb:85:13:85:13 | f : | local_dataflow.rb:85:27:85:27 | f | -| local_dataflow.rb:86:18:86:18 | g : | local_dataflow.rb:86:33:86:33 | g | -| local_dataflow.rb:87:10:87:10 | x : | local_dataflow.rb:78:3:78:3 | z : | -| local_dataflow.rb:87:10:87:10 | x : | local_dataflow.rb:87:25:87:25 | x | -| local_dataflow.rb:93:3:93:3 | a : | local_dataflow.rb:94:8:94:8 | a | -| local_dataflow.rb:93:3:93:3 | a : | local_dataflow.rb:94:8:94:8 | a | -| local_dataflow.rb:93:7:93:15 | call to source : | local_dataflow.rb:93:3:93:3 | a : | -| local_dataflow.rb:93:7:93:15 | call to source : | local_dataflow.rb:93:3:93:3 | a : | -| local_dataflow.rb:93:20:93:28 | call to source : | local_dataflow.rb:93:3:93:3 | a : | -| local_dataflow.rb:93:20:93:28 | call to source : | local_dataflow.rb:93:3:93:3 | a : | -| local_dataflow.rb:95:3:95:3 | b : | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:3:95:3 | b : | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:8:95:16 | call to source : | local_dataflow.rb:95:3:95:3 | b : | -| local_dataflow.rb:95:8:95:16 | call to source : | local_dataflow.rb:95:3:95:3 | b : | -| local_dataflow.rb:95:21:95:29 | call to source : | local_dataflow.rb:95:3:95:3 | b : | -| local_dataflow.rb:95:21:95:29 | call to source : | local_dataflow.rb:95:3:95:3 | b : | -| local_dataflow.rb:98:3:98:3 | a : | local_dataflow.rb:99:8:99:8 | a | -| local_dataflow.rb:98:3:98:3 | a : | local_dataflow.rb:99:8:99:8 | a | -| local_dataflow.rb:98:7:98:15 | call to source : | local_dataflow.rb:98:3:98:3 | a : | -| local_dataflow.rb:98:7:98:15 | call to source : | local_dataflow.rb:98:3:98:3 | a : | -| local_dataflow.rb:98:20:98:28 | call to source : | local_dataflow.rb:98:3:98:3 | a : | -| local_dataflow.rb:98:20:98:28 | call to source : | local_dataflow.rb:98:3:98:3 | a : | -| local_dataflow.rb:100:3:100:3 | b : | local_dataflow.rb:101:8:101:8 | b | -| local_dataflow.rb:100:3:100:3 | b : | local_dataflow.rb:101:8:101:8 | b | -| local_dataflow.rb:100:8:100:16 | call to source : | local_dataflow.rb:100:3:100:3 | b : | -| local_dataflow.rb:100:8:100:16 | call to source : | local_dataflow.rb:100:3:100:3 | b : | -| local_dataflow.rb:100:22:100:30 | call to source : | local_dataflow.rb:100:3:100:3 | b : | -| local_dataflow.rb:100:22:100:30 | call to source : | local_dataflow.rb:100:3:100:3 | b : | -| local_dataflow.rb:103:3:103:3 | a : | local_dataflow.rb:104:3:104:3 | a : | -| local_dataflow.rb:103:3:103:3 | a : | local_dataflow.rb:104:3:104:3 | a : | -| local_dataflow.rb:103:7:103:15 | call to source : | local_dataflow.rb:103:3:103:3 | a : | -| local_dataflow.rb:103:7:103:15 | call to source : | local_dataflow.rb:103:3:103:3 | a : | -| local_dataflow.rb:104:3:104:3 | a : | local_dataflow.rb:105:8:105:8 | a | -| local_dataflow.rb:104:3:104:3 | a : | local_dataflow.rb:105:8:105:8 | a | -| local_dataflow.rb:104:9:104:17 | call to source : | local_dataflow.rb:104:3:104:3 | a : | -| local_dataflow.rb:104:9:104:17 | call to source : | local_dataflow.rb:104:3:104:3 | a : | -| local_dataflow.rb:106:3:106:3 | b : | local_dataflow.rb:107:3:107:3 | b : | -| local_dataflow.rb:106:3:106:3 | b : | local_dataflow.rb:107:3:107:3 | b : | -| local_dataflow.rb:106:7:106:15 | call to source : | local_dataflow.rb:106:3:106:3 | b : | -| local_dataflow.rb:106:7:106:15 | call to source : | local_dataflow.rb:106:3:106:3 | b : | -| local_dataflow.rb:107:3:107:3 | b : | local_dataflow.rb:108:8:108:8 | b | -| local_dataflow.rb:107:3:107:3 | b : | local_dataflow.rb:108:8:108:8 | b | -| local_dataflow.rb:107:9:107:17 | call to source : | local_dataflow.rb:107:3:107:3 | b : | -| local_dataflow.rb:107:9:107:17 | call to source : | local_dataflow.rb:107:3:107:3 | b : | -| local_dataflow.rb:112:8:112:16 | call to source : | local_dataflow.rb:112:8:112:20 | call to dup | -| local_dataflow.rb:112:8:112:16 | call to source : | local_dataflow.rb:112:8:112:20 | call to dup | -| local_dataflow.rb:113:8:113:16 | call to source : | local_dataflow.rb:113:8:113:20 | call to dup : | -| local_dataflow.rb:113:8:113:16 | call to source : | local_dataflow.rb:113:8:113:20 | call to dup : | -| local_dataflow.rb:113:8:113:20 | call to dup : | local_dataflow.rb:113:8:113:24 | call to dup | -| local_dataflow.rb:113:8:113:20 | call to dup : | local_dataflow.rb:113:8:113:24 | call to dup | -| local_dataflow.rb:117:8:117:16 | call to source : | local_dataflow.rb:117:8:117:23 | call to tap | -| local_dataflow.rb:117:8:117:16 | call to source : | local_dataflow.rb:117:8:117:23 | call to tap | -| local_dataflow.rb:118:3:118:11 | call to source : | local_dataflow.rb:118:20:118:20 | x : | -| local_dataflow.rb:118:3:118:11 | call to source : | local_dataflow.rb:118:20:118:20 | x : | -| local_dataflow.rb:118:20:118:20 | x : | local_dataflow.rb:118:28:118:28 | x | -| local_dataflow.rb:118:20:118:20 | x : | local_dataflow.rb:118:28:118:28 | x | -| local_dataflow.rb:119:8:119:16 | call to source : | local_dataflow.rb:119:8:119:23 | call to tap : | -| local_dataflow.rb:119:8:119:16 | call to source : | local_dataflow.rb:119:8:119:23 | call to tap : | -| local_dataflow.rb:119:8:119:23 | call to tap : | local_dataflow.rb:119:8:119:30 | call to tap | -| local_dataflow.rb:119:8:119:23 | call to tap : | local_dataflow.rb:119:8:119:30 | call to tap | -| local_dataflow.rb:123:8:123:16 | call to source : | local_dataflow.rb:123:8:123:20 | call to dup : | -| local_dataflow.rb:123:8:123:16 | call to source : | local_dataflow.rb:123:8:123:20 | call to dup : | -| local_dataflow.rb:123:8:123:20 | call to dup : | local_dataflow.rb:123:8:123:45 | call to tap : | -| local_dataflow.rb:123:8:123:20 | call to dup : | local_dataflow.rb:123:8:123:45 | call to tap : | -| local_dataflow.rb:123:8:123:45 | call to tap : | local_dataflow.rb:123:8:123:49 | call to dup | -| local_dataflow.rb:123:8:123:45 | call to tap : | local_dataflow.rb:123:8:123:49 | call to dup | +| local_dataflow.rb:78:3:78:3 | z | local_dataflow.rb:89:8:89:8 | z | +| local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:79:13:79:13 | b | +| local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:80:8:80:8 | a | +| local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:81:9:81:9 | c | +| local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:81:13:81:13 | d | +| local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:81:16:81:16 | e | +| local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:85:13:85:13 | f | +| local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:86:18:86:18 | g | +| local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:87:10:87:10 | x | +| local_dataflow.rb:79:13:79:13 | b | local_dataflow.rb:79:25:79:25 | b | +| local_dataflow.rb:80:8:80:8 | a | local_dataflow.rb:80:29:80:29 | a | +| local_dataflow.rb:81:9:81:9 | c | local_dataflow.rb:82:12:82:12 | c | +| local_dataflow.rb:81:13:81:13 | d | local_dataflow.rb:83:12:83:12 | d | +| local_dataflow.rb:81:16:81:16 | e | local_dataflow.rb:84:12:84:12 | e | +| local_dataflow.rb:85:13:85:13 | f | local_dataflow.rb:85:27:85:27 | f | +| local_dataflow.rb:86:18:86:18 | g | local_dataflow.rb:86:33:86:33 | g | +| local_dataflow.rb:87:10:87:10 | x | local_dataflow.rb:78:3:78:3 | z | +| local_dataflow.rb:87:10:87:10 | x | local_dataflow.rb:87:25:87:25 | x | +| local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | +| local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | +| local_dataflow.rb:93:7:93:15 | call to source | local_dataflow.rb:93:3:93:3 | a | +| local_dataflow.rb:93:7:93:15 | call to source | local_dataflow.rb:93:3:93:3 | a | +| local_dataflow.rb:93:20:93:28 | call to source | local_dataflow.rb:93:3:93:3 | a | +| local_dataflow.rb:93:20:93:28 | call to source | local_dataflow.rb:93:3:93:3 | a | +| local_dataflow.rb:95:3:95:3 | b | local_dataflow.rb:96:8:96:8 | b | +| local_dataflow.rb:95:3:95:3 | b | local_dataflow.rb:96:8:96:8 | b | +| local_dataflow.rb:95:8:95:16 | call to source | local_dataflow.rb:95:3:95:3 | b | +| local_dataflow.rb:95:8:95:16 | call to source | local_dataflow.rb:95:3:95:3 | b | +| local_dataflow.rb:95:21:95:29 | call to source | local_dataflow.rb:95:3:95:3 | b | +| local_dataflow.rb:95:21:95:29 | call to source | local_dataflow.rb:95:3:95:3 | b | +| local_dataflow.rb:98:3:98:3 | a | local_dataflow.rb:99:8:99:8 | a | +| local_dataflow.rb:98:3:98:3 | a | local_dataflow.rb:99:8:99:8 | a | +| local_dataflow.rb:98:7:98:15 | call to source | local_dataflow.rb:98:3:98:3 | a | +| local_dataflow.rb:98:7:98:15 | call to source | local_dataflow.rb:98:3:98:3 | a | +| local_dataflow.rb:98:20:98:28 | call to source | local_dataflow.rb:98:3:98:3 | a | +| local_dataflow.rb:98:20:98:28 | call to source | local_dataflow.rb:98:3:98:3 | a | +| local_dataflow.rb:100:3:100:3 | b | local_dataflow.rb:101:8:101:8 | b | +| local_dataflow.rb:100:3:100:3 | b | local_dataflow.rb:101:8:101:8 | b | +| local_dataflow.rb:100:8:100:16 | call to source | local_dataflow.rb:100:3:100:3 | b | +| local_dataflow.rb:100:8:100:16 | call to source | local_dataflow.rb:100:3:100:3 | b | +| local_dataflow.rb:100:22:100:30 | call to source | local_dataflow.rb:100:3:100:3 | b | +| local_dataflow.rb:100:22:100:30 | call to source | local_dataflow.rb:100:3:100:3 | b | +| local_dataflow.rb:103:3:103:3 | a | local_dataflow.rb:104:3:104:3 | a | +| local_dataflow.rb:103:3:103:3 | a | local_dataflow.rb:104:3:104:3 | a | +| local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:3 | a | +| local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:3 | a | +| local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:105:8:105:8 | a | +| local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:105:8:105:8 | a | +| local_dataflow.rb:104:9:104:17 | call to source | local_dataflow.rb:104:3:104:3 | a | +| local_dataflow.rb:104:9:104:17 | call to source | local_dataflow.rb:104:3:104:3 | a | +| local_dataflow.rb:106:3:106:3 | b | local_dataflow.rb:107:3:107:3 | b | +| local_dataflow.rb:106:3:106:3 | b | local_dataflow.rb:107:3:107:3 | b | +| local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:3 | b | +| local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:3 | b | +| local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:108:8:108:8 | b | +| local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:108:8:108:8 | b | +| local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:3:107:3 | b | +| local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:3:107:3 | b | +| local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | +| local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | +| local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:20 | call to dup | +| local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:20 | call to dup | +| local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | +| local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | +| local_dataflow.rb:117:8:117:16 | call to source | local_dataflow.rb:117:8:117:23 | call to tap | +| local_dataflow.rb:117:8:117:16 | call to source | local_dataflow.rb:117:8:117:23 | call to tap | +| local_dataflow.rb:118:3:118:11 | call to source | local_dataflow.rb:118:20:118:20 | x | +| local_dataflow.rb:118:3:118:11 | call to source | local_dataflow.rb:118:20:118:20 | x | +| local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:28:118:28 | x | +| local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:28:118:28 | x | +| local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:23 | call to tap | +| local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:23 | call to tap | +| local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | +| local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | +| local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:20 | call to dup | +| local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:20 | call to dup | +| local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | +| local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | +| local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | +| local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | nodes -| local_dataflow.rb:78:3:78:3 | z : | semmle.label | z : | -| local_dataflow.rb:78:12:78:20 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:79:13:79:13 | b : | semmle.label | b : | +| local_dataflow.rb:78:3:78:3 | z | semmle.label | z | +| local_dataflow.rb:78:12:78:20 | call to source | semmle.label | call to source | +| local_dataflow.rb:79:13:79:13 | b | semmle.label | b | | local_dataflow.rb:79:25:79:25 | b | semmle.label | b | -| local_dataflow.rb:80:8:80:8 | a : | semmle.label | a : | +| local_dataflow.rb:80:8:80:8 | a | semmle.label | a | | local_dataflow.rb:80:29:80:29 | a | semmle.label | a | -| local_dataflow.rb:81:9:81:9 | c : | semmle.label | c : | -| local_dataflow.rb:81:13:81:13 | d : | semmle.label | d : | -| local_dataflow.rb:81:16:81:16 | e : | semmle.label | e : | +| local_dataflow.rb:81:9:81:9 | c | semmle.label | c | +| local_dataflow.rb:81:13:81:13 | d | semmle.label | d | +| local_dataflow.rb:81:16:81:16 | e | semmle.label | e | | local_dataflow.rb:82:12:82:12 | c | semmle.label | c | | local_dataflow.rb:83:12:83:12 | d | semmle.label | d | | local_dataflow.rb:84:12:84:12 | e | semmle.label | e | -| local_dataflow.rb:85:13:85:13 | f : | semmle.label | f : | +| local_dataflow.rb:85:13:85:13 | f | semmle.label | f | | local_dataflow.rb:85:27:85:27 | f | semmle.label | f | -| local_dataflow.rb:86:18:86:18 | g : | semmle.label | g : | +| local_dataflow.rb:86:18:86:18 | g | semmle.label | g | | local_dataflow.rb:86:33:86:33 | g | semmle.label | g | -| local_dataflow.rb:87:10:87:10 | x : | semmle.label | x : | +| local_dataflow.rb:87:10:87:10 | x | semmle.label | x | | local_dataflow.rb:87:25:87:25 | x | semmle.label | x | | local_dataflow.rb:89:8:89:8 | z | semmle.label | z | -| local_dataflow.rb:93:3:93:3 | a : | semmle.label | a : | -| local_dataflow.rb:93:3:93:3 | a : | semmle.label | a : | -| local_dataflow.rb:93:7:93:15 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:93:7:93:15 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:93:20:93:28 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:93:20:93:28 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:93:3:93:3 | a | semmle.label | a | +| local_dataflow.rb:93:3:93:3 | a | semmle.label | a | +| local_dataflow.rb:93:7:93:15 | call to source | semmle.label | call to source | +| local_dataflow.rb:93:7:93:15 | call to source | semmle.label | call to source | +| local_dataflow.rb:93:20:93:28 | call to source | semmle.label | call to source | +| local_dataflow.rb:93:20:93:28 | call to source | semmle.label | call to source | | local_dataflow.rb:94:8:94:8 | a | semmle.label | a | | local_dataflow.rb:94:8:94:8 | a | semmle.label | a | -| local_dataflow.rb:95:3:95:3 | b : | semmle.label | b : | -| local_dataflow.rb:95:3:95:3 | b : | semmle.label | b : | -| local_dataflow.rb:95:8:95:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:95:8:95:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:95:21:95:29 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:95:21:95:29 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:95:3:95:3 | b | semmle.label | b | +| local_dataflow.rb:95:3:95:3 | b | semmle.label | b | +| local_dataflow.rb:95:8:95:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:95:8:95:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:95:21:95:29 | call to source | semmle.label | call to source | +| local_dataflow.rb:95:21:95:29 | call to source | semmle.label | call to source | | local_dataflow.rb:96:8:96:8 | b | semmle.label | b | | local_dataflow.rb:96:8:96:8 | b | semmle.label | b | -| local_dataflow.rb:98:3:98:3 | a : | semmle.label | a : | -| local_dataflow.rb:98:3:98:3 | a : | semmle.label | a : | -| local_dataflow.rb:98:7:98:15 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:98:7:98:15 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:98:20:98:28 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:98:20:98:28 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:98:3:98:3 | a | semmle.label | a | +| local_dataflow.rb:98:3:98:3 | a | semmle.label | a | +| local_dataflow.rb:98:7:98:15 | call to source | semmle.label | call to source | +| local_dataflow.rb:98:7:98:15 | call to source | semmle.label | call to source | +| local_dataflow.rb:98:20:98:28 | call to source | semmle.label | call to source | +| local_dataflow.rb:98:20:98:28 | call to source | semmle.label | call to source | | local_dataflow.rb:99:8:99:8 | a | semmle.label | a | | local_dataflow.rb:99:8:99:8 | a | semmle.label | a | -| local_dataflow.rb:100:3:100:3 | b : | semmle.label | b : | -| local_dataflow.rb:100:3:100:3 | b : | semmle.label | b : | -| local_dataflow.rb:100:8:100:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:100:8:100:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:100:22:100:30 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:100:22:100:30 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:100:3:100:3 | b | semmle.label | b | +| local_dataflow.rb:100:3:100:3 | b | semmle.label | b | +| local_dataflow.rb:100:8:100:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:100:8:100:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:100:22:100:30 | call to source | semmle.label | call to source | +| local_dataflow.rb:100:22:100:30 | call to source | semmle.label | call to source | | local_dataflow.rb:101:8:101:8 | b | semmle.label | b | | local_dataflow.rb:101:8:101:8 | b | semmle.label | b | -| local_dataflow.rb:103:3:103:3 | a : | semmle.label | a : | -| local_dataflow.rb:103:3:103:3 | a : | semmle.label | a : | -| local_dataflow.rb:103:7:103:15 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:103:7:103:15 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:104:3:104:3 | a : | semmle.label | a : | -| local_dataflow.rb:104:3:104:3 | a : | semmle.label | a : | -| local_dataflow.rb:104:9:104:17 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:104:9:104:17 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:103:3:103:3 | a | semmle.label | a | +| local_dataflow.rb:103:3:103:3 | a | semmle.label | a | +| local_dataflow.rb:103:7:103:15 | call to source | semmle.label | call to source | +| local_dataflow.rb:103:7:103:15 | call to source | semmle.label | call to source | +| local_dataflow.rb:104:3:104:3 | a | semmle.label | a | +| local_dataflow.rb:104:3:104:3 | a | semmle.label | a | +| local_dataflow.rb:104:9:104:17 | call to source | semmle.label | call to source | +| local_dataflow.rb:104:9:104:17 | call to source | semmle.label | call to source | | local_dataflow.rb:105:8:105:8 | a | semmle.label | a | | local_dataflow.rb:105:8:105:8 | a | semmle.label | a | -| local_dataflow.rb:106:3:106:3 | b : | semmle.label | b : | -| local_dataflow.rb:106:3:106:3 | b : | semmle.label | b : | -| local_dataflow.rb:106:7:106:15 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:106:7:106:15 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:107:3:107:3 | b : | semmle.label | b : | -| local_dataflow.rb:107:3:107:3 | b : | semmle.label | b : | -| local_dataflow.rb:107:9:107:17 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:107:9:107:17 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:106:3:106:3 | b | semmle.label | b | +| local_dataflow.rb:106:3:106:3 | b | semmle.label | b | +| local_dataflow.rb:106:7:106:15 | call to source | semmle.label | call to source | +| local_dataflow.rb:106:7:106:15 | call to source | semmle.label | call to source | +| local_dataflow.rb:107:3:107:3 | b | semmle.label | b | +| local_dataflow.rb:107:3:107:3 | b | semmle.label | b | +| local_dataflow.rb:107:9:107:17 | call to source | semmle.label | call to source | +| local_dataflow.rb:107:9:107:17 | call to source | semmle.label | call to source | | local_dataflow.rb:108:8:108:8 | b | semmle.label | b | | local_dataflow.rb:108:8:108:8 | b | semmle.label | b | -| local_dataflow.rb:112:8:112:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:112:8:112:16 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:112:8:112:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:112:8:112:16 | call to source | semmle.label | call to source | | local_dataflow.rb:112:8:112:20 | call to dup | semmle.label | call to dup | | local_dataflow.rb:112:8:112:20 | call to dup | semmle.label | call to dup | -| local_dataflow.rb:113:8:113:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:113:8:113:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:113:8:113:20 | call to dup : | semmle.label | call to dup : | -| local_dataflow.rb:113:8:113:20 | call to dup : | semmle.label | call to dup : | +| local_dataflow.rb:113:8:113:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:113:8:113:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:113:8:113:20 | call to dup | semmle.label | call to dup | +| local_dataflow.rb:113:8:113:20 | call to dup | semmle.label | call to dup | | local_dataflow.rb:113:8:113:24 | call to dup | semmle.label | call to dup | | local_dataflow.rb:113:8:113:24 | call to dup | semmle.label | call to dup | -| local_dataflow.rb:117:8:117:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:117:8:117:16 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:117:8:117:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:117:8:117:16 | call to source | semmle.label | call to source | | local_dataflow.rb:117:8:117:23 | call to tap | semmle.label | call to tap | | local_dataflow.rb:117:8:117:23 | call to tap | semmle.label | call to tap | -| local_dataflow.rb:118:3:118:11 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:118:3:118:11 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:118:20:118:20 | x : | semmle.label | x : | -| local_dataflow.rb:118:20:118:20 | x : | semmle.label | x : | +| local_dataflow.rb:118:3:118:11 | call to source | semmle.label | call to source | +| local_dataflow.rb:118:3:118:11 | call to source | semmle.label | call to source | +| local_dataflow.rb:118:20:118:20 | x | semmle.label | x | +| local_dataflow.rb:118:20:118:20 | x | semmle.label | x | | local_dataflow.rb:118:28:118:28 | x | semmle.label | x | | local_dataflow.rb:118:28:118:28 | x | semmle.label | x | -| local_dataflow.rb:119:8:119:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:119:8:119:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:119:8:119:23 | call to tap : | semmle.label | call to tap : | -| local_dataflow.rb:119:8:119:23 | call to tap : | semmle.label | call to tap : | +| local_dataflow.rb:119:8:119:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:119:8:119:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:119:8:119:23 | call to tap | semmle.label | call to tap | +| local_dataflow.rb:119:8:119:23 | call to tap | semmle.label | call to tap | | local_dataflow.rb:119:8:119:30 | call to tap | semmle.label | call to tap | | local_dataflow.rb:119:8:119:30 | call to tap | semmle.label | call to tap | -| local_dataflow.rb:123:8:123:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:123:8:123:16 | call to source : | semmle.label | call to source : | -| local_dataflow.rb:123:8:123:20 | call to dup : | semmle.label | call to dup : | -| local_dataflow.rb:123:8:123:20 | call to dup : | semmle.label | call to dup : | -| local_dataflow.rb:123:8:123:45 | call to tap : | semmle.label | call to tap : | -| local_dataflow.rb:123:8:123:45 | call to tap : | semmle.label | call to tap : | +| local_dataflow.rb:123:8:123:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:123:8:123:16 | call to source | semmle.label | call to source | +| local_dataflow.rb:123:8:123:20 | call to dup | semmle.label | call to dup | +| local_dataflow.rb:123:8:123:20 | call to dup | semmle.label | call to dup | +| local_dataflow.rb:123:8:123:45 | call to tap | semmle.label | call to tap | +| local_dataflow.rb:123:8:123:45 | call to tap | semmle.label | call to tap | | local_dataflow.rb:123:8:123:49 | call to dup | semmle.label | call to dup | | local_dataflow.rb:123:8:123:49 | call to dup | semmle.label | call to dup | subpaths #select -| local_dataflow.rb:79:25:79:25 | b | local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:79:25:79:25 | b | $@ | local_dataflow.rb:78:12:78:20 | call to source : | call to source : | -| local_dataflow.rb:80:29:80:29 | a | local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:80:29:80:29 | a | $@ | local_dataflow.rb:78:12:78:20 | call to source : | call to source : | -| local_dataflow.rb:82:12:82:12 | c | local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:82:12:82:12 | c | $@ | local_dataflow.rb:78:12:78:20 | call to source : | call to source : | -| local_dataflow.rb:83:12:83:12 | d | local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:83:12:83:12 | d | $@ | local_dataflow.rb:78:12:78:20 | call to source : | call to source : | -| local_dataflow.rb:84:12:84:12 | e | local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:84:12:84:12 | e | $@ | local_dataflow.rb:78:12:78:20 | call to source : | call to source : | -| local_dataflow.rb:85:27:85:27 | f | local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:85:27:85:27 | f | $@ | local_dataflow.rb:78:12:78:20 | call to source : | call to source : | -| local_dataflow.rb:86:33:86:33 | g | local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:86:33:86:33 | g | $@ | local_dataflow.rb:78:12:78:20 | call to source : | call to source : | -| local_dataflow.rb:87:25:87:25 | x | local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:87:25:87:25 | x | $@ | local_dataflow.rb:78:12:78:20 | call to source : | call to source : | -| local_dataflow.rb:89:8:89:8 | z | local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:89:8:89:8 | z | $@ | local_dataflow.rb:78:12:78:20 | call to source : | call to source : | -| local_dataflow.rb:94:8:94:8 | a | local_dataflow.rb:93:7:93:15 | call to source : | local_dataflow.rb:94:8:94:8 | a | $@ | local_dataflow.rb:93:7:93:15 | call to source : | call to source : | -| local_dataflow.rb:94:8:94:8 | a | local_dataflow.rb:93:20:93:28 | call to source : | local_dataflow.rb:94:8:94:8 | a | $@ | local_dataflow.rb:93:20:93:28 | call to source : | call to source : | -| local_dataflow.rb:96:8:96:8 | b | local_dataflow.rb:95:8:95:16 | call to source : | local_dataflow.rb:96:8:96:8 | b | $@ | local_dataflow.rb:95:8:95:16 | call to source : | call to source : | -| local_dataflow.rb:96:8:96:8 | b | local_dataflow.rb:95:21:95:29 | call to source : | local_dataflow.rb:96:8:96:8 | b | $@ | local_dataflow.rb:95:21:95:29 | call to source : | call to source : | -| local_dataflow.rb:99:8:99:8 | a | local_dataflow.rb:98:7:98:15 | call to source : | local_dataflow.rb:99:8:99:8 | a | $@ | local_dataflow.rb:98:7:98:15 | call to source : | call to source : | -| local_dataflow.rb:99:8:99:8 | a | local_dataflow.rb:98:20:98:28 | call to source : | local_dataflow.rb:99:8:99:8 | a | $@ | local_dataflow.rb:98:20:98:28 | call to source : | call to source : | -| local_dataflow.rb:101:8:101:8 | b | local_dataflow.rb:100:8:100:16 | call to source : | local_dataflow.rb:101:8:101:8 | b | $@ | local_dataflow.rb:100:8:100:16 | call to source : | call to source : | -| local_dataflow.rb:101:8:101:8 | b | local_dataflow.rb:100:22:100:30 | call to source : | local_dataflow.rb:101:8:101:8 | b | $@ | local_dataflow.rb:100:22:100:30 | call to source : | call to source : | -| local_dataflow.rb:105:8:105:8 | a | local_dataflow.rb:103:7:103:15 | call to source : | local_dataflow.rb:105:8:105:8 | a | $@ | local_dataflow.rb:103:7:103:15 | call to source : | call to source : | -| local_dataflow.rb:105:8:105:8 | a | local_dataflow.rb:104:9:104:17 | call to source : | local_dataflow.rb:105:8:105:8 | a | $@ | local_dataflow.rb:104:9:104:17 | call to source : | call to source : | -| local_dataflow.rb:108:8:108:8 | b | local_dataflow.rb:106:7:106:15 | call to source : | local_dataflow.rb:108:8:108:8 | b | $@ | local_dataflow.rb:106:7:106:15 | call to source : | call to source : | -| local_dataflow.rb:108:8:108:8 | b | local_dataflow.rb:107:9:107:17 | call to source : | local_dataflow.rb:108:8:108:8 | b | $@ | local_dataflow.rb:107:9:107:17 | call to source : | call to source : | -| local_dataflow.rb:112:8:112:20 | call to dup | local_dataflow.rb:112:8:112:16 | call to source : | local_dataflow.rb:112:8:112:20 | call to dup | $@ | local_dataflow.rb:112:8:112:16 | call to source : | call to source : | -| local_dataflow.rb:113:8:113:24 | call to dup | local_dataflow.rb:113:8:113:16 | call to source : | local_dataflow.rb:113:8:113:24 | call to dup | $@ | local_dataflow.rb:113:8:113:16 | call to source : | call to source : | -| local_dataflow.rb:117:8:117:23 | call to tap | local_dataflow.rb:117:8:117:16 | call to source : | local_dataflow.rb:117:8:117:23 | call to tap | $@ | local_dataflow.rb:117:8:117:16 | call to source : | call to source : | -| local_dataflow.rb:118:28:118:28 | x | local_dataflow.rb:118:3:118:11 | call to source : | local_dataflow.rb:118:28:118:28 | x | $@ | local_dataflow.rb:118:3:118:11 | call to source : | call to source : | -| local_dataflow.rb:119:8:119:30 | call to tap | local_dataflow.rb:119:8:119:16 | call to source : | local_dataflow.rb:119:8:119:30 | call to tap | $@ | local_dataflow.rb:119:8:119:16 | call to source : | call to source : | -| local_dataflow.rb:123:8:123:49 | call to dup | local_dataflow.rb:123:8:123:16 | call to source : | local_dataflow.rb:123:8:123:49 | call to dup | $@ | local_dataflow.rb:123:8:123:16 | call to source : | call to source : | +| local_dataflow.rb:79:25:79:25 | b | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:79:25:79:25 | b | $@ | local_dataflow.rb:78:12:78:20 | call to source | call to source | +| local_dataflow.rb:80:29:80:29 | a | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:80:29:80:29 | a | $@ | local_dataflow.rb:78:12:78:20 | call to source | call to source | +| local_dataflow.rb:82:12:82:12 | c | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:82:12:82:12 | c | $@ | local_dataflow.rb:78:12:78:20 | call to source | call to source | +| local_dataflow.rb:83:12:83:12 | d | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:83:12:83:12 | d | $@ | local_dataflow.rb:78:12:78:20 | call to source | call to source | +| local_dataflow.rb:84:12:84:12 | e | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:84:12:84:12 | e | $@ | local_dataflow.rb:78:12:78:20 | call to source | call to source | +| local_dataflow.rb:85:27:85:27 | f | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:85:27:85:27 | f | $@ | local_dataflow.rb:78:12:78:20 | call to source | call to source | +| local_dataflow.rb:86:33:86:33 | g | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:86:33:86:33 | g | $@ | local_dataflow.rb:78:12:78:20 | call to source | call to source | +| local_dataflow.rb:87:25:87:25 | x | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:87:25:87:25 | x | $@ | local_dataflow.rb:78:12:78:20 | call to source | call to source | +| local_dataflow.rb:89:8:89:8 | z | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:89:8:89:8 | z | $@ | local_dataflow.rb:78:12:78:20 | call to source | call to source | +| local_dataflow.rb:94:8:94:8 | a | local_dataflow.rb:93:7:93:15 | call to source | local_dataflow.rb:94:8:94:8 | a | $@ | local_dataflow.rb:93:7:93:15 | call to source | call to source | +| local_dataflow.rb:94:8:94:8 | a | local_dataflow.rb:93:20:93:28 | call to source | local_dataflow.rb:94:8:94:8 | a | $@ | local_dataflow.rb:93:20:93:28 | call to source | call to source | +| local_dataflow.rb:96:8:96:8 | b | local_dataflow.rb:95:8:95:16 | call to source | local_dataflow.rb:96:8:96:8 | b | $@ | local_dataflow.rb:95:8:95:16 | call to source | call to source | +| local_dataflow.rb:96:8:96:8 | b | local_dataflow.rb:95:21:95:29 | call to source | local_dataflow.rb:96:8:96:8 | b | $@ | local_dataflow.rb:95:21:95:29 | call to source | call to source | +| local_dataflow.rb:99:8:99:8 | a | local_dataflow.rb:98:7:98:15 | call to source | local_dataflow.rb:99:8:99:8 | a | $@ | local_dataflow.rb:98:7:98:15 | call to source | call to source | +| local_dataflow.rb:99:8:99:8 | a | local_dataflow.rb:98:20:98:28 | call to source | local_dataflow.rb:99:8:99:8 | a | $@ | local_dataflow.rb:98:20:98:28 | call to source | call to source | +| local_dataflow.rb:101:8:101:8 | b | local_dataflow.rb:100:8:100:16 | call to source | local_dataflow.rb:101:8:101:8 | b | $@ | local_dataflow.rb:100:8:100:16 | call to source | call to source | +| local_dataflow.rb:101:8:101:8 | b | local_dataflow.rb:100:22:100:30 | call to source | local_dataflow.rb:101:8:101:8 | b | $@ | local_dataflow.rb:100:22:100:30 | call to source | call to source | +| local_dataflow.rb:105:8:105:8 | a | local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:105:8:105:8 | a | $@ | local_dataflow.rb:103:7:103:15 | call to source | call to source | +| local_dataflow.rb:105:8:105:8 | a | local_dataflow.rb:104:9:104:17 | call to source | local_dataflow.rb:105:8:105:8 | a | $@ | local_dataflow.rb:104:9:104:17 | call to source | call to source | +| local_dataflow.rb:108:8:108:8 | b | local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:108:8:108:8 | b | $@ | local_dataflow.rb:106:7:106:15 | call to source | call to source | +| local_dataflow.rb:108:8:108:8 | b | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:108:8:108:8 | b | $@ | local_dataflow.rb:107:9:107:17 | call to source | call to source | +| local_dataflow.rb:112:8:112:20 | call to dup | local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | $@ | local_dataflow.rb:112:8:112:16 | call to source | call to source | +| local_dataflow.rb:113:8:113:24 | call to dup | local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:24 | call to dup | $@ | local_dataflow.rb:113:8:113:16 | call to source | call to source | +| local_dataflow.rb:117:8:117:23 | call to tap | local_dataflow.rb:117:8:117:16 | call to source | local_dataflow.rb:117:8:117:23 | call to tap | $@ | local_dataflow.rb:117:8:117:16 | call to source | call to source | +| local_dataflow.rb:118:28:118:28 | x | local_dataflow.rb:118:3:118:11 | call to source | local_dataflow.rb:118:28:118:28 | x | $@ | local_dataflow.rb:118:3:118:11 | call to source | call to source | +| local_dataflow.rb:119:8:119:30 | call to tap | local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:30 | call to tap | $@ | local_dataflow.rb:119:8:119:16 | call to source | call to source | +| local_dataflow.rb:123:8:123:49 | call to dup | local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:49 | call to dup | $@ | local_dataflow.rb:123:8:123:16 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/params/params-flow.expected b/ruby/ql/test/library-tests/dataflow/params/params-flow.expected index 3b459c4a3e6..cd2d1c87b28 100644 --- a/ruby/ql/test/library-tests/dataflow/params/params-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/params/params-flow.expected @@ -1,135 +1,135 @@ failures edges -| params_flow.rb:9:16:9:17 | p1 : | params_flow.rb:10:10:10:11 | p1 | -| params_flow.rb:9:20:9:21 | p2 : | params_flow.rb:11:10:11:11 | p2 | -| params_flow.rb:14:12:14:19 | call to taint : | params_flow.rb:9:16:9:17 | p1 : | -| params_flow.rb:14:22:14:29 | call to taint : | params_flow.rb:9:20:9:21 | p2 : | -| params_flow.rb:16:13:16:14 | p1 : | params_flow.rb:17:10:17:11 | p1 | -| params_flow.rb:16:18:16:19 | p2 : | params_flow.rb:18:10:18:11 | p2 | -| params_flow.rb:21:13:21:20 | call to taint : | params_flow.rb:16:13:16:14 | p1 : | -| params_flow.rb:21:27:21:34 | call to taint : | params_flow.rb:16:18:16:19 | p2 : | -| params_flow.rb:22:13:22:20 | call to taint : | params_flow.rb:16:18:16:19 | p2 : | -| params_flow.rb:22:27:22:34 | call to taint : | params_flow.rb:16:13:16:14 | p1 : | -| params_flow.rb:23:16:23:23 | call to taint : | params_flow.rb:16:18:16:19 | p2 : | -| params_flow.rb:23:33:23:40 | call to taint : | params_flow.rb:16:13:16:14 | p1 : | -| params_flow.rb:25:12:25:13 | p1 : | params_flow.rb:26:10:26:11 | p1 | -| params_flow.rb:25:17:25:24 | **kwargs [element :p2] : | params_flow.rb:28:11:28:16 | kwargs [element :p2] : | -| params_flow.rb:25:17:25:24 | **kwargs [element :p3] : | params_flow.rb:29:11:29:16 | kwargs [element :p3] : | -| params_flow.rb:28:11:28:16 | kwargs [element :p2] : | params_flow.rb:28:11:28:21 | ...[...] : | -| params_flow.rb:28:11:28:21 | ...[...] : | params_flow.rb:28:10:28:22 | ( ... ) | -| params_flow.rb:29:11:29:16 | kwargs [element :p3] : | params_flow.rb:29:11:29:21 | ...[...] : | -| params_flow.rb:29:11:29:21 | ...[...] : | params_flow.rb:29:10:29:22 | ( ... ) | -| params_flow.rb:33:12:33:19 | call to taint : | params_flow.rb:25:12:25:13 | p1 : | -| params_flow.rb:33:26:33:34 | call to taint : | params_flow.rb:25:17:25:24 | **kwargs [element :p2] : | -| params_flow.rb:33:41:33:49 | call to taint : | params_flow.rb:25:17:25:24 | **kwargs [element :p3] : | -| params_flow.rb:34:1:34:4 | args [element :p3] : | params_flow.rb:35:25:35:28 | args [element :p3] : | -| params_flow.rb:34:14:34:22 | call to taint : | params_flow.rb:34:1:34:4 | args [element :p3] : | -| params_flow.rb:35:12:35:20 | call to taint : | params_flow.rb:25:12:25:13 | p1 : | -| params_flow.rb:35:23:35:28 | ** ... [element :p3] : | params_flow.rb:25:17:25:24 | **kwargs [element :p3] : | -| params_flow.rb:35:25:35:28 | args [element :p3] : | params_flow.rb:35:23:35:28 | ** ... [element :p3] : | -| params_flow.rb:37:1:37:4 | args [element :p1] : | params_flow.rb:38:10:38:13 | args [element :p1] : | -| params_flow.rb:37:1:37:4 | args [element :p2] : | params_flow.rb:38:10:38:13 | args [element :p2] : | -| params_flow.rb:37:16:37:24 | call to taint : | params_flow.rb:37:1:37:4 | args [element :p1] : | -| params_flow.rb:37:34:37:42 | call to taint : | params_flow.rb:37:1:37:4 | args [element :p2] : | -| params_flow.rb:38:8:38:13 | ** ... [element :p1] : | params_flow.rb:25:12:25:13 | p1 : | -| params_flow.rb:38:8:38:13 | ** ... [element :p2] : | params_flow.rb:25:17:25:24 | **kwargs [element :p2] : | -| params_flow.rb:38:10:38:13 | args [element :p1] : | params_flow.rb:38:8:38:13 | ** ... [element :p1] : | -| params_flow.rb:38:10:38:13 | args [element :p2] : | params_flow.rb:38:8:38:13 | ** ... [element :p2] : | -| params_flow.rb:40:1:40:4 | args [element :p1] : | params_flow.rb:41:26:41:29 | args [element :p1] : | -| params_flow.rb:40:16:40:24 | call to taint : | params_flow.rb:40:1:40:4 | args [element :p1] : | -| params_flow.rb:41:13:41:21 | call to taint : | params_flow.rb:16:18:16:19 | p2 : | -| params_flow.rb:41:24:41:29 | ** ... [element :p1] : | params_flow.rb:16:13:16:14 | p1 : | -| params_flow.rb:41:26:41:29 | args [element :p1] : | params_flow.rb:41:24:41:29 | ** ... [element :p1] : | -| params_flow.rb:44:12:44:20 | call to taint : | params_flow.rb:9:16:9:17 | p1 : | -| params_flow.rb:49:13:49:14 | p1 : | params_flow.rb:50:10:50:11 | p1 | -| params_flow.rb:54:9:54:17 | call to taint : | params_flow.rb:49:13:49:14 | p1 : | -| params_flow.rb:57:9:57:17 | call to taint : | params_flow.rb:49:13:49:14 | p1 : | -| params_flow.rb:62:1:62:4 | args : | params_flow.rb:66:13:66:16 | args : | -| params_flow.rb:62:8:62:16 | call to taint : | params_flow.rb:62:1:62:4 | args : | -| params_flow.rb:63:16:63:17 | *x [element 0] : | params_flow.rb:64:10:64:10 | x [element 0] : | -| params_flow.rb:64:10:64:10 | x [element 0] : | params_flow.rb:64:10:64:13 | ...[...] | -| params_flow.rb:66:12:66:16 | * ... [element 0] : | params_flow.rb:63:16:63:17 | *x [element 0] : | -| params_flow.rb:66:13:66:16 | args : | params_flow.rb:66:12:66:16 | * ... [element 0] : | +| params_flow.rb:9:16:9:17 | p1 | params_flow.rb:10:10:10:11 | p1 | +| params_flow.rb:9:20:9:21 | p2 | params_flow.rb:11:10:11:11 | p2 | +| params_flow.rb:14:12:14:19 | call to taint | params_flow.rb:9:16:9:17 | p1 | +| params_flow.rb:14:22:14:29 | call to taint | params_flow.rb:9:20:9:21 | p2 | +| params_flow.rb:16:13:16:14 | p1 | params_flow.rb:17:10:17:11 | p1 | +| params_flow.rb:16:18:16:19 | p2 | params_flow.rb:18:10:18:11 | p2 | +| params_flow.rb:21:13:21:20 | call to taint | params_flow.rb:16:13:16:14 | p1 | +| params_flow.rb:21:27:21:34 | call to taint | params_flow.rb:16:18:16:19 | p2 | +| params_flow.rb:22:13:22:20 | call to taint | params_flow.rb:16:18:16:19 | p2 | +| params_flow.rb:22:27:22:34 | call to taint | params_flow.rb:16:13:16:14 | p1 | +| params_flow.rb:23:16:23:23 | call to taint | params_flow.rb:16:18:16:19 | p2 | +| params_flow.rb:23:33:23:40 | call to taint | params_flow.rb:16:13:16:14 | p1 | +| params_flow.rb:25:12:25:13 | p1 | params_flow.rb:26:10:26:11 | p1 | +| params_flow.rb:25:17:25:24 | **kwargs [element :p2] | params_flow.rb:28:11:28:16 | kwargs [element :p2] | +| params_flow.rb:25:17:25:24 | **kwargs [element :p3] | params_flow.rb:29:11:29:16 | kwargs [element :p3] | +| params_flow.rb:28:11:28:16 | kwargs [element :p2] | params_flow.rb:28:11:28:21 | ...[...] | +| params_flow.rb:28:11:28:21 | ...[...] | params_flow.rb:28:10:28:22 | ( ... ) | +| params_flow.rb:29:11:29:16 | kwargs [element :p3] | params_flow.rb:29:11:29:21 | ...[...] | +| params_flow.rb:29:11:29:21 | ...[...] | params_flow.rb:29:10:29:22 | ( ... ) | +| params_flow.rb:33:12:33:19 | call to taint | params_flow.rb:25:12:25:13 | p1 | +| params_flow.rb:33:26:33:34 | call to taint | params_flow.rb:25:17:25:24 | **kwargs [element :p2] | +| params_flow.rb:33:41:33:49 | call to taint | params_flow.rb:25:17:25:24 | **kwargs [element :p3] | +| params_flow.rb:34:1:34:4 | args [element :p3] | params_flow.rb:35:25:35:28 | args [element :p3] | +| params_flow.rb:34:14:34:22 | call to taint | params_flow.rb:34:1:34:4 | args [element :p3] | +| params_flow.rb:35:12:35:20 | call to taint | params_flow.rb:25:12:25:13 | p1 | +| params_flow.rb:35:23:35:28 | ** ... [element :p3] | params_flow.rb:25:17:25:24 | **kwargs [element :p3] | +| params_flow.rb:35:25:35:28 | args [element :p3] | params_flow.rb:35:23:35:28 | ** ... [element :p3] | +| params_flow.rb:37:1:37:4 | args [element :p1] | params_flow.rb:38:10:38:13 | args [element :p1] | +| params_flow.rb:37:1:37:4 | args [element :p2] | params_flow.rb:38:10:38:13 | args [element :p2] | +| params_flow.rb:37:16:37:24 | call to taint | params_flow.rb:37:1:37:4 | args [element :p1] | +| params_flow.rb:37:34:37:42 | call to taint | params_flow.rb:37:1:37:4 | args [element :p2] | +| params_flow.rb:38:8:38:13 | ** ... [element :p1] | params_flow.rb:25:12:25:13 | p1 | +| params_flow.rb:38:8:38:13 | ** ... [element :p2] | params_flow.rb:25:17:25:24 | **kwargs [element :p2] | +| params_flow.rb:38:10:38:13 | args [element :p1] | params_flow.rb:38:8:38:13 | ** ... [element :p1] | +| params_flow.rb:38:10:38:13 | args [element :p2] | params_flow.rb:38:8:38:13 | ** ... [element :p2] | +| params_flow.rb:40:1:40:4 | args [element :p1] | params_flow.rb:41:26:41:29 | args [element :p1] | +| params_flow.rb:40:16:40:24 | call to taint | params_flow.rb:40:1:40:4 | args [element :p1] | +| params_flow.rb:41:13:41:21 | call to taint | params_flow.rb:16:18:16:19 | p2 | +| params_flow.rb:41:24:41:29 | ** ... [element :p1] | params_flow.rb:16:13:16:14 | p1 | +| params_flow.rb:41:26:41:29 | args [element :p1] | params_flow.rb:41:24:41:29 | ** ... [element :p1] | +| params_flow.rb:44:12:44:20 | call to taint | params_flow.rb:9:16:9:17 | p1 | +| params_flow.rb:49:13:49:14 | p1 | params_flow.rb:50:10:50:11 | p1 | +| params_flow.rb:54:9:54:17 | call to taint | params_flow.rb:49:13:49:14 | p1 | +| params_flow.rb:57:9:57:17 | call to taint | params_flow.rb:49:13:49:14 | p1 | +| params_flow.rb:62:1:62:4 | args | params_flow.rb:66:13:66:16 | args | +| params_flow.rb:62:8:62:16 | call to taint | params_flow.rb:62:1:62:4 | args | +| params_flow.rb:63:16:63:17 | *x [element 0] | params_flow.rb:64:10:64:10 | x [element 0] | +| params_flow.rb:64:10:64:10 | x [element 0] | params_flow.rb:64:10:64:13 | ...[...] | +| params_flow.rb:66:12:66:16 | * ... [element 0] | params_flow.rb:63:16:63:17 | *x [element 0] | +| params_flow.rb:66:13:66:16 | args | params_flow.rb:66:12:66:16 | * ... [element 0] | nodes -| params_flow.rb:9:16:9:17 | p1 : | semmle.label | p1 : | -| params_flow.rb:9:20:9:21 | p2 : | semmle.label | p2 : | +| params_flow.rb:9:16:9:17 | p1 | semmle.label | p1 | +| params_flow.rb:9:20:9:21 | p2 | semmle.label | p2 | | params_flow.rb:10:10:10:11 | p1 | semmle.label | p1 | | params_flow.rb:11:10:11:11 | p2 | semmle.label | p2 | -| params_flow.rb:14:12:14:19 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:14:22:14:29 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:16:13:16:14 | p1 : | semmle.label | p1 : | -| params_flow.rb:16:18:16:19 | p2 : | semmle.label | p2 : | +| params_flow.rb:14:12:14:19 | call to taint | semmle.label | call to taint | +| params_flow.rb:14:22:14:29 | call to taint | semmle.label | call to taint | +| params_flow.rb:16:13:16:14 | p1 | semmle.label | p1 | +| params_flow.rb:16:18:16:19 | p2 | semmle.label | p2 | | params_flow.rb:17:10:17:11 | p1 | semmle.label | p1 | | params_flow.rb:18:10:18:11 | p2 | semmle.label | p2 | -| params_flow.rb:21:13:21:20 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:21:27:21:34 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:22:13:22:20 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:22:27:22:34 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:23:16:23:23 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:23:33:23:40 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:25:12:25:13 | p1 : | semmle.label | p1 : | -| params_flow.rb:25:17:25:24 | **kwargs [element :p2] : | semmle.label | **kwargs [element :p2] : | -| params_flow.rb:25:17:25:24 | **kwargs [element :p3] : | semmle.label | **kwargs [element :p3] : | +| params_flow.rb:21:13:21:20 | call to taint | semmle.label | call to taint | +| params_flow.rb:21:27:21:34 | call to taint | semmle.label | call to taint | +| params_flow.rb:22:13:22:20 | call to taint | semmle.label | call to taint | +| params_flow.rb:22:27:22:34 | call to taint | semmle.label | call to taint | +| params_flow.rb:23:16:23:23 | call to taint | semmle.label | call to taint | +| params_flow.rb:23:33:23:40 | call to taint | semmle.label | call to taint | +| params_flow.rb:25:12:25:13 | p1 | semmle.label | p1 | +| params_flow.rb:25:17:25:24 | **kwargs [element :p2] | semmle.label | **kwargs [element :p2] | +| params_flow.rb:25:17:25:24 | **kwargs [element :p3] | semmle.label | **kwargs [element :p3] | | params_flow.rb:26:10:26:11 | p1 | semmle.label | p1 | | params_flow.rb:28:10:28:22 | ( ... ) | semmle.label | ( ... ) | -| params_flow.rb:28:11:28:16 | kwargs [element :p2] : | semmle.label | kwargs [element :p2] : | -| params_flow.rb:28:11:28:21 | ...[...] : | semmle.label | ...[...] : | +| params_flow.rb:28:11:28:16 | kwargs [element :p2] | semmle.label | kwargs [element :p2] | +| params_flow.rb:28:11:28:21 | ...[...] | semmle.label | ...[...] | | params_flow.rb:29:10:29:22 | ( ... ) | semmle.label | ( ... ) | -| params_flow.rb:29:11:29:16 | kwargs [element :p3] : | semmle.label | kwargs [element :p3] : | -| params_flow.rb:29:11:29:21 | ...[...] : | semmle.label | ...[...] : | -| params_flow.rb:33:12:33:19 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:33:26:33:34 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:33:41:33:49 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:34:1:34:4 | args [element :p3] : | semmle.label | args [element :p3] : | -| params_flow.rb:34:14:34:22 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:35:12:35:20 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:35:23:35:28 | ** ... [element :p3] : | semmle.label | ** ... [element :p3] : | -| params_flow.rb:35:25:35:28 | args [element :p3] : | semmle.label | args [element :p3] : | -| params_flow.rb:37:1:37:4 | args [element :p1] : | semmle.label | args [element :p1] : | -| params_flow.rb:37:1:37:4 | args [element :p2] : | semmle.label | args [element :p2] : | -| params_flow.rb:37:16:37:24 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:37:34:37:42 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:38:8:38:13 | ** ... [element :p1] : | semmle.label | ** ... [element :p1] : | -| params_flow.rb:38:8:38:13 | ** ... [element :p2] : | semmle.label | ** ... [element :p2] : | -| params_flow.rb:38:10:38:13 | args [element :p1] : | semmle.label | args [element :p1] : | -| params_flow.rb:38:10:38:13 | args [element :p2] : | semmle.label | args [element :p2] : | -| params_flow.rb:40:1:40:4 | args [element :p1] : | semmle.label | args [element :p1] : | -| params_flow.rb:40:16:40:24 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:41:13:41:21 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:41:24:41:29 | ** ... [element :p1] : | semmle.label | ** ... [element :p1] : | -| params_flow.rb:41:26:41:29 | args [element :p1] : | semmle.label | args [element :p1] : | -| params_flow.rb:44:12:44:20 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:49:13:49:14 | p1 : | semmle.label | p1 : | +| params_flow.rb:29:11:29:16 | kwargs [element :p3] | semmle.label | kwargs [element :p3] | +| params_flow.rb:29:11:29:21 | ...[...] | semmle.label | ...[...] | +| params_flow.rb:33:12:33:19 | call to taint | semmle.label | call to taint | +| params_flow.rb:33:26:33:34 | call to taint | semmle.label | call to taint | +| params_flow.rb:33:41:33:49 | call to taint | semmle.label | call to taint | +| params_flow.rb:34:1:34:4 | args [element :p3] | semmle.label | args [element :p3] | +| params_flow.rb:34:14:34:22 | call to taint | semmle.label | call to taint | +| params_flow.rb:35:12:35:20 | call to taint | semmle.label | call to taint | +| params_flow.rb:35:23:35:28 | ** ... [element :p3] | semmle.label | ** ... [element :p3] | +| params_flow.rb:35:25:35:28 | args [element :p3] | semmle.label | args [element :p3] | +| params_flow.rb:37:1:37:4 | args [element :p1] | semmle.label | args [element :p1] | +| params_flow.rb:37:1:37:4 | args [element :p2] | semmle.label | args [element :p2] | +| params_flow.rb:37:16:37:24 | call to taint | semmle.label | call to taint | +| params_flow.rb:37:34:37:42 | call to taint | semmle.label | call to taint | +| params_flow.rb:38:8:38:13 | ** ... [element :p1] | semmle.label | ** ... [element :p1] | +| params_flow.rb:38:8:38:13 | ** ... [element :p2] | semmle.label | ** ... [element :p2] | +| params_flow.rb:38:10:38:13 | args [element :p1] | semmle.label | args [element :p1] | +| params_flow.rb:38:10:38:13 | args [element :p2] | semmle.label | args [element :p2] | +| params_flow.rb:40:1:40:4 | args [element :p1] | semmle.label | args [element :p1] | +| params_flow.rb:40:16:40:24 | call to taint | semmle.label | call to taint | +| params_flow.rb:41:13:41:21 | call to taint | semmle.label | call to taint | +| params_flow.rb:41:24:41:29 | ** ... [element :p1] | semmle.label | ** ... [element :p1] | +| params_flow.rb:41:26:41:29 | args [element :p1] | semmle.label | args [element :p1] | +| params_flow.rb:44:12:44:20 | call to taint | semmle.label | call to taint | +| params_flow.rb:49:13:49:14 | p1 | semmle.label | p1 | | params_flow.rb:50:10:50:11 | p1 | semmle.label | p1 | -| params_flow.rb:54:9:54:17 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:57:9:57:17 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:62:1:62:4 | args : | semmle.label | args : | -| params_flow.rb:62:8:62:16 | call to taint : | semmle.label | call to taint : | -| params_flow.rb:63:16:63:17 | *x [element 0] : | semmle.label | *x [element 0] : | -| params_flow.rb:64:10:64:10 | x [element 0] : | semmle.label | x [element 0] : | +| params_flow.rb:54:9:54:17 | call to taint | semmle.label | call to taint | +| params_flow.rb:57:9:57:17 | call to taint | semmle.label | call to taint | +| params_flow.rb:62:1:62:4 | args | semmle.label | args | +| params_flow.rb:62:8:62:16 | call to taint | semmle.label | call to taint | +| params_flow.rb:63:16:63:17 | *x [element 0] | semmle.label | *x [element 0] | +| params_flow.rb:64:10:64:10 | x [element 0] | semmle.label | x [element 0] | | params_flow.rb:64:10:64:13 | ...[...] | semmle.label | ...[...] | -| params_flow.rb:66:12:66:16 | * ... [element 0] : | semmle.label | * ... [element 0] : | -| params_flow.rb:66:13:66:16 | args : | semmle.label | args : | +| params_flow.rb:66:12:66:16 | * ... [element 0] | semmle.label | * ... [element 0] | +| params_flow.rb:66:13:66:16 | args | semmle.label | args | subpaths #select -| params_flow.rb:10:10:10:11 | p1 | params_flow.rb:14:12:14:19 | call to taint : | params_flow.rb:10:10:10:11 | p1 | $@ | params_flow.rb:14:12:14:19 | call to taint : | call to taint : | -| params_flow.rb:10:10:10:11 | p1 | params_flow.rb:44:12:44:20 | call to taint : | params_flow.rb:10:10:10:11 | p1 | $@ | params_flow.rb:44:12:44:20 | call to taint : | call to taint : | -| params_flow.rb:11:10:11:11 | p2 | params_flow.rb:14:22:14:29 | call to taint : | params_flow.rb:11:10:11:11 | p2 | $@ | params_flow.rb:14:22:14:29 | call to taint : | call to taint : | -| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:21:13:21:20 | call to taint : | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:21:13:21:20 | call to taint : | call to taint : | -| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:22:27:22:34 | call to taint : | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:22:27:22:34 | call to taint : | call to taint : | -| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:23:33:23:40 | call to taint : | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:23:33:23:40 | call to taint : | call to taint : | -| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:40:16:40:24 | call to taint : | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:40:16:40:24 | call to taint : | call to taint : | -| params_flow.rb:18:10:18:11 | p2 | params_flow.rb:21:27:21:34 | call to taint : | params_flow.rb:18:10:18:11 | p2 | $@ | params_flow.rb:21:27:21:34 | call to taint : | call to taint : | -| params_flow.rb:18:10:18:11 | p2 | params_flow.rb:22:13:22:20 | call to taint : | params_flow.rb:18:10:18:11 | p2 | $@ | params_flow.rb:22:13:22:20 | call to taint : | call to taint : | -| params_flow.rb:18:10:18:11 | p2 | params_flow.rb:23:16:23:23 | call to taint : | params_flow.rb:18:10:18:11 | p2 | $@ | params_flow.rb:23:16:23:23 | call to taint : | call to taint : | -| params_flow.rb:18:10:18:11 | p2 | params_flow.rb:41:13:41:21 | call to taint : | params_flow.rb:18:10:18:11 | p2 | $@ | params_flow.rb:41:13:41:21 | call to taint : | call to taint : | -| params_flow.rb:26:10:26:11 | p1 | params_flow.rb:33:12:33:19 | call to taint : | params_flow.rb:26:10:26:11 | p1 | $@ | params_flow.rb:33:12:33:19 | call to taint : | call to taint : | -| params_flow.rb:26:10:26:11 | p1 | params_flow.rb:35:12:35:20 | call to taint : | params_flow.rb:26:10:26:11 | p1 | $@ | params_flow.rb:35:12:35:20 | call to taint : | call to taint : | -| params_flow.rb:26:10:26:11 | p1 | params_flow.rb:37:16:37:24 | call to taint : | params_flow.rb:26:10:26:11 | p1 | $@ | params_flow.rb:37:16:37:24 | call to taint : | call to taint : | -| params_flow.rb:28:10:28:22 | ( ... ) | params_flow.rb:33:26:33:34 | call to taint : | params_flow.rb:28:10:28:22 | ( ... ) | $@ | params_flow.rb:33:26:33:34 | call to taint : | call to taint : | -| params_flow.rb:28:10:28:22 | ( ... ) | params_flow.rb:37:34:37:42 | call to taint : | params_flow.rb:28:10:28:22 | ( ... ) | $@ | params_flow.rb:37:34:37:42 | call to taint : | call to taint : | -| params_flow.rb:29:10:29:22 | ( ... ) | params_flow.rb:33:41:33:49 | call to taint : | params_flow.rb:29:10:29:22 | ( ... ) | $@ | params_flow.rb:33:41:33:49 | call to taint : | call to taint : | -| params_flow.rb:29:10:29:22 | ( ... ) | params_flow.rb:34:14:34:22 | call to taint : | params_flow.rb:29:10:29:22 | ( ... ) | $@ | params_flow.rb:34:14:34:22 | call to taint : | call to taint : | -| params_flow.rb:50:10:50:11 | p1 | params_flow.rb:54:9:54:17 | call to taint : | params_flow.rb:50:10:50:11 | p1 | $@ | params_flow.rb:54:9:54:17 | call to taint : | call to taint : | -| params_flow.rb:50:10:50:11 | p1 | params_flow.rb:57:9:57:17 | call to taint : | params_flow.rb:50:10:50:11 | p1 | $@ | params_flow.rb:57:9:57:17 | call to taint : | call to taint : | -| params_flow.rb:64:10:64:13 | ...[...] | params_flow.rb:62:8:62:16 | call to taint : | params_flow.rb:64:10:64:13 | ...[...] | $@ | params_flow.rb:62:8:62:16 | call to taint : | call to taint : | +| params_flow.rb:10:10:10:11 | p1 | params_flow.rb:14:12:14:19 | call to taint | params_flow.rb:10:10:10:11 | p1 | $@ | params_flow.rb:14:12:14:19 | call to taint | call to taint | +| params_flow.rb:10:10:10:11 | p1 | params_flow.rb:44:12:44:20 | call to taint | params_flow.rb:10:10:10:11 | p1 | $@ | params_flow.rb:44:12:44:20 | call to taint | call to taint | +| params_flow.rb:11:10:11:11 | p2 | params_flow.rb:14:22:14:29 | call to taint | params_flow.rb:11:10:11:11 | p2 | $@ | params_flow.rb:14:22:14:29 | call to taint | call to taint | +| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:21:13:21:20 | call to taint | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:21:13:21:20 | call to taint | call to taint | +| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:22:27:22:34 | call to taint | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:22:27:22:34 | call to taint | call to taint | +| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:23:33:23:40 | call to taint | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:23:33:23:40 | call to taint | call to taint | +| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:40:16:40:24 | call to taint | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:40:16:40:24 | call to taint | call to taint | +| params_flow.rb:18:10:18:11 | p2 | params_flow.rb:21:27:21:34 | call to taint | params_flow.rb:18:10:18:11 | p2 | $@ | params_flow.rb:21:27:21:34 | call to taint | call to taint | +| params_flow.rb:18:10:18:11 | p2 | params_flow.rb:22:13:22:20 | call to taint | params_flow.rb:18:10:18:11 | p2 | $@ | params_flow.rb:22:13:22:20 | call to taint | call to taint | +| params_flow.rb:18:10:18:11 | p2 | params_flow.rb:23:16:23:23 | call to taint | params_flow.rb:18:10:18:11 | p2 | $@ | params_flow.rb:23:16:23:23 | call to taint | call to taint | +| params_flow.rb:18:10:18:11 | p2 | params_flow.rb:41:13:41:21 | call to taint | params_flow.rb:18:10:18:11 | p2 | $@ | params_flow.rb:41:13:41:21 | call to taint | call to taint | +| params_flow.rb:26:10:26:11 | p1 | params_flow.rb:33:12:33:19 | call to taint | params_flow.rb:26:10:26:11 | p1 | $@ | params_flow.rb:33:12:33:19 | call to taint | call to taint | +| params_flow.rb:26:10:26:11 | p1 | params_flow.rb:35:12:35:20 | call to taint | params_flow.rb:26:10:26:11 | p1 | $@ | params_flow.rb:35:12:35:20 | call to taint | call to taint | +| params_flow.rb:26:10:26:11 | p1 | params_flow.rb:37:16:37:24 | call to taint | params_flow.rb:26:10:26:11 | p1 | $@ | params_flow.rb:37:16:37:24 | call to taint | call to taint | +| params_flow.rb:28:10:28:22 | ( ... ) | params_flow.rb:33:26:33:34 | call to taint | params_flow.rb:28:10:28:22 | ( ... ) | $@ | params_flow.rb:33:26:33:34 | call to taint | call to taint | +| params_flow.rb:28:10:28:22 | ( ... ) | params_flow.rb:37:34:37:42 | call to taint | params_flow.rb:28:10:28:22 | ( ... ) | $@ | params_flow.rb:37:34:37:42 | call to taint | call to taint | +| params_flow.rb:29:10:29:22 | ( ... ) | params_flow.rb:33:41:33:49 | call to taint | params_flow.rb:29:10:29:22 | ( ... ) | $@ | params_flow.rb:33:41:33:49 | call to taint | call to taint | +| params_flow.rb:29:10:29:22 | ( ... ) | params_flow.rb:34:14:34:22 | call to taint | params_flow.rb:29:10:29:22 | ( ... ) | $@ | params_flow.rb:34:14:34:22 | call to taint | call to taint | +| params_flow.rb:50:10:50:11 | p1 | params_flow.rb:54:9:54:17 | call to taint | params_flow.rb:50:10:50:11 | p1 | $@ | params_flow.rb:54:9:54:17 | call to taint | call to taint | +| params_flow.rb:50:10:50:11 | p1 | params_flow.rb:57:9:57:17 | call to taint | params_flow.rb:50:10:50:11 | p1 | $@ | params_flow.rb:57:9:57:17 | call to taint | call to taint | +| params_flow.rb:64:10:64:13 | ...[...] | params_flow.rb:62:8:62:16 | call to taint | params_flow.rb:64:10:64:13 | ...[...] | $@ | params_flow.rb:62:8:62:16 | call to taint | call to taint | diff --git a/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.expected b/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.expected index b248ef21157..37a7d126193 100644 --- a/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.expected @@ -1,293 +1,293 @@ failures edges -| pathname_flow.rb:4:5:4:6 | pn : | pathname_flow.rb:5:10:5:11 | pn | -| pathname_flow.rb:4:10:4:33 | call to new : | pathname_flow.rb:4:5:4:6 | pn : | -| pathname_flow.rb:4:23:4:32 | call to source : | pathname_flow.rb:4:10:4:33 | call to new : | -| pathname_flow.rb:9:3:9:3 | a : | pathname_flow.rb:11:8:11:12 | ... + ... | -| pathname_flow.rb:9:7:9:30 | call to new : | pathname_flow.rb:9:3:9:3 | a : | -| pathname_flow.rb:9:20:9:29 | call to source : | pathname_flow.rb:9:7:9:30 | call to new : | -| pathname_flow.rb:10:3:10:3 | b : | pathname_flow.rb:11:8:11:12 | ... + ... | -| pathname_flow.rb:10:7:10:30 | call to new : | pathname_flow.rb:10:3:10:3 | b : | -| pathname_flow.rb:10:20:10:29 | call to source : | pathname_flow.rb:10:7:10:30 | call to new : | -| pathname_flow.rb:15:3:15:4 | pn : | pathname_flow.rb:16:8:16:9 | pn : | -| pathname_flow.rb:15:8:15:31 | call to new : | pathname_flow.rb:15:3:15:4 | pn : | -| pathname_flow.rb:15:21:15:30 | call to source : | pathname_flow.rb:15:8:15:31 | call to new : | -| pathname_flow.rb:16:8:16:9 | pn : | pathname_flow.rb:16:8:16:17 | call to dirname | -| pathname_flow.rb:20:3:20:3 | a : | pathname_flow.rb:21:3:21:3 | a : | -| pathname_flow.rb:20:7:20:30 | call to new : | pathname_flow.rb:20:3:20:3 | a : | -| pathname_flow.rb:20:20:20:29 | call to source : | pathname_flow.rb:20:7:20:30 | call to new : | -| pathname_flow.rb:21:3:21:3 | a : | pathname_flow.rb:21:23:21:23 | x : | -| pathname_flow.rb:21:23:21:23 | x : | pathname_flow.rb:22:10:22:10 | x | -| pathname_flow.rb:27:3:27:3 | a : | pathname_flow.rb:28:8:28:8 | a : | -| pathname_flow.rb:27:7:27:30 | call to new : | pathname_flow.rb:27:3:27:3 | a : | -| pathname_flow.rb:27:20:27:29 | call to source : | pathname_flow.rb:27:7:27:30 | call to new : | -| pathname_flow.rb:28:8:28:8 | a : | pathname_flow.rb:28:8:28:22 | call to expand_path | -| pathname_flow.rb:32:3:32:3 | a : | pathname_flow.rb:35:8:35:8 | a : | -| pathname_flow.rb:32:7:32:30 | call to new : | pathname_flow.rb:32:3:32:3 | a : | -| pathname_flow.rb:32:20:32:29 | call to source : | pathname_flow.rb:32:7:32:30 | call to new : | -| pathname_flow.rb:34:3:34:3 | c : | pathname_flow.rb:35:18:35:18 | c : | -| pathname_flow.rb:34:7:34:30 | call to new : | pathname_flow.rb:34:3:34:3 | c : | -| pathname_flow.rb:34:20:34:29 | call to source : | pathname_flow.rb:34:7:34:30 | call to new : | -| pathname_flow.rb:35:8:35:8 | a : | pathname_flow.rb:35:8:35:19 | call to join | -| pathname_flow.rb:35:18:35:18 | c : | pathname_flow.rb:35:8:35:19 | call to join | -| pathname_flow.rb:39:3:39:3 | a : | pathname_flow.rb:40:8:40:8 | a : | -| pathname_flow.rb:39:7:39:30 | call to new : | pathname_flow.rb:39:3:39:3 | a : | -| pathname_flow.rb:39:20:39:29 | call to source : | pathname_flow.rb:39:7:39:30 | call to new : | -| pathname_flow.rb:40:8:40:8 | a : | pathname_flow.rb:40:8:40:17 | call to parent | -| pathname_flow.rb:44:3:44:3 | a : | pathname_flow.rb:45:8:45:8 | a : | -| pathname_flow.rb:44:7:44:30 | call to new : | pathname_flow.rb:44:3:44:3 | a : | -| pathname_flow.rb:44:20:44:29 | call to source : | pathname_flow.rb:44:7:44:30 | call to new : | -| pathname_flow.rb:45:8:45:8 | a : | pathname_flow.rb:45:8:45:19 | call to realpath | -| pathname_flow.rb:49:3:49:3 | a : | pathname_flow.rb:50:8:50:8 | a : | -| pathname_flow.rb:49:7:49:30 | call to new : | pathname_flow.rb:49:3:49:3 | a : | -| pathname_flow.rb:49:20:49:29 | call to source : | pathname_flow.rb:49:7:49:30 | call to new : | -| pathname_flow.rb:50:8:50:8 | a : | pathname_flow.rb:50:8:50:39 | call to relative_path_from | -| pathname_flow.rb:54:3:54:3 | a : | pathname_flow.rb:55:8:55:8 | a : | -| pathname_flow.rb:54:7:54:30 | call to new : | pathname_flow.rb:54:3:54:3 | a : | -| pathname_flow.rb:54:20:54:29 | call to source : | pathname_flow.rb:54:7:54:30 | call to new : | -| pathname_flow.rb:55:8:55:8 | a : | pathname_flow.rb:55:8:55:16 | call to to_path | -| pathname_flow.rb:59:3:59:3 | a : | pathname_flow.rb:60:8:60:8 | a : | -| pathname_flow.rb:59:7:59:30 | call to new : | pathname_flow.rb:59:3:59:3 | a : | -| pathname_flow.rb:59:20:59:29 | call to source : | pathname_flow.rb:59:7:59:30 | call to new : | -| pathname_flow.rb:60:8:60:8 | a : | pathname_flow.rb:60:8:60:13 | call to to_s | -| pathname_flow.rb:64:3:64:3 | a : | pathname_flow.rb:65:3:65:3 | b : | -| pathname_flow.rb:64:7:64:30 | call to new : | pathname_flow.rb:64:3:64:3 | a : | -| pathname_flow.rb:64:20:64:29 | call to source : | pathname_flow.rb:64:7:64:30 | call to new : | -| pathname_flow.rb:65:3:65:3 | b : | pathname_flow.rb:66:8:66:8 | b | -| pathname_flow.rb:70:3:70:3 | a : | pathname_flow.rb:71:3:71:3 | b : | -| pathname_flow.rb:70:7:70:30 | call to new : | pathname_flow.rb:70:3:70:3 | a : | -| pathname_flow.rb:70:20:70:29 | call to source : | pathname_flow.rb:70:7:70:30 | call to new : | -| pathname_flow.rb:71:3:71:3 | b : | pathname_flow.rb:72:8:72:8 | b | -| pathname_flow.rb:76:3:76:3 | a : | pathname_flow.rb:77:7:77:7 | a : | -| pathname_flow.rb:76:7:76:30 | call to new : | pathname_flow.rb:76:3:76:3 | a : | -| pathname_flow.rb:76:20:76:29 | call to source : | pathname_flow.rb:76:7:76:30 | call to new : | -| pathname_flow.rb:77:3:77:3 | b : | pathname_flow.rb:78:8:78:8 | b | -| pathname_flow.rb:77:7:77:7 | a : | pathname_flow.rb:77:7:77:16 | call to basename : | -| pathname_flow.rb:77:7:77:16 | call to basename : | pathname_flow.rb:77:3:77:3 | b : | -| pathname_flow.rb:82:3:82:3 | a : | pathname_flow.rb:83:7:83:7 | a : | -| pathname_flow.rb:82:7:82:30 | call to new : | pathname_flow.rb:82:3:82:3 | a : | -| pathname_flow.rb:82:20:82:29 | call to source : | pathname_flow.rb:82:7:82:30 | call to new : | -| pathname_flow.rb:83:3:83:3 | b : | pathname_flow.rb:84:8:84:8 | b | -| pathname_flow.rb:83:7:83:7 | a : | pathname_flow.rb:83:7:83:17 | call to cleanpath : | -| pathname_flow.rb:83:7:83:17 | call to cleanpath : | pathname_flow.rb:83:3:83:3 | b : | -| pathname_flow.rb:88:3:88:3 | a : | pathname_flow.rb:89:7:89:7 | a : | -| pathname_flow.rb:88:7:88:30 | call to new : | pathname_flow.rb:88:3:88:3 | a : | -| pathname_flow.rb:88:20:88:29 | call to source : | pathname_flow.rb:88:7:88:30 | call to new : | -| pathname_flow.rb:89:3:89:3 | b : | pathname_flow.rb:90:8:90:8 | b | -| pathname_flow.rb:89:7:89:7 | a : | pathname_flow.rb:89:7:89:25 | call to sub : | -| pathname_flow.rb:89:7:89:25 | call to sub : | pathname_flow.rb:89:3:89:3 | b : | -| pathname_flow.rb:94:3:94:3 | a : | pathname_flow.rb:95:7:95:7 | a : | -| pathname_flow.rb:94:7:94:30 | call to new : | pathname_flow.rb:94:3:94:3 | a : | -| pathname_flow.rb:94:20:94:29 | call to source : | pathname_flow.rb:94:7:94:30 | call to new : | -| pathname_flow.rb:95:3:95:3 | b : | pathname_flow.rb:96:8:96:8 | b | -| pathname_flow.rb:95:7:95:7 | a : | pathname_flow.rb:95:7:95:23 | call to sub_ext : | -| pathname_flow.rb:95:7:95:23 | call to sub_ext : | pathname_flow.rb:95:3:95:3 | b : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:103:3:103:3 | b : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:106:3:106:3 | c : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:109:7:109:7 | a : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:112:7:112:7 | a : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:115:7:115:7 | a : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:118:7:118:7 | a : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:121:7:121:7 | a : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:124:7:124:7 | a : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:127:7:127:7 | a : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:130:7:130:7 | a : | -| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:133:7:133:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:101:3:101:3 | a : | -| pathname_flow.rb:101:20:101:29 | call to source : | pathname_flow.rb:101:7:101:30 | call to new : | -| pathname_flow.rb:103:3:103:3 | b : | pathname_flow.rb:104:8:104:8 | b : | -| pathname_flow.rb:104:8:104:8 | b : | pathname_flow.rb:104:8:104:17 | call to realpath | -| pathname_flow.rb:106:3:106:3 | c : | pathname_flow.rb:107:8:107:8 | c : | -| pathname_flow.rb:107:8:107:8 | c : | pathname_flow.rb:107:8:107:17 | call to realpath | -| pathname_flow.rb:109:3:109:3 | d : | pathname_flow.rb:110:8:110:8 | d : | -| pathname_flow.rb:109:7:109:7 | a : | pathname_flow.rb:109:7:109:16 | call to basename : | -| pathname_flow.rb:109:7:109:16 | call to basename : | pathname_flow.rb:109:3:109:3 | d : | -| pathname_flow.rb:110:8:110:8 | d : | pathname_flow.rb:110:8:110:17 | call to realpath | -| pathname_flow.rb:112:3:112:3 | e : | pathname_flow.rb:113:8:113:8 | e : | -| pathname_flow.rb:112:7:112:7 | a : | pathname_flow.rb:112:7:112:17 | call to cleanpath : | -| pathname_flow.rb:112:7:112:17 | call to cleanpath : | pathname_flow.rb:112:3:112:3 | e : | -| pathname_flow.rb:113:8:113:8 | e : | pathname_flow.rb:113:8:113:17 | call to realpath | -| pathname_flow.rb:115:3:115:3 | f : | pathname_flow.rb:116:8:116:8 | f : | -| pathname_flow.rb:115:7:115:7 | a : | pathname_flow.rb:115:7:115:19 | call to expand_path : | -| pathname_flow.rb:115:7:115:19 | call to expand_path : | pathname_flow.rb:115:3:115:3 | f : | -| pathname_flow.rb:116:8:116:8 | f : | pathname_flow.rb:116:8:116:17 | call to realpath | -| pathname_flow.rb:118:3:118:3 | g : | pathname_flow.rb:119:8:119:8 | g : | -| pathname_flow.rb:118:7:118:7 | a : | pathname_flow.rb:118:7:118:19 | call to join : | -| pathname_flow.rb:118:7:118:19 | call to join : | pathname_flow.rb:118:3:118:3 | g : | -| pathname_flow.rb:119:8:119:8 | g : | pathname_flow.rb:119:8:119:17 | call to realpath | -| pathname_flow.rb:121:3:121:3 | h : | pathname_flow.rb:122:8:122:8 | h : | -| pathname_flow.rb:121:7:121:7 | a : | pathname_flow.rb:121:7:121:16 | call to realpath : | -| pathname_flow.rb:121:7:121:16 | call to realpath : | pathname_flow.rb:121:3:121:3 | h : | -| pathname_flow.rb:122:8:122:8 | h : | pathname_flow.rb:122:8:122:17 | call to realpath | -| pathname_flow.rb:124:3:124:3 | i : | pathname_flow.rb:125:8:125:8 | i : | -| pathname_flow.rb:124:7:124:7 | a : | pathname_flow.rb:124:7:124:38 | call to relative_path_from : | -| pathname_flow.rb:124:7:124:38 | call to relative_path_from : | pathname_flow.rb:124:3:124:3 | i : | -| pathname_flow.rb:125:8:125:8 | i : | pathname_flow.rb:125:8:125:17 | call to realpath | -| pathname_flow.rb:127:3:127:3 | j : | pathname_flow.rb:128:8:128:8 | j : | -| pathname_flow.rb:127:7:127:7 | a : | pathname_flow.rb:127:7:127:25 | call to sub : | -| pathname_flow.rb:127:7:127:25 | call to sub : | pathname_flow.rb:127:3:127:3 | j : | -| pathname_flow.rb:128:8:128:8 | j : | pathname_flow.rb:128:8:128:17 | call to realpath | -| pathname_flow.rb:130:3:130:3 | k : | pathname_flow.rb:131:8:131:8 | k : | -| pathname_flow.rb:130:7:130:7 | a : | pathname_flow.rb:130:7:130:23 | call to sub_ext : | -| pathname_flow.rb:130:7:130:23 | call to sub_ext : | pathname_flow.rb:130:3:130:3 | k : | -| pathname_flow.rb:131:8:131:8 | k : | pathname_flow.rb:131:8:131:17 | call to realpath | -| pathname_flow.rb:133:3:133:3 | l : | pathname_flow.rb:134:8:134:8 | l : | -| pathname_flow.rb:133:7:133:7 | a : | pathname_flow.rb:133:7:133:15 | call to to_path : | -| pathname_flow.rb:133:7:133:15 | call to to_path : | pathname_flow.rb:133:3:133:3 | l : | -| pathname_flow.rb:134:8:134:8 | l : | pathname_flow.rb:134:8:134:17 | call to realpath | +| pathname_flow.rb:4:5:4:6 | pn | pathname_flow.rb:5:10:5:11 | pn | +| pathname_flow.rb:4:10:4:33 | call to new | pathname_flow.rb:4:5:4:6 | pn | +| pathname_flow.rb:4:23:4:32 | call to source | pathname_flow.rb:4:10:4:33 | call to new | +| pathname_flow.rb:9:3:9:3 | a | pathname_flow.rb:11:8:11:12 | ... + ... | +| pathname_flow.rb:9:7:9:30 | call to new | pathname_flow.rb:9:3:9:3 | a | +| pathname_flow.rb:9:20:9:29 | call to source | pathname_flow.rb:9:7:9:30 | call to new | +| pathname_flow.rb:10:3:10:3 | b | pathname_flow.rb:11:8:11:12 | ... + ... | +| pathname_flow.rb:10:7:10:30 | call to new | pathname_flow.rb:10:3:10:3 | b | +| pathname_flow.rb:10:20:10:29 | call to source | pathname_flow.rb:10:7:10:30 | call to new | +| pathname_flow.rb:15:3:15:4 | pn | pathname_flow.rb:16:8:16:9 | pn | +| pathname_flow.rb:15:8:15:31 | call to new | pathname_flow.rb:15:3:15:4 | pn | +| pathname_flow.rb:15:21:15:30 | call to source | pathname_flow.rb:15:8:15:31 | call to new | +| pathname_flow.rb:16:8:16:9 | pn | pathname_flow.rb:16:8:16:17 | call to dirname | +| pathname_flow.rb:20:3:20:3 | a | pathname_flow.rb:21:3:21:3 | a | +| pathname_flow.rb:20:7:20:30 | call to new | pathname_flow.rb:20:3:20:3 | a | +| pathname_flow.rb:20:20:20:29 | call to source | pathname_flow.rb:20:7:20:30 | call to new | +| pathname_flow.rb:21:3:21:3 | a | pathname_flow.rb:21:23:21:23 | x | +| pathname_flow.rb:21:23:21:23 | x | pathname_flow.rb:22:10:22:10 | x | +| pathname_flow.rb:27:3:27:3 | a | pathname_flow.rb:28:8:28:8 | a | +| pathname_flow.rb:27:7:27:30 | call to new | pathname_flow.rb:27:3:27:3 | a | +| pathname_flow.rb:27:20:27:29 | call to source | pathname_flow.rb:27:7:27:30 | call to new | +| pathname_flow.rb:28:8:28:8 | a | pathname_flow.rb:28:8:28:22 | call to expand_path | +| pathname_flow.rb:32:3:32:3 | a | pathname_flow.rb:35:8:35:8 | a | +| pathname_flow.rb:32:7:32:30 | call to new | pathname_flow.rb:32:3:32:3 | a | +| pathname_flow.rb:32:20:32:29 | call to source | pathname_flow.rb:32:7:32:30 | call to new | +| pathname_flow.rb:34:3:34:3 | c | pathname_flow.rb:35:18:35:18 | c | +| pathname_flow.rb:34:7:34:30 | call to new | pathname_flow.rb:34:3:34:3 | c | +| pathname_flow.rb:34:20:34:29 | call to source | pathname_flow.rb:34:7:34:30 | call to new | +| pathname_flow.rb:35:8:35:8 | a | pathname_flow.rb:35:8:35:19 | call to join | +| pathname_flow.rb:35:18:35:18 | c | pathname_flow.rb:35:8:35:19 | call to join | +| pathname_flow.rb:39:3:39:3 | a | pathname_flow.rb:40:8:40:8 | a | +| pathname_flow.rb:39:7:39:30 | call to new | pathname_flow.rb:39:3:39:3 | a | +| pathname_flow.rb:39:20:39:29 | call to source | pathname_flow.rb:39:7:39:30 | call to new | +| pathname_flow.rb:40:8:40:8 | a | pathname_flow.rb:40:8:40:17 | call to parent | +| pathname_flow.rb:44:3:44:3 | a | pathname_flow.rb:45:8:45:8 | a | +| pathname_flow.rb:44:7:44:30 | call to new | pathname_flow.rb:44:3:44:3 | a | +| pathname_flow.rb:44:20:44:29 | call to source | pathname_flow.rb:44:7:44:30 | call to new | +| pathname_flow.rb:45:8:45:8 | a | pathname_flow.rb:45:8:45:19 | call to realpath | +| pathname_flow.rb:49:3:49:3 | a | pathname_flow.rb:50:8:50:8 | a | +| pathname_flow.rb:49:7:49:30 | call to new | pathname_flow.rb:49:3:49:3 | a | +| pathname_flow.rb:49:20:49:29 | call to source | pathname_flow.rb:49:7:49:30 | call to new | +| pathname_flow.rb:50:8:50:8 | a | pathname_flow.rb:50:8:50:39 | call to relative_path_from | +| pathname_flow.rb:54:3:54:3 | a | pathname_flow.rb:55:8:55:8 | a | +| pathname_flow.rb:54:7:54:30 | call to new | pathname_flow.rb:54:3:54:3 | a | +| pathname_flow.rb:54:20:54:29 | call to source | pathname_flow.rb:54:7:54:30 | call to new | +| pathname_flow.rb:55:8:55:8 | a | pathname_flow.rb:55:8:55:16 | call to to_path | +| pathname_flow.rb:59:3:59:3 | a | pathname_flow.rb:60:8:60:8 | a | +| pathname_flow.rb:59:7:59:30 | call to new | pathname_flow.rb:59:3:59:3 | a | +| pathname_flow.rb:59:20:59:29 | call to source | pathname_flow.rb:59:7:59:30 | call to new | +| pathname_flow.rb:60:8:60:8 | a | pathname_flow.rb:60:8:60:13 | call to to_s | +| pathname_flow.rb:64:3:64:3 | a | pathname_flow.rb:65:3:65:3 | b | +| pathname_flow.rb:64:7:64:30 | call to new | pathname_flow.rb:64:3:64:3 | a | +| pathname_flow.rb:64:20:64:29 | call to source | pathname_flow.rb:64:7:64:30 | call to new | +| pathname_flow.rb:65:3:65:3 | b | pathname_flow.rb:66:8:66:8 | b | +| pathname_flow.rb:70:3:70:3 | a | pathname_flow.rb:71:3:71:3 | b | +| pathname_flow.rb:70:7:70:30 | call to new | pathname_flow.rb:70:3:70:3 | a | +| pathname_flow.rb:70:20:70:29 | call to source | pathname_flow.rb:70:7:70:30 | call to new | +| pathname_flow.rb:71:3:71:3 | b | pathname_flow.rb:72:8:72:8 | b | +| pathname_flow.rb:76:3:76:3 | a | pathname_flow.rb:77:7:77:7 | a | +| pathname_flow.rb:76:7:76:30 | call to new | pathname_flow.rb:76:3:76:3 | a | +| pathname_flow.rb:76:20:76:29 | call to source | pathname_flow.rb:76:7:76:30 | call to new | +| pathname_flow.rb:77:3:77:3 | b | pathname_flow.rb:78:8:78:8 | b | +| pathname_flow.rb:77:7:77:7 | a | pathname_flow.rb:77:7:77:16 | call to basename | +| pathname_flow.rb:77:7:77:16 | call to basename | pathname_flow.rb:77:3:77:3 | b | +| pathname_flow.rb:82:3:82:3 | a | pathname_flow.rb:83:7:83:7 | a | +| pathname_flow.rb:82:7:82:30 | call to new | pathname_flow.rb:82:3:82:3 | a | +| pathname_flow.rb:82:20:82:29 | call to source | pathname_flow.rb:82:7:82:30 | call to new | +| pathname_flow.rb:83:3:83:3 | b | pathname_flow.rb:84:8:84:8 | b | +| pathname_flow.rb:83:7:83:7 | a | pathname_flow.rb:83:7:83:17 | call to cleanpath | +| pathname_flow.rb:83:7:83:17 | call to cleanpath | pathname_flow.rb:83:3:83:3 | b | +| pathname_flow.rb:88:3:88:3 | a | pathname_flow.rb:89:7:89:7 | a | +| pathname_flow.rb:88:7:88:30 | call to new | pathname_flow.rb:88:3:88:3 | a | +| pathname_flow.rb:88:20:88:29 | call to source | pathname_flow.rb:88:7:88:30 | call to new | +| pathname_flow.rb:89:3:89:3 | b | pathname_flow.rb:90:8:90:8 | b | +| pathname_flow.rb:89:7:89:7 | a | pathname_flow.rb:89:7:89:25 | call to sub | +| pathname_flow.rb:89:7:89:25 | call to sub | pathname_flow.rb:89:3:89:3 | b | +| pathname_flow.rb:94:3:94:3 | a | pathname_flow.rb:95:7:95:7 | a | +| pathname_flow.rb:94:7:94:30 | call to new | pathname_flow.rb:94:3:94:3 | a | +| pathname_flow.rb:94:20:94:29 | call to source | pathname_flow.rb:94:7:94:30 | call to new | +| pathname_flow.rb:95:3:95:3 | b | pathname_flow.rb:96:8:96:8 | b | +| pathname_flow.rb:95:7:95:7 | a | pathname_flow.rb:95:7:95:23 | call to sub_ext | +| pathname_flow.rb:95:7:95:23 | call to sub_ext | pathname_flow.rb:95:3:95:3 | b | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:103:3:103:3 | b | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:106:3:106:3 | c | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:109:7:109:7 | a | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:112:7:112:7 | a | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:115:7:115:7 | a | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:118:7:118:7 | a | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:121:7:121:7 | a | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:124:7:124:7 | a | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:127:7:127:7 | a | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:130:7:130:7 | a | +| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:133:7:133:7 | a | +| pathname_flow.rb:101:7:101:30 | call to new | pathname_flow.rb:101:3:101:3 | a | +| pathname_flow.rb:101:20:101:29 | call to source | pathname_flow.rb:101:7:101:30 | call to new | +| pathname_flow.rb:103:3:103:3 | b | pathname_flow.rb:104:8:104:8 | b | +| pathname_flow.rb:104:8:104:8 | b | pathname_flow.rb:104:8:104:17 | call to realpath | +| pathname_flow.rb:106:3:106:3 | c | pathname_flow.rb:107:8:107:8 | c | +| pathname_flow.rb:107:8:107:8 | c | pathname_flow.rb:107:8:107:17 | call to realpath | +| pathname_flow.rb:109:3:109:3 | d | pathname_flow.rb:110:8:110:8 | d | +| pathname_flow.rb:109:7:109:7 | a | pathname_flow.rb:109:7:109:16 | call to basename | +| pathname_flow.rb:109:7:109:16 | call to basename | pathname_flow.rb:109:3:109:3 | d | +| pathname_flow.rb:110:8:110:8 | d | pathname_flow.rb:110:8:110:17 | call to realpath | +| pathname_flow.rb:112:3:112:3 | e | pathname_flow.rb:113:8:113:8 | e | +| pathname_flow.rb:112:7:112:7 | a | pathname_flow.rb:112:7:112:17 | call to cleanpath | +| pathname_flow.rb:112:7:112:17 | call to cleanpath | pathname_flow.rb:112:3:112:3 | e | +| pathname_flow.rb:113:8:113:8 | e | pathname_flow.rb:113:8:113:17 | call to realpath | +| pathname_flow.rb:115:3:115:3 | f | pathname_flow.rb:116:8:116:8 | f | +| pathname_flow.rb:115:7:115:7 | a | pathname_flow.rb:115:7:115:19 | call to expand_path | +| pathname_flow.rb:115:7:115:19 | call to expand_path | pathname_flow.rb:115:3:115:3 | f | +| pathname_flow.rb:116:8:116:8 | f | pathname_flow.rb:116:8:116:17 | call to realpath | +| pathname_flow.rb:118:3:118:3 | g | pathname_flow.rb:119:8:119:8 | g | +| pathname_flow.rb:118:7:118:7 | a | pathname_flow.rb:118:7:118:19 | call to join | +| pathname_flow.rb:118:7:118:19 | call to join | pathname_flow.rb:118:3:118:3 | g | +| pathname_flow.rb:119:8:119:8 | g | pathname_flow.rb:119:8:119:17 | call to realpath | +| pathname_flow.rb:121:3:121:3 | h | pathname_flow.rb:122:8:122:8 | h | +| pathname_flow.rb:121:7:121:7 | a | pathname_flow.rb:121:7:121:16 | call to realpath | +| pathname_flow.rb:121:7:121:16 | call to realpath | pathname_flow.rb:121:3:121:3 | h | +| pathname_flow.rb:122:8:122:8 | h | pathname_flow.rb:122:8:122:17 | call to realpath | +| pathname_flow.rb:124:3:124:3 | i | pathname_flow.rb:125:8:125:8 | i | +| pathname_flow.rb:124:7:124:7 | a | pathname_flow.rb:124:7:124:38 | call to relative_path_from | +| pathname_flow.rb:124:7:124:38 | call to relative_path_from | pathname_flow.rb:124:3:124:3 | i | +| pathname_flow.rb:125:8:125:8 | i | pathname_flow.rb:125:8:125:17 | call to realpath | +| pathname_flow.rb:127:3:127:3 | j | pathname_flow.rb:128:8:128:8 | j | +| pathname_flow.rb:127:7:127:7 | a | pathname_flow.rb:127:7:127:25 | call to sub | +| pathname_flow.rb:127:7:127:25 | call to sub | pathname_flow.rb:127:3:127:3 | j | +| pathname_flow.rb:128:8:128:8 | j | pathname_flow.rb:128:8:128:17 | call to realpath | +| pathname_flow.rb:130:3:130:3 | k | pathname_flow.rb:131:8:131:8 | k | +| pathname_flow.rb:130:7:130:7 | a | pathname_flow.rb:130:7:130:23 | call to sub_ext | +| pathname_flow.rb:130:7:130:23 | call to sub_ext | pathname_flow.rb:130:3:130:3 | k | +| pathname_flow.rb:131:8:131:8 | k | pathname_flow.rb:131:8:131:17 | call to realpath | +| pathname_flow.rb:133:3:133:3 | l | pathname_flow.rb:134:8:134:8 | l | +| pathname_flow.rb:133:7:133:7 | a | pathname_flow.rb:133:7:133:15 | call to to_path | +| pathname_flow.rb:133:7:133:15 | call to to_path | pathname_flow.rb:133:3:133:3 | l | +| pathname_flow.rb:134:8:134:8 | l | pathname_flow.rb:134:8:134:17 | call to realpath | nodes -| pathname_flow.rb:4:5:4:6 | pn : | semmle.label | pn : | -| pathname_flow.rb:4:10:4:33 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:4:23:4:32 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:4:5:4:6 | pn | semmle.label | pn | +| pathname_flow.rb:4:10:4:33 | call to new | semmle.label | call to new | +| pathname_flow.rb:4:23:4:32 | call to source | semmle.label | call to source | | pathname_flow.rb:5:10:5:11 | pn | semmle.label | pn | -| pathname_flow.rb:9:3:9:3 | a : | semmle.label | a : | -| pathname_flow.rb:9:7:9:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:9:20:9:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:10:3:10:3 | b : | semmle.label | b : | -| pathname_flow.rb:10:7:10:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:10:20:10:29 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:9:3:9:3 | a | semmle.label | a | +| pathname_flow.rb:9:7:9:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:9:20:9:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:10:3:10:3 | b | semmle.label | b | +| pathname_flow.rb:10:7:10:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:10:20:10:29 | call to source | semmle.label | call to source | | pathname_flow.rb:11:8:11:12 | ... + ... | semmle.label | ... + ... | -| pathname_flow.rb:15:3:15:4 | pn : | semmle.label | pn : | -| pathname_flow.rb:15:8:15:31 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:15:21:15:30 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:16:8:16:9 | pn : | semmle.label | pn : | +| pathname_flow.rb:15:3:15:4 | pn | semmle.label | pn | +| pathname_flow.rb:15:8:15:31 | call to new | semmle.label | call to new | +| pathname_flow.rb:15:21:15:30 | call to source | semmle.label | call to source | +| pathname_flow.rb:16:8:16:9 | pn | semmle.label | pn | | pathname_flow.rb:16:8:16:17 | call to dirname | semmle.label | call to dirname | -| pathname_flow.rb:20:3:20:3 | a : | semmle.label | a : | -| pathname_flow.rb:20:7:20:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:20:20:20:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:21:3:21:3 | a : | semmle.label | a : | -| pathname_flow.rb:21:23:21:23 | x : | semmle.label | x : | +| pathname_flow.rb:20:3:20:3 | a | semmle.label | a | +| pathname_flow.rb:20:7:20:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:20:20:20:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:21:3:21:3 | a | semmle.label | a | +| pathname_flow.rb:21:23:21:23 | x | semmle.label | x | | pathname_flow.rb:22:10:22:10 | x | semmle.label | x | -| pathname_flow.rb:27:3:27:3 | a : | semmle.label | a : | -| pathname_flow.rb:27:7:27:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:27:20:27:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:28:8:28:8 | a : | semmle.label | a : | +| pathname_flow.rb:27:3:27:3 | a | semmle.label | a | +| pathname_flow.rb:27:7:27:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:27:20:27:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:28:8:28:8 | a | semmle.label | a | | pathname_flow.rb:28:8:28:22 | call to expand_path | semmle.label | call to expand_path | -| pathname_flow.rb:32:3:32:3 | a : | semmle.label | a : | -| pathname_flow.rb:32:7:32:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:32:20:32:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:34:3:34:3 | c : | semmle.label | c : | -| pathname_flow.rb:34:7:34:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:34:20:34:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:35:8:35:8 | a : | semmle.label | a : | +| pathname_flow.rb:32:3:32:3 | a | semmle.label | a | +| pathname_flow.rb:32:7:32:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:32:20:32:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:34:3:34:3 | c | semmle.label | c | +| pathname_flow.rb:34:7:34:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:34:20:34:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:35:8:35:8 | a | semmle.label | a | | pathname_flow.rb:35:8:35:19 | call to join | semmle.label | call to join | -| pathname_flow.rb:35:18:35:18 | c : | semmle.label | c : | -| pathname_flow.rb:39:3:39:3 | a : | semmle.label | a : | -| pathname_flow.rb:39:7:39:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:39:20:39:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:40:8:40:8 | a : | semmle.label | a : | +| pathname_flow.rb:35:18:35:18 | c | semmle.label | c | +| pathname_flow.rb:39:3:39:3 | a | semmle.label | a | +| pathname_flow.rb:39:7:39:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:39:20:39:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:40:8:40:8 | a | semmle.label | a | | pathname_flow.rb:40:8:40:17 | call to parent | semmle.label | call to parent | -| pathname_flow.rb:44:3:44:3 | a : | semmle.label | a : | -| pathname_flow.rb:44:7:44:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:44:20:44:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:45:8:45:8 | a : | semmle.label | a : | +| pathname_flow.rb:44:3:44:3 | a | semmle.label | a | +| pathname_flow.rb:44:7:44:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:44:20:44:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:45:8:45:8 | a | semmle.label | a | | pathname_flow.rb:45:8:45:19 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:49:3:49:3 | a : | semmle.label | a : | -| pathname_flow.rb:49:7:49:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:49:20:49:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:50:8:50:8 | a : | semmle.label | a : | +| pathname_flow.rb:49:3:49:3 | a | semmle.label | a | +| pathname_flow.rb:49:7:49:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:49:20:49:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:50:8:50:8 | a | semmle.label | a | | pathname_flow.rb:50:8:50:39 | call to relative_path_from | semmle.label | call to relative_path_from | -| pathname_flow.rb:54:3:54:3 | a : | semmle.label | a : | -| pathname_flow.rb:54:7:54:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:54:20:54:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:55:8:55:8 | a : | semmle.label | a : | +| pathname_flow.rb:54:3:54:3 | a | semmle.label | a | +| pathname_flow.rb:54:7:54:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:54:20:54:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:55:8:55:8 | a | semmle.label | a | | pathname_flow.rb:55:8:55:16 | call to to_path | semmle.label | call to to_path | -| pathname_flow.rb:59:3:59:3 | a : | semmle.label | a : | -| pathname_flow.rb:59:7:59:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:59:20:59:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:60:8:60:8 | a : | semmle.label | a : | +| pathname_flow.rb:59:3:59:3 | a | semmle.label | a | +| pathname_flow.rb:59:7:59:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:59:20:59:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:60:8:60:8 | a | semmle.label | a | | pathname_flow.rb:60:8:60:13 | call to to_s | semmle.label | call to to_s | -| pathname_flow.rb:64:3:64:3 | a : | semmle.label | a : | -| pathname_flow.rb:64:7:64:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:64:20:64:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:65:3:65:3 | b : | semmle.label | b : | +| pathname_flow.rb:64:3:64:3 | a | semmle.label | a | +| pathname_flow.rb:64:7:64:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:64:20:64:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:65:3:65:3 | b | semmle.label | b | | pathname_flow.rb:66:8:66:8 | b | semmle.label | b | -| pathname_flow.rb:70:3:70:3 | a : | semmle.label | a : | -| pathname_flow.rb:70:7:70:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:70:20:70:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:71:3:71:3 | b : | semmle.label | b : | +| pathname_flow.rb:70:3:70:3 | a | semmle.label | a | +| pathname_flow.rb:70:7:70:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:70:20:70:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:71:3:71:3 | b | semmle.label | b | | pathname_flow.rb:72:8:72:8 | b | semmle.label | b | -| pathname_flow.rb:76:3:76:3 | a : | semmle.label | a : | -| pathname_flow.rb:76:7:76:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:76:20:76:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:77:3:77:3 | b : | semmle.label | b : | -| pathname_flow.rb:77:7:77:7 | a : | semmle.label | a : | -| pathname_flow.rb:77:7:77:16 | call to basename : | semmle.label | call to basename : | +| pathname_flow.rb:76:3:76:3 | a | semmle.label | a | +| pathname_flow.rb:76:7:76:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:76:20:76:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:77:3:77:3 | b | semmle.label | b | +| pathname_flow.rb:77:7:77:7 | a | semmle.label | a | +| pathname_flow.rb:77:7:77:16 | call to basename | semmle.label | call to basename | | pathname_flow.rb:78:8:78:8 | b | semmle.label | b | -| pathname_flow.rb:82:3:82:3 | a : | semmle.label | a : | -| pathname_flow.rb:82:7:82:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:82:20:82:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:83:3:83:3 | b : | semmle.label | b : | -| pathname_flow.rb:83:7:83:7 | a : | semmle.label | a : | -| pathname_flow.rb:83:7:83:17 | call to cleanpath : | semmle.label | call to cleanpath : | +| pathname_flow.rb:82:3:82:3 | a | semmle.label | a | +| pathname_flow.rb:82:7:82:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:82:20:82:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:83:3:83:3 | b | semmle.label | b | +| pathname_flow.rb:83:7:83:7 | a | semmle.label | a | +| pathname_flow.rb:83:7:83:17 | call to cleanpath | semmle.label | call to cleanpath | | pathname_flow.rb:84:8:84:8 | b | semmle.label | b | -| pathname_flow.rb:88:3:88:3 | a : | semmle.label | a : | -| pathname_flow.rb:88:7:88:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:88:20:88:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:89:3:89:3 | b : | semmle.label | b : | -| pathname_flow.rb:89:7:89:7 | a : | semmle.label | a : | -| pathname_flow.rb:89:7:89:25 | call to sub : | semmle.label | call to sub : | +| pathname_flow.rb:88:3:88:3 | a | semmle.label | a | +| pathname_flow.rb:88:7:88:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:88:20:88:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:89:3:89:3 | b | semmle.label | b | +| pathname_flow.rb:89:7:89:7 | a | semmle.label | a | +| pathname_flow.rb:89:7:89:25 | call to sub | semmle.label | call to sub | | pathname_flow.rb:90:8:90:8 | b | semmle.label | b | -| pathname_flow.rb:94:3:94:3 | a : | semmle.label | a : | -| pathname_flow.rb:94:7:94:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:94:20:94:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:95:3:95:3 | b : | semmle.label | b : | -| pathname_flow.rb:95:7:95:7 | a : | semmle.label | a : | -| pathname_flow.rb:95:7:95:23 | call to sub_ext : | semmle.label | call to sub_ext : | +| pathname_flow.rb:94:3:94:3 | a | semmle.label | a | +| pathname_flow.rb:94:7:94:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:94:20:94:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:95:3:95:3 | b | semmle.label | b | +| pathname_flow.rb:95:7:95:7 | a | semmle.label | a | +| pathname_flow.rb:95:7:95:23 | call to sub_ext | semmle.label | call to sub_ext | | pathname_flow.rb:96:8:96:8 | b | semmle.label | b | -| pathname_flow.rb:101:3:101:3 | a : | semmle.label | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | semmle.label | call to new : | -| pathname_flow.rb:101:20:101:29 | call to source : | semmle.label | call to source : | -| pathname_flow.rb:103:3:103:3 | b : | semmle.label | b : | -| pathname_flow.rb:104:8:104:8 | b : | semmle.label | b : | +| pathname_flow.rb:101:3:101:3 | a | semmle.label | a | +| pathname_flow.rb:101:7:101:30 | call to new | semmle.label | call to new | +| pathname_flow.rb:101:20:101:29 | call to source | semmle.label | call to source | +| pathname_flow.rb:103:3:103:3 | b | semmle.label | b | +| pathname_flow.rb:104:8:104:8 | b | semmle.label | b | | pathname_flow.rb:104:8:104:17 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:106:3:106:3 | c : | semmle.label | c : | -| pathname_flow.rb:107:8:107:8 | c : | semmle.label | c : | +| pathname_flow.rb:106:3:106:3 | c | semmle.label | c | +| pathname_flow.rb:107:8:107:8 | c | semmle.label | c | | pathname_flow.rb:107:8:107:17 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:109:3:109:3 | d : | semmle.label | d : | -| pathname_flow.rb:109:7:109:7 | a : | semmle.label | a : | -| pathname_flow.rb:109:7:109:16 | call to basename : | semmle.label | call to basename : | -| pathname_flow.rb:110:8:110:8 | d : | semmle.label | d : | +| pathname_flow.rb:109:3:109:3 | d | semmle.label | d | +| pathname_flow.rb:109:7:109:7 | a | semmle.label | a | +| pathname_flow.rb:109:7:109:16 | call to basename | semmle.label | call to basename | +| pathname_flow.rb:110:8:110:8 | d | semmle.label | d | | pathname_flow.rb:110:8:110:17 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:112:3:112:3 | e : | semmle.label | e : | -| pathname_flow.rb:112:7:112:7 | a : | semmle.label | a : | -| pathname_flow.rb:112:7:112:17 | call to cleanpath : | semmle.label | call to cleanpath : | -| pathname_flow.rb:113:8:113:8 | e : | semmle.label | e : | +| pathname_flow.rb:112:3:112:3 | e | semmle.label | e | +| pathname_flow.rb:112:7:112:7 | a | semmle.label | a | +| pathname_flow.rb:112:7:112:17 | call to cleanpath | semmle.label | call to cleanpath | +| pathname_flow.rb:113:8:113:8 | e | semmle.label | e | | pathname_flow.rb:113:8:113:17 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:115:3:115:3 | f : | semmle.label | f : | -| pathname_flow.rb:115:7:115:7 | a : | semmle.label | a : | -| pathname_flow.rb:115:7:115:19 | call to expand_path : | semmle.label | call to expand_path : | -| pathname_flow.rb:116:8:116:8 | f : | semmle.label | f : | +| pathname_flow.rb:115:3:115:3 | f | semmle.label | f | +| pathname_flow.rb:115:7:115:7 | a | semmle.label | a | +| pathname_flow.rb:115:7:115:19 | call to expand_path | semmle.label | call to expand_path | +| pathname_flow.rb:116:8:116:8 | f | semmle.label | f | | pathname_flow.rb:116:8:116:17 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:118:3:118:3 | g : | semmle.label | g : | -| pathname_flow.rb:118:7:118:7 | a : | semmle.label | a : | -| pathname_flow.rb:118:7:118:19 | call to join : | semmle.label | call to join : | -| pathname_flow.rb:119:8:119:8 | g : | semmle.label | g : | +| pathname_flow.rb:118:3:118:3 | g | semmle.label | g | +| pathname_flow.rb:118:7:118:7 | a | semmle.label | a | +| pathname_flow.rb:118:7:118:19 | call to join | semmle.label | call to join | +| pathname_flow.rb:119:8:119:8 | g | semmle.label | g | | pathname_flow.rb:119:8:119:17 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:121:3:121:3 | h : | semmle.label | h : | -| pathname_flow.rb:121:7:121:7 | a : | semmle.label | a : | -| pathname_flow.rb:121:7:121:16 | call to realpath : | semmle.label | call to realpath : | -| pathname_flow.rb:122:8:122:8 | h : | semmle.label | h : | +| pathname_flow.rb:121:3:121:3 | h | semmle.label | h | +| pathname_flow.rb:121:7:121:7 | a | semmle.label | a | +| pathname_flow.rb:121:7:121:16 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:122:8:122:8 | h | semmle.label | h | | pathname_flow.rb:122:8:122:17 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:124:3:124:3 | i : | semmle.label | i : | -| pathname_flow.rb:124:7:124:7 | a : | semmle.label | a : | -| pathname_flow.rb:124:7:124:38 | call to relative_path_from : | semmle.label | call to relative_path_from : | -| pathname_flow.rb:125:8:125:8 | i : | semmle.label | i : | +| pathname_flow.rb:124:3:124:3 | i | semmle.label | i | +| pathname_flow.rb:124:7:124:7 | a | semmle.label | a | +| pathname_flow.rb:124:7:124:38 | call to relative_path_from | semmle.label | call to relative_path_from | +| pathname_flow.rb:125:8:125:8 | i | semmle.label | i | | pathname_flow.rb:125:8:125:17 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:127:3:127:3 | j : | semmle.label | j : | -| pathname_flow.rb:127:7:127:7 | a : | semmle.label | a : | -| pathname_flow.rb:127:7:127:25 | call to sub : | semmle.label | call to sub : | -| pathname_flow.rb:128:8:128:8 | j : | semmle.label | j : | +| pathname_flow.rb:127:3:127:3 | j | semmle.label | j | +| pathname_flow.rb:127:7:127:7 | a | semmle.label | a | +| pathname_flow.rb:127:7:127:25 | call to sub | semmle.label | call to sub | +| pathname_flow.rb:128:8:128:8 | j | semmle.label | j | | pathname_flow.rb:128:8:128:17 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:130:3:130:3 | k : | semmle.label | k : | -| pathname_flow.rb:130:7:130:7 | a : | semmle.label | a : | -| pathname_flow.rb:130:7:130:23 | call to sub_ext : | semmle.label | call to sub_ext : | -| pathname_flow.rb:131:8:131:8 | k : | semmle.label | k : | +| pathname_flow.rb:130:3:130:3 | k | semmle.label | k | +| pathname_flow.rb:130:7:130:7 | a | semmle.label | a | +| pathname_flow.rb:130:7:130:23 | call to sub_ext | semmle.label | call to sub_ext | +| pathname_flow.rb:131:8:131:8 | k | semmle.label | k | | pathname_flow.rb:131:8:131:17 | call to realpath | semmle.label | call to realpath | -| pathname_flow.rb:133:3:133:3 | l : | semmle.label | l : | -| pathname_flow.rb:133:7:133:7 | a : | semmle.label | a : | -| pathname_flow.rb:133:7:133:15 | call to to_path : | semmle.label | call to to_path : | -| pathname_flow.rb:134:8:134:8 | l : | semmle.label | l : | +| pathname_flow.rb:133:3:133:3 | l | semmle.label | l | +| pathname_flow.rb:133:7:133:7 | a | semmle.label | a | +| pathname_flow.rb:133:7:133:15 | call to to_path | semmle.label | call to to_path | +| pathname_flow.rb:134:8:134:8 | l | semmle.label | l | | pathname_flow.rb:134:8:134:17 | call to realpath | semmle.label | call to realpath | subpaths #select diff --git a/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected b/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected index 90826a90984..e1e2893fad6 100644 --- a/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected @@ -1,20 +1,20 @@ failures edges -| ssa_flow.rb:12:9:12:9 | [post] a [element 0] : | ssa_flow.rb:16:10:16:10 | a [element 0] : | -| ssa_flow.rb:12:9:12:9 | [post] a [element 0] : | ssa_flow.rb:16:10:16:10 | a [element 0] : | -| ssa_flow.rb:12:16:12:23 | call to taint : | ssa_flow.rb:12:9:12:9 | [post] a [element 0] : | -| ssa_flow.rb:12:16:12:23 | call to taint : | ssa_flow.rb:12:9:12:9 | [post] a [element 0] : | -| ssa_flow.rb:16:10:16:10 | a [element 0] : | ssa_flow.rb:16:10:16:13 | ...[...] | -| ssa_flow.rb:16:10:16:10 | a [element 0] : | ssa_flow.rb:16:10:16:13 | ...[...] | +| ssa_flow.rb:12:9:12:9 | [post] a [element 0] | ssa_flow.rb:16:10:16:10 | a [element 0] | +| ssa_flow.rb:12:9:12:9 | [post] a [element 0] | ssa_flow.rb:16:10:16:10 | a [element 0] | +| ssa_flow.rb:12:16:12:23 | call to taint | ssa_flow.rb:12:9:12:9 | [post] a [element 0] | +| ssa_flow.rb:12:16:12:23 | call to taint | ssa_flow.rb:12:9:12:9 | [post] a [element 0] | +| ssa_flow.rb:16:10:16:10 | a [element 0] | ssa_flow.rb:16:10:16:13 | ...[...] | +| ssa_flow.rb:16:10:16:10 | a [element 0] | ssa_flow.rb:16:10:16:13 | ...[...] | nodes -| ssa_flow.rb:12:9:12:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| ssa_flow.rb:12:9:12:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | -| ssa_flow.rb:12:16:12:23 | call to taint : | semmle.label | call to taint : | -| ssa_flow.rb:12:16:12:23 | call to taint : | semmle.label | call to taint : | -| ssa_flow.rb:16:10:16:10 | a [element 0] : | semmle.label | a [element 0] : | -| ssa_flow.rb:16:10:16:10 | a [element 0] : | semmle.label | a [element 0] : | +| ssa_flow.rb:12:9:12:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| ssa_flow.rb:12:9:12:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| ssa_flow.rb:12:16:12:23 | call to taint | semmle.label | call to taint | +| ssa_flow.rb:12:16:12:23 | call to taint | semmle.label | call to taint | +| ssa_flow.rb:16:10:16:10 | a [element 0] | semmle.label | a [element 0] | +| ssa_flow.rb:16:10:16:10 | a [element 0] | semmle.label | a [element 0] | | ssa_flow.rb:16:10:16:13 | ...[...] | semmle.label | ...[...] | | ssa_flow.rb:16:10:16:13 | ...[...] | semmle.label | ...[...] | subpaths #select -| ssa_flow.rb:16:10:16:13 | ...[...] | ssa_flow.rb:12:16:12:23 | call to taint : | ssa_flow.rb:16:10:16:13 | ...[...] | $@ | ssa_flow.rb:12:16:12:23 | call to taint : | call to taint : | +| ssa_flow.rb:16:10:16:13 | ...[...] | ssa_flow.rb:12:16:12:23 | call to taint | ssa_flow.rb:16:10:16:13 | ...[...] | $@ | ssa_flow.rb:12:16:12:23 | call to taint | call to taint | diff --git a/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.expected b/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.expected index 651a6affec7..4cab79b9e42 100644 --- a/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.expected @@ -2,766 +2,766 @@ failures | string_flow.rb:85:10:85:10 | a | Unexpected result: hasValueFlow=a | | string_flow.rb:227:10:227:10 | a | Unexpected result: hasValueFlow=a | edges -| string_flow.rb:2:5:2:5 | a : | string_flow.rb:3:21:3:21 | a : | -| string_flow.rb:2:5:2:5 | a : | string_flow.rb:3:21:3:21 | a : | -| string_flow.rb:2:9:2:18 | call to source : | string_flow.rb:2:5:2:5 | a : | -| string_flow.rb:2:9:2:18 | call to source : | string_flow.rb:2:5:2:5 | a : | -| string_flow.rb:3:21:3:21 | a : | string_flow.rb:3:10:3:22 | call to new | -| string_flow.rb:3:21:3:21 | a : | string_flow.rb:3:10:3:22 | call to new | -| string_flow.rb:7:5:7:5 | a : | string_flow.rb:9:29:9:29 | a : | -| string_flow.rb:7:9:7:18 | call to source : | string_flow.rb:7:5:7:5 | a : | -| string_flow.rb:8:5:8:5 | b : | string_flow.rb:10:29:10:29 | b : | -| string_flow.rb:8:9:8:16 | call to source : | string_flow.rb:8:5:8:5 | b : | -| string_flow.rb:9:29:9:29 | a : | string_flow.rb:9:10:9:30 | call to try_convert | -| string_flow.rb:10:29:10:29 | b : | string_flow.rb:10:10:10:30 | call to try_convert | -| string_flow.rb:14:5:14:5 | a : | string_flow.rb:15:10:15:17 | ... % ... | -| string_flow.rb:14:5:14:5 | a : | string_flow.rb:15:17:15:17 | a : | -| string_flow.rb:14:5:14:5 | a : | string_flow.rb:16:10:16:29 | ... % ... | -| string_flow.rb:14:5:14:5 | a : | string_flow.rb:16:28:16:28 | a : | -| string_flow.rb:14:5:14:5 | a : | string_flow.rb:17:10:17:10 | a : | -| string_flow.rb:14:5:14:5 | a : | string_flow.rb:17:10:17:18 | ... % ... | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:14:5:14:5 | a : | -| string_flow.rb:15:17:15:17 | a : | string_flow.rb:15:10:15:17 | ... % ... | -| string_flow.rb:16:28:16:28 | a : | string_flow.rb:16:10:16:29 | ... % ... | -| string_flow.rb:17:10:17:10 | a : | string_flow.rb:17:10:17:18 | ... % ... | -| string_flow.rb:21:5:21:5 | a : | string_flow.rb:22:5:22:5 | b : | -| string_flow.rb:21:9:21:18 | call to source : | string_flow.rb:21:5:21:5 | a : | -| string_flow.rb:22:5:22:5 | b : | string_flow.rb:23:10:23:10 | b | -| string_flow.rb:27:5:27:5 | a : | string_flow.rb:28:5:28:5 | b : | -| string_flow.rb:27:9:27:18 | call to source : | string_flow.rb:27:5:27:5 | a : | -| string_flow.rb:28:5:28:5 | b : | string_flow.rb:29:10:29:10 | b | -| string_flow.rb:33:5:33:5 | a : | string_flow.rb:34:5:34:5 | b : | -| string_flow.rb:33:5:33:5 | a : | string_flow.rb:36:5:36:5 | c : | -| string_flow.rb:33:9:33:18 | call to source : | string_flow.rb:33:5:33:5 | a : | -| string_flow.rb:34:5:34:5 | b : | string_flow.rb:35:10:35:10 | b | -| string_flow.rb:36:5:36:5 | c : | string_flow.rb:37:10:37:10 | c | -| string_flow.rb:41:5:41:5 | a : | string_flow.rb:42:10:42:10 | a : | -| string_flow.rb:41:9:41:18 | call to source : | string_flow.rb:41:5:41:5 | a : | -| string_flow.rb:42:10:42:10 | a : | string_flow.rb:42:10:42:12 | call to b | -| string_flow.rb:46:5:46:5 | a : | string_flow.rb:47:10:47:10 | a : | -| string_flow.rb:46:5:46:5 | a : | string_flow.rb:48:10:48:10 | a : | -| string_flow.rb:46:5:46:5 | a : | string_flow.rb:49:10:49:10 | a : | -| string_flow.rb:46:9:46:18 | call to source : | string_flow.rb:46:5:46:5 | a : | -| string_flow.rb:47:10:47:10 | a : | string_flow.rb:47:10:47:23 | call to byteslice | -| string_flow.rb:48:10:48:10 | a : | string_flow.rb:48:10:48:26 | call to byteslice | -| string_flow.rb:49:10:49:10 | a : | string_flow.rb:49:10:49:26 | call to byteslice | -| string_flow.rb:53:5:53:5 | a : | string_flow.rb:54:10:54:10 | a : | -| string_flow.rb:53:5:53:5 | a : | string_flow.rb:55:10:55:10 | a : | -| string_flow.rb:53:9:53:18 | call to source : | string_flow.rb:53:5:53:5 | a : | -| string_flow.rb:54:10:54:10 | a : | string_flow.rb:54:10:54:21 | call to capitalize | -| string_flow.rb:55:10:55:10 | a : | string_flow.rb:55:10:55:22 | call to capitalize! | -| string_flow.rb:59:5:59:5 | a : | string_flow.rb:60:10:60:10 | a : | -| string_flow.rb:59:5:59:5 | a : | string_flow.rb:61:27:61:27 | a : | -| string_flow.rb:59:5:59:5 | a : | string_flow.rb:62:10:62:10 | a : | -| string_flow.rb:59:5:59:5 | a : | string_flow.rb:63:26:63:26 | a : | -| string_flow.rb:59:5:59:5 | a : | string_flow.rb:64:10:64:10 | a : | -| string_flow.rb:59:5:59:5 | a : | string_flow.rb:65:26:65:26 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:59:5:59:5 | a : | -| string_flow.rb:60:10:60:10 | a : | string_flow.rb:60:10:60:21 | call to center | -| string_flow.rb:61:27:61:27 | a : | string_flow.rb:61:10:61:28 | call to center | -| string_flow.rb:62:10:62:10 | a : | string_flow.rb:62:10:62:20 | call to ljust | -| string_flow.rb:63:26:63:26 | a : | string_flow.rb:63:10:63:27 | call to ljust | -| string_flow.rb:64:10:64:10 | a : | string_flow.rb:64:10:64:20 | call to rjust | -| string_flow.rb:65:26:65:26 | a : | string_flow.rb:65:10:65:27 | call to rjust | -| string_flow.rb:69:5:69:5 | a : | string_flow.rb:70:10:70:10 | a : | -| string_flow.rb:69:5:69:5 | a : | string_flow.rb:71:10:71:10 | a : | -| string_flow.rb:69:9:69:18 | call to source : | string_flow.rb:69:5:69:5 | a : | -| string_flow.rb:70:10:70:10 | a : | string_flow.rb:70:10:70:16 | call to chomp | -| string_flow.rb:71:10:71:10 | a : | string_flow.rb:71:10:71:17 | call to chomp! | -| string_flow.rb:75:5:75:5 | a : | string_flow.rb:76:10:76:10 | a : | -| string_flow.rb:75:5:75:5 | a : | string_flow.rb:77:10:77:10 | a : | -| string_flow.rb:75:9:75:18 | call to source : | string_flow.rb:75:5:75:5 | a : | -| string_flow.rb:76:10:76:10 | a : | string_flow.rb:76:10:76:15 | call to chop | -| string_flow.rb:77:10:77:10 | a : | string_flow.rb:77:10:77:16 | call to chop! | -| string_flow.rb:83:5:83:5 | a : | string_flow.rb:84:5:84:5 | a : | -| string_flow.rb:83:5:83:5 | a : | string_flow.rb:84:5:84:5 | a : | -| string_flow.rb:83:9:83:18 | call to source : | string_flow.rb:83:5:83:5 | a : | -| string_flow.rb:83:9:83:18 | call to source : | string_flow.rb:83:5:83:5 | a : | -| string_flow.rb:84:5:84:5 | [post] a : | string_flow.rb:85:10:85:10 | a | -| string_flow.rb:84:5:84:5 | [post] a : | string_flow.rb:85:10:85:10 | a | -| string_flow.rb:84:5:84:5 | a : | string_flow.rb:84:5:84:5 | [post] a : | -| string_flow.rb:84:5:84:5 | a : | string_flow.rb:84:5:84:5 | [post] a : | -| string_flow.rb:108:5:108:5 | a : | string_flow.rb:109:10:109:10 | a : | -| string_flow.rb:108:9:108:18 | call to source : | string_flow.rb:108:5:108:5 | a : | -| string_flow.rb:109:10:109:10 | [post] a : | string_flow.rb:110:10:110:10 | a : | -| string_flow.rb:109:10:109:10 | [post] a : | string_flow.rb:111:10:111:10 | a : | -| string_flow.rb:109:10:109:10 | a : | string_flow.rb:109:10:109:10 | [post] a : | -| string_flow.rb:109:10:109:10 | a : | string_flow.rb:109:10:109:22 | call to delete | -| string_flow.rb:110:10:110:10 | a : | string_flow.rb:110:10:110:29 | call to delete_prefix | -| string_flow.rb:111:10:111:10 | a : | string_flow.rb:111:10:111:29 | call to delete_suffix | -| string_flow.rb:115:5:115:5 | a : | string_flow.rb:116:10:116:10 | a : | -| string_flow.rb:115:5:115:5 | a : | string_flow.rb:117:10:117:10 | a : | -| string_flow.rb:115:5:115:5 | a : | string_flow.rb:118:10:118:10 | a : | -| string_flow.rb:115:5:115:5 | a : | string_flow.rb:119:10:119:10 | a : | -| string_flow.rb:115:5:115:5 | a : | string_flow.rb:120:10:120:10 | a : | -| string_flow.rb:115:5:115:5 | a : | string_flow.rb:121:10:121:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:115:5:115:5 | a : | -| string_flow.rb:116:10:116:10 | a : | string_flow.rb:116:10:116:19 | call to downcase | -| string_flow.rb:117:10:117:10 | a : | string_flow.rb:117:10:117:20 | call to downcase! | -| string_flow.rb:118:10:118:10 | a : | string_flow.rb:118:10:118:19 | call to swapcase | -| string_flow.rb:119:10:119:10 | a : | string_flow.rb:119:10:119:20 | call to swapcase! | -| string_flow.rb:120:10:120:10 | a : | string_flow.rb:120:10:120:17 | call to upcase | -| string_flow.rb:121:10:121:10 | a : | string_flow.rb:121:10:121:18 | call to upcase! | -| string_flow.rb:125:5:125:5 | a : | string_flow.rb:126:9:126:9 | a : | -| string_flow.rb:125:9:125:18 | call to source : | string_flow.rb:125:5:125:5 | a : | -| string_flow.rb:126:5:126:5 | b : | string_flow.rb:127:10:127:10 | b | -| string_flow.rb:126:5:126:5 | b : | string_flow.rb:128:10:128:10 | b : | -| string_flow.rb:126:9:126:9 | a : | string_flow.rb:126:9:126:14 | call to dump : | -| string_flow.rb:126:9:126:14 | call to dump : | string_flow.rb:126:5:126:5 | b : | -| string_flow.rb:128:10:128:10 | b : | string_flow.rb:128:10:128:17 | call to undump | -| string_flow.rb:132:5:132:5 | a : | string_flow.rb:133:9:133:9 | a : | -| string_flow.rb:132:5:132:5 | a : | string_flow.rb:135:9:135:9 | a : | -| string_flow.rb:132:9:132:18 | call to source : | string_flow.rb:132:5:132:5 | a : | -| string_flow.rb:133:5:133:5 | b : | string_flow.rb:134:10:134:10 | b | -| string_flow.rb:133:9:133:9 | a : | string_flow.rb:133:9:133:40 | call to each_line : | -| string_flow.rb:133:9:133:9 | a : | string_flow.rb:133:24:133:27 | line : | -| string_flow.rb:133:9:133:40 | call to each_line : | string_flow.rb:133:5:133:5 | b : | -| string_flow.rb:133:24:133:27 | line : | string_flow.rb:133:35:133:38 | line | -| string_flow.rb:135:5:135:5 | c [element] : | string_flow.rb:136:10:136:10 | c [element] : | -| string_flow.rb:135:9:135:9 | a : | string_flow.rb:135:9:135:19 | call to each_line [element] : | -| string_flow.rb:135:9:135:19 | call to each_line [element] : | string_flow.rb:135:5:135:5 | c [element] : | -| string_flow.rb:136:10:136:10 | c [element] : | string_flow.rb:136:10:136:15 | call to to_a [element] : | -| string_flow.rb:136:10:136:15 | call to to_a [element] : | string_flow.rb:136:10:136:18 | ...[...] | -| string_flow.rb:140:5:140:5 | a : | string_flow.rb:141:9:141:9 | a : | -| string_flow.rb:140:5:140:5 | a : | string_flow.rb:143:9:143:9 | a : | -| string_flow.rb:140:9:140:18 | call to source : | string_flow.rb:140:5:140:5 | a : | -| string_flow.rb:141:5:141:5 | b : | string_flow.rb:142:10:142:10 | b | -| string_flow.rb:141:9:141:9 | a : | string_flow.rb:141:9:141:36 | call to lines : | -| string_flow.rb:141:9:141:9 | a : | string_flow.rb:141:20:141:23 | line : | -| string_flow.rb:141:9:141:36 | call to lines : | string_flow.rb:141:5:141:5 | b : | -| string_flow.rb:141:20:141:23 | line : | string_flow.rb:141:31:141:34 | line | -| string_flow.rb:143:5:143:5 | c [element] : | string_flow.rb:144:10:144:10 | c [element] : | -| string_flow.rb:143:9:143:9 | a : | string_flow.rb:143:9:143:15 | call to lines [element] : | -| string_flow.rb:143:9:143:15 | call to lines [element] : | string_flow.rb:143:5:143:5 | c [element] : | -| string_flow.rb:144:10:144:10 | c [element] : | string_flow.rb:144:10:144:13 | ...[...] | -| string_flow.rb:148:5:148:5 | a : | string_flow.rb:149:10:149:10 | a : | -| string_flow.rb:148:5:148:5 | a : | string_flow.rb:150:10:150:10 | a : | -| string_flow.rb:148:5:148:5 | a : | string_flow.rb:151:10:151:10 | a : | -| string_flow.rb:148:5:148:5 | a : | string_flow.rb:152:10:152:10 | a : | -| string_flow.rb:148:9:148:18 | call to source : | string_flow.rb:148:5:148:5 | a : | -| string_flow.rb:149:10:149:10 | a : | string_flow.rb:149:10:149:26 | call to encode | -| string_flow.rb:150:10:150:10 | a : | string_flow.rb:150:10:150:27 | call to encode! | -| string_flow.rb:151:10:151:10 | a : | string_flow.rb:151:10:151:28 | call to unicode_normalize | -| string_flow.rb:152:10:152:10 | a : | string_flow.rb:152:10:152:29 | call to unicode_normalize! | -| string_flow.rb:156:5:156:5 | a : | string_flow.rb:157:10:157:10 | a : | -| string_flow.rb:156:9:156:18 | call to source : | string_flow.rb:156:5:156:5 | a : | -| string_flow.rb:157:10:157:10 | a : | string_flow.rb:157:10:157:34 | call to force_encoding | -| string_flow.rb:161:5:161:5 | a : | string_flow.rb:162:10:162:10 | a : | -| string_flow.rb:161:9:161:18 | call to source : | string_flow.rb:161:5:161:5 | a : | -| string_flow.rb:162:10:162:10 | a : | string_flow.rb:162:10:162:17 | call to freeze | -| string_flow.rb:166:5:166:5 | a : | string_flow.rb:168:10:168:10 | a : | -| string_flow.rb:166:5:166:5 | a : | string_flow.rb:169:10:169:10 | a : | -| string_flow.rb:166:5:166:5 | a : | string_flow.rb:170:10:170:10 | a : | -| string_flow.rb:166:5:166:5 | a : | string_flow.rb:171:10:171:10 | a : | -| string_flow.rb:166:9:166:18 | call to source : | string_flow.rb:166:5:166:5 | a : | -| string_flow.rb:167:5:167:5 | c : | string_flow.rb:168:22:168:22 | c : | -| string_flow.rb:167:5:167:5 | c : | string_flow.rb:169:23:169:23 | c : | -| string_flow.rb:167:9:167:18 | call to source : | string_flow.rb:167:5:167:5 | c : | -| string_flow.rb:168:10:168:10 | a : | string_flow.rb:168:10:168:23 | call to gsub | -| string_flow.rb:168:22:168:22 | c : | string_flow.rb:168:10:168:23 | call to gsub | -| string_flow.rb:169:10:169:10 | a : | string_flow.rb:169:10:169:24 | call to gsub! | -| string_flow.rb:169:23:169:23 | c : | string_flow.rb:169:10:169:24 | call to gsub! | -| string_flow.rb:170:10:170:10 | a : | string_flow.rb:170:10:170:43 | call to gsub | -| string_flow.rb:170:32:170:41 | call to source : | string_flow.rb:170:10:170:43 | call to gsub | -| string_flow.rb:171:10:171:10 | a : | string_flow.rb:171:10:171:44 | call to gsub! | -| string_flow.rb:171:33:171:42 | call to source : | string_flow.rb:171:10:171:44 | call to gsub! | -| string_flow.rb:175:5:175:5 | a : | string_flow.rb:177:10:177:10 | a : | -| string_flow.rb:175:5:175:5 | a : | string_flow.rb:178:10:178:10 | a : | -| string_flow.rb:175:5:175:5 | a : | string_flow.rb:179:10:179:10 | a : | -| string_flow.rb:175:5:175:5 | a : | string_flow.rb:180:10:180:10 | a : | -| string_flow.rb:175:9:175:18 | call to source : | string_flow.rb:175:5:175:5 | a : | -| string_flow.rb:176:5:176:5 | c : | string_flow.rb:177:21:177:21 | c : | -| string_flow.rb:176:5:176:5 | c : | string_flow.rb:178:22:178:22 | c : | -| string_flow.rb:176:9:176:18 | call to source : | string_flow.rb:176:5:176:5 | c : | -| string_flow.rb:177:10:177:10 | a : | string_flow.rb:177:10:177:22 | call to sub | -| string_flow.rb:177:21:177:21 | c : | string_flow.rb:177:10:177:22 | call to sub | -| string_flow.rb:178:10:178:10 | a : | string_flow.rb:178:10:178:23 | call to sub! | -| string_flow.rb:178:22:178:22 | c : | string_flow.rb:178:10:178:23 | call to sub! | -| string_flow.rb:179:10:179:10 | a : | string_flow.rb:179:10:179:42 | call to sub | -| string_flow.rb:179:31:179:40 | call to source : | string_flow.rb:179:10:179:42 | call to sub | -| string_flow.rb:180:10:180:10 | a : | string_flow.rb:180:10:180:43 | call to sub! | -| string_flow.rb:180:32:180:41 | call to source : | string_flow.rb:180:10:180:43 | call to sub! | -| string_flow.rb:191:5:191:5 | a : | string_flow.rb:192:10:192:10 | a : | -| string_flow.rb:191:9:191:18 | call to source : | string_flow.rb:191:5:191:5 | a : | -| string_flow.rb:192:10:192:10 | a : | string_flow.rb:192:10:192:18 | call to inspect | -| string_flow.rb:196:5:196:5 | a : | string_flow.rb:197:10:197:10 | a : | -| string_flow.rb:196:5:196:5 | a : | string_flow.rb:198:10:198:10 | a : | -| string_flow.rb:196:5:196:5 | a : | string_flow.rb:199:10:199:10 | a : | -| string_flow.rb:196:5:196:5 | a : | string_flow.rb:200:10:200:10 | a : | -| string_flow.rb:196:5:196:5 | a : | string_flow.rb:201:10:201:10 | a : | -| string_flow.rb:196:5:196:5 | a : | string_flow.rb:202:10:202:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:196:5:196:5 | a : | -| string_flow.rb:197:10:197:10 | a : | string_flow.rb:197:10:197:16 | call to strip | -| string_flow.rb:198:10:198:10 | a : | string_flow.rb:198:10:198:17 | call to strip! | -| string_flow.rb:199:10:199:10 | a : | string_flow.rb:199:10:199:17 | call to lstrip | -| string_flow.rb:200:10:200:10 | a : | string_flow.rb:200:10:200:18 | call to lstrip! | -| string_flow.rb:201:10:201:10 | a : | string_flow.rb:201:10:201:17 | call to rstrip | -| string_flow.rb:202:10:202:10 | a : | string_flow.rb:202:10:202:18 | call to rstrip! | -| string_flow.rb:206:5:206:5 | a : | string_flow.rb:207:10:207:10 | a : | -| string_flow.rb:206:5:206:5 | a : | string_flow.rb:208:10:208:10 | a : | -| string_flow.rb:206:5:206:5 | a : | string_flow.rb:209:10:209:10 | a : | -| string_flow.rb:206:5:206:5 | a : | string_flow.rb:210:10:210:10 | a : | -| string_flow.rb:206:9:206:18 | call to source : | string_flow.rb:206:5:206:5 | a : | -| string_flow.rb:207:10:207:10 | a : | string_flow.rb:207:10:207:15 | call to next | -| string_flow.rb:208:10:208:10 | a : | string_flow.rb:208:10:208:16 | call to next! | -| string_flow.rb:209:10:209:10 | a : | string_flow.rb:209:10:209:15 | call to succ | -| string_flow.rb:210:10:210:10 | a : | string_flow.rb:210:10:210:16 | call to succ! | -| string_flow.rb:214:5:214:5 | a : | string_flow.rb:215:9:215:9 | a : | -| string_flow.rb:214:9:214:18 | call to source : | string_flow.rb:214:5:214:5 | a : | -| string_flow.rb:215:5:215:5 | b [element 0] : | string_flow.rb:216:10:216:10 | b [element 0] : | -| string_flow.rb:215:5:215:5 | b [element 1] : | string_flow.rb:217:10:217:10 | b [element 1] : | -| string_flow.rb:215:5:215:5 | b [element 2] : | string_flow.rb:218:10:218:10 | b [element 2] : | -| string_flow.rb:215:9:215:9 | a : | string_flow.rb:215:9:215:24 | call to partition [element 0] : | -| string_flow.rb:215:9:215:9 | a : | string_flow.rb:215:9:215:24 | call to partition [element 1] : | -| string_flow.rb:215:9:215:9 | a : | string_flow.rb:215:9:215:24 | call to partition [element 2] : | -| string_flow.rb:215:9:215:24 | call to partition [element 0] : | string_flow.rb:215:5:215:5 | b [element 0] : | -| string_flow.rb:215:9:215:24 | call to partition [element 1] : | string_flow.rb:215:5:215:5 | b [element 1] : | -| string_flow.rb:215:9:215:24 | call to partition [element 2] : | string_flow.rb:215:5:215:5 | b [element 2] : | -| string_flow.rb:216:10:216:10 | b [element 0] : | string_flow.rb:216:10:216:13 | ...[...] | -| string_flow.rb:217:10:217:10 | b [element 1] : | string_flow.rb:217:10:217:13 | ...[...] | -| string_flow.rb:218:10:218:10 | b [element 2] : | string_flow.rb:218:10:218:13 | ...[...] | -| string_flow.rb:223:5:223:5 | a : | string_flow.rb:225:10:225:10 | a : | -| string_flow.rb:223:5:223:5 | a : | string_flow.rb:225:10:225:10 | a : | -| string_flow.rb:223:9:223:18 | call to source : | string_flow.rb:223:5:223:5 | a : | -| string_flow.rb:223:9:223:18 | call to source : | string_flow.rb:223:5:223:5 | a : | -| string_flow.rb:224:5:224:5 | b : | string_flow.rb:225:20:225:20 | b : | -| string_flow.rb:224:9:224:18 | call to source : | string_flow.rb:224:5:224:5 | b : | -| string_flow.rb:225:10:225:10 | [post] a : | string_flow.rb:227:10:227:10 | a | -| string_flow.rb:225:10:225:10 | [post] a : | string_flow.rb:227:10:227:10 | a | -| string_flow.rb:225:10:225:10 | a : | string_flow.rb:225:10:225:10 | [post] a : | -| string_flow.rb:225:10:225:10 | a : | string_flow.rb:225:10:225:10 | [post] a : | -| string_flow.rb:225:20:225:20 | b : | string_flow.rb:225:10:225:10 | [post] a : | -| string_flow.rb:225:20:225:20 | b : | string_flow.rb:225:10:225:21 | call to replace | -| string_flow.rb:231:5:231:5 | a : | string_flow.rb:232:10:232:10 | a : | -| string_flow.rb:231:9:231:18 | call to source : | string_flow.rb:231:5:231:5 | a : | -| string_flow.rb:232:10:232:10 | a : | string_flow.rb:232:10:232:18 | call to reverse | -| string_flow.rb:236:5:236:5 | a : | string_flow.rb:237:9:237:9 | a : | -| string_flow.rb:236:5:236:5 | a : | string_flow.rb:238:9:238:9 | a : | -| string_flow.rb:236:5:236:5 | a : | string_flow.rb:240:9:240:9 | a : | -| string_flow.rb:236:9:236:18 | call to source : | string_flow.rb:236:5:236:5 | a : | -| string_flow.rb:237:9:237:9 | a : | string_flow.rb:237:24:237:24 | x : | -| string_flow.rb:237:24:237:24 | x : | string_flow.rb:237:35:237:35 | x | -| string_flow.rb:238:5:238:5 | b : | string_flow.rb:239:10:239:10 | b | -| string_flow.rb:238:9:238:9 | a : | string_flow.rb:238:9:238:37 | call to scan : | -| string_flow.rb:238:9:238:9 | a : | string_flow.rb:238:27:238:27 | y : | -| string_flow.rb:238:9:238:37 | call to scan : | string_flow.rb:238:5:238:5 | b : | -| string_flow.rb:238:27:238:27 | y : | string_flow.rb:238:35:238:35 | y | -| string_flow.rb:240:5:240:5 | b [element] : | string_flow.rb:241:10:241:10 | b [element] : | -| string_flow.rb:240:5:240:5 | b [element] : | string_flow.rb:242:10:242:10 | b [element] : | -| string_flow.rb:240:9:240:9 | a : | string_flow.rb:240:9:240:19 | call to scan [element] : | -| string_flow.rb:240:9:240:19 | call to scan [element] : | string_flow.rb:240:5:240:5 | b [element] : | -| string_flow.rb:241:10:241:10 | b [element] : | string_flow.rb:241:10:241:13 | ...[...] | -| string_flow.rb:242:10:242:10 | b [element] : | string_flow.rb:242:10:242:13 | ...[...] | -| string_flow.rb:246:5:246:5 | a : | string_flow.rb:247:10:247:10 | a : | -| string_flow.rb:246:5:246:5 | a : | string_flow.rb:248:20:248:20 | a : | -| string_flow.rb:246:5:246:5 | a : | string_flow.rb:249:5:249:5 | a : | -| string_flow.rb:246:5:246:5 | a : | string_flow.rb:250:26:250:26 | a : | -| string_flow.rb:246:5:246:5 | a : | string_flow.rb:252:10:252:10 | a : | -| string_flow.rb:246:5:246:5 | a : | string_flow.rb:253:21:253:21 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:246:5:246:5 | a : | -| string_flow.rb:247:10:247:10 | a : | string_flow.rb:247:10:247:21 | call to scrub | -| string_flow.rb:248:20:248:20 | a : | string_flow.rb:248:10:248:21 | call to scrub | -| string_flow.rb:249:5:249:5 | a : | string_flow.rb:249:16:249:16 | x : | -| string_flow.rb:249:16:249:16 | x : | string_flow.rb:249:24:249:24 | x | -| string_flow.rb:250:26:250:26 | a : | string_flow.rb:250:10:250:28 | call to scrub | -| string_flow.rb:252:10:252:10 | a : | string_flow.rb:252:10:252:22 | call to scrub! | -| string_flow.rb:253:21:253:21 | a : | string_flow.rb:253:10:253:22 | call to scrub! | -| string_flow.rb:255:5:255:5 | a : | string_flow.rb:256:5:256:5 | a : | -| string_flow.rb:255:5:255:5 | a : | string_flow.rb:258:27:258:27 | a : | -| string_flow.rb:255:9:255:18 | call to source : | string_flow.rb:255:5:255:5 | a : | -| string_flow.rb:256:5:256:5 | a : | string_flow.rb:256:17:256:17 | x : | -| string_flow.rb:256:17:256:17 | x : | string_flow.rb:256:25:256:25 | x | -| string_flow.rb:258:27:258:27 | a : | string_flow.rb:258:10:258:29 | call to scrub! | -| string_flow.rb:262:5:262:5 | a : | string_flow.rb:263:10:263:10 | a : | -| string_flow.rb:262:9:262:18 | call to source : | string_flow.rb:262:5:262:5 | a : | -| string_flow.rb:263:10:263:10 | a : | string_flow.rb:263:10:263:22 | call to shellescape | -| string_flow.rb:267:5:267:5 | a : | string_flow.rb:268:9:268:9 | a : | -| string_flow.rb:267:9:267:18 | call to source : | string_flow.rb:267:5:267:5 | a : | -| string_flow.rb:268:5:268:5 | b [element] : | string_flow.rb:269:10:269:10 | b [element] : | -| string_flow.rb:268:9:268:9 | a : | string_flow.rb:268:9:268:20 | call to shellsplit [element] : | -| string_flow.rb:268:9:268:20 | call to shellsplit [element] : | string_flow.rb:268:5:268:5 | b [element] : | -| string_flow.rb:269:10:269:10 | b [element] : | string_flow.rb:269:10:269:13 | ...[...] | -| string_flow.rb:273:5:273:5 | a : | string_flow.rb:274:9:274:9 | a : | -| string_flow.rb:273:5:273:5 | a : | string_flow.rb:277:9:277:9 | a : | -| string_flow.rb:273:9:273:18 | call to source : | string_flow.rb:273:5:273:5 | a : | -| string_flow.rb:274:5:274:5 | b : | string_flow.rb:275:10:275:10 | b : | -| string_flow.rb:274:9:274:9 | a : | string_flow.rb:274:9:274:18 | call to slice : | -| string_flow.rb:274:9:274:18 | call to slice : | string_flow.rb:274:5:274:5 | b : | -| string_flow.rb:275:10:275:10 | b : | string_flow.rb:275:10:275:13 | ...[...] | -| string_flow.rb:277:5:277:5 | b : | string_flow.rb:278:10:278:10 | b : | -| string_flow.rb:277:9:277:9 | [post] a : | string_flow.rb:280:9:280:9 | a : | -| string_flow.rb:277:9:277:9 | [post] a : | string_flow.rb:283:9:283:9 | a : | -| string_flow.rb:277:9:277:9 | [post] a [element 1] : | string_flow.rb:283:9:283:9 | a [element 1] : | -| string_flow.rb:277:9:277:9 | [post] a [element 2] : | string_flow.rb:283:9:283:9 | a [element 2] : | -| string_flow.rb:277:9:277:9 | [post] a [element] : | string_flow.rb:283:9:283:9 | a [element] : | -| string_flow.rb:277:9:277:9 | a : | string_flow.rb:277:9:277:9 | [post] a : | -| string_flow.rb:277:9:277:9 | a : | string_flow.rb:277:9:277:9 | [post] a [element 1] : | -| string_flow.rb:277:9:277:9 | a : | string_flow.rb:277:9:277:9 | [post] a [element 2] : | -| string_flow.rb:277:9:277:9 | a : | string_flow.rb:277:9:277:9 | [post] a [element] : | -| string_flow.rb:277:9:277:9 | a : | string_flow.rb:277:9:277:19 | call to slice! : | -| string_flow.rb:277:9:277:19 | call to slice! : | string_flow.rb:277:5:277:5 | b : | -| string_flow.rb:278:10:278:10 | b : | string_flow.rb:278:10:278:13 | ...[...] | -| string_flow.rb:280:5:280:5 | b : | string_flow.rb:281:10:281:10 | b : | -| string_flow.rb:280:9:280:9 | a : | string_flow.rb:280:9:280:20 | call to split : | -| string_flow.rb:280:9:280:20 | call to split : | string_flow.rb:280:5:280:5 | b : | -| string_flow.rb:281:10:281:10 | b : | string_flow.rb:281:10:281:13 | ...[...] | -| string_flow.rb:283:5:283:5 | b : | string_flow.rb:284:10:284:10 | b : | -| string_flow.rb:283:5:283:5 | b [element 0] : | string_flow.rb:284:10:284:10 | b [element 0] : | -| string_flow.rb:283:5:283:5 | b [element 1] : | string_flow.rb:284:10:284:10 | b [element 1] : | -| string_flow.rb:283:5:283:5 | b [element] : | string_flow.rb:284:10:284:10 | b [element] : | -| string_flow.rb:283:9:283:9 | a : | string_flow.rb:283:9:283:14 | ...[...] : | -| string_flow.rb:283:9:283:9 | a : | string_flow.rb:283:9:283:14 | ...[...] [element 0] : | -| string_flow.rb:283:9:283:9 | a : | string_flow.rb:283:9:283:14 | ...[...] [element 1] : | -| string_flow.rb:283:9:283:9 | a [element 1] : | string_flow.rb:283:9:283:14 | ...[...] [element 0] : | -| string_flow.rb:283:9:283:9 | a [element 2] : | string_flow.rb:283:9:283:14 | ...[...] [element 1] : | -| string_flow.rb:283:9:283:9 | a [element] : | string_flow.rb:283:9:283:14 | ...[...] [element] : | -| string_flow.rb:283:9:283:14 | ...[...] : | string_flow.rb:283:5:283:5 | b : | -| string_flow.rb:283:9:283:14 | ...[...] [element 0] : | string_flow.rb:283:5:283:5 | b [element 0] : | -| string_flow.rb:283:9:283:14 | ...[...] [element 1] : | string_flow.rb:283:5:283:5 | b [element 1] : | -| string_flow.rb:283:9:283:14 | ...[...] [element] : | string_flow.rb:283:5:283:5 | b [element] : | -| string_flow.rb:284:10:284:10 | b : | string_flow.rb:284:10:284:13 | ...[...] | -| string_flow.rb:284:10:284:10 | b [element 0] : | string_flow.rb:284:10:284:13 | ...[...] | -| string_flow.rb:284:10:284:10 | b [element 1] : | string_flow.rb:284:10:284:13 | ...[...] | -| string_flow.rb:284:10:284:10 | b [element] : | string_flow.rb:284:10:284:13 | ...[...] | -| string_flow.rb:288:5:288:5 | a : | string_flow.rb:289:10:289:10 | a : | -| string_flow.rb:288:5:288:5 | a : | string_flow.rb:290:10:290:10 | a : | -| string_flow.rb:288:5:288:5 | a : | string_flow.rb:291:10:291:10 | a : | -| string_flow.rb:288:5:288:5 | a : | string_flow.rb:292:10:292:10 | a : | -| string_flow.rb:288:9:288:18 | call to source : | string_flow.rb:288:5:288:5 | a : | -| string_flow.rb:289:10:289:10 | a : | string_flow.rb:289:10:289:18 | call to squeeze | -| string_flow.rb:290:10:290:10 | a : | string_flow.rb:290:10:290:23 | call to squeeze | -| string_flow.rb:291:10:291:10 | a : | string_flow.rb:291:10:291:19 | call to squeeze! | -| string_flow.rb:292:10:292:10 | a : | string_flow.rb:292:10:292:24 | call to squeeze! | -| string_flow.rb:296:5:296:5 | a : | string_flow.rb:297:10:297:10 | a : | -| string_flow.rb:296:5:296:5 | a : | string_flow.rb:298:10:298:10 | a : | -| string_flow.rb:296:9:296:18 | call to source : | string_flow.rb:296:5:296:5 | a : | -| string_flow.rb:297:10:297:10 | a : | string_flow.rb:297:10:297:17 | call to to_str | -| string_flow.rb:298:10:298:10 | a : | string_flow.rb:298:10:298:15 | call to to_s | -| string_flow.rb:302:5:302:5 | a : | string_flow.rb:303:10:303:10 | a : | -| string_flow.rb:302:5:302:5 | a : | string_flow.rb:304:22:304:22 | a : | -| string_flow.rb:302:5:302:5 | a : | string_flow.rb:305:10:305:10 | a : | -| string_flow.rb:302:5:302:5 | a : | string_flow.rb:306:23:306:23 | a : | -| string_flow.rb:302:5:302:5 | a : | string_flow.rb:307:10:307:10 | a : | -| string_flow.rb:302:5:302:5 | a : | string_flow.rb:308:24:308:24 | a : | -| string_flow.rb:302:5:302:5 | a : | string_flow.rb:309:10:309:10 | a : | -| string_flow.rb:302:5:302:5 | a : | string_flow.rb:310:25:310:25 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:302:5:302:5 | a : | -| string_flow.rb:303:10:303:10 | a : | string_flow.rb:303:10:303:23 | call to tr | -| string_flow.rb:304:22:304:22 | a : | string_flow.rb:304:10:304:23 | call to tr | -| string_flow.rb:305:10:305:10 | a : | string_flow.rb:305:10:305:24 | call to tr! | -| string_flow.rb:306:23:306:23 | a : | string_flow.rb:306:10:306:24 | call to tr! | -| string_flow.rb:307:10:307:10 | a : | string_flow.rb:307:10:307:25 | call to tr_s | -| string_flow.rb:308:24:308:24 | a : | string_flow.rb:308:10:308:25 | call to tr_s | -| string_flow.rb:309:10:309:10 | a : | string_flow.rb:309:10:309:26 | call to tr_s! | -| string_flow.rb:310:25:310:25 | a : | string_flow.rb:310:10:310:26 | call to tr_s! | -| string_flow.rb:314:5:314:5 | a : | string_flow.rb:315:5:315:5 | a : | -| string_flow.rb:314:5:314:5 | a : | string_flow.rb:316:5:316:5 | a : | -| string_flow.rb:314:5:314:5 | a : | string_flow.rb:317:14:317:14 | a : | -| string_flow.rb:314:9:314:18 | call to source : | string_flow.rb:314:5:314:5 | a : | -| string_flow.rb:315:5:315:5 | a : | string_flow.rb:315:20:315:20 | x : | -| string_flow.rb:315:20:315:20 | x : | string_flow.rb:315:28:315:28 | x | -| string_flow.rb:316:5:316:5 | a : | string_flow.rb:316:26:316:26 | x : | -| string_flow.rb:316:26:316:26 | x : | string_flow.rb:316:34:316:34 | x | -| string_flow.rb:317:14:317:14 | a : | string_flow.rb:317:20:317:20 | x : | -| string_flow.rb:317:20:317:20 | x : | string_flow.rb:317:28:317:28 | x | +| string_flow.rb:2:5:2:5 | a | string_flow.rb:3:21:3:21 | a | +| string_flow.rb:2:5:2:5 | a | string_flow.rb:3:21:3:21 | a | +| string_flow.rb:2:9:2:18 | call to source | string_flow.rb:2:5:2:5 | a | +| string_flow.rb:2:9:2:18 | call to source | string_flow.rb:2:5:2:5 | a | +| string_flow.rb:3:21:3:21 | a | string_flow.rb:3:10:3:22 | call to new | +| string_flow.rb:3:21:3:21 | a | string_flow.rb:3:10:3:22 | call to new | +| string_flow.rb:7:5:7:5 | a | string_flow.rb:9:29:9:29 | a | +| string_flow.rb:7:9:7:18 | call to source | string_flow.rb:7:5:7:5 | a | +| string_flow.rb:8:5:8:5 | b | string_flow.rb:10:29:10:29 | b | +| string_flow.rb:8:9:8:16 | call to source | string_flow.rb:8:5:8:5 | b | +| string_flow.rb:9:29:9:29 | a | string_flow.rb:9:10:9:30 | call to try_convert | +| string_flow.rb:10:29:10:29 | b | string_flow.rb:10:10:10:30 | call to try_convert | +| string_flow.rb:14:5:14:5 | a | string_flow.rb:15:10:15:17 | ... % ... | +| string_flow.rb:14:5:14:5 | a | string_flow.rb:15:17:15:17 | a | +| string_flow.rb:14:5:14:5 | a | string_flow.rb:16:10:16:29 | ... % ... | +| string_flow.rb:14:5:14:5 | a | string_flow.rb:16:28:16:28 | a | +| string_flow.rb:14:5:14:5 | a | string_flow.rb:17:10:17:10 | a | +| string_flow.rb:14:5:14:5 | a | string_flow.rb:17:10:17:18 | ... % ... | +| string_flow.rb:14:9:14:18 | call to source | string_flow.rb:14:5:14:5 | a | +| string_flow.rb:15:17:15:17 | a | string_flow.rb:15:10:15:17 | ... % ... | +| string_flow.rb:16:28:16:28 | a | string_flow.rb:16:10:16:29 | ... % ... | +| string_flow.rb:17:10:17:10 | a | string_flow.rb:17:10:17:18 | ... % ... | +| string_flow.rb:21:5:21:5 | a | string_flow.rb:22:5:22:5 | b | +| string_flow.rb:21:9:21:18 | call to source | string_flow.rb:21:5:21:5 | a | +| string_flow.rb:22:5:22:5 | b | string_flow.rb:23:10:23:10 | b | +| string_flow.rb:27:5:27:5 | a | string_flow.rb:28:5:28:5 | b | +| string_flow.rb:27:9:27:18 | call to source | string_flow.rb:27:5:27:5 | a | +| string_flow.rb:28:5:28:5 | b | string_flow.rb:29:10:29:10 | b | +| string_flow.rb:33:5:33:5 | a | string_flow.rb:34:5:34:5 | b | +| string_flow.rb:33:5:33:5 | a | string_flow.rb:36:5:36:5 | c | +| string_flow.rb:33:9:33:18 | call to source | string_flow.rb:33:5:33:5 | a | +| string_flow.rb:34:5:34:5 | b | string_flow.rb:35:10:35:10 | b | +| string_flow.rb:36:5:36:5 | c | string_flow.rb:37:10:37:10 | c | +| string_flow.rb:41:5:41:5 | a | string_flow.rb:42:10:42:10 | a | +| string_flow.rb:41:9:41:18 | call to source | string_flow.rb:41:5:41:5 | a | +| string_flow.rb:42:10:42:10 | a | string_flow.rb:42:10:42:12 | call to b | +| string_flow.rb:46:5:46:5 | a | string_flow.rb:47:10:47:10 | a | +| string_flow.rb:46:5:46:5 | a | string_flow.rb:48:10:48:10 | a | +| string_flow.rb:46:5:46:5 | a | string_flow.rb:49:10:49:10 | a | +| string_flow.rb:46:9:46:18 | call to source | string_flow.rb:46:5:46:5 | a | +| string_flow.rb:47:10:47:10 | a | string_flow.rb:47:10:47:23 | call to byteslice | +| string_flow.rb:48:10:48:10 | a | string_flow.rb:48:10:48:26 | call to byteslice | +| string_flow.rb:49:10:49:10 | a | string_flow.rb:49:10:49:26 | call to byteslice | +| string_flow.rb:53:5:53:5 | a | string_flow.rb:54:10:54:10 | a | +| string_flow.rb:53:5:53:5 | a | string_flow.rb:55:10:55:10 | a | +| string_flow.rb:53:9:53:18 | call to source | string_flow.rb:53:5:53:5 | a | +| string_flow.rb:54:10:54:10 | a | string_flow.rb:54:10:54:21 | call to capitalize | +| string_flow.rb:55:10:55:10 | a | string_flow.rb:55:10:55:22 | call to capitalize! | +| string_flow.rb:59:5:59:5 | a | string_flow.rb:60:10:60:10 | a | +| string_flow.rb:59:5:59:5 | a | string_flow.rb:61:27:61:27 | a | +| string_flow.rb:59:5:59:5 | a | string_flow.rb:62:10:62:10 | a | +| string_flow.rb:59:5:59:5 | a | string_flow.rb:63:26:63:26 | a | +| string_flow.rb:59:5:59:5 | a | string_flow.rb:64:10:64:10 | a | +| string_flow.rb:59:5:59:5 | a | string_flow.rb:65:26:65:26 | a | +| string_flow.rb:59:9:59:18 | call to source | string_flow.rb:59:5:59:5 | a | +| string_flow.rb:60:10:60:10 | a | string_flow.rb:60:10:60:21 | call to center | +| string_flow.rb:61:27:61:27 | a | string_flow.rb:61:10:61:28 | call to center | +| string_flow.rb:62:10:62:10 | a | string_flow.rb:62:10:62:20 | call to ljust | +| string_flow.rb:63:26:63:26 | a | string_flow.rb:63:10:63:27 | call to ljust | +| string_flow.rb:64:10:64:10 | a | string_flow.rb:64:10:64:20 | call to rjust | +| string_flow.rb:65:26:65:26 | a | string_flow.rb:65:10:65:27 | call to rjust | +| string_flow.rb:69:5:69:5 | a | string_flow.rb:70:10:70:10 | a | +| string_flow.rb:69:5:69:5 | a | string_flow.rb:71:10:71:10 | a | +| string_flow.rb:69:9:69:18 | call to source | string_flow.rb:69:5:69:5 | a | +| string_flow.rb:70:10:70:10 | a | string_flow.rb:70:10:70:16 | call to chomp | +| string_flow.rb:71:10:71:10 | a | string_flow.rb:71:10:71:17 | call to chomp! | +| string_flow.rb:75:5:75:5 | a | string_flow.rb:76:10:76:10 | a | +| string_flow.rb:75:5:75:5 | a | string_flow.rb:77:10:77:10 | a | +| string_flow.rb:75:9:75:18 | call to source | string_flow.rb:75:5:75:5 | a | +| string_flow.rb:76:10:76:10 | a | string_flow.rb:76:10:76:15 | call to chop | +| string_flow.rb:77:10:77:10 | a | string_flow.rb:77:10:77:16 | call to chop! | +| string_flow.rb:83:5:83:5 | a | string_flow.rb:84:5:84:5 | a | +| string_flow.rb:83:5:83:5 | a | string_flow.rb:84:5:84:5 | a | +| string_flow.rb:83:9:83:18 | call to source | string_flow.rb:83:5:83:5 | a | +| string_flow.rb:83:9:83:18 | call to source | string_flow.rb:83:5:83:5 | a | +| string_flow.rb:84:5:84:5 | [post] a | string_flow.rb:85:10:85:10 | a | +| string_flow.rb:84:5:84:5 | [post] a | string_flow.rb:85:10:85:10 | a | +| string_flow.rb:84:5:84:5 | a | string_flow.rb:84:5:84:5 | [post] a | +| string_flow.rb:84:5:84:5 | a | string_flow.rb:84:5:84:5 | [post] a | +| string_flow.rb:108:5:108:5 | a | string_flow.rb:109:10:109:10 | a | +| string_flow.rb:108:9:108:18 | call to source | string_flow.rb:108:5:108:5 | a | +| string_flow.rb:109:10:109:10 | [post] a | string_flow.rb:110:10:110:10 | a | +| string_flow.rb:109:10:109:10 | [post] a | string_flow.rb:111:10:111:10 | a | +| string_flow.rb:109:10:109:10 | a | string_flow.rb:109:10:109:10 | [post] a | +| string_flow.rb:109:10:109:10 | a | string_flow.rb:109:10:109:22 | call to delete | +| string_flow.rb:110:10:110:10 | a | string_flow.rb:110:10:110:29 | call to delete_prefix | +| string_flow.rb:111:10:111:10 | a | string_flow.rb:111:10:111:29 | call to delete_suffix | +| string_flow.rb:115:5:115:5 | a | string_flow.rb:116:10:116:10 | a | +| string_flow.rb:115:5:115:5 | a | string_flow.rb:117:10:117:10 | a | +| string_flow.rb:115:5:115:5 | a | string_flow.rb:118:10:118:10 | a | +| string_flow.rb:115:5:115:5 | a | string_flow.rb:119:10:119:10 | a | +| string_flow.rb:115:5:115:5 | a | string_flow.rb:120:10:120:10 | a | +| string_flow.rb:115:5:115:5 | a | string_flow.rb:121:10:121:10 | a | +| string_flow.rb:115:9:115:18 | call to source | string_flow.rb:115:5:115:5 | a | +| string_flow.rb:116:10:116:10 | a | string_flow.rb:116:10:116:19 | call to downcase | +| string_flow.rb:117:10:117:10 | a | string_flow.rb:117:10:117:20 | call to downcase! | +| string_flow.rb:118:10:118:10 | a | string_flow.rb:118:10:118:19 | call to swapcase | +| string_flow.rb:119:10:119:10 | a | string_flow.rb:119:10:119:20 | call to swapcase! | +| string_flow.rb:120:10:120:10 | a | string_flow.rb:120:10:120:17 | call to upcase | +| string_flow.rb:121:10:121:10 | a | string_flow.rb:121:10:121:18 | call to upcase! | +| string_flow.rb:125:5:125:5 | a | string_flow.rb:126:9:126:9 | a | +| string_flow.rb:125:9:125:18 | call to source | string_flow.rb:125:5:125:5 | a | +| string_flow.rb:126:5:126:5 | b | string_flow.rb:127:10:127:10 | b | +| string_flow.rb:126:5:126:5 | b | string_flow.rb:128:10:128:10 | b | +| string_flow.rb:126:9:126:9 | a | string_flow.rb:126:9:126:14 | call to dump | +| string_flow.rb:126:9:126:14 | call to dump | string_flow.rb:126:5:126:5 | b | +| string_flow.rb:128:10:128:10 | b | string_flow.rb:128:10:128:17 | call to undump | +| string_flow.rb:132:5:132:5 | a | string_flow.rb:133:9:133:9 | a | +| string_flow.rb:132:5:132:5 | a | string_flow.rb:135:9:135:9 | a | +| string_flow.rb:132:9:132:18 | call to source | string_flow.rb:132:5:132:5 | a | +| string_flow.rb:133:5:133:5 | b | string_flow.rb:134:10:134:10 | b | +| string_flow.rb:133:9:133:9 | a | string_flow.rb:133:9:133:40 | call to each_line | +| string_flow.rb:133:9:133:9 | a | string_flow.rb:133:24:133:27 | line | +| string_flow.rb:133:9:133:40 | call to each_line | string_flow.rb:133:5:133:5 | b | +| string_flow.rb:133:24:133:27 | line | string_flow.rb:133:35:133:38 | line | +| string_flow.rb:135:5:135:5 | c [element] | string_flow.rb:136:10:136:10 | c [element] | +| string_flow.rb:135:9:135:9 | a | string_flow.rb:135:9:135:19 | call to each_line [element] | +| string_flow.rb:135:9:135:19 | call to each_line [element] | string_flow.rb:135:5:135:5 | c [element] | +| string_flow.rb:136:10:136:10 | c [element] | string_flow.rb:136:10:136:15 | call to to_a [element] | +| string_flow.rb:136:10:136:15 | call to to_a [element] | string_flow.rb:136:10:136:18 | ...[...] | +| string_flow.rb:140:5:140:5 | a | string_flow.rb:141:9:141:9 | a | +| string_flow.rb:140:5:140:5 | a | string_flow.rb:143:9:143:9 | a | +| string_flow.rb:140:9:140:18 | call to source | string_flow.rb:140:5:140:5 | a | +| string_flow.rb:141:5:141:5 | b | string_flow.rb:142:10:142:10 | b | +| string_flow.rb:141:9:141:9 | a | string_flow.rb:141:9:141:36 | call to lines | +| string_flow.rb:141:9:141:9 | a | string_flow.rb:141:20:141:23 | line | +| string_flow.rb:141:9:141:36 | call to lines | string_flow.rb:141:5:141:5 | b | +| string_flow.rb:141:20:141:23 | line | string_flow.rb:141:31:141:34 | line | +| string_flow.rb:143:5:143:5 | c [element] | string_flow.rb:144:10:144:10 | c [element] | +| string_flow.rb:143:9:143:9 | a | string_flow.rb:143:9:143:15 | call to lines [element] | +| string_flow.rb:143:9:143:15 | call to lines [element] | string_flow.rb:143:5:143:5 | c [element] | +| string_flow.rb:144:10:144:10 | c [element] | string_flow.rb:144:10:144:13 | ...[...] | +| string_flow.rb:148:5:148:5 | a | string_flow.rb:149:10:149:10 | a | +| string_flow.rb:148:5:148:5 | a | string_flow.rb:150:10:150:10 | a | +| string_flow.rb:148:5:148:5 | a | string_flow.rb:151:10:151:10 | a | +| string_flow.rb:148:5:148:5 | a | string_flow.rb:152:10:152:10 | a | +| string_flow.rb:148:9:148:18 | call to source | string_flow.rb:148:5:148:5 | a | +| string_flow.rb:149:10:149:10 | a | string_flow.rb:149:10:149:26 | call to encode | +| string_flow.rb:150:10:150:10 | a | string_flow.rb:150:10:150:27 | call to encode! | +| string_flow.rb:151:10:151:10 | a | string_flow.rb:151:10:151:28 | call to unicode_normalize | +| string_flow.rb:152:10:152:10 | a | string_flow.rb:152:10:152:29 | call to unicode_normalize! | +| string_flow.rb:156:5:156:5 | a | string_flow.rb:157:10:157:10 | a | +| string_flow.rb:156:9:156:18 | call to source | string_flow.rb:156:5:156:5 | a | +| string_flow.rb:157:10:157:10 | a | string_flow.rb:157:10:157:34 | call to force_encoding | +| string_flow.rb:161:5:161:5 | a | string_flow.rb:162:10:162:10 | a | +| string_flow.rb:161:9:161:18 | call to source | string_flow.rb:161:5:161:5 | a | +| string_flow.rb:162:10:162:10 | a | string_flow.rb:162:10:162:17 | call to freeze | +| string_flow.rb:166:5:166:5 | a | string_flow.rb:168:10:168:10 | a | +| string_flow.rb:166:5:166:5 | a | string_flow.rb:169:10:169:10 | a | +| string_flow.rb:166:5:166:5 | a | string_flow.rb:170:10:170:10 | a | +| string_flow.rb:166:5:166:5 | a | string_flow.rb:171:10:171:10 | a | +| string_flow.rb:166:9:166:18 | call to source | string_flow.rb:166:5:166:5 | a | +| string_flow.rb:167:5:167:5 | c | string_flow.rb:168:22:168:22 | c | +| string_flow.rb:167:5:167:5 | c | string_flow.rb:169:23:169:23 | c | +| string_flow.rb:167:9:167:18 | call to source | string_flow.rb:167:5:167:5 | c | +| string_flow.rb:168:10:168:10 | a | string_flow.rb:168:10:168:23 | call to gsub | +| string_flow.rb:168:22:168:22 | c | string_flow.rb:168:10:168:23 | call to gsub | +| string_flow.rb:169:10:169:10 | a | string_flow.rb:169:10:169:24 | call to gsub! | +| string_flow.rb:169:23:169:23 | c | string_flow.rb:169:10:169:24 | call to gsub! | +| string_flow.rb:170:10:170:10 | a | string_flow.rb:170:10:170:43 | call to gsub | +| string_flow.rb:170:32:170:41 | call to source | string_flow.rb:170:10:170:43 | call to gsub | +| string_flow.rb:171:10:171:10 | a | string_flow.rb:171:10:171:44 | call to gsub! | +| string_flow.rb:171:33:171:42 | call to source | string_flow.rb:171:10:171:44 | call to gsub! | +| string_flow.rb:175:5:175:5 | a | string_flow.rb:177:10:177:10 | a | +| string_flow.rb:175:5:175:5 | a | string_flow.rb:178:10:178:10 | a | +| string_flow.rb:175:5:175:5 | a | string_flow.rb:179:10:179:10 | a | +| string_flow.rb:175:5:175:5 | a | string_flow.rb:180:10:180:10 | a | +| string_flow.rb:175:9:175:18 | call to source | string_flow.rb:175:5:175:5 | a | +| string_flow.rb:176:5:176:5 | c | string_flow.rb:177:21:177:21 | c | +| string_flow.rb:176:5:176:5 | c | string_flow.rb:178:22:178:22 | c | +| string_flow.rb:176:9:176:18 | call to source | string_flow.rb:176:5:176:5 | c | +| string_flow.rb:177:10:177:10 | a | string_flow.rb:177:10:177:22 | call to sub | +| string_flow.rb:177:21:177:21 | c | string_flow.rb:177:10:177:22 | call to sub | +| string_flow.rb:178:10:178:10 | a | string_flow.rb:178:10:178:23 | call to sub! | +| string_flow.rb:178:22:178:22 | c | string_flow.rb:178:10:178:23 | call to sub! | +| string_flow.rb:179:10:179:10 | a | string_flow.rb:179:10:179:42 | call to sub | +| string_flow.rb:179:31:179:40 | call to source | string_flow.rb:179:10:179:42 | call to sub | +| string_flow.rb:180:10:180:10 | a | string_flow.rb:180:10:180:43 | call to sub! | +| string_flow.rb:180:32:180:41 | call to source | string_flow.rb:180:10:180:43 | call to sub! | +| string_flow.rb:191:5:191:5 | a | string_flow.rb:192:10:192:10 | a | +| string_flow.rb:191:9:191:18 | call to source | string_flow.rb:191:5:191:5 | a | +| string_flow.rb:192:10:192:10 | a | string_flow.rb:192:10:192:18 | call to inspect | +| string_flow.rb:196:5:196:5 | a | string_flow.rb:197:10:197:10 | a | +| string_flow.rb:196:5:196:5 | a | string_flow.rb:198:10:198:10 | a | +| string_flow.rb:196:5:196:5 | a | string_flow.rb:199:10:199:10 | a | +| string_flow.rb:196:5:196:5 | a | string_flow.rb:200:10:200:10 | a | +| string_flow.rb:196:5:196:5 | a | string_flow.rb:201:10:201:10 | a | +| string_flow.rb:196:5:196:5 | a | string_flow.rb:202:10:202:10 | a | +| string_flow.rb:196:9:196:18 | call to source | string_flow.rb:196:5:196:5 | a | +| string_flow.rb:197:10:197:10 | a | string_flow.rb:197:10:197:16 | call to strip | +| string_flow.rb:198:10:198:10 | a | string_flow.rb:198:10:198:17 | call to strip! | +| string_flow.rb:199:10:199:10 | a | string_flow.rb:199:10:199:17 | call to lstrip | +| string_flow.rb:200:10:200:10 | a | string_flow.rb:200:10:200:18 | call to lstrip! | +| string_flow.rb:201:10:201:10 | a | string_flow.rb:201:10:201:17 | call to rstrip | +| string_flow.rb:202:10:202:10 | a | string_flow.rb:202:10:202:18 | call to rstrip! | +| string_flow.rb:206:5:206:5 | a | string_flow.rb:207:10:207:10 | a | +| string_flow.rb:206:5:206:5 | a | string_flow.rb:208:10:208:10 | a | +| string_flow.rb:206:5:206:5 | a | string_flow.rb:209:10:209:10 | a | +| string_flow.rb:206:5:206:5 | a | string_flow.rb:210:10:210:10 | a | +| string_flow.rb:206:9:206:18 | call to source | string_flow.rb:206:5:206:5 | a | +| string_flow.rb:207:10:207:10 | a | string_flow.rb:207:10:207:15 | call to next | +| string_flow.rb:208:10:208:10 | a | string_flow.rb:208:10:208:16 | call to next! | +| string_flow.rb:209:10:209:10 | a | string_flow.rb:209:10:209:15 | call to succ | +| string_flow.rb:210:10:210:10 | a | string_flow.rb:210:10:210:16 | call to succ! | +| string_flow.rb:214:5:214:5 | a | string_flow.rb:215:9:215:9 | a | +| string_flow.rb:214:9:214:18 | call to source | string_flow.rb:214:5:214:5 | a | +| string_flow.rb:215:5:215:5 | b [element 0] | string_flow.rb:216:10:216:10 | b [element 0] | +| string_flow.rb:215:5:215:5 | b [element 1] | string_flow.rb:217:10:217:10 | b [element 1] | +| string_flow.rb:215:5:215:5 | b [element 2] | string_flow.rb:218:10:218:10 | b [element 2] | +| string_flow.rb:215:9:215:9 | a | string_flow.rb:215:9:215:24 | call to partition [element 0] | +| string_flow.rb:215:9:215:9 | a | string_flow.rb:215:9:215:24 | call to partition [element 1] | +| string_flow.rb:215:9:215:9 | a | string_flow.rb:215:9:215:24 | call to partition [element 2] | +| string_flow.rb:215:9:215:24 | call to partition [element 0] | string_flow.rb:215:5:215:5 | b [element 0] | +| string_flow.rb:215:9:215:24 | call to partition [element 1] | string_flow.rb:215:5:215:5 | b [element 1] | +| string_flow.rb:215:9:215:24 | call to partition [element 2] | string_flow.rb:215:5:215:5 | b [element 2] | +| string_flow.rb:216:10:216:10 | b [element 0] | string_flow.rb:216:10:216:13 | ...[...] | +| string_flow.rb:217:10:217:10 | b [element 1] | string_flow.rb:217:10:217:13 | ...[...] | +| string_flow.rb:218:10:218:10 | b [element 2] | string_flow.rb:218:10:218:13 | ...[...] | +| string_flow.rb:223:5:223:5 | a | string_flow.rb:225:10:225:10 | a | +| string_flow.rb:223:5:223:5 | a | string_flow.rb:225:10:225:10 | a | +| string_flow.rb:223:9:223:18 | call to source | string_flow.rb:223:5:223:5 | a | +| string_flow.rb:223:9:223:18 | call to source | string_flow.rb:223:5:223:5 | a | +| string_flow.rb:224:5:224:5 | b | string_flow.rb:225:20:225:20 | b | +| string_flow.rb:224:9:224:18 | call to source | string_flow.rb:224:5:224:5 | b | +| string_flow.rb:225:10:225:10 | [post] a | string_flow.rb:227:10:227:10 | a | +| string_flow.rb:225:10:225:10 | [post] a | string_flow.rb:227:10:227:10 | a | +| string_flow.rb:225:10:225:10 | a | string_flow.rb:225:10:225:10 | [post] a | +| string_flow.rb:225:10:225:10 | a | string_flow.rb:225:10:225:10 | [post] a | +| string_flow.rb:225:20:225:20 | b | string_flow.rb:225:10:225:10 | [post] a | +| string_flow.rb:225:20:225:20 | b | string_flow.rb:225:10:225:21 | call to replace | +| string_flow.rb:231:5:231:5 | a | string_flow.rb:232:10:232:10 | a | +| string_flow.rb:231:9:231:18 | call to source | string_flow.rb:231:5:231:5 | a | +| string_flow.rb:232:10:232:10 | a | string_flow.rb:232:10:232:18 | call to reverse | +| string_flow.rb:236:5:236:5 | a | string_flow.rb:237:9:237:9 | a | +| string_flow.rb:236:5:236:5 | a | string_flow.rb:238:9:238:9 | a | +| string_flow.rb:236:5:236:5 | a | string_flow.rb:240:9:240:9 | a | +| string_flow.rb:236:9:236:18 | call to source | string_flow.rb:236:5:236:5 | a | +| string_flow.rb:237:9:237:9 | a | string_flow.rb:237:24:237:24 | x | +| string_flow.rb:237:24:237:24 | x | string_flow.rb:237:35:237:35 | x | +| string_flow.rb:238:5:238:5 | b | string_flow.rb:239:10:239:10 | b | +| string_flow.rb:238:9:238:9 | a | string_flow.rb:238:9:238:37 | call to scan | +| string_flow.rb:238:9:238:9 | a | string_flow.rb:238:27:238:27 | y | +| string_flow.rb:238:9:238:37 | call to scan | string_flow.rb:238:5:238:5 | b | +| string_flow.rb:238:27:238:27 | y | string_flow.rb:238:35:238:35 | y | +| string_flow.rb:240:5:240:5 | b [element] | string_flow.rb:241:10:241:10 | b [element] | +| string_flow.rb:240:5:240:5 | b [element] | string_flow.rb:242:10:242:10 | b [element] | +| string_flow.rb:240:9:240:9 | a | string_flow.rb:240:9:240:19 | call to scan [element] | +| string_flow.rb:240:9:240:19 | call to scan [element] | string_flow.rb:240:5:240:5 | b [element] | +| string_flow.rb:241:10:241:10 | b [element] | string_flow.rb:241:10:241:13 | ...[...] | +| string_flow.rb:242:10:242:10 | b [element] | string_flow.rb:242:10:242:13 | ...[...] | +| string_flow.rb:246:5:246:5 | a | string_flow.rb:247:10:247:10 | a | +| string_flow.rb:246:5:246:5 | a | string_flow.rb:248:20:248:20 | a | +| string_flow.rb:246:5:246:5 | a | string_flow.rb:249:5:249:5 | a | +| string_flow.rb:246:5:246:5 | a | string_flow.rb:250:26:250:26 | a | +| string_flow.rb:246:5:246:5 | a | string_flow.rb:252:10:252:10 | a | +| string_flow.rb:246:5:246:5 | a | string_flow.rb:253:21:253:21 | a | +| string_flow.rb:246:9:246:18 | call to source | string_flow.rb:246:5:246:5 | a | +| string_flow.rb:247:10:247:10 | a | string_flow.rb:247:10:247:21 | call to scrub | +| string_flow.rb:248:20:248:20 | a | string_flow.rb:248:10:248:21 | call to scrub | +| string_flow.rb:249:5:249:5 | a | string_flow.rb:249:16:249:16 | x | +| string_flow.rb:249:16:249:16 | x | string_flow.rb:249:24:249:24 | x | +| string_flow.rb:250:26:250:26 | a | string_flow.rb:250:10:250:28 | call to scrub | +| string_flow.rb:252:10:252:10 | a | string_flow.rb:252:10:252:22 | call to scrub! | +| string_flow.rb:253:21:253:21 | a | string_flow.rb:253:10:253:22 | call to scrub! | +| string_flow.rb:255:5:255:5 | a | string_flow.rb:256:5:256:5 | a | +| string_flow.rb:255:5:255:5 | a | string_flow.rb:258:27:258:27 | a | +| string_flow.rb:255:9:255:18 | call to source | string_flow.rb:255:5:255:5 | a | +| string_flow.rb:256:5:256:5 | a | string_flow.rb:256:17:256:17 | x | +| string_flow.rb:256:17:256:17 | x | string_flow.rb:256:25:256:25 | x | +| string_flow.rb:258:27:258:27 | a | string_flow.rb:258:10:258:29 | call to scrub! | +| string_flow.rb:262:5:262:5 | a | string_flow.rb:263:10:263:10 | a | +| string_flow.rb:262:9:262:18 | call to source | string_flow.rb:262:5:262:5 | a | +| string_flow.rb:263:10:263:10 | a | string_flow.rb:263:10:263:22 | call to shellescape | +| string_flow.rb:267:5:267:5 | a | string_flow.rb:268:9:268:9 | a | +| string_flow.rb:267:9:267:18 | call to source | string_flow.rb:267:5:267:5 | a | +| string_flow.rb:268:5:268:5 | b [element] | string_flow.rb:269:10:269:10 | b [element] | +| string_flow.rb:268:9:268:9 | a | string_flow.rb:268:9:268:20 | call to shellsplit [element] | +| string_flow.rb:268:9:268:20 | call to shellsplit [element] | string_flow.rb:268:5:268:5 | b [element] | +| string_flow.rb:269:10:269:10 | b [element] | string_flow.rb:269:10:269:13 | ...[...] | +| string_flow.rb:273:5:273:5 | a | string_flow.rb:274:9:274:9 | a | +| string_flow.rb:273:5:273:5 | a | string_flow.rb:277:9:277:9 | a | +| string_flow.rb:273:9:273:18 | call to source | string_flow.rb:273:5:273:5 | a | +| string_flow.rb:274:5:274:5 | b | string_flow.rb:275:10:275:10 | b | +| string_flow.rb:274:9:274:9 | a | string_flow.rb:274:9:274:18 | call to slice | +| string_flow.rb:274:9:274:18 | call to slice | string_flow.rb:274:5:274:5 | b | +| string_flow.rb:275:10:275:10 | b | string_flow.rb:275:10:275:13 | ...[...] | +| string_flow.rb:277:5:277:5 | b | string_flow.rb:278:10:278:10 | b | +| string_flow.rb:277:9:277:9 | [post] a | string_flow.rb:280:9:280:9 | a | +| string_flow.rb:277:9:277:9 | [post] a | string_flow.rb:283:9:283:9 | a | +| string_flow.rb:277:9:277:9 | [post] a [element 1] | string_flow.rb:283:9:283:9 | a [element 1] | +| string_flow.rb:277:9:277:9 | [post] a [element 2] | string_flow.rb:283:9:283:9 | a [element 2] | +| string_flow.rb:277:9:277:9 | [post] a [element] | string_flow.rb:283:9:283:9 | a [element] | +| string_flow.rb:277:9:277:9 | a | string_flow.rb:277:9:277:9 | [post] a | +| string_flow.rb:277:9:277:9 | a | string_flow.rb:277:9:277:9 | [post] a [element 1] | +| string_flow.rb:277:9:277:9 | a | string_flow.rb:277:9:277:9 | [post] a [element 2] | +| string_flow.rb:277:9:277:9 | a | string_flow.rb:277:9:277:9 | [post] a [element] | +| string_flow.rb:277:9:277:9 | a | string_flow.rb:277:9:277:19 | call to slice! | +| string_flow.rb:277:9:277:19 | call to slice! | string_flow.rb:277:5:277:5 | b | +| string_flow.rb:278:10:278:10 | b | string_flow.rb:278:10:278:13 | ...[...] | +| string_flow.rb:280:5:280:5 | b | string_flow.rb:281:10:281:10 | b | +| string_flow.rb:280:9:280:9 | a | string_flow.rb:280:9:280:20 | call to split | +| string_flow.rb:280:9:280:20 | call to split | string_flow.rb:280:5:280:5 | b | +| string_flow.rb:281:10:281:10 | b | string_flow.rb:281:10:281:13 | ...[...] | +| string_flow.rb:283:5:283:5 | b | string_flow.rb:284:10:284:10 | b | +| string_flow.rb:283:5:283:5 | b [element 0] | string_flow.rb:284:10:284:10 | b [element 0] | +| string_flow.rb:283:5:283:5 | b [element 1] | string_flow.rb:284:10:284:10 | b [element 1] | +| string_flow.rb:283:5:283:5 | b [element] | string_flow.rb:284:10:284:10 | b [element] | +| string_flow.rb:283:9:283:9 | a | string_flow.rb:283:9:283:14 | ...[...] | +| string_flow.rb:283:9:283:9 | a | string_flow.rb:283:9:283:14 | ...[...] [element 0] | +| string_flow.rb:283:9:283:9 | a | string_flow.rb:283:9:283:14 | ...[...] [element 1] | +| string_flow.rb:283:9:283:9 | a [element 1] | string_flow.rb:283:9:283:14 | ...[...] [element 0] | +| string_flow.rb:283:9:283:9 | a [element 2] | string_flow.rb:283:9:283:14 | ...[...] [element 1] | +| string_flow.rb:283:9:283:9 | a [element] | string_flow.rb:283:9:283:14 | ...[...] [element] | +| string_flow.rb:283:9:283:14 | ...[...] | string_flow.rb:283:5:283:5 | b | +| string_flow.rb:283:9:283:14 | ...[...] [element 0] | string_flow.rb:283:5:283:5 | b [element 0] | +| string_flow.rb:283:9:283:14 | ...[...] [element 1] | string_flow.rb:283:5:283:5 | b [element 1] | +| string_flow.rb:283:9:283:14 | ...[...] [element] | string_flow.rb:283:5:283:5 | b [element] | +| string_flow.rb:284:10:284:10 | b | string_flow.rb:284:10:284:13 | ...[...] | +| string_flow.rb:284:10:284:10 | b [element 0] | string_flow.rb:284:10:284:13 | ...[...] | +| string_flow.rb:284:10:284:10 | b [element 1] | string_flow.rb:284:10:284:13 | ...[...] | +| string_flow.rb:284:10:284:10 | b [element] | string_flow.rb:284:10:284:13 | ...[...] | +| string_flow.rb:288:5:288:5 | a | string_flow.rb:289:10:289:10 | a | +| string_flow.rb:288:5:288:5 | a | string_flow.rb:290:10:290:10 | a | +| string_flow.rb:288:5:288:5 | a | string_flow.rb:291:10:291:10 | a | +| string_flow.rb:288:5:288:5 | a | string_flow.rb:292:10:292:10 | a | +| string_flow.rb:288:9:288:18 | call to source | string_flow.rb:288:5:288:5 | a | +| string_flow.rb:289:10:289:10 | a | string_flow.rb:289:10:289:18 | call to squeeze | +| string_flow.rb:290:10:290:10 | a | string_flow.rb:290:10:290:23 | call to squeeze | +| string_flow.rb:291:10:291:10 | a | string_flow.rb:291:10:291:19 | call to squeeze! | +| string_flow.rb:292:10:292:10 | a | string_flow.rb:292:10:292:24 | call to squeeze! | +| string_flow.rb:296:5:296:5 | a | string_flow.rb:297:10:297:10 | a | +| string_flow.rb:296:5:296:5 | a | string_flow.rb:298:10:298:10 | a | +| string_flow.rb:296:9:296:18 | call to source | string_flow.rb:296:5:296:5 | a | +| string_flow.rb:297:10:297:10 | a | string_flow.rb:297:10:297:17 | call to to_str | +| string_flow.rb:298:10:298:10 | a | string_flow.rb:298:10:298:15 | call to to_s | +| string_flow.rb:302:5:302:5 | a | string_flow.rb:303:10:303:10 | a | +| string_flow.rb:302:5:302:5 | a | string_flow.rb:304:22:304:22 | a | +| string_flow.rb:302:5:302:5 | a | string_flow.rb:305:10:305:10 | a | +| string_flow.rb:302:5:302:5 | a | string_flow.rb:306:23:306:23 | a | +| string_flow.rb:302:5:302:5 | a | string_flow.rb:307:10:307:10 | a | +| string_flow.rb:302:5:302:5 | a | string_flow.rb:308:24:308:24 | a | +| string_flow.rb:302:5:302:5 | a | string_flow.rb:309:10:309:10 | a | +| string_flow.rb:302:5:302:5 | a | string_flow.rb:310:25:310:25 | a | +| string_flow.rb:302:9:302:18 | call to source | string_flow.rb:302:5:302:5 | a | +| string_flow.rb:303:10:303:10 | a | string_flow.rb:303:10:303:23 | call to tr | +| string_flow.rb:304:22:304:22 | a | string_flow.rb:304:10:304:23 | call to tr | +| string_flow.rb:305:10:305:10 | a | string_flow.rb:305:10:305:24 | call to tr! | +| string_flow.rb:306:23:306:23 | a | string_flow.rb:306:10:306:24 | call to tr! | +| string_flow.rb:307:10:307:10 | a | string_flow.rb:307:10:307:25 | call to tr_s | +| string_flow.rb:308:24:308:24 | a | string_flow.rb:308:10:308:25 | call to tr_s | +| string_flow.rb:309:10:309:10 | a | string_flow.rb:309:10:309:26 | call to tr_s! | +| string_flow.rb:310:25:310:25 | a | string_flow.rb:310:10:310:26 | call to tr_s! | +| string_flow.rb:314:5:314:5 | a | string_flow.rb:315:5:315:5 | a | +| string_flow.rb:314:5:314:5 | a | string_flow.rb:316:5:316:5 | a | +| string_flow.rb:314:5:314:5 | a | string_flow.rb:317:14:317:14 | a | +| string_flow.rb:314:9:314:18 | call to source | string_flow.rb:314:5:314:5 | a | +| string_flow.rb:315:5:315:5 | a | string_flow.rb:315:20:315:20 | x | +| string_flow.rb:315:20:315:20 | x | string_flow.rb:315:28:315:28 | x | +| string_flow.rb:316:5:316:5 | a | string_flow.rb:316:26:316:26 | x | +| string_flow.rb:316:26:316:26 | x | string_flow.rb:316:34:316:34 | x | +| string_flow.rb:317:14:317:14 | a | string_flow.rb:317:20:317:20 | x | +| string_flow.rb:317:20:317:20 | x | string_flow.rb:317:28:317:28 | x | nodes -| string_flow.rb:2:5:2:5 | a : | semmle.label | a : | -| string_flow.rb:2:5:2:5 | a : | semmle.label | a : | -| string_flow.rb:2:9:2:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:2:9:2:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:2:5:2:5 | a | semmle.label | a | +| string_flow.rb:2:5:2:5 | a | semmle.label | a | +| string_flow.rb:2:9:2:18 | call to source | semmle.label | call to source | +| string_flow.rb:2:9:2:18 | call to source | semmle.label | call to source | | string_flow.rb:3:10:3:22 | call to new | semmle.label | call to new | | string_flow.rb:3:10:3:22 | call to new | semmle.label | call to new | -| string_flow.rb:3:21:3:21 | a : | semmle.label | a : | -| string_flow.rb:3:21:3:21 | a : | semmle.label | a : | -| string_flow.rb:7:5:7:5 | a : | semmle.label | a : | -| string_flow.rb:7:9:7:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:8:5:8:5 | b : | semmle.label | b : | -| string_flow.rb:8:9:8:16 | call to source : | semmle.label | call to source : | +| string_flow.rb:3:21:3:21 | a | semmle.label | a | +| string_flow.rb:3:21:3:21 | a | semmle.label | a | +| string_flow.rb:7:5:7:5 | a | semmle.label | a | +| string_flow.rb:7:9:7:18 | call to source | semmle.label | call to source | +| string_flow.rb:8:5:8:5 | b | semmle.label | b | +| string_flow.rb:8:9:8:16 | call to source | semmle.label | call to source | | string_flow.rb:9:10:9:30 | call to try_convert | semmle.label | call to try_convert | -| string_flow.rb:9:29:9:29 | a : | semmle.label | a : | +| string_flow.rb:9:29:9:29 | a | semmle.label | a | | string_flow.rb:10:10:10:30 | call to try_convert | semmle.label | call to try_convert | -| string_flow.rb:10:29:10:29 | b : | semmle.label | b : | -| string_flow.rb:14:5:14:5 | a : | semmle.label | a : | -| string_flow.rb:14:9:14:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:10:29:10:29 | b | semmle.label | b | +| string_flow.rb:14:5:14:5 | a | semmle.label | a | +| string_flow.rb:14:9:14:18 | call to source | semmle.label | call to source | | string_flow.rb:15:10:15:17 | ... % ... | semmle.label | ... % ... | -| string_flow.rb:15:17:15:17 | a : | semmle.label | a : | +| string_flow.rb:15:17:15:17 | a | semmle.label | a | | string_flow.rb:16:10:16:29 | ... % ... | semmle.label | ... % ... | -| string_flow.rb:16:28:16:28 | a : | semmle.label | a : | -| string_flow.rb:17:10:17:10 | a : | semmle.label | a : | +| string_flow.rb:16:28:16:28 | a | semmle.label | a | +| string_flow.rb:17:10:17:10 | a | semmle.label | a | | string_flow.rb:17:10:17:18 | ... % ... | semmle.label | ... % ... | -| string_flow.rb:21:5:21:5 | a : | semmle.label | a : | -| string_flow.rb:21:9:21:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:22:5:22:5 | b : | semmle.label | b : | +| string_flow.rb:21:5:21:5 | a | semmle.label | a | +| string_flow.rb:21:9:21:18 | call to source | semmle.label | call to source | +| string_flow.rb:22:5:22:5 | b | semmle.label | b | | string_flow.rb:23:10:23:10 | b | semmle.label | b | -| string_flow.rb:27:5:27:5 | a : | semmle.label | a : | -| string_flow.rb:27:9:27:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:28:5:28:5 | b : | semmle.label | b : | +| string_flow.rb:27:5:27:5 | a | semmle.label | a | +| string_flow.rb:27:9:27:18 | call to source | semmle.label | call to source | +| string_flow.rb:28:5:28:5 | b | semmle.label | b | | string_flow.rb:29:10:29:10 | b | semmle.label | b | -| string_flow.rb:33:5:33:5 | a : | semmle.label | a : | -| string_flow.rb:33:9:33:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:34:5:34:5 | b : | semmle.label | b : | +| string_flow.rb:33:5:33:5 | a | semmle.label | a | +| string_flow.rb:33:9:33:18 | call to source | semmle.label | call to source | +| string_flow.rb:34:5:34:5 | b | semmle.label | b | | string_flow.rb:35:10:35:10 | b | semmle.label | b | -| string_flow.rb:36:5:36:5 | c : | semmle.label | c : | +| string_flow.rb:36:5:36:5 | c | semmle.label | c | | string_flow.rb:37:10:37:10 | c | semmle.label | c | -| string_flow.rb:41:5:41:5 | a : | semmle.label | a : | -| string_flow.rb:41:9:41:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:42:10:42:10 | a : | semmle.label | a : | +| string_flow.rb:41:5:41:5 | a | semmle.label | a | +| string_flow.rb:41:9:41:18 | call to source | semmle.label | call to source | +| string_flow.rb:42:10:42:10 | a | semmle.label | a | | string_flow.rb:42:10:42:12 | call to b | semmle.label | call to b | -| string_flow.rb:46:5:46:5 | a : | semmle.label | a : | -| string_flow.rb:46:9:46:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:47:10:47:10 | a : | semmle.label | a : | +| string_flow.rb:46:5:46:5 | a | semmle.label | a | +| string_flow.rb:46:9:46:18 | call to source | semmle.label | call to source | +| string_flow.rb:47:10:47:10 | a | semmle.label | a | | string_flow.rb:47:10:47:23 | call to byteslice | semmle.label | call to byteslice | -| string_flow.rb:48:10:48:10 | a : | semmle.label | a : | +| string_flow.rb:48:10:48:10 | a | semmle.label | a | | string_flow.rb:48:10:48:26 | call to byteslice | semmle.label | call to byteslice | -| string_flow.rb:49:10:49:10 | a : | semmle.label | a : | +| string_flow.rb:49:10:49:10 | a | semmle.label | a | | string_flow.rb:49:10:49:26 | call to byteslice | semmle.label | call to byteslice | -| string_flow.rb:53:5:53:5 | a : | semmle.label | a : | -| string_flow.rb:53:9:53:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:54:10:54:10 | a : | semmle.label | a : | +| string_flow.rb:53:5:53:5 | a | semmle.label | a | +| string_flow.rb:53:9:53:18 | call to source | semmle.label | call to source | +| string_flow.rb:54:10:54:10 | a | semmle.label | a | | string_flow.rb:54:10:54:21 | call to capitalize | semmle.label | call to capitalize | -| string_flow.rb:55:10:55:10 | a : | semmle.label | a : | +| string_flow.rb:55:10:55:10 | a | semmle.label | a | | string_flow.rb:55:10:55:22 | call to capitalize! | semmle.label | call to capitalize! | -| string_flow.rb:59:5:59:5 | a : | semmle.label | a : | -| string_flow.rb:59:9:59:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:60:10:60:10 | a : | semmle.label | a : | +| string_flow.rb:59:5:59:5 | a | semmle.label | a | +| string_flow.rb:59:9:59:18 | call to source | semmle.label | call to source | +| string_flow.rb:60:10:60:10 | a | semmle.label | a | | string_flow.rb:60:10:60:21 | call to center | semmle.label | call to center | | string_flow.rb:61:10:61:28 | call to center | semmle.label | call to center | -| string_flow.rb:61:27:61:27 | a : | semmle.label | a : | -| string_flow.rb:62:10:62:10 | a : | semmle.label | a : | +| string_flow.rb:61:27:61:27 | a | semmle.label | a | +| string_flow.rb:62:10:62:10 | a | semmle.label | a | | string_flow.rb:62:10:62:20 | call to ljust | semmle.label | call to ljust | | string_flow.rb:63:10:63:27 | call to ljust | semmle.label | call to ljust | -| string_flow.rb:63:26:63:26 | a : | semmle.label | a : | -| string_flow.rb:64:10:64:10 | a : | semmle.label | a : | +| string_flow.rb:63:26:63:26 | a | semmle.label | a | +| string_flow.rb:64:10:64:10 | a | semmle.label | a | | string_flow.rb:64:10:64:20 | call to rjust | semmle.label | call to rjust | | string_flow.rb:65:10:65:27 | call to rjust | semmle.label | call to rjust | -| string_flow.rb:65:26:65:26 | a : | semmle.label | a : | -| string_flow.rb:69:5:69:5 | a : | semmle.label | a : | -| string_flow.rb:69:9:69:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:70:10:70:10 | a : | semmle.label | a : | +| string_flow.rb:65:26:65:26 | a | semmle.label | a | +| string_flow.rb:69:5:69:5 | a | semmle.label | a | +| string_flow.rb:69:9:69:18 | call to source | semmle.label | call to source | +| string_flow.rb:70:10:70:10 | a | semmle.label | a | | string_flow.rb:70:10:70:16 | call to chomp | semmle.label | call to chomp | -| string_flow.rb:71:10:71:10 | a : | semmle.label | a : | +| string_flow.rb:71:10:71:10 | a | semmle.label | a | | string_flow.rb:71:10:71:17 | call to chomp! | semmle.label | call to chomp! | -| string_flow.rb:75:5:75:5 | a : | semmle.label | a : | -| string_flow.rb:75:9:75:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:76:10:76:10 | a : | semmle.label | a : | +| string_flow.rb:75:5:75:5 | a | semmle.label | a | +| string_flow.rb:75:9:75:18 | call to source | semmle.label | call to source | +| string_flow.rb:76:10:76:10 | a | semmle.label | a | | string_flow.rb:76:10:76:15 | call to chop | semmle.label | call to chop | -| string_flow.rb:77:10:77:10 | a : | semmle.label | a : | +| string_flow.rb:77:10:77:10 | a | semmle.label | a | | string_flow.rb:77:10:77:16 | call to chop! | semmle.label | call to chop! | -| string_flow.rb:83:5:83:5 | a : | semmle.label | a : | -| string_flow.rb:83:5:83:5 | a : | semmle.label | a : | -| string_flow.rb:83:9:83:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:83:9:83:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:84:5:84:5 | [post] a : | semmle.label | [post] a : | -| string_flow.rb:84:5:84:5 | [post] a : | semmle.label | [post] a : | -| string_flow.rb:84:5:84:5 | a : | semmle.label | a : | -| string_flow.rb:84:5:84:5 | a : | semmle.label | a : | +| string_flow.rb:83:5:83:5 | a | semmle.label | a | +| string_flow.rb:83:5:83:5 | a | semmle.label | a | +| string_flow.rb:83:9:83:18 | call to source | semmle.label | call to source | +| string_flow.rb:83:9:83:18 | call to source | semmle.label | call to source | +| string_flow.rb:84:5:84:5 | [post] a | semmle.label | [post] a | +| string_flow.rb:84:5:84:5 | [post] a | semmle.label | [post] a | +| string_flow.rb:84:5:84:5 | a | semmle.label | a | +| string_flow.rb:84:5:84:5 | a | semmle.label | a | | string_flow.rb:85:10:85:10 | a | semmle.label | a | | string_flow.rb:85:10:85:10 | a | semmle.label | a | -| string_flow.rb:108:5:108:5 | a : | semmle.label | a : | -| string_flow.rb:108:9:108:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:109:10:109:10 | [post] a : | semmle.label | [post] a : | -| string_flow.rb:109:10:109:10 | a : | semmle.label | a : | +| string_flow.rb:108:5:108:5 | a | semmle.label | a | +| string_flow.rb:108:9:108:18 | call to source | semmle.label | call to source | +| string_flow.rb:109:10:109:10 | [post] a | semmle.label | [post] a | +| string_flow.rb:109:10:109:10 | a | semmle.label | a | | string_flow.rb:109:10:109:22 | call to delete | semmle.label | call to delete | -| string_flow.rb:110:10:110:10 | a : | semmle.label | a : | +| string_flow.rb:110:10:110:10 | a | semmle.label | a | | string_flow.rb:110:10:110:29 | call to delete_prefix | semmle.label | call to delete_prefix | -| string_flow.rb:111:10:111:10 | a : | semmle.label | a : | +| string_flow.rb:111:10:111:10 | a | semmle.label | a | | string_flow.rb:111:10:111:29 | call to delete_suffix | semmle.label | call to delete_suffix | -| string_flow.rb:115:5:115:5 | a : | semmle.label | a : | -| string_flow.rb:115:9:115:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:116:10:116:10 | a : | semmle.label | a : | +| string_flow.rb:115:5:115:5 | a | semmle.label | a | +| string_flow.rb:115:9:115:18 | call to source | semmle.label | call to source | +| string_flow.rb:116:10:116:10 | a | semmle.label | a | | string_flow.rb:116:10:116:19 | call to downcase | semmle.label | call to downcase | -| string_flow.rb:117:10:117:10 | a : | semmle.label | a : | +| string_flow.rb:117:10:117:10 | a | semmle.label | a | | string_flow.rb:117:10:117:20 | call to downcase! | semmle.label | call to downcase! | -| string_flow.rb:118:10:118:10 | a : | semmle.label | a : | +| string_flow.rb:118:10:118:10 | a | semmle.label | a | | string_flow.rb:118:10:118:19 | call to swapcase | semmle.label | call to swapcase | -| string_flow.rb:119:10:119:10 | a : | semmle.label | a : | +| string_flow.rb:119:10:119:10 | a | semmle.label | a | | string_flow.rb:119:10:119:20 | call to swapcase! | semmle.label | call to swapcase! | -| string_flow.rb:120:10:120:10 | a : | semmle.label | a : | +| string_flow.rb:120:10:120:10 | a | semmle.label | a | | string_flow.rb:120:10:120:17 | call to upcase | semmle.label | call to upcase | -| string_flow.rb:121:10:121:10 | a : | semmle.label | a : | +| string_flow.rb:121:10:121:10 | a | semmle.label | a | | string_flow.rb:121:10:121:18 | call to upcase! | semmle.label | call to upcase! | -| string_flow.rb:125:5:125:5 | a : | semmle.label | a : | -| string_flow.rb:125:9:125:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:126:5:126:5 | b : | semmle.label | b : | -| string_flow.rb:126:9:126:9 | a : | semmle.label | a : | -| string_flow.rb:126:9:126:14 | call to dump : | semmle.label | call to dump : | +| string_flow.rb:125:5:125:5 | a | semmle.label | a | +| string_flow.rb:125:9:125:18 | call to source | semmle.label | call to source | +| string_flow.rb:126:5:126:5 | b | semmle.label | b | +| string_flow.rb:126:9:126:9 | a | semmle.label | a | +| string_flow.rb:126:9:126:14 | call to dump | semmle.label | call to dump | | string_flow.rb:127:10:127:10 | b | semmle.label | b | -| string_flow.rb:128:10:128:10 | b : | semmle.label | b : | +| string_flow.rb:128:10:128:10 | b | semmle.label | b | | string_flow.rb:128:10:128:17 | call to undump | semmle.label | call to undump | -| string_flow.rb:132:5:132:5 | a : | semmle.label | a : | -| string_flow.rb:132:9:132:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:133:5:133:5 | b : | semmle.label | b : | -| string_flow.rb:133:9:133:9 | a : | semmle.label | a : | -| string_flow.rb:133:9:133:40 | call to each_line : | semmle.label | call to each_line : | -| string_flow.rb:133:24:133:27 | line : | semmle.label | line : | +| string_flow.rb:132:5:132:5 | a | semmle.label | a | +| string_flow.rb:132:9:132:18 | call to source | semmle.label | call to source | +| string_flow.rb:133:5:133:5 | b | semmle.label | b | +| string_flow.rb:133:9:133:9 | a | semmle.label | a | +| string_flow.rb:133:9:133:40 | call to each_line | semmle.label | call to each_line | +| string_flow.rb:133:24:133:27 | line | semmle.label | line | | string_flow.rb:133:35:133:38 | line | semmle.label | line | | string_flow.rb:134:10:134:10 | b | semmle.label | b | -| string_flow.rb:135:5:135:5 | c [element] : | semmle.label | c [element] : | -| string_flow.rb:135:9:135:9 | a : | semmle.label | a : | -| string_flow.rb:135:9:135:19 | call to each_line [element] : | semmle.label | call to each_line [element] : | -| string_flow.rb:136:10:136:10 | c [element] : | semmle.label | c [element] : | -| string_flow.rb:136:10:136:15 | call to to_a [element] : | semmle.label | call to to_a [element] : | +| string_flow.rb:135:5:135:5 | c [element] | semmle.label | c [element] | +| string_flow.rb:135:9:135:9 | a | semmle.label | a | +| string_flow.rb:135:9:135:19 | call to each_line [element] | semmle.label | call to each_line [element] | +| string_flow.rb:136:10:136:10 | c [element] | semmle.label | c [element] | +| string_flow.rb:136:10:136:15 | call to to_a [element] | semmle.label | call to to_a [element] | | string_flow.rb:136:10:136:18 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:140:5:140:5 | a : | semmle.label | a : | -| string_flow.rb:140:9:140:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:141:5:141:5 | b : | semmle.label | b : | -| string_flow.rb:141:9:141:9 | a : | semmle.label | a : | -| string_flow.rb:141:9:141:36 | call to lines : | semmle.label | call to lines : | -| string_flow.rb:141:20:141:23 | line : | semmle.label | line : | +| string_flow.rb:140:5:140:5 | a | semmle.label | a | +| string_flow.rb:140:9:140:18 | call to source | semmle.label | call to source | +| string_flow.rb:141:5:141:5 | b | semmle.label | b | +| string_flow.rb:141:9:141:9 | a | semmle.label | a | +| string_flow.rb:141:9:141:36 | call to lines | semmle.label | call to lines | +| string_flow.rb:141:20:141:23 | line | semmle.label | line | | string_flow.rb:141:31:141:34 | line | semmle.label | line | | string_flow.rb:142:10:142:10 | b | semmle.label | b | -| string_flow.rb:143:5:143:5 | c [element] : | semmle.label | c [element] : | -| string_flow.rb:143:9:143:9 | a : | semmle.label | a : | -| string_flow.rb:143:9:143:15 | call to lines [element] : | semmle.label | call to lines [element] : | -| string_flow.rb:144:10:144:10 | c [element] : | semmle.label | c [element] : | +| string_flow.rb:143:5:143:5 | c [element] | semmle.label | c [element] | +| string_flow.rb:143:9:143:9 | a | semmle.label | a | +| string_flow.rb:143:9:143:15 | call to lines [element] | semmle.label | call to lines [element] | +| string_flow.rb:144:10:144:10 | c [element] | semmle.label | c [element] | | string_flow.rb:144:10:144:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:148:5:148:5 | a : | semmle.label | a : | -| string_flow.rb:148:9:148:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:149:10:149:10 | a : | semmle.label | a : | +| string_flow.rb:148:5:148:5 | a | semmle.label | a | +| string_flow.rb:148:9:148:18 | call to source | semmle.label | call to source | +| string_flow.rb:149:10:149:10 | a | semmle.label | a | | string_flow.rb:149:10:149:26 | call to encode | semmle.label | call to encode | -| string_flow.rb:150:10:150:10 | a : | semmle.label | a : | +| string_flow.rb:150:10:150:10 | a | semmle.label | a | | string_flow.rb:150:10:150:27 | call to encode! | semmle.label | call to encode! | -| string_flow.rb:151:10:151:10 | a : | semmle.label | a : | +| string_flow.rb:151:10:151:10 | a | semmle.label | a | | string_flow.rb:151:10:151:28 | call to unicode_normalize | semmle.label | call to unicode_normalize | -| string_flow.rb:152:10:152:10 | a : | semmle.label | a : | +| string_flow.rb:152:10:152:10 | a | semmle.label | a | | string_flow.rb:152:10:152:29 | call to unicode_normalize! | semmle.label | call to unicode_normalize! | -| string_flow.rb:156:5:156:5 | a : | semmle.label | a : | -| string_flow.rb:156:9:156:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:157:10:157:10 | a : | semmle.label | a : | +| string_flow.rb:156:5:156:5 | a | semmle.label | a | +| string_flow.rb:156:9:156:18 | call to source | semmle.label | call to source | +| string_flow.rb:157:10:157:10 | a | semmle.label | a | | string_flow.rb:157:10:157:34 | call to force_encoding | semmle.label | call to force_encoding | -| string_flow.rb:161:5:161:5 | a : | semmle.label | a : | -| string_flow.rb:161:9:161:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:162:10:162:10 | a : | semmle.label | a : | +| string_flow.rb:161:5:161:5 | a | semmle.label | a | +| string_flow.rb:161:9:161:18 | call to source | semmle.label | call to source | +| string_flow.rb:162:10:162:10 | a | semmle.label | a | | string_flow.rb:162:10:162:17 | call to freeze | semmle.label | call to freeze | -| string_flow.rb:166:5:166:5 | a : | semmle.label | a : | -| string_flow.rb:166:9:166:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:167:5:167:5 | c : | semmle.label | c : | -| string_flow.rb:167:9:167:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:168:10:168:10 | a : | semmle.label | a : | +| string_flow.rb:166:5:166:5 | a | semmle.label | a | +| string_flow.rb:166:9:166:18 | call to source | semmle.label | call to source | +| string_flow.rb:167:5:167:5 | c | semmle.label | c | +| string_flow.rb:167:9:167:18 | call to source | semmle.label | call to source | +| string_flow.rb:168:10:168:10 | a | semmle.label | a | | string_flow.rb:168:10:168:23 | call to gsub | semmle.label | call to gsub | -| string_flow.rb:168:22:168:22 | c : | semmle.label | c : | -| string_flow.rb:169:10:169:10 | a : | semmle.label | a : | +| string_flow.rb:168:22:168:22 | c | semmle.label | c | +| string_flow.rb:169:10:169:10 | a | semmle.label | a | | string_flow.rb:169:10:169:24 | call to gsub! | semmle.label | call to gsub! | -| string_flow.rb:169:23:169:23 | c : | semmle.label | c : | -| string_flow.rb:170:10:170:10 | a : | semmle.label | a : | +| string_flow.rb:169:23:169:23 | c | semmle.label | c | +| string_flow.rb:170:10:170:10 | a | semmle.label | a | | string_flow.rb:170:10:170:43 | call to gsub | semmle.label | call to gsub | -| string_flow.rb:170:32:170:41 | call to source : | semmle.label | call to source : | -| string_flow.rb:171:10:171:10 | a : | semmle.label | a : | +| string_flow.rb:170:32:170:41 | call to source | semmle.label | call to source | +| string_flow.rb:171:10:171:10 | a | semmle.label | a | | string_flow.rb:171:10:171:44 | call to gsub! | semmle.label | call to gsub! | -| string_flow.rb:171:33:171:42 | call to source : | semmle.label | call to source : | -| string_flow.rb:175:5:175:5 | a : | semmle.label | a : | -| string_flow.rb:175:9:175:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:176:5:176:5 | c : | semmle.label | c : | -| string_flow.rb:176:9:176:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:177:10:177:10 | a : | semmle.label | a : | +| string_flow.rb:171:33:171:42 | call to source | semmle.label | call to source | +| string_flow.rb:175:5:175:5 | a | semmle.label | a | +| string_flow.rb:175:9:175:18 | call to source | semmle.label | call to source | +| string_flow.rb:176:5:176:5 | c | semmle.label | c | +| string_flow.rb:176:9:176:18 | call to source | semmle.label | call to source | +| string_flow.rb:177:10:177:10 | a | semmle.label | a | | string_flow.rb:177:10:177:22 | call to sub | semmle.label | call to sub | -| string_flow.rb:177:21:177:21 | c : | semmle.label | c : | -| string_flow.rb:178:10:178:10 | a : | semmle.label | a : | +| string_flow.rb:177:21:177:21 | c | semmle.label | c | +| string_flow.rb:178:10:178:10 | a | semmle.label | a | | string_flow.rb:178:10:178:23 | call to sub! | semmle.label | call to sub! | -| string_flow.rb:178:22:178:22 | c : | semmle.label | c : | -| string_flow.rb:179:10:179:10 | a : | semmle.label | a : | +| string_flow.rb:178:22:178:22 | c | semmle.label | c | +| string_flow.rb:179:10:179:10 | a | semmle.label | a | | string_flow.rb:179:10:179:42 | call to sub | semmle.label | call to sub | -| string_flow.rb:179:31:179:40 | call to source : | semmle.label | call to source : | -| string_flow.rb:180:10:180:10 | a : | semmle.label | a : | +| string_flow.rb:179:31:179:40 | call to source | semmle.label | call to source | +| string_flow.rb:180:10:180:10 | a | semmle.label | a | | string_flow.rb:180:10:180:43 | call to sub! | semmle.label | call to sub! | -| string_flow.rb:180:32:180:41 | call to source : | semmle.label | call to source : | -| string_flow.rb:191:5:191:5 | a : | semmle.label | a : | -| string_flow.rb:191:9:191:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:192:10:192:10 | a : | semmle.label | a : | +| string_flow.rb:180:32:180:41 | call to source | semmle.label | call to source | +| string_flow.rb:191:5:191:5 | a | semmle.label | a | +| string_flow.rb:191:9:191:18 | call to source | semmle.label | call to source | +| string_flow.rb:192:10:192:10 | a | semmle.label | a | | string_flow.rb:192:10:192:18 | call to inspect | semmle.label | call to inspect | -| string_flow.rb:196:5:196:5 | a : | semmle.label | a : | -| string_flow.rb:196:9:196:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:197:10:197:10 | a : | semmle.label | a : | +| string_flow.rb:196:5:196:5 | a | semmle.label | a | +| string_flow.rb:196:9:196:18 | call to source | semmle.label | call to source | +| string_flow.rb:197:10:197:10 | a | semmle.label | a | | string_flow.rb:197:10:197:16 | call to strip | semmle.label | call to strip | -| string_flow.rb:198:10:198:10 | a : | semmle.label | a : | +| string_flow.rb:198:10:198:10 | a | semmle.label | a | | string_flow.rb:198:10:198:17 | call to strip! | semmle.label | call to strip! | -| string_flow.rb:199:10:199:10 | a : | semmle.label | a : | +| string_flow.rb:199:10:199:10 | a | semmle.label | a | | string_flow.rb:199:10:199:17 | call to lstrip | semmle.label | call to lstrip | -| string_flow.rb:200:10:200:10 | a : | semmle.label | a : | +| string_flow.rb:200:10:200:10 | a | semmle.label | a | | string_flow.rb:200:10:200:18 | call to lstrip! | semmle.label | call to lstrip! | -| string_flow.rb:201:10:201:10 | a : | semmle.label | a : | +| string_flow.rb:201:10:201:10 | a | semmle.label | a | | string_flow.rb:201:10:201:17 | call to rstrip | semmle.label | call to rstrip | -| string_flow.rb:202:10:202:10 | a : | semmle.label | a : | +| string_flow.rb:202:10:202:10 | a | semmle.label | a | | string_flow.rb:202:10:202:18 | call to rstrip! | semmle.label | call to rstrip! | -| string_flow.rb:206:5:206:5 | a : | semmle.label | a : | -| string_flow.rb:206:9:206:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:207:10:207:10 | a : | semmle.label | a : | +| string_flow.rb:206:5:206:5 | a | semmle.label | a | +| string_flow.rb:206:9:206:18 | call to source | semmle.label | call to source | +| string_flow.rb:207:10:207:10 | a | semmle.label | a | | string_flow.rb:207:10:207:15 | call to next | semmle.label | call to next | -| string_flow.rb:208:10:208:10 | a : | semmle.label | a : | +| string_flow.rb:208:10:208:10 | a | semmle.label | a | | string_flow.rb:208:10:208:16 | call to next! | semmle.label | call to next! | -| string_flow.rb:209:10:209:10 | a : | semmle.label | a : | +| string_flow.rb:209:10:209:10 | a | semmle.label | a | | string_flow.rb:209:10:209:15 | call to succ | semmle.label | call to succ | -| string_flow.rb:210:10:210:10 | a : | semmle.label | a : | +| string_flow.rb:210:10:210:10 | a | semmle.label | a | | string_flow.rb:210:10:210:16 | call to succ! | semmle.label | call to succ! | -| string_flow.rb:214:5:214:5 | a : | semmle.label | a : | -| string_flow.rb:214:9:214:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:215:5:215:5 | b [element 0] : | semmle.label | b [element 0] : | -| string_flow.rb:215:5:215:5 | b [element 1] : | semmle.label | b [element 1] : | -| string_flow.rb:215:5:215:5 | b [element 2] : | semmle.label | b [element 2] : | -| string_flow.rb:215:9:215:9 | a : | semmle.label | a : | -| string_flow.rb:215:9:215:24 | call to partition [element 0] : | semmle.label | call to partition [element 0] : | -| string_flow.rb:215:9:215:24 | call to partition [element 1] : | semmle.label | call to partition [element 1] : | -| string_flow.rb:215:9:215:24 | call to partition [element 2] : | semmle.label | call to partition [element 2] : | -| string_flow.rb:216:10:216:10 | b [element 0] : | semmle.label | b [element 0] : | +| string_flow.rb:214:5:214:5 | a | semmle.label | a | +| string_flow.rb:214:9:214:18 | call to source | semmle.label | call to source | +| string_flow.rb:215:5:215:5 | b [element 0] | semmle.label | b [element 0] | +| string_flow.rb:215:5:215:5 | b [element 1] | semmle.label | b [element 1] | +| string_flow.rb:215:5:215:5 | b [element 2] | semmle.label | b [element 2] | +| string_flow.rb:215:9:215:9 | a | semmle.label | a | +| string_flow.rb:215:9:215:24 | call to partition [element 0] | semmle.label | call to partition [element 0] | +| string_flow.rb:215:9:215:24 | call to partition [element 1] | semmle.label | call to partition [element 1] | +| string_flow.rb:215:9:215:24 | call to partition [element 2] | semmle.label | call to partition [element 2] | +| string_flow.rb:216:10:216:10 | b [element 0] | semmle.label | b [element 0] | | string_flow.rb:216:10:216:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:217:10:217:10 | b [element 1] : | semmle.label | b [element 1] : | +| string_flow.rb:217:10:217:10 | b [element 1] | semmle.label | b [element 1] | | string_flow.rb:217:10:217:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:218:10:218:10 | b [element 2] : | semmle.label | b [element 2] : | +| string_flow.rb:218:10:218:10 | b [element 2] | semmle.label | b [element 2] | | string_flow.rb:218:10:218:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:223:5:223:5 | a : | semmle.label | a : | -| string_flow.rb:223:5:223:5 | a : | semmle.label | a : | -| string_flow.rb:223:9:223:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:223:9:223:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:224:5:224:5 | b : | semmle.label | b : | -| string_flow.rb:224:9:224:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:225:10:225:10 | [post] a : | semmle.label | [post] a : | -| string_flow.rb:225:10:225:10 | [post] a : | semmle.label | [post] a : | -| string_flow.rb:225:10:225:10 | a : | semmle.label | a : | -| string_flow.rb:225:10:225:10 | a : | semmle.label | a : | +| string_flow.rb:223:5:223:5 | a | semmle.label | a | +| string_flow.rb:223:5:223:5 | a | semmle.label | a | +| string_flow.rb:223:9:223:18 | call to source | semmle.label | call to source | +| string_flow.rb:223:9:223:18 | call to source | semmle.label | call to source | +| string_flow.rb:224:5:224:5 | b | semmle.label | b | +| string_flow.rb:224:9:224:18 | call to source | semmle.label | call to source | +| string_flow.rb:225:10:225:10 | [post] a | semmle.label | [post] a | +| string_flow.rb:225:10:225:10 | [post] a | semmle.label | [post] a | +| string_flow.rb:225:10:225:10 | a | semmle.label | a | +| string_flow.rb:225:10:225:10 | a | semmle.label | a | | string_flow.rb:225:10:225:21 | call to replace | semmle.label | call to replace | -| string_flow.rb:225:20:225:20 | b : | semmle.label | b : | +| string_flow.rb:225:20:225:20 | b | semmle.label | b | | string_flow.rb:227:10:227:10 | a | semmle.label | a | | string_flow.rb:227:10:227:10 | a | semmle.label | a | -| string_flow.rb:231:5:231:5 | a : | semmle.label | a : | -| string_flow.rb:231:9:231:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:232:10:232:10 | a : | semmle.label | a : | +| string_flow.rb:231:5:231:5 | a | semmle.label | a | +| string_flow.rb:231:9:231:18 | call to source | semmle.label | call to source | +| string_flow.rb:232:10:232:10 | a | semmle.label | a | | string_flow.rb:232:10:232:18 | call to reverse | semmle.label | call to reverse | -| string_flow.rb:236:5:236:5 | a : | semmle.label | a : | -| string_flow.rb:236:9:236:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:237:9:237:9 | a : | semmle.label | a : | -| string_flow.rb:237:24:237:24 | x : | semmle.label | x : | +| string_flow.rb:236:5:236:5 | a | semmle.label | a | +| string_flow.rb:236:9:236:18 | call to source | semmle.label | call to source | +| string_flow.rb:237:9:237:9 | a | semmle.label | a | +| string_flow.rb:237:24:237:24 | x | semmle.label | x | | string_flow.rb:237:35:237:35 | x | semmle.label | x | -| string_flow.rb:238:5:238:5 | b : | semmle.label | b : | -| string_flow.rb:238:9:238:9 | a : | semmle.label | a : | -| string_flow.rb:238:9:238:37 | call to scan : | semmle.label | call to scan : | -| string_flow.rb:238:27:238:27 | y : | semmle.label | y : | +| string_flow.rb:238:5:238:5 | b | semmle.label | b | +| string_flow.rb:238:9:238:9 | a | semmle.label | a | +| string_flow.rb:238:9:238:37 | call to scan | semmle.label | call to scan | +| string_flow.rb:238:27:238:27 | y | semmle.label | y | | string_flow.rb:238:35:238:35 | y | semmle.label | y | | string_flow.rb:239:10:239:10 | b | semmle.label | b | -| string_flow.rb:240:5:240:5 | b [element] : | semmle.label | b [element] : | -| string_flow.rb:240:9:240:9 | a : | semmle.label | a : | -| string_flow.rb:240:9:240:19 | call to scan [element] : | semmle.label | call to scan [element] : | -| string_flow.rb:241:10:241:10 | b [element] : | semmle.label | b [element] : | +| string_flow.rb:240:5:240:5 | b [element] | semmle.label | b [element] | +| string_flow.rb:240:9:240:9 | a | semmle.label | a | +| string_flow.rb:240:9:240:19 | call to scan [element] | semmle.label | call to scan [element] | +| string_flow.rb:241:10:241:10 | b [element] | semmle.label | b [element] | | string_flow.rb:241:10:241:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:242:10:242:10 | b [element] : | semmle.label | b [element] : | +| string_flow.rb:242:10:242:10 | b [element] | semmle.label | b [element] | | string_flow.rb:242:10:242:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:246:5:246:5 | a : | semmle.label | a : | -| string_flow.rb:246:9:246:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:247:10:247:10 | a : | semmle.label | a : | +| string_flow.rb:246:5:246:5 | a | semmle.label | a | +| string_flow.rb:246:9:246:18 | call to source | semmle.label | call to source | +| string_flow.rb:247:10:247:10 | a | semmle.label | a | | string_flow.rb:247:10:247:21 | call to scrub | semmle.label | call to scrub | | string_flow.rb:248:10:248:21 | call to scrub | semmle.label | call to scrub | -| string_flow.rb:248:20:248:20 | a : | semmle.label | a : | -| string_flow.rb:249:5:249:5 | a : | semmle.label | a : | -| string_flow.rb:249:16:249:16 | x : | semmle.label | x : | +| string_flow.rb:248:20:248:20 | a | semmle.label | a | +| string_flow.rb:249:5:249:5 | a | semmle.label | a | +| string_flow.rb:249:16:249:16 | x | semmle.label | x | | string_flow.rb:249:24:249:24 | x | semmle.label | x | | string_flow.rb:250:10:250:28 | call to scrub | semmle.label | call to scrub | -| string_flow.rb:250:26:250:26 | a : | semmle.label | a : | -| string_flow.rb:252:10:252:10 | a : | semmle.label | a : | +| string_flow.rb:250:26:250:26 | a | semmle.label | a | +| string_flow.rb:252:10:252:10 | a | semmle.label | a | | string_flow.rb:252:10:252:22 | call to scrub! | semmle.label | call to scrub! | | string_flow.rb:253:10:253:22 | call to scrub! | semmle.label | call to scrub! | -| string_flow.rb:253:21:253:21 | a : | semmle.label | a : | -| string_flow.rb:255:5:255:5 | a : | semmle.label | a : | -| string_flow.rb:255:9:255:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:256:5:256:5 | a : | semmle.label | a : | -| string_flow.rb:256:17:256:17 | x : | semmle.label | x : | +| string_flow.rb:253:21:253:21 | a | semmle.label | a | +| string_flow.rb:255:5:255:5 | a | semmle.label | a | +| string_flow.rb:255:9:255:18 | call to source | semmle.label | call to source | +| string_flow.rb:256:5:256:5 | a | semmle.label | a | +| string_flow.rb:256:17:256:17 | x | semmle.label | x | | string_flow.rb:256:25:256:25 | x | semmle.label | x | | string_flow.rb:258:10:258:29 | call to scrub! | semmle.label | call to scrub! | -| string_flow.rb:258:27:258:27 | a : | semmle.label | a : | -| string_flow.rb:262:5:262:5 | a : | semmle.label | a : | -| string_flow.rb:262:9:262:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:263:10:263:10 | a : | semmle.label | a : | +| string_flow.rb:258:27:258:27 | a | semmle.label | a | +| string_flow.rb:262:5:262:5 | a | semmle.label | a | +| string_flow.rb:262:9:262:18 | call to source | semmle.label | call to source | +| string_flow.rb:263:10:263:10 | a | semmle.label | a | | string_flow.rb:263:10:263:22 | call to shellescape | semmle.label | call to shellescape | -| string_flow.rb:267:5:267:5 | a : | semmle.label | a : | -| string_flow.rb:267:9:267:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:268:5:268:5 | b [element] : | semmle.label | b [element] : | -| string_flow.rb:268:9:268:9 | a : | semmle.label | a : | -| string_flow.rb:268:9:268:20 | call to shellsplit [element] : | semmle.label | call to shellsplit [element] : | -| string_flow.rb:269:10:269:10 | b [element] : | semmle.label | b [element] : | +| string_flow.rb:267:5:267:5 | a | semmle.label | a | +| string_flow.rb:267:9:267:18 | call to source | semmle.label | call to source | +| string_flow.rb:268:5:268:5 | b [element] | semmle.label | b [element] | +| string_flow.rb:268:9:268:9 | a | semmle.label | a | +| string_flow.rb:268:9:268:20 | call to shellsplit [element] | semmle.label | call to shellsplit [element] | +| string_flow.rb:269:10:269:10 | b [element] | semmle.label | b [element] | | string_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:273:5:273:5 | a : | semmle.label | a : | -| string_flow.rb:273:9:273:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:274:5:274:5 | b : | semmle.label | b : | -| string_flow.rb:274:9:274:9 | a : | semmle.label | a : | -| string_flow.rb:274:9:274:18 | call to slice : | semmle.label | call to slice : | -| string_flow.rb:275:10:275:10 | b : | semmle.label | b : | +| string_flow.rb:273:5:273:5 | a | semmle.label | a | +| string_flow.rb:273:9:273:18 | call to source | semmle.label | call to source | +| string_flow.rb:274:5:274:5 | b | semmle.label | b | +| string_flow.rb:274:9:274:9 | a | semmle.label | a | +| string_flow.rb:274:9:274:18 | call to slice | semmle.label | call to slice | +| string_flow.rb:275:10:275:10 | b | semmle.label | b | | string_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:277:5:277:5 | b : | semmle.label | b : | -| string_flow.rb:277:9:277:9 | [post] a : | semmle.label | [post] a : | -| string_flow.rb:277:9:277:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | -| string_flow.rb:277:9:277:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| string_flow.rb:277:9:277:9 | [post] a [element] : | semmle.label | [post] a [element] : | -| string_flow.rb:277:9:277:9 | a : | semmle.label | a : | -| string_flow.rb:277:9:277:19 | call to slice! : | semmle.label | call to slice! : | -| string_flow.rb:278:10:278:10 | b : | semmle.label | b : | +| string_flow.rb:277:5:277:5 | b | semmle.label | b | +| string_flow.rb:277:9:277:9 | [post] a | semmle.label | [post] a | +| string_flow.rb:277:9:277:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | +| string_flow.rb:277:9:277:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| string_flow.rb:277:9:277:9 | [post] a [element] | semmle.label | [post] a [element] | +| string_flow.rb:277:9:277:9 | a | semmle.label | a | +| string_flow.rb:277:9:277:19 | call to slice! | semmle.label | call to slice! | +| string_flow.rb:278:10:278:10 | b | semmle.label | b | | string_flow.rb:278:10:278:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:280:5:280:5 | b : | semmle.label | b : | -| string_flow.rb:280:9:280:9 | a : | semmle.label | a : | -| string_flow.rb:280:9:280:20 | call to split : | semmle.label | call to split : | -| string_flow.rb:281:10:281:10 | b : | semmle.label | b : | +| string_flow.rb:280:5:280:5 | b | semmle.label | b | +| string_flow.rb:280:9:280:9 | a | semmle.label | a | +| string_flow.rb:280:9:280:20 | call to split | semmle.label | call to split | +| string_flow.rb:281:10:281:10 | b | semmle.label | b | | string_flow.rb:281:10:281:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:283:5:283:5 | b : | semmle.label | b : | -| string_flow.rb:283:5:283:5 | b [element 0] : | semmle.label | b [element 0] : | -| string_flow.rb:283:5:283:5 | b [element 1] : | semmle.label | b [element 1] : | -| string_flow.rb:283:5:283:5 | b [element] : | semmle.label | b [element] : | -| string_flow.rb:283:9:283:9 | a : | semmle.label | a : | -| string_flow.rb:283:9:283:9 | a [element 1] : | semmle.label | a [element 1] : | -| string_flow.rb:283:9:283:9 | a [element 2] : | semmle.label | a [element 2] : | -| string_flow.rb:283:9:283:9 | a [element] : | semmle.label | a [element] : | -| string_flow.rb:283:9:283:14 | ...[...] : | semmle.label | ...[...] : | -| string_flow.rb:283:9:283:14 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | -| string_flow.rb:283:9:283:14 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| string_flow.rb:283:9:283:14 | ...[...] [element] : | semmle.label | ...[...] [element] : | -| string_flow.rb:284:10:284:10 | b : | semmle.label | b : | -| string_flow.rb:284:10:284:10 | b [element 0] : | semmle.label | b [element 0] : | -| string_flow.rb:284:10:284:10 | b [element 1] : | semmle.label | b [element 1] : | -| string_flow.rb:284:10:284:10 | b [element] : | semmle.label | b [element] : | +| string_flow.rb:283:5:283:5 | b | semmle.label | b | +| string_flow.rb:283:5:283:5 | b [element 0] | semmle.label | b [element 0] | +| string_flow.rb:283:5:283:5 | b [element 1] | semmle.label | b [element 1] | +| string_flow.rb:283:5:283:5 | b [element] | semmle.label | b [element] | +| string_flow.rb:283:9:283:9 | a | semmle.label | a | +| string_flow.rb:283:9:283:9 | a [element 1] | semmle.label | a [element 1] | +| string_flow.rb:283:9:283:9 | a [element 2] | semmle.label | a [element 2] | +| string_flow.rb:283:9:283:9 | a [element] | semmle.label | a [element] | +| string_flow.rb:283:9:283:14 | ...[...] | semmle.label | ...[...] | +| string_flow.rb:283:9:283:14 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | +| string_flow.rb:283:9:283:14 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| string_flow.rb:283:9:283:14 | ...[...] [element] | semmle.label | ...[...] [element] | +| string_flow.rb:284:10:284:10 | b | semmle.label | b | +| string_flow.rb:284:10:284:10 | b [element 0] | semmle.label | b [element 0] | +| string_flow.rb:284:10:284:10 | b [element 1] | semmle.label | b [element 1] | +| string_flow.rb:284:10:284:10 | b [element] | semmle.label | b [element] | | string_flow.rb:284:10:284:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:288:5:288:5 | a : | semmle.label | a : | -| string_flow.rb:288:9:288:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:289:10:289:10 | a : | semmle.label | a : | +| string_flow.rb:288:5:288:5 | a | semmle.label | a | +| string_flow.rb:288:9:288:18 | call to source | semmle.label | call to source | +| string_flow.rb:289:10:289:10 | a | semmle.label | a | | string_flow.rb:289:10:289:18 | call to squeeze | semmle.label | call to squeeze | -| string_flow.rb:290:10:290:10 | a : | semmle.label | a : | +| string_flow.rb:290:10:290:10 | a | semmle.label | a | | string_flow.rb:290:10:290:23 | call to squeeze | semmle.label | call to squeeze | -| string_flow.rb:291:10:291:10 | a : | semmle.label | a : | +| string_flow.rb:291:10:291:10 | a | semmle.label | a | | string_flow.rb:291:10:291:19 | call to squeeze! | semmle.label | call to squeeze! | -| string_flow.rb:292:10:292:10 | a : | semmle.label | a : | +| string_flow.rb:292:10:292:10 | a | semmle.label | a | | string_flow.rb:292:10:292:24 | call to squeeze! | semmle.label | call to squeeze! | -| string_flow.rb:296:5:296:5 | a : | semmle.label | a : | -| string_flow.rb:296:9:296:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:297:10:297:10 | a : | semmle.label | a : | +| string_flow.rb:296:5:296:5 | a | semmle.label | a | +| string_flow.rb:296:9:296:18 | call to source | semmle.label | call to source | +| string_flow.rb:297:10:297:10 | a | semmle.label | a | | string_flow.rb:297:10:297:17 | call to to_str | semmle.label | call to to_str | -| string_flow.rb:298:10:298:10 | a : | semmle.label | a : | +| string_flow.rb:298:10:298:10 | a | semmle.label | a | | string_flow.rb:298:10:298:15 | call to to_s | semmle.label | call to to_s | -| string_flow.rb:302:5:302:5 | a : | semmle.label | a : | -| string_flow.rb:302:9:302:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:303:10:303:10 | a : | semmle.label | a : | +| string_flow.rb:302:5:302:5 | a | semmle.label | a | +| string_flow.rb:302:9:302:18 | call to source | semmle.label | call to source | +| string_flow.rb:303:10:303:10 | a | semmle.label | a | | string_flow.rb:303:10:303:23 | call to tr | semmle.label | call to tr | | string_flow.rb:304:10:304:23 | call to tr | semmle.label | call to tr | -| string_flow.rb:304:22:304:22 | a : | semmle.label | a : | -| string_flow.rb:305:10:305:10 | a : | semmle.label | a : | +| string_flow.rb:304:22:304:22 | a | semmle.label | a | +| string_flow.rb:305:10:305:10 | a | semmle.label | a | | string_flow.rb:305:10:305:24 | call to tr! | semmle.label | call to tr! | | string_flow.rb:306:10:306:24 | call to tr! | semmle.label | call to tr! | -| string_flow.rb:306:23:306:23 | a : | semmle.label | a : | -| string_flow.rb:307:10:307:10 | a : | semmle.label | a : | +| string_flow.rb:306:23:306:23 | a | semmle.label | a | +| string_flow.rb:307:10:307:10 | a | semmle.label | a | | string_flow.rb:307:10:307:25 | call to tr_s | semmle.label | call to tr_s | | string_flow.rb:308:10:308:25 | call to tr_s | semmle.label | call to tr_s | -| string_flow.rb:308:24:308:24 | a : | semmle.label | a : | -| string_flow.rb:309:10:309:10 | a : | semmle.label | a : | +| string_flow.rb:308:24:308:24 | a | semmle.label | a | +| string_flow.rb:309:10:309:10 | a | semmle.label | a | | string_flow.rb:309:10:309:26 | call to tr_s! | semmle.label | call to tr_s! | | string_flow.rb:310:10:310:26 | call to tr_s! | semmle.label | call to tr_s! | -| string_flow.rb:310:25:310:25 | a : | semmle.label | a : | -| string_flow.rb:314:5:314:5 | a : | semmle.label | a : | -| string_flow.rb:314:9:314:18 | call to source : | semmle.label | call to source : | -| string_flow.rb:315:5:315:5 | a : | semmle.label | a : | -| string_flow.rb:315:20:315:20 | x : | semmle.label | x : | +| string_flow.rb:310:25:310:25 | a | semmle.label | a | +| string_flow.rb:314:5:314:5 | a | semmle.label | a | +| string_flow.rb:314:9:314:18 | call to source | semmle.label | call to source | +| string_flow.rb:315:5:315:5 | a | semmle.label | a | +| string_flow.rb:315:20:315:20 | x | semmle.label | x | | string_flow.rb:315:28:315:28 | x | semmle.label | x | -| string_flow.rb:316:5:316:5 | a : | semmle.label | a : | -| string_flow.rb:316:26:316:26 | x : | semmle.label | x : | +| string_flow.rb:316:5:316:5 | a | semmle.label | a | +| string_flow.rb:316:26:316:26 | x | semmle.label | x | | string_flow.rb:316:34:316:34 | x | semmle.label | x | -| string_flow.rb:317:14:317:14 | a : | semmle.label | a : | -| string_flow.rb:317:20:317:20 | x : | semmle.label | x : | +| string_flow.rb:317:14:317:14 | a | semmle.label | a | +| string_flow.rb:317:20:317:20 | x | semmle.label | x | | string_flow.rb:317:28:317:28 | x | semmle.label | x | subpaths #select -| string_flow.rb:3:10:3:22 | call to new | string_flow.rb:2:9:2:18 | call to source : | string_flow.rb:3:10:3:22 | call to new | $@ | string_flow.rb:2:9:2:18 | call to source : | call to source : | -| string_flow.rb:85:10:85:10 | a | string_flow.rb:83:9:83:18 | call to source : | string_flow.rb:85:10:85:10 | a | $@ | string_flow.rb:83:9:83:18 | call to source : | call to source : | -| string_flow.rb:227:10:227:10 | a | string_flow.rb:223:9:223:18 | call to source : | string_flow.rb:227:10:227:10 | a | $@ | string_flow.rb:223:9:223:18 | call to source : | call to source : | +| string_flow.rb:3:10:3:22 | call to new | string_flow.rb:2:9:2:18 | call to source | string_flow.rb:3:10:3:22 | call to new | $@ | string_flow.rb:2:9:2:18 | call to source | call to source | +| string_flow.rb:85:10:85:10 | a | string_flow.rb:83:9:83:18 | call to source | string_flow.rb:85:10:85:10 | a | $@ | string_flow.rb:83:9:83:18 | call to source | call to source | +| string_flow.rb:227:10:227:10 | a | string_flow.rb:223:9:223:18 | call to source | string_flow.rb:227:10:227:10 | a | $@ | string_flow.rb:223:9:223:18 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected index a69c52963cb..eb990f9ab27 100644 --- a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected +++ b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected @@ -1,288 +1,288 @@ failures edges -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:2:6:2:12 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:2:6:2:12 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:4:24:4:30 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:4:24:4:30 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:16:36:16:42 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:16:36:16:42 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:20:25:20:31 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:26:31:26:37 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:30:24:30:30 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:31:27:31:33 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:34:16:34:22 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:34:16:34:22 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:35:16:35:22 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:35:16:35:22 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:36:21:36:27 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:36:21:36:27 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:37:36:37:42 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:37:36:37:42 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:51:24:51:30 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:56:22:56:28 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:57:17:57:23 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:59:27:59:33 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:63:32:63:38 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:65:23:65:29 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:122:16:122:22 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:128:14:128:20 | tainted : | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:131:16:131:22 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:131:16:131:22 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:132:21:132:27 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:132:21:132:27 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:135:26:135:32 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:135:26:135:32 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:137:23:137:29 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:137:23:137:29 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:140:19:140:25 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:140:19:140:25 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:141:19:141:25 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:141:19:141:25 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:145:26:145:32 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:145:26:145:32 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:147:16:147:22 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:147:16:147:22 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:150:39:150:45 | tainted | -| summaries.rb:1:1:1:7 | tainted : | summaries.rb:150:39:150:45 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:1:1:1:7 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:1:1:1:7 | tainted : | -| summaries.rb:1:20:1:36 | call to source : | summaries.rb:1:11:1:36 | call to identity : | -| summaries.rb:1:20:1:36 | call to source : | summaries.rb:1:11:1:36 | call to identity : | -| summaries.rb:4:1:4:8 | tainted2 : | summaries.rb:9:6:9:13 | tainted2 | -| summaries.rb:4:1:4:8 | tainted2 : | summaries.rb:9:6:9:13 | tainted2 | -| summaries.rb:4:12:7:3 | call to apply_block : | summaries.rb:4:1:4:8 | tainted2 : | -| summaries.rb:4:12:7:3 | call to apply_block : | summaries.rb:4:1:4:8 | tainted2 : | -| summaries.rb:4:24:4:30 | tainted : | summaries.rb:4:12:7:3 | call to apply_block : | -| summaries.rb:4:24:4:30 | tainted : | summaries.rb:4:12:7:3 | call to apply_block : | -| summaries.rb:4:24:4:30 | tainted : | summaries.rb:4:36:4:36 | x : | -| summaries.rb:4:24:4:30 | tainted : | summaries.rb:4:36:4:36 | x : | -| summaries.rb:4:36:4:36 | x : | summaries.rb:5:8:5:8 | x | -| summaries.rb:4:36:4:36 | x : | summaries.rb:5:8:5:8 | x | -| summaries.rb:11:17:11:17 | x : | summaries.rb:12:8:12:8 | x | -| summaries.rb:11:17:11:17 | x : | summaries.rb:12:8:12:8 | x | -| summaries.rb:16:1:16:8 | tainted3 : | summaries.rb:18:6:18:13 | tainted3 | -| summaries.rb:16:1:16:8 | tainted3 : | summaries.rb:18:6:18:13 | tainted3 | -| summaries.rb:16:12:16:43 | call to apply_lambda : | summaries.rb:16:1:16:8 | tainted3 : | -| summaries.rb:16:12:16:43 | call to apply_lambda : | summaries.rb:16:1:16:8 | tainted3 : | -| summaries.rb:16:36:16:42 | tainted : | summaries.rb:11:17:11:17 | x : | -| summaries.rb:16:36:16:42 | tainted : | summaries.rb:11:17:11:17 | x : | -| summaries.rb:16:36:16:42 | tainted : | summaries.rb:16:12:16:43 | call to apply_lambda : | -| summaries.rb:16:36:16:42 | tainted : | summaries.rb:16:12:16:43 | call to apply_lambda : | -| summaries.rb:20:1:20:8 | tainted4 : | summaries.rb:21:6:21:13 | tainted4 | -| summaries.rb:20:12:20:32 | call to firstArg : | summaries.rb:20:1:20:8 | tainted4 : | -| summaries.rb:20:25:20:31 | tainted : | summaries.rb:20:12:20:32 | call to firstArg : | -| summaries.rb:26:1:26:8 | tainted5 : | summaries.rb:27:6:27:13 | tainted5 | -| summaries.rb:26:12:26:38 | call to secondArg : | summaries.rb:26:1:26:8 | tainted5 : | -| summaries.rb:26:31:26:37 | tainted : | summaries.rb:26:12:26:38 | call to secondArg : | -| summaries.rb:30:24:30:30 | tainted : | summaries.rb:30:6:30:42 | call to onlyWithBlock | -| summaries.rb:31:27:31:33 | tainted : | summaries.rb:31:6:31:34 | call to onlyWithoutBlock | -| summaries.rb:40:3:40:3 | t : | summaries.rb:41:24:41:24 | t : | -| summaries.rb:40:3:40:3 | t : | summaries.rb:42:24:42:24 | t : | -| summaries.rb:40:3:40:3 | t : | summaries.rb:44:8:44:8 | t : | -| summaries.rb:40:7:40:17 | call to source : | summaries.rb:40:3:40:3 | t : | -| summaries.rb:41:24:41:24 | t : | summaries.rb:41:8:41:25 | call to matchedByName | -| summaries.rb:42:24:42:24 | t : | summaries.rb:42:8:42:25 | call to matchedByName | -| summaries.rb:44:8:44:8 | t : | summaries.rb:44:8:44:27 | call to matchedByNameRcv | -| summaries.rb:48:24:48:41 | call to source : | summaries.rb:48:8:48:42 | call to preserveTaint | -| summaries.rb:51:24:51:30 | tainted : | summaries.rb:51:6:51:31 | call to namedArg | -| summaries.rb:53:1:53:4 | args [element :foo] : | summaries.rb:54:21:54:24 | args [element :foo] : | -| summaries.rb:53:15:53:31 | call to source : | summaries.rb:53:1:53:4 | args [element :foo] : | -| summaries.rb:54:19:54:24 | ** ... [element :foo] : | summaries.rb:54:6:54:25 | call to namedArg | -| summaries.rb:54:21:54:24 | args [element :foo] : | summaries.rb:54:19:54:24 | ** ... [element :foo] : | -| summaries.rb:56:22:56:28 | tainted : | summaries.rb:56:6:56:29 | call to anyArg | -| summaries.rb:57:17:57:23 | tainted : | summaries.rb:57:6:57:24 | call to anyArg | -| summaries.rb:59:27:59:33 | tainted : | summaries.rb:59:6:59:34 | call to anyNamedArg | -| summaries.rb:63:32:63:38 | tainted : | summaries.rb:63:6:63:39 | call to anyPositionFromOne | -| summaries.rb:65:23:65:29 | tainted : | summaries.rb:65:40:65:40 | x : | -| summaries.rb:65:40:65:40 | x : | summaries.rb:66:8:66:8 | x | -| summaries.rb:73:24:73:53 | call to source : | summaries.rb:73:8:73:54 | call to preserveTaint | -| summaries.rb:76:26:76:56 | call to source : | summaries.rb:76:8:76:57 | call to preserveTaint | -| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:82:6:82:6 | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:82:6:82:6 | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:83:6:83:6 | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:83:6:83:6 | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:85:6:85:6 | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:85:6:85:6 | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:87:5:87:5 | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:87:5:87:5 | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:91:5:91:5 | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:91:5:91:5 | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 2] : | summaries.rb:86:6:86:6 | a [element 2] : | -| summaries.rb:79:1:79:1 | a [element 2] : | summaries.rb:86:6:86:6 | a [element 2] : | -| summaries.rb:79:1:79:1 | a [element 2] : | summaries.rb:95:1:95:1 | a [element 2] : | -| summaries.rb:79:1:79:1 | a [element 2] : | summaries.rb:95:1:95:1 | a [element 2] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:79:1:79:1 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:79:1:79:1 | a [element 1] : | -| summaries.rb:79:32:79:46 | call to source : | summaries.rb:79:1:79:1 | a [element 2] : | -| summaries.rb:79:32:79:46 | call to source : | summaries.rb:79:1:79:1 | a [element 2] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:82:6:82:6 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:82:6:82:6 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:84:6:84:6 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:84:6:84:6 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:85:6:85:6 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:85:6:85:6 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:86:6:86:6 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:86:6:86:6 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:87:5:87:5 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:87:5:87:5 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:95:1:95:1 | a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:95:1:95:1 | a [element] : | -| summaries.rb:81:13:81:27 | call to source : | summaries.rb:81:1:81:1 | [post] a [element] : | -| summaries.rb:81:13:81:27 | call to source : | summaries.rb:81:1:81:1 | [post] a [element] : | -| summaries.rb:82:6:82:6 | a [element 1] : | summaries.rb:82:6:82:24 | call to readElementOne | -| summaries.rb:82:6:82:6 | a [element 1] : | summaries.rb:82:6:82:24 | call to readElementOne | -| summaries.rb:82:6:82:6 | a [element] : | summaries.rb:82:6:82:24 | call to readElementOne | -| summaries.rb:82:6:82:6 | a [element] : | summaries.rb:82:6:82:24 | call to readElementOne | -| summaries.rb:83:6:83:6 | a [element 1] : | summaries.rb:83:6:83:31 | call to readExactlyElementOne | -| summaries.rb:83:6:83:6 | a [element 1] : | summaries.rb:83:6:83:31 | call to readExactlyElementOne | -| summaries.rb:84:6:84:6 | a [element] : | summaries.rb:84:6:84:9 | ...[...] | -| summaries.rb:84:6:84:6 | a [element] : | summaries.rb:84:6:84:9 | ...[...] | -| summaries.rb:85:6:85:6 | a [element 1] : | summaries.rb:85:6:85:9 | ...[...] | -| summaries.rb:85:6:85:6 | a [element 1] : | summaries.rb:85:6:85:9 | ...[...] | -| summaries.rb:85:6:85:6 | a [element] : | summaries.rb:85:6:85:9 | ...[...] | -| summaries.rb:85:6:85:6 | a [element] : | summaries.rb:85:6:85:9 | ...[...] | -| summaries.rb:86:6:86:6 | a [element 2] : | summaries.rb:86:6:86:9 | ...[...] | -| summaries.rb:86:6:86:6 | a [element 2] : | summaries.rb:86:6:86:9 | ...[...] | -| summaries.rb:86:6:86:6 | a [element] : | summaries.rb:86:6:86:9 | ...[...] | -| summaries.rb:86:6:86:6 | a [element] : | summaries.rb:86:6:86:9 | ...[...] | -| summaries.rb:87:1:87:1 | b [element 1] : | summaries.rb:89:6:89:6 | b [element 1] : | -| summaries.rb:87:1:87:1 | b [element 1] : | summaries.rb:89:6:89:6 | b [element 1] : | -| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:88:6:88:6 | b [element] : | -| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:88:6:88:6 | b [element] : | -| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:89:6:89:6 | b [element] : | -| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:89:6:89:6 | b [element] : | -| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:90:6:90:6 | b [element] : | -| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:90:6:90:6 | b [element] : | -| summaries.rb:87:5:87:5 | a [element 1] : | summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | -| summaries.rb:87:5:87:5 | a [element 1] : | summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | -| summaries.rb:87:5:87:5 | a [element] : | summaries.rb:87:5:87:22 | call to withElementOne [element] : | -| summaries.rb:87:5:87:5 | a [element] : | summaries.rb:87:5:87:22 | call to withElementOne [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | summaries.rb:87:1:87:1 | b [element 1] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | summaries.rb:87:1:87:1 | b [element 1] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:87:1:87:1 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:87:1:87:1 | b [element] : | -| summaries.rb:88:6:88:6 | b [element] : | summaries.rb:88:6:88:9 | ...[...] | -| summaries.rb:88:6:88:6 | b [element] : | summaries.rb:88:6:88:9 | ...[...] | -| summaries.rb:89:6:89:6 | b [element 1] : | summaries.rb:89:6:89:9 | ...[...] | -| summaries.rb:89:6:89:6 | b [element 1] : | summaries.rb:89:6:89:9 | ...[...] | -| summaries.rb:89:6:89:6 | b [element] : | summaries.rb:89:6:89:9 | ...[...] | -| summaries.rb:89:6:89:6 | b [element] : | summaries.rb:89:6:89:9 | ...[...] | -| summaries.rb:90:6:90:6 | b [element] : | summaries.rb:90:6:90:9 | ...[...] | -| summaries.rb:90:6:90:6 | b [element] : | summaries.rb:90:6:90:9 | ...[...] | -| summaries.rb:91:1:91:1 | c [element 1] : | summaries.rb:93:6:93:6 | c [element 1] : | -| summaries.rb:91:1:91:1 | c [element 1] : | summaries.rb:93:6:93:6 | c [element 1] : | -| summaries.rb:91:5:91:5 | a [element 1] : | summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | -| summaries.rb:91:5:91:5 | a [element 1] : | summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | summaries.rb:91:1:91:1 | c [element 1] : | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | summaries.rb:91:1:91:1 | c [element 1] : | -| summaries.rb:93:6:93:6 | c [element 1] : | summaries.rb:93:6:93:9 | ...[...] | -| summaries.rb:93:6:93:6 | c [element 1] : | summaries.rb:93:6:93:9 | ...[...] | -| summaries.rb:95:1:95:1 | [post] a [element 2] : | summaries.rb:98:6:98:6 | a [element 2] : | -| summaries.rb:95:1:95:1 | [post] a [element 2] : | summaries.rb:98:6:98:6 | a [element 2] : | -| summaries.rb:95:1:95:1 | [post] a [element 2] : | summaries.rb:99:1:99:1 | a [element 2] : | -| summaries.rb:95:1:95:1 | [post] a [element 2] : | summaries.rb:99:1:99:1 | a [element 2] : | -| summaries.rb:95:1:95:1 | [post] a [element] : | summaries.rb:96:6:96:6 | a [element] : | -| summaries.rb:95:1:95:1 | [post] a [element] : | summaries.rb:96:6:96:6 | a [element] : | -| summaries.rb:95:1:95:1 | [post] a [element] : | summaries.rb:97:6:97:6 | a [element] : | -| summaries.rb:95:1:95:1 | [post] a [element] : | summaries.rb:97:6:97:6 | a [element] : | -| summaries.rb:95:1:95:1 | [post] a [element] : | summaries.rb:98:6:98:6 | a [element] : | -| summaries.rb:95:1:95:1 | [post] a [element] : | summaries.rb:98:6:98:6 | a [element] : | -| summaries.rb:95:1:95:1 | a [element 2] : | summaries.rb:95:1:95:1 | [post] a [element 2] : | -| summaries.rb:95:1:95:1 | a [element 2] : | summaries.rb:95:1:95:1 | [post] a [element 2] : | -| summaries.rb:95:1:95:1 | a [element] : | summaries.rb:95:1:95:1 | [post] a [element] : | -| summaries.rb:95:1:95:1 | a [element] : | summaries.rb:95:1:95:1 | [post] a [element] : | -| summaries.rb:96:6:96:6 | a [element] : | summaries.rb:96:6:96:9 | ...[...] | -| summaries.rb:96:6:96:6 | a [element] : | summaries.rb:96:6:96:9 | ...[...] | -| summaries.rb:97:6:97:6 | a [element] : | summaries.rb:97:6:97:9 | ...[...] | -| summaries.rb:97:6:97:6 | a [element] : | summaries.rb:97:6:97:9 | ...[...] | -| summaries.rb:98:6:98:6 | a [element 2] : | summaries.rb:98:6:98:9 | ...[...] | -| summaries.rb:98:6:98:6 | a [element 2] : | summaries.rb:98:6:98:9 | ...[...] | -| summaries.rb:98:6:98:6 | a [element] : | summaries.rb:98:6:98:9 | ...[...] | -| summaries.rb:98:6:98:6 | a [element] : | summaries.rb:98:6:98:9 | ...[...] | -| summaries.rb:99:1:99:1 | [post] a [element 2] : | summaries.rb:102:6:102:6 | a [element 2] : | -| summaries.rb:99:1:99:1 | [post] a [element 2] : | summaries.rb:102:6:102:6 | a [element 2] : | -| summaries.rb:99:1:99:1 | a [element 2] : | summaries.rb:99:1:99:1 | [post] a [element 2] : | -| summaries.rb:99:1:99:1 | a [element 2] : | summaries.rb:99:1:99:1 | [post] a [element 2] : | -| summaries.rb:102:6:102:6 | a [element 2] : | summaries.rb:102:6:102:9 | ...[...] | -| summaries.rb:102:6:102:6 | a [element 2] : | summaries.rb:102:6:102:9 | ...[...] | -| summaries.rb:103:1:103:1 | [post] d [element 3] : | summaries.rb:104:1:104:1 | d [element 3] : | -| summaries.rb:103:1:103:1 | [post] d [element 3] : | summaries.rb:104:1:104:1 | d [element 3] : | -| summaries.rb:103:8:103:22 | call to source : | summaries.rb:103:1:103:1 | [post] d [element 3] : | -| summaries.rb:103:8:103:22 | call to source : | summaries.rb:103:1:103:1 | [post] d [element 3] : | -| summaries.rb:104:1:104:1 | [post] d [element 3] : | summaries.rb:108:6:108:6 | d [element 3] : | -| summaries.rb:104:1:104:1 | [post] d [element 3] : | summaries.rb:108:6:108:6 | d [element 3] : | -| summaries.rb:104:1:104:1 | d [element 3] : | summaries.rb:104:1:104:1 | [post] d [element 3] : | -| summaries.rb:104:1:104:1 | d [element 3] : | summaries.rb:104:1:104:1 | [post] d [element 3] : | -| summaries.rb:108:6:108:6 | d [element 3] : | summaries.rb:108:6:108:9 | ...[...] | -| summaries.rb:108:6:108:6 | d [element 3] : | summaries.rb:108:6:108:9 | ...[...] | -| summaries.rb:111:1:111:1 | [post] x [@value] : | summaries.rb:112:6:112:6 | x [@value] : | -| summaries.rb:111:1:111:1 | [post] x [@value] : | summaries.rb:112:6:112:6 | x [@value] : | -| summaries.rb:111:13:111:26 | call to source : | summaries.rb:111:1:111:1 | [post] x [@value] : | -| summaries.rb:111:13:111:26 | call to source : | summaries.rb:111:1:111:1 | [post] x [@value] : | -| summaries.rb:112:6:112:6 | x [@value] : | summaries.rb:112:6:112:16 | call to get_value | -| summaries.rb:112:6:112:6 | x [@value] : | summaries.rb:112:6:112:16 | call to get_value | -| summaries.rb:122:16:122:22 | [post] tainted : | summaries.rb:128:14:128:20 | tainted : | -| summaries.rb:122:16:122:22 | [post] tainted : | summaries.rb:131:16:131:22 | tainted | -| summaries.rb:122:16:122:22 | [post] tainted : | summaries.rb:132:21:132:27 | tainted | -| summaries.rb:122:16:122:22 | [post] tainted : | summaries.rb:135:26:135:32 | tainted | -| summaries.rb:122:16:122:22 | [post] tainted : | summaries.rb:137:23:137:29 | tainted | -| summaries.rb:122:16:122:22 | [post] tainted : | summaries.rb:140:19:140:25 | tainted | -| summaries.rb:122:16:122:22 | [post] tainted : | summaries.rb:141:19:141:25 | tainted | -| summaries.rb:122:16:122:22 | [post] tainted : | summaries.rb:145:26:145:32 | tainted | -| summaries.rb:122:16:122:22 | [post] tainted : | summaries.rb:147:16:147:22 | tainted | -| summaries.rb:122:16:122:22 | [post] tainted : | summaries.rb:150:39:150:45 | tainted | -| summaries.rb:122:16:122:22 | tainted : | summaries.rb:122:16:122:22 | [post] tainted : | -| summaries.rb:122:16:122:22 | tainted : | summaries.rb:122:25:122:25 | [post] y : | -| summaries.rb:122:16:122:22 | tainted : | summaries.rb:122:33:122:33 | [post] z : | -| summaries.rb:122:25:122:25 | [post] y : | summaries.rb:124:6:124:6 | y | -| summaries.rb:122:33:122:33 | [post] z : | summaries.rb:125:6:125:6 | z | -| summaries.rb:128:1:128:1 | [post] x : | summaries.rb:129:6:129:6 | x | -| summaries.rb:128:14:128:20 | tainted : | summaries.rb:128:1:128:1 | [post] x : | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:2:6:2:12 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:2:6:2:12 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:4:24:4:30 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:4:24:4:30 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:16:36:16:42 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:16:36:16:42 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:20:25:20:31 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:26:31:26:37 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:30:24:30:30 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:31:27:31:33 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:34:16:34:22 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:34:16:34:22 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:35:16:35:22 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:35:16:35:22 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:36:21:36:27 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:36:21:36:27 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:37:36:37:42 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:37:36:37:42 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:51:24:51:30 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:56:22:56:28 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:57:17:57:23 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:59:27:59:33 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:63:32:63:38 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:65:23:65:29 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:122:16:122:22 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:128:14:128:20 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:131:16:131:22 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:131:16:131:22 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:132:21:132:27 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:132:21:132:27 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:135:26:135:32 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:135:26:135:32 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:137:23:137:29 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:137:23:137:29 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:140:19:140:25 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:140:19:140:25 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:141:19:141:25 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:141:19:141:25 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:145:26:145:32 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:145:26:145:32 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:147:16:147:22 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:147:16:147:22 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:150:39:150:45 | tainted | +| summaries.rb:1:1:1:7 | tainted | summaries.rb:150:39:150:45 | tainted | +| summaries.rb:1:11:1:36 | call to identity | summaries.rb:1:1:1:7 | tainted | +| summaries.rb:1:11:1:36 | call to identity | summaries.rb:1:1:1:7 | tainted | +| summaries.rb:1:20:1:36 | call to source | summaries.rb:1:11:1:36 | call to identity | +| summaries.rb:1:20:1:36 | call to source | summaries.rb:1:11:1:36 | call to identity | +| summaries.rb:4:1:4:8 | tainted2 | summaries.rb:9:6:9:13 | tainted2 | +| summaries.rb:4:1:4:8 | tainted2 | summaries.rb:9:6:9:13 | tainted2 | +| summaries.rb:4:12:7:3 | call to apply_block | summaries.rb:4:1:4:8 | tainted2 | +| summaries.rb:4:12:7:3 | call to apply_block | summaries.rb:4:1:4:8 | tainted2 | +| summaries.rb:4:24:4:30 | tainted | summaries.rb:4:12:7:3 | call to apply_block | +| summaries.rb:4:24:4:30 | tainted | summaries.rb:4:12:7:3 | call to apply_block | +| summaries.rb:4:24:4:30 | tainted | summaries.rb:4:36:4:36 | x | +| summaries.rb:4:24:4:30 | tainted | summaries.rb:4:36:4:36 | x | +| summaries.rb:4:36:4:36 | x | summaries.rb:5:8:5:8 | x | +| summaries.rb:4:36:4:36 | x | summaries.rb:5:8:5:8 | x | +| summaries.rb:11:17:11:17 | x | summaries.rb:12:8:12:8 | x | +| summaries.rb:11:17:11:17 | x | summaries.rb:12:8:12:8 | x | +| summaries.rb:16:1:16:8 | tainted3 | summaries.rb:18:6:18:13 | tainted3 | +| summaries.rb:16:1:16:8 | tainted3 | summaries.rb:18:6:18:13 | tainted3 | +| summaries.rb:16:12:16:43 | call to apply_lambda | summaries.rb:16:1:16:8 | tainted3 | +| summaries.rb:16:12:16:43 | call to apply_lambda | summaries.rb:16:1:16:8 | tainted3 | +| summaries.rb:16:36:16:42 | tainted | summaries.rb:11:17:11:17 | x | +| summaries.rb:16:36:16:42 | tainted | summaries.rb:11:17:11:17 | x | +| summaries.rb:16:36:16:42 | tainted | summaries.rb:16:12:16:43 | call to apply_lambda | +| summaries.rb:16:36:16:42 | tainted | summaries.rb:16:12:16:43 | call to apply_lambda | +| summaries.rb:20:1:20:8 | tainted4 | summaries.rb:21:6:21:13 | tainted4 | +| summaries.rb:20:12:20:32 | call to firstArg | summaries.rb:20:1:20:8 | tainted4 | +| summaries.rb:20:25:20:31 | tainted | summaries.rb:20:12:20:32 | call to firstArg | +| summaries.rb:26:1:26:8 | tainted5 | summaries.rb:27:6:27:13 | tainted5 | +| summaries.rb:26:12:26:38 | call to secondArg | summaries.rb:26:1:26:8 | tainted5 | +| summaries.rb:26:31:26:37 | tainted | summaries.rb:26:12:26:38 | call to secondArg | +| summaries.rb:30:24:30:30 | tainted | summaries.rb:30:6:30:42 | call to onlyWithBlock | +| summaries.rb:31:27:31:33 | tainted | summaries.rb:31:6:31:34 | call to onlyWithoutBlock | +| summaries.rb:40:3:40:3 | t | summaries.rb:41:24:41:24 | t | +| summaries.rb:40:3:40:3 | t | summaries.rb:42:24:42:24 | t | +| summaries.rb:40:3:40:3 | t | summaries.rb:44:8:44:8 | t | +| summaries.rb:40:7:40:17 | call to source | summaries.rb:40:3:40:3 | t | +| summaries.rb:41:24:41:24 | t | summaries.rb:41:8:41:25 | call to matchedByName | +| summaries.rb:42:24:42:24 | t | summaries.rb:42:8:42:25 | call to matchedByName | +| summaries.rb:44:8:44:8 | t | summaries.rb:44:8:44:27 | call to matchedByNameRcv | +| summaries.rb:48:24:48:41 | call to source | summaries.rb:48:8:48:42 | call to preserveTaint | +| summaries.rb:51:24:51:30 | tainted | summaries.rb:51:6:51:31 | call to namedArg | +| summaries.rb:53:1:53:4 | args [element :foo] | summaries.rb:54:21:54:24 | args [element :foo] | +| summaries.rb:53:15:53:31 | call to source | summaries.rb:53:1:53:4 | args [element :foo] | +| summaries.rb:54:19:54:24 | ** ... [element :foo] | summaries.rb:54:6:54:25 | call to namedArg | +| summaries.rb:54:21:54:24 | args [element :foo] | summaries.rb:54:19:54:24 | ** ... [element :foo] | +| summaries.rb:56:22:56:28 | tainted | summaries.rb:56:6:56:29 | call to anyArg | +| summaries.rb:57:17:57:23 | tainted | summaries.rb:57:6:57:24 | call to anyArg | +| summaries.rb:59:27:59:33 | tainted | summaries.rb:59:6:59:34 | call to anyNamedArg | +| summaries.rb:63:32:63:38 | tainted | summaries.rb:63:6:63:39 | call to anyPositionFromOne | +| summaries.rb:65:23:65:29 | tainted | summaries.rb:65:40:65:40 | x | +| summaries.rb:65:40:65:40 | x | summaries.rb:66:8:66:8 | x | +| summaries.rb:73:24:73:53 | call to source | summaries.rb:73:8:73:54 | call to preserveTaint | +| summaries.rb:76:26:76:56 | call to source | summaries.rb:76:8:76:57 | call to preserveTaint | +| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:82:6:82:6 | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:82:6:82:6 | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:83:6:83:6 | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:83:6:83:6 | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:85:6:85:6 | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:85:6:85:6 | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:87:5:87:5 | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:87:5:87:5 | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:91:5:91:5 | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:91:5:91:5 | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:86:6:86:6 | a [element 2] | +| summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:86:6:86:6 | a [element 2] | +| summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:95:1:95:1 | a [element 2] | +| summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:95:1:95:1 | a [element 2] | +| summaries.rb:79:15:79:29 | call to source | summaries.rb:79:1:79:1 | a [element 1] | +| summaries.rb:79:15:79:29 | call to source | summaries.rb:79:1:79:1 | a [element 1] | +| summaries.rb:79:32:79:46 | call to source | summaries.rb:79:1:79:1 | a [element 2] | +| summaries.rb:79:32:79:46 | call to source | summaries.rb:79:1:79:1 | a [element 2] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:82:6:82:6 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:82:6:82:6 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:84:6:84:6 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:84:6:84:6 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:85:6:85:6 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:85:6:85:6 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:86:6:86:6 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:86:6:86:6 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:87:5:87:5 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:87:5:87:5 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:95:1:95:1 | a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:95:1:95:1 | a [element] | +| summaries.rb:81:13:81:27 | call to source | summaries.rb:81:1:81:1 | [post] a [element] | +| summaries.rb:81:13:81:27 | call to source | summaries.rb:81:1:81:1 | [post] a [element] | +| summaries.rb:82:6:82:6 | a [element 1] | summaries.rb:82:6:82:24 | call to readElementOne | +| summaries.rb:82:6:82:6 | a [element 1] | summaries.rb:82:6:82:24 | call to readElementOne | +| summaries.rb:82:6:82:6 | a [element] | summaries.rb:82:6:82:24 | call to readElementOne | +| summaries.rb:82:6:82:6 | a [element] | summaries.rb:82:6:82:24 | call to readElementOne | +| summaries.rb:83:6:83:6 | a [element 1] | summaries.rb:83:6:83:31 | call to readExactlyElementOne | +| summaries.rb:83:6:83:6 | a [element 1] | summaries.rb:83:6:83:31 | call to readExactlyElementOne | +| summaries.rb:84:6:84:6 | a [element] | summaries.rb:84:6:84:9 | ...[...] | +| summaries.rb:84:6:84:6 | a [element] | summaries.rb:84:6:84:9 | ...[...] | +| summaries.rb:85:6:85:6 | a [element 1] | summaries.rb:85:6:85:9 | ...[...] | +| summaries.rb:85:6:85:6 | a [element 1] | summaries.rb:85:6:85:9 | ...[...] | +| summaries.rb:85:6:85:6 | a [element] | summaries.rb:85:6:85:9 | ...[...] | +| summaries.rb:85:6:85:6 | a [element] | summaries.rb:85:6:85:9 | ...[...] | +| summaries.rb:86:6:86:6 | a [element 2] | summaries.rb:86:6:86:9 | ...[...] | +| summaries.rb:86:6:86:6 | a [element 2] | summaries.rb:86:6:86:9 | ...[...] | +| summaries.rb:86:6:86:6 | a [element] | summaries.rb:86:6:86:9 | ...[...] | +| summaries.rb:86:6:86:6 | a [element] | summaries.rb:86:6:86:9 | ...[...] | +| summaries.rb:87:1:87:1 | b [element 1] | summaries.rb:89:6:89:6 | b [element 1] | +| summaries.rb:87:1:87:1 | b [element 1] | summaries.rb:89:6:89:6 | b [element 1] | +| summaries.rb:87:1:87:1 | b [element] | summaries.rb:88:6:88:6 | b [element] | +| summaries.rb:87:1:87:1 | b [element] | summaries.rb:88:6:88:6 | b [element] | +| summaries.rb:87:1:87:1 | b [element] | summaries.rb:89:6:89:6 | b [element] | +| summaries.rb:87:1:87:1 | b [element] | summaries.rb:89:6:89:6 | b [element] | +| summaries.rb:87:1:87:1 | b [element] | summaries.rb:90:6:90:6 | b [element] | +| summaries.rb:87:1:87:1 | b [element] | summaries.rb:90:6:90:6 | b [element] | +| summaries.rb:87:5:87:5 | a [element 1] | summaries.rb:87:5:87:22 | call to withElementOne [element 1] | +| summaries.rb:87:5:87:5 | a [element 1] | summaries.rb:87:5:87:22 | call to withElementOne [element 1] | +| summaries.rb:87:5:87:5 | a [element] | summaries.rb:87:5:87:22 | call to withElementOne [element] | +| summaries.rb:87:5:87:5 | a [element] | summaries.rb:87:5:87:22 | call to withElementOne [element] | +| summaries.rb:87:5:87:22 | call to withElementOne [element 1] | summaries.rb:87:1:87:1 | b [element 1] | +| summaries.rb:87:5:87:22 | call to withElementOne [element 1] | summaries.rb:87:1:87:1 | b [element 1] | +| summaries.rb:87:5:87:22 | call to withElementOne [element] | summaries.rb:87:1:87:1 | b [element] | +| summaries.rb:87:5:87:22 | call to withElementOne [element] | summaries.rb:87:1:87:1 | b [element] | +| summaries.rb:88:6:88:6 | b [element] | summaries.rb:88:6:88:9 | ...[...] | +| summaries.rb:88:6:88:6 | b [element] | summaries.rb:88:6:88:9 | ...[...] | +| summaries.rb:89:6:89:6 | b [element 1] | summaries.rb:89:6:89:9 | ...[...] | +| summaries.rb:89:6:89:6 | b [element 1] | summaries.rb:89:6:89:9 | ...[...] | +| summaries.rb:89:6:89:6 | b [element] | summaries.rb:89:6:89:9 | ...[...] | +| summaries.rb:89:6:89:6 | b [element] | summaries.rb:89:6:89:9 | ...[...] | +| summaries.rb:90:6:90:6 | b [element] | summaries.rb:90:6:90:9 | ...[...] | +| summaries.rb:90:6:90:6 | b [element] | summaries.rb:90:6:90:9 | ...[...] | +| summaries.rb:91:1:91:1 | c [element 1] | summaries.rb:93:6:93:6 | c [element 1] | +| summaries.rb:91:1:91:1 | c [element 1] | summaries.rb:93:6:93:6 | c [element 1] | +| summaries.rb:91:5:91:5 | a [element 1] | summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | +| summaries.rb:91:5:91:5 | a [element 1] | summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | +| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | summaries.rb:91:1:91:1 | c [element 1] | +| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | summaries.rb:91:1:91:1 | c [element 1] | +| summaries.rb:93:6:93:6 | c [element 1] | summaries.rb:93:6:93:9 | ...[...] | +| summaries.rb:93:6:93:6 | c [element 1] | summaries.rb:93:6:93:9 | ...[...] | +| summaries.rb:95:1:95:1 | [post] a [element 2] | summaries.rb:98:6:98:6 | a [element 2] | +| summaries.rb:95:1:95:1 | [post] a [element 2] | summaries.rb:98:6:98:6 | a [element 2] | +| summaries.rb:95:1:95:1 | [post] a [element 2] | summaries.rb:99:1:99:1 | a [element 2] | +| summaries.rb:95:1:95:1 | [post] a [element 2] | summaries.rb:99:1:99:1 | a [element 2] | +| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:96:6:96:6 | a [element] | +| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:96:6:96:6 | a [element] | +| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:97:6:97:6 | a [element] | +| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:97:6:97:6 | a [element] | +| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:98:6:98:6 | a [element] | +| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:98:6:98:6 | a [element] | +| summaries.rb:95:1:95:1 | a [element 2] | summaries.rb:95:1:95:1 | [post] a [element 2] | +| summaries.rb:95:1:95:1 | a [element 2] | summaries.rb:95:1:95:1 | [post] a [element 2] | +| summaries.rb:95:1:95:1 | a [element] | summaries.rb:95:1:95:1 | [post] a [element] | +| summaries.rb:95:1:95:1 | a [element] | summaries.rb:95:1:95:1 | [post] a [element] | +| summaries.rb:96:6:96:6 | a [element] | summaries.rb:96:6:96:9 | ...[...] | +| summaries.rb:96:6:96:6 | a [element] | summaries.rb:96:6:96:9 | ...[...] | +| summaries.rb:97:6:97:6 | a [element] | summaries.rb:97:6:97:9 | ...[...] | +| summaries.rb:97:6:97:6 | a [element] | summaries.rb:97:6:97:9 | ...[...] | +| summaries.rb:98:6:98:6 | a [element 2] | summaries.rb:98:6:98:9 | ...[...] | +| summaries.rb:98:6:98:6 | a [element 2] | summaries.rb:98:6:98:9 | ...[...] | +| summaries.rb:98:6:98:6 | a [element] | summaries.rb:98:6:98:9 | ...[...] | +| summaries.rb:98:6:98:6 | a [element] | summaries.rb:98:6:98:9 | ...[...] | +| summaries.rb:99:1:99:1 | [post] a [element 2] | summaries.rb:102:6:102:6 | a [element 2] | +| summaries.rb:99:1:99:1 | [post] a [element 2] | summaries.rb:102:6:102:6 | a [element 2] | +| summaries.rb:99:1:99:1 | a [element 2] | summaries.rb:99:1:99:1 | [post] a [element 2] | +| summaries.rb:99:1:99:1 | a [element 2] | summaries.rb:99:1:99:1 | [post] a [element 2] | +| summaries.rb:102:6:102:6 | a [element 2] | summaries.rb:102:6:102:9 | ...[...] | +| summaries.rb:102:6:102:6 | a [element 2] | summaries.rb:102:6:102:9 | ...[...] | +| summaries.rb:103:1:103:1 | [post] d [element 3] | summaries.rb:104:1:104:1 | d [element 3] | +| summaries.rb:103:1:103:1 | [post] d [element 3] | summaries.rb:104:1:104:1 | d [element 3] | +| summaries.rb:103:8:103:22 | call to source | summaries.rb:103:1:103:1 | [post] d [element 3] | +| summaries.rb:103:8:103:22 | call to source | summaries.rb:103:1:103:1 | [post] d [element 3] | +| summaries.rb:104:1:104:1 | [post] d [element 3] | summaries.rb:108:6:108:6 | d [element 3] | +| summaries.rb:104:1:104:1 | [post] d [element 3] | summaries.rb:108:6:108:6 | d [element 3] | +| summaries.rb:104:1:104:1 | d [element 3] | summaries.rb:104:1:104:1 | [post] d [element 3] | +| summaries.rb:104:1:104:1 | d [element 3] | summaries.rb:104:1:104:1 | [post] d [element 3] | +| summaries.rb:108:6:108:6 | d [element 3] | summaries.rb:108:6:108:9 | ...[...] | +| summaries.rb:108:6:108:6 | d [element 3] | summaries.rb:108:6:108:9 | ...[...] | +| summaries.rb:111:1:111:1 | [post] x [@value] | summaries.rb:112:6:112:6 | x [@value] | +| summaries.rb:111:1:111:1 | [post] x [@value] | summaries.rb:112:6:112:6 | x [@value] | +| summaries.rb:111:13:111:26 | call to source | summaries.rb:111:1:111:1 | [post] x [@value] | +| summaries.rb:111:13:111:26 | call to source | summaries.rb:111:1:111:1 | [post] x [@value] | +| summaries.rb:112:6:112:6 | x [@value] | summaries.rb:112:6:112:16 | call to get_value | +| summaries.rb:112:6:112:6 | x [@value] | summaries.rb:112:6:112:16 | call to get_value | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:128:14:128:20 | tainted | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:131:16:131:22 | tainted | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:132:21:132:27 | tainted | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:135:26:135:32 | tainted | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:137:23:137:29 | tainted | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:140:19:140:25 | tainted | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:141:19:141:25 | tainted | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:145:26:145:32 | tainted | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:147:16:147:22 | tainted | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:150:39:150:45 | tainted | +| summaries.rb:122:16:122:22 | tainted | summaries.rb:122:16:122:22 | [post] tainted | +| summaries.rb:122:16:122:22 | tainted | summaries.rb:122:25:122:25 | [post] y | +| summaries.rb:122:16:122:22 | tainted | summaries.rb:122:33:122:33 | [post] z | +| summaries.rb:122:25:122:25 | [post] y | summaries.rb:124:6:124:6 | y | +| summaries.rb:122:33:122:33 | [post] z | summaries.rb:125:6:125:6 | z | +| summaries.rb:128:1:128:1 | [post] x | summaries.rb:129:6:129:6 | x | +| summaries.rb:128:14:128:20 | tainted | summaries.rb:128:1:128:1 | [post] x | nodes -| summaries.rb:1:1:1:7 | tainted : | semmle.label | tainted : | -| summaries.rb:1:1:1:7 | tainted : | semmle.label | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | semmle.label | call to identity : | -| summaries.rb:1:11:1:36 | call to identity : | semmle.label | call to identity : | -| summaries.rb:1:20:1:36 | call to source : | semmle.label | call to source : | -| summaries.rb:1:20:1:36 | call to source : | semmle.label | call to source : | +| summaries.rb:1:1:1:7 | tainted | semmle.label | tainted | +| summaries.rb:1:1:1:7 | tainted | semmle.label | tainted | +| summaries.rb:1:11:1:36 | call to identity | semmle.label | call to identity | +| summaries.rb:1:11:1:36 | call to identity | semmle.label | call to identity | +| summaries.rb:1:20:1:36 | call to source | semmle.label | call to source | +| summaries.rb:1:20:1:36 | call to source | semmle.label | call to source | | summaries.rb:2:6:2:12 | tainted | semmle.label | tainted | | summaries.rb:2:6:2:12 | tainted | semmle.label | tainted | -| summaries.rb:4:1:4:8 | tainted2 : | semmle.label | tainted2 : | -| summaries.rb:4:1:4:8 | tainted2 : | semmle.label | tainted2 : | -| summaries.rb:4:12:7:3 | call to apply_block : | semmle.label | call to apply_block : | -| summaries.rb:4:12:7:3 | call to apply_block : | semmle.label | call to apply_block : | -| summaries.rb:4:24:4:30 | tainted : | semmle.label | tainted : | -| summaries.rb:4:24:4:30 | tainted : | semmle.label | tainted : | -| summaries.rb:4:36:4:36 | x : | semmle.label | x : | -| summaries.rb:4:36:4:36 | x : | semmle.label | x : | +| summaries.rb:4:1:4:8 | tainted2 | semmle.label | tainted2 | +| summaries.rb:4:1:4:8 | tainted2 | semmle.label | tainted2 | +| summaries.rb:4:12:7:3 | call to apply_block | semmle.label | call to apply_block | +| summaries.rb:4:12:7:3 | call to apply_block | semmle.label | call to apply_block | +| summaries.rb:4:24:4:30 | tainted | semmle.label | tainted | +| summaries.rb:4:24:4:30 | tainted | semmle.label | tainted | +| summaries.rb:4:36:4:36 | x | semmle.label | x | +| summaries.rb:4:36:4:36 | x | semmle.label | x | | summaries.rb:5:8:5:8 | x | semmle.label | x | | summaries.rb:5:8:5:8 | x | semmle.label | x | | summaries.rb:9:6:9:13 | tainted2 | semmle.label | tainted2 | | summaries.rb:9:6:9:13 | tainted2 | semmle.label | tainted2 | -| summaries.rb:11:17:11:17 | x : | semmle.label | x : | -| summaries.rb:11:17:11:17 | x : | semmle.label | x : | +| summaries.rb:11:17:11:17 | x | semmle.label | x | +| summaries.rb:11:17:11:17 | x | semmle.label | x | | summaries.rb:12:8:12:8 | x | semmle.label | x | | summaries.rb:12:8:12:8 | x | semmle.label | x | -| summaries.rb:16:1:16:8 | tainted3 : | semmle.label | tainted3 : | -| summaries.rb:16:1:16:8 | tainted3 : | semmle.label | tainted3 : | -| summaries.rb:16:12:16:43 | call to apply_lambda : | semmle.label | call to apply_lambda : | -| summaries.rb:16:12:16:43 | call to apply_lambda : | semmle.label | call to apply_lambda : | -| summaries.rb:16:36:16:42 | tainted : | semmle.label | tainted : | -| summaries.rb:16:36:16:42 | tainted : | semmle.label | tainted : | +| summaries.rb:16:1:16:8 | tainted3 | semmle.label | tainted3 | +| summaries.rb:16:1:16:8 | tainted3 | semmle.label | tainted3 | +| summaries.rb:16:12:16:43 | call to apply_lambda | semmle.label | call to apply_lambda | +| summaries.rb:16:12:16:43 | call to apply_lambda | semmle.label | call to apply_lambda | +| summaries.rb:16:36:16:42 | tainted | semmle.label | tainted | +| summaries.rb:16:36:16:42 | tainted | semmle.label | tainted | | summaries.rb:18:6:18:13 | tainted3 | semmle.label | tainted3 | | summaries.rb:18:6:18:13 | tainted3 | semmle.label | tainted3 | -| summaries.rb:20:1:20:8 | tainted4 : | semmle.label | tainted4 : | -| summaries.rb:20:12:20:32 | call to firstArg : | semmle.label | call to firstArg : | -| summaries.rb:20:25:20:31 | tainted : | semmle.label | tainted : | +| summaries.rb:20:1:20:8 | tainted4 | semmle.label | tainted4 | +| summaries.rb:20:12:20:32 | call to firstArg | semmle.label | call to firstArg | +| summaries.rb:20:25:20:31 | tainted | semmle.label | tainted | | summaries.rb:21:6:21:13 | tainted4 | semmle.label | tainted4 | -| summaries.rb:26:1:26:8 | tainted5 : | semmle.label | tainted5 : | -| summaries.rb:26:12:26:38 | call to secondArg : | semmle.label | call to secondArg : | -| summaries.rb:26:31:26:37 | tainted : | semmle.label | tainted : | +| summaries.rb:26:1:26:8 | tainted5 | semmle.label | tainted5 | +| summaries.rb:26:12:26:38 | call to secondArg | semmle.label | call to secondArg | +| summaries.rb:26:31:26:37 | tainted | semmle.label | tainted | | summaries.rb:27:6:27:13 | tainted5 | semmle.label | tainted5 | | summaries.rb:30:6:30:42 | call to onlyWithBlock | semmle.label | call to onlyWithBlock | -| summaries.rb:30:24:30:30 | tainted : | semmle.label | tainted : | +| summaries.rb:30:24:30:30 | tainted | semmle.label | tainted | | summaries.rb:31:6:31:34 | call to onlyWithoutBlock | semmle.label | call to onlyWithoutBlock | -| summaries.rb:31:27:31:33 | tainted : | semmle.label | tainted : | +| summaries.rb:31:27:31:33 | tainted | semmle.label | tainted | | summaries.rb:34:16:34:22 | tainted | semmle.label | tainted | | summaries.rb:34:16:34:22 | tainted | semmle.label | tainted | | summaries.rb:35:16:35:22 | tainted | semmle.label | tainted | @@ -291,170 +291,170 @@ nodes | summaries.rb:36:21:36:27 | tainted | semmle.label | tainted | | summaries.rb:37:36:37:42 | tainted | semmle.label | tainted | | summaries.rb:37:36:37:42 | tainted | semmle.label | tainted | -| summaries.rb:40:3:40:3 | t : | semmle.label | t : | -| summaries.rb:40:7:40:17 | call to source : | semmle.label | call to source : | +| summaries.rb:40:3:40:3 | t | semmle.label | t | +| summaries.rb:40:7:40:17 | call to source | semmle.label | call to source | | summaries.rb:41:8:41:25 | call to matchedByName | semmle.label | call to matchedByName | -| summaries.rb:41:24:41:24 | t : | semmle.label | t : | +| summaries.rb:41:24:41:24 | t | semmle.label | t | | summaries.rb:42:8:42:25 | call to matchedByName | semmle.label | call to matchedByName | -| summaries.rb:42:24:42:24 | t : | semmle.label | t : | -| summaries.rb:44:8:44:8 | t : | semmle.label | t : | +| summaries.rb:42:24:42:24 | t | semmle.label | t | +| summaries.rb:44:8:44:8 | t | semmle.label | t | | summaries.rb:44:8:44:27 | call to matchedByNameRcv | semmle.label | call to matchedByNameRcv | | summaries.rb:48:8:48:42 | call to preserveTaint | semmle.label | call to preserveTaint | -| summaries.rb:48:24:48:41 | call to source : | semmle.label | call to source : | +| summaries.rb:48:24:48:41 | call to source | semmle.label | call to source | | summaries.rb:51:6:51:31 | call to namedArg | semmle.label | call to namedArg | -| summaries.rb:51:24:51:30 | tainted : | semmle.label | tainted : | -| summaries.rb:53:1:53:4 | args [element :foo] : | semmle.label | args [element :foo] : | -| summaries.rb:53:15:53:31 | call to source : | semmle.label | call to source : | +| summaries.rb:51:24:51:30 | tainted | semmle.label | tainted | +| summaries.rb:53:1:53:4 | args [element :foo] | semmle.label | args [element :foo] | +| summaries.rb:53:15:53:31 | call to source | semmle.label | call to source | | summaries.rb:54:6:54:25 | call to namedArg | semmle.label | call to namedArg | -| summaries.rb:54:19:54:24 | ** ... [element :foo] : | semmle.label | ** ... [element :foo] : | -| summaries.rb:54:21:54:24 | args [element :foo] : | semmle.label | args [element :foo] : | +| summaries.rb:54:19:54:24 | ** ... [element :foo] | semmle.label | ** ... [element :foo] | +| summaries.rb:54:21:54:24 | args [element :foo] | semmle.label | args [element :foo] | | summaries.rb:56:6:56:29 | call to anyArg | semmle.label | call to anyArg | -| summaries.rb:56:22:56:28 | tainted : | semmle.label | tainted : | +| summaries.rb:56:22:56:28 | tainted | semmle.label | tainted | | summaries.rb:57:6:57:24 | call to anyArg | semmle.label | call to anyArg | -| summaries.rb:57:17:57:23 | tainted : | semmle.label | tainted : | +| summaries.rb:57:17:57:23 | tainted | semmle.label | tainted | | summaries.rb:59:6:59:34 | call to anyNamedArg | semmle.label | call to anyNamedArg | -| summaries.rb:59:27:59:33 | tainted : | semmle.label | tainted : | +| summaries.rb:59:27:59:33 | tainted | semmle.label | tainted | | summaries.rb:63:6:63:39 | call to anyPositionFromOne | semmle.label | call to anyPositionFromOne | -| summaries.rb:63:32:63:38 | tainted : | semmle.label | tainted : | -| summaries.rb:65:23:65:29 | tainted : | semmle.label | tainted : | -| summaries.rb:65:40:65:40 | x : | semmle.label | x : | +| summaries.rb:63:32:63:38 | tainted | semmle.label | tainted | +| summaries.rb:65:23:65:29 | tainted | semmle.label | tainted | +| summaries.rb:65:40:65:40 | x | semmle.label | x | | summaries.rb:66:8:66:8 | x | semmle.label | x | | summaries.rb:73:8:73:54 | call to preserveTaint | semmle.label | call to preserveTaint | -| summaries.rb:73:24:73:53 | call to source : | semmle.label | call to source : | +| summaries.rb:73:24:73:53 | call to source | semmle.label | call to source | | summaries.rb:76:8:76:57 | call to preserveTaint | semmle.label | call to preserveTaint | -| summaries.rb:76:26:76:56 | call to source : | semmle.label | call to source : | -| summaries.rb:79:1:79:1 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:79:1:79:1 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:79:1:79:1 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:79:15:79:29 | call to source : | semmle.label | call to source : | -| summaries.rb:79:15:79:29 | call to source : | semmle.label | call to source : | -| summaries.rb:79:32:79:46 | call to source : | semmle.label | call to source : | -| summaries.rb:79:32:79:46 | call to source : | semmle.label | call to source : | -| summaries.rb:81:1:81:1 | [post] a [element] : | semmle.label | [post] a [element] : | -| summaries.rb:81:1:81:1 | [post] a [element] : | semmle.label | [post] a [element] : | -| summaries.rb:81:13:81:27 | call to source : | semmle.label | call to source : | -| summaries.rb:81:13:81:27 | call to source : | semmle.label | call to source : | -| summaries.rb:82:6:82:6 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:82:6:82:6 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:82:6:82:6 | a [element] : | semmle.label | a [element] : | -| summaries.rb:82:6:82:6 | a [element] : | semmle.label | a [element] : | +| summaries.rb:76:26:76:56 | call to source | semmle.label | call to source | +| summaries.rb:79:1:79:1 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:79:1:79:1 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:79:1:79:1 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:79:15:79:29 | call to source | semmle.label | call to source | +| summaries.rb:79:15:79:29 | call to source | semmle.label | call to source | +| summaries.rb:79:32:79:46 | call to source | semmle.label | call to source | +| summaries.rb:79:32:79:46 | call to source | semmle.label | call to source | +| summaries.rb:81:1:81:1 | [post] a [element] | semmle.label | [post] a [element] | +| summaries.rb:81:1:81:1 | [post] a [element] | semmle.label | [post] a [element] | +| summaries.rb:81:13:81:27 | call to source | semmle.label | call to source | +| summaries.rb:81:13:81:27 | call to source | semmle.label | call to source | +| summaries.rb:82:6:82:6 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:82:6:82:6 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:82:6:82:6 | a [element] | semmle.label | a [element] | +| summaries.rb:82:6:82:6 | a [element] | semmle.label | a [element] | | summaries.rb:82:6:82:24 | call to readElementOne | semmle.label | call to readElementOne | | summaries.rb:82:6:82:24 | call to readElementOne | semmle.label | call to readElementOne | -| summaries.rb:83:6:83:6 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:83:6:83:6 | a [element 1] : | semmle.label | a [element 1] : | +| summaries.rb:83:6:83:6 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:83:6:83:6 | a [element 1] | semmle.label | a [element 1] | | summaries.rb:83:6:83:31 | call to readExactlyElementOne | semmle.label | call to readExactlyElementOne | | summaries.rb:83:6:83:31 | call to readExactlyElementOne | semmle.label | call to readExactlyElementOne | -| summaries.rb:84:6:84:6 | a [element] : | semmle.label | a [element] : | -| summaries.rb:84:6:84:6 | a [element] : | semmle.label | a [element] : | +| summaries.rb:84:6:84:6 | a [element] | semmle.label | a [element] | +| summaries.rb:84:6:84:6 | a [element] | semmle.label | a [element] | | summaries.rb:84:6:84:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:84:6:84:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:85:6:85:6 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:85:6:85:6 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:85:6:85:6 | a [element] : | semmle.label | a [element] : | -| summaries.rb:85:6:85:6 | a [element] : | semmle.label | a [element] : | +| summaries.rb:85:6:85:6 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:85:6:85:6 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:85:6:85:6 | a [element] | semmle.label | a [element] | +| summaries.rb:85:6:85:6 | a [element] | semmle.label | a [element] | | summaries.rb:85:6:85:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:85:6:85:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:86:6:86:6 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:86:6:86:6 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:86:6:86:6 | a [element] : | semmle.label | a [element] : | -| summaries.rb:86:6:86:6 | a [element] : | semmle.label | a [element] : | +| summaries.rb:86:6:86:6 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:86:6:86:6 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:86:6:86:6 | a [element] | semmle.label | a [element] | +| summaries.rb:86:6:86:6 | a [element] | semmle.label | a [element] | | summaries.rb:86:6:86:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:86:6:86:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:87:1:87:1 | b [element 1] : | semmle.label | b [element 1] : | -| summaries.rb:87:1:87:1 | b [element 1] : | semmle.label | b [element 1] : | -| summaries.rb:87:1:87:1 | b [element] : | semmle.label | b [element] : | -| summaries.rb:87:1:87:1 | b [element] : | semmle.label | b [element] : | -| summaries.rb:87:5:87:5 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:87:5:87:5 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:87:5:87:5 | a [element] : | semmle.label | a [element] : | -| summaries.rb:87:5:87:5 | a [element] : | semmle.label | a [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | semmle.label | call to withElementOne [element 1] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | semmle.label | call to withElementOne [element 1] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | semmle.label | call to withElementOne [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | semmle.label | call to withElementOne [element] : | -| summaries.rb:88:6:88:6 | b [element] : | semmle.label | b [element] : | -| summaries.rb:88:6:88:6 | b [element] : | semmle.label | b [element] : | +| summaries.rb:87:1:87:1 | b [element 1] | semmle.label | b [element 1] | +| summaries.rb:87:1:87:1 | b [element 1] | semmle.label | b [element 1] | +| summaries.rb:87:1:87:1 | b [element] | semmle.label | b [element] | +| summaries.rb:87:1:87:1 | b [element] | semmle.label | b [element] | +| summaries.rb:87:5:87:5 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:87:5:87:5 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:87:5:87:5 | a [element] | semmle.label | a [element] | +| summaries.rb:87:5:87:5 | a [element] | semmle.label | a [element] | +| summaries.rb:87:5:87:22 | call to withElementOne [element 1] | semmle.label | call to withElementOne [element 1] | +| summaries.rb:87:5:87:22 | call to withElementOne [element 1] | semmle.label | call to withElementOne [element 1] | +| summaries.rb:87:5:87:22 | call to withElementOne [element] | semmle.label | call to withElementOne [element] | +| summaries.rb:87:5:87:22 | call to withElementOne [element] | semmle.label | call to withElementOne [element] | +| summaries.rb:88:6:88:6 | b [element] | semmle.label | b [element] | +| summaries.rb:88:6:88:6 | b [element] | semmle.label | b [element] | | summaries.rb:88:6:88:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:88:6:88:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:89:6:89:6 | b [element 1] : | semmle.label | b [element 1] : | -| summaries.rb:89:6:89:6 | b [element 1] : | semmle.label | b [element 1] : | -| summaries.rb:89:6:89:6 | b [element] : | semmle.label | b [element] : | -| summaries.rb:89:6:89:6 | b [element] : | semmle.label | b [element] : | +| summaries.rb:89:6:89:6 | b [element 1] | semmle.label | b [element 1] | +| summaries.rb:89:6:89:6 | b [element 1] | semmle.label | b [element 1] | +| summaries.rb:89:6:89:6 | b [element] | semmle.label | b [element] | +| summaries.rb:89:6:89:6 | b [element] | semmle.label | b [element] | | summaries.rb:89:6:89:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:89:6:89:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:90:6:90:6 | b [element] : | semmle.label | b [element] : | -| summaries.rb:90:6:90:6 | b [element] : | semmle.label | b [element] : | +| summaries.rb:90:6:90:6 | b [element] | semmle.label | b [element] | +| summaries.rb:90:6:90:6 | b [element] | semmle.label | b [element] | | summaries.rb:90:6:90:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:90:6:90:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:91:1:91:1 | c [element 1] : | semmle.label | c [element 1] : | -| summaries.rb:91:1:91:1 | c [element 1] : | semmle.label | c [element 1] : | -| summaries.rb:91:5:91:5 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:91:5:91:5 | a [element 1] : | semmle.label | a [element 1] : | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | semmle.label | call to withExactlyElementOne [element 1] : | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | semmle.label | call to withExactlyElementOne [element 1] : | -| summaries.rb:93:6:93:6 | c [element 1] : | semmle.label | c [element 1] : | -| summaries.rb:93:6:93:6 | c [element 1] : | semmle.label | c [element 1] : | +| summaries.rb:91:1:91:1 | c [element 1] | semmle.label | c [element 1] | +| summaries.rb:91:1:91:1 | c [element 1] | semmle.label | c [element 1] | +| summaries.rb:91:5:91:5 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:91:5:91:5 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | semmle.label | call to withExactlyElementOne [element 1] | +| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | semmle.label | call to withExactlyElementOne [element 1] | +| summaries.rb:93:6:93:6 | c [element 1] | semmle.label | c [element 1] | +| summaries.rb:93:6:93:6 | c [element 1] | semmle.label | c [element 1] | | summaries.rb:93:6:93:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:93:6:93:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:95:1:95:1 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| summaries.rb:95:1:95:1 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| summaries.rb:95:1:95:1 | [post] a [element] : | semmle.label | [post] a [element] : | -| summaries.rb:95:1:95:1 | [post] a [element] : | semmle.label | [post] a [element] : | -| summaries.rb:95:1:95:1 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:95:1:95:1 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:95:1:95:1 | a [element] : | semmle.label | a [element] : | -| summaries.rb:95:1:95:1 | a [element] : | semmle.label | a [element] : | -| summaries.rb:96:6:96:6 | a [element] : | semmle.label | a [element] : | -| summaries.rb:96:6:96:6 | a [element] : | semmle.label | a [element] : | +| summaries.rb:95:1:95:1 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| summaries.rb:95:1:95:1 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| summaries.rb:95:1:95:1 | [post] a [element] | semmle.label | [post] a [element] | +| summaries.rb:95:1:95:1 | [post] a [element] | semmle.label | [post] a [element] | +| summaries.rb:95:1:95:1 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:95:1:95:1 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:95:1:95:1 | a [element] | semmle.label | a [element] | +| summaries.rb:95:1:95:1 | a [element] | semmle.label | a [element] | +| summaries.rb:96:6:96:6 | a [element] | semmle.label | a [element] | +| summaries.rb:96:6:96:6 | a [element] | semmle.label | a [element] | | summaries.rb:96:6:96:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:96:6:96:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:97:6:97:6 | a [element] : | semmle.label | a [element] : | -| summaries.rb:97:6:97:6 | a [element] : | semmle.label | a [element] : | +| summaries.rb:97:6:97:6 | a [element] | semmle.label | a [element] | +| summaries.rb:97:6:97:6 | a [element] | semmle.label | a [element] | | summaries.rb:97:6:97:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:97:6:97:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:98:6:98:6 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:98:6:98:6 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:98:6:98:6 | a [element] : | semmle.label | a [element] : | -| summaries.rb:98:6:98:6 | a [element] : | semmle.label | a [element] : | +| summaries.rb:98:6:98:6 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:98:6:98:6 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:98:6:98:6 | a [element] | semmle.label | a [element] | +| summaries.rb:98:6:98:6 | a [element] | semmle.label | a [element] | | summaries.rb:98:6:98:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:98:6:98:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:99:1:99:1 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| summaries.rb:99:1:99:1 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | -| summaries.rb:99:1:99:1 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:99:1:99:1 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:102:6:102:6 | a [element 2] : | semmle.label | a [element 2] : | -| summaries.rb:102:6:102:6 | a [element 2] : | semmle.label | a [element 2] : | +| summaries.rb:99:1:99:1 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| summaries.rb:99:1:99:1 | [post] a [element 2] | semmle.label | [post] a [element 2] | +| summaries.rb:99:1:99:1 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:99:1:99:1 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:102:6:102:6 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:102:6:102:6 | a [element 2] | semmle.label | a [element 2] | | summaries.rb:102:6:102:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:102:6:102:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:103:1:103:1 | [post] d [element 3] : | semmle.label | [post] d [element 3] : | -| summaries.rb:103:1:103:1 | [post] d [element 3] : | semmle.label | [post] d [element 3] : | -| summaries.rb:103:8:103:22 | call to source : | semmle.label | call to source : | -| summaries.rb:103:8:103:22 | call to source : | semmle.label | call to source : | -| summaries.rb:104:1:104:1 | [post] d [element 3] : | semmle.label | [post] d [element 3] : | -| summaries.rb:104:1:104:1 | [post] d [element 3] : | semmle.label | [post] d [element 3] : | -| summaries.rb:104:1:104:1 | d [element 3] : | semmle.label | d [element 3] : | -| summaries.rb:104:1:104:1 | d [element 3] : | semmle.label | d [element 3] : | -| summaries.rb:108:6:108:6 | d [element 3] : | semmle.label | d [element 3] : | -| summaries.rb:108:6:108:6 | d [element 3] : | semmle.label | d [element 3] : | +| summaries.rb:103:1:103:1 | [post] d [element 3] | semmle.label | [post] d [element 3] | +| summaries.rb:103:1:103:1 | [post] d [element 3] | semmle.label | [post] d [element 3] | +| summaries.rb:103:8:103:22 | call to source | semmle.label | call to source | +| summaries.rb:103:8:103:22 | call to source | semmle.label | call to source | +| summaries.rb:104:1:104:1 | [post] d [element 3] | semmle.label | [post] d [element 3] | +| summaries.rb:104:1:104:1 | [post] d [element 3] | semmle.label | [post] d [element 3] | +| summaries.rb:104:1:104:1 | d [element 3] | semmle.label | d [element 3] | +| summaries.rb:104:1:104:1 | d [element 3] | semmle.label | d [element 3] | +| summaries.rb:108:6:108:6 | d [element 3] | semmle.label | d [element 3] | +| summaries.rb:108:6:108:6 | d [element 3] | semmle.label | d [element 3] | | summaries.rb:108:6:108:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:108:6:108:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:111:1:111:1 | [post] x [@value] : | semmle.label | [post] x [@value] : | -| summaries.rb:111:1:111:1 | [post] x [@value] : | semmle.label | [post] x [@value] : | -| summaries.rb:111:13:111:26 | call to source : | semmle.label | call to source : | -| summaries.rb:111:13:111:26 | call to source : | semmle.label | call to source : | -| summaries.rb:112:6:112:6 | x [@value] : | semmle.label | x [@value] : | -| summaries.rb:112:6:112:6 | x [@value] : | semmle.label | x [@value] : | +| summaries.rb:111:1:111:1 | [post] x [@value] | semmle.label | [post] x [@value] | +| summaries.rb:111:1:111:1 | [post] x [@value] | semmle.label | [post] x [@value] | +| summaries.rb:111:13:111:26 | call to source | semmle.label | call to source | +| summaries.rb:111:13:111:26 | call to source | semmle.label | call to source | +| summaries.rb:112:6:112:6 | x [@value] | semmle.label | x [@value] | +| summaries.rb:112:6:112:6 | x [@value] | semmle.label | x [@value] | | summaries.rb:112:6:112:16 | call to get_value | semmle.label | call to get_value | | summaries.rb:112:6:112:16 | call to get_value | semmle.label | call to get_value | -| summaries.rb:122:16:122:22 | [post] tainted : | semmle.label | [post] tainted : | -| summaries.rb:122:16:122:22 | tainted : | semmle.label | tainted : | -| summaries.rb:122:25:122:25 | [post] y : | semmle.label | [post] y : | -| summaries.rb:122:33:122:33 | [post] z : | semmle.label | [post] z : | +| summaries.rb:122:16:122:22 | [post] tainted | semmle.label | [post] tainted | +| summaries.rb:122:16:122:22 | tainted | semmle.label | tainted | +| summaries.rb:122:25:122:25 | [post] y | semmle.label | [post] y | +| summaries.rb:122:33:122:33 | [post] z | semmle.label | [post] z | | summaries.rb:124:6:124:6 | y | semmle.label | y | | summaries.rb:125:6:125:6 | z | semmle.label | z | -| summaries.rb:128:1:128:1 | [post] x : | semmle.label | [post] x : | -| summaries.rb:128:14:128:20 | tainted : | semmle.label | tainted : | +| summaries.rb:128:1:128:1 | [post] x | semmle.label | [post] x | +| summaries.rb:128:14:128:20 | tainted | semmle.label | tainted | | summaries.rb:129:6:129:6 | x | semmle.label | x | | summaries.rb:131:16:131:22 | tainted | semmle.label | tainted | | summaries.rb:131:16:131:22 | tainted | semmle.label | tainted | @@ -477,102 +477,102 @@ nodes subpaths invalidSpecComponent #select -| summaries.rb:2:6:2:12 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:2:6:2:12 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:2:6:2:12 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:2:6:2:12 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:5:8:5:8 | x | summaries.rb:1:20:1:36 | call to source : | summaries.rb:5:8:5:8 | x | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:5:8:5:8 | x | summaries.rb:1:20:1:36 | call to source : | summaries.rb:5:8:5:8 | x | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:9:6:9:13 | tainted2 | summaries.rb:1:20:1:36 | call to source : | summaries.rb:9:6:9:13 | tainted2 | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:9:6:9:13 | tainted2 | summaries.rb:1:20:1:36 | call to source : | summaries.rb:9:6:9:13 | tainted2 | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:12:8:12:8 | x | summaries.rb:1:20:1:36 | call to source : | summaries.rb:12:8:12:8 | x | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:12:8:12:8 | x | summaries.rb:1:20:1:36 | call to source : | summaries.rb:12:8:12:8 | x | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:18:6:18:13 | tainted3 | summaries.rb:1:20:1:36 | call to source : | summaries.rb:18:6:18:13 | tainted3 | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:18:6:18:13 | tainted3 | summaries.rb:1:20:1:36 | call to source : | summaries.rb:18:6:18:13 | tainted3 | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:21:6:21:13 | tainted4 | summaries.rb:1:20:1:36 | call to source : | summaries.rb:21:6:21:13 | tainted4 | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:27:6:27:13 | tainted5 | summaries.rb:1:20:1:36 | call to source : | summaries.rb:27:6:27:13 | tainted5 | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:30:6:30:42 | call to onlyWithBlock | summaries.rb:1:20:1:36 | call to source : | summaries.rb:30:6:30:42 | call to onlyWithBlock | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:31:6:31:34 | call to onlyWithoutBlock | summaries.rb:1:20:1:36 | call to source : | summaries.rb:31:6:31:34 | call to onlyWithoutBlock | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:34:16:34:22 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:34:16:34:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:34:16:34:22 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:34:16:34:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:35:16:35:22 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:35:16:35:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:35:16:35:22 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:35:16:35:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:36:21:36:27 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:36:21:36:27 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:36:21:36:27 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:36:21:36:27 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:37:36:37:42 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:37:36:37:42 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:37:36:37:42 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:37:36:37:42 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:41:8:41:25 | call to matchedByName | summaries.rb:40:7:40:17 | call to source : | summaries.rb:41:8:41:25 | call to matchedByName | $@ | summaries.rb:40:7:40:17 | call to source : | call to source : | -| summaries.rb:42:8:42:25 | call to matchedByName | summaries.rb:40:7:40:17 | call to source : | summaries.rb:42:8:42:25 | call to matchedByName | $@ | summaries.rb:40:7:40:17 | call to source : | call to source : | -| summaries.rb:44:8:44:27 | call to matchedByNameRcv | summaries.rb:40:7:40:17 | call to source : | summaries.rb:44:8:44:27 | call to matchedByNameRcv | $@ | summaries.rb:40:7:40:17 | call to source : | call to source : | -| summaries.rb:48:8:48:42 | call to preserveTaint | summaries.rb:48:24:48:41 | call to source : | summaries.rb:48:8:48:42 | call to preserveTaint | $@ | summaries.rb:48:24:48:41 | call to source : | call to source : | -| summaries.rb:51:6:51:31 | call to namedArg | summaries.rb:1:20:1:36 | call to source : | summaries.rb:51:6:51:31 | call to namedArg | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:54:6:54:25 | call to namedArg | summaries.rb:53:15:53:31 | call to source : | summaries.rb:54:6:54:25 | call to namedArg | $@ | summaries.rb:53:15:53:31 | call to source : | call to source : | -| summaries.rb:56:6:56:29 | call to anyArg | summaries.rb:1:20:1:36 | call to source : | summaries.rb:56:6:56:29 | call to anyArg | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:57:6:57:24 | call to anyArg | summaries.rb:1:20:1:36 | call to source : | summaries.rb:57:6:57:24 | call to anyArg | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:59:6:59:34 | call to anyNamedArg | summaries.rb:1:20:1:36 | call to source : | summaries.rb:59:6:59:34 | call to anyNamedArg | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:63:6:63:39 | call to anyPositionFromOne | summaries.rb:1:20:1:36 | call to source : | summaries.rb:63:6:63:39 | call to anyPositionFromOne | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:66:8:66:8 | x | summaries.rb:1:20:1:36 | call to source : | summaries.rb:66:8:66:8 | x | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:73:8:73:54 | call to preserveTaint | summaries.rb:73:24:73:53 | call to source : | summaries.rb:73:8:73:54 | call to preserveTaint | $@ | summaries.rb:73:24:73:53 | call to source : | call to source : | -| summaries.rb:76:8:76:57 | call to preserveTaint | summaries.rb:76:26:76:56 | call to source : | summaries.rb:76:8:76:57 | call to preserveTaint | $@ | summaries.rb:76:26:76:56 | call to source : | call to source : | -| summaries.rb:82:6:82:24 | call to readElementOne | summaries.rb:79:15:79:29 | call to source : | summaries.rb:82:6:82:24 | call to readElementOne | $@ | summaries.rb:79:15:79:29 | call to source : | call to source : | -| summaries.rb:82:6:82:24 | call to readElementOne | summaries.rb:79:15:79:29 | call to source : | summaries.rb:82:6:82:24 | call to readElementOne | $@ | summaries.rb:79:15:79:29 | call to source : | call to source : | -| summaries.rb:82:6:82:24 | call to readElementOne | summaries.rb:81:13:81:27 | call to source : | summaries.rb:82:6:82:24 | call to readElementOne | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:82:6:82:24 | call to readElementOne | summaries.rb:81:13:81:27 | call to source : | summaries.rb:82:6:82:24 | call to readElementOne | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:83:6:83:31 | call to readExactlyElementOne | summaries.rb:79:15:79:29 | call to source : | summaries.rb:83:6:83:31 | call to readExactlyElementOne | $@ | summaries.rb:79:15:79:29 | call to source : | call to source : | -| summaries.rb:83:6:83:31 | call to readExactlyElementOne | summaries.rb:79:15:79:29 | call to source : | summaries.rb:83:6:83:31 | call to readExactlyElementOne | $@ | summaries.rb:79:15:79:29 | call to source : | call to source : | -| summaries.rb:84:6:84:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:84:6:84:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:84:6:84:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:84:6:84:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:85:6:85:9 | ...[...] | summaries.rb:79:15:79:29 | call to source : | summaries.rb:85:6:85:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source : | call to source : | -| summaries.rb:85:6:85:9 | ...[...] | summaries.rb:79:15:79:29 | call to source : | summaries.rb:85:6:85:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source : | call to source : | -| summaries.rb:85:6:85:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:85:6:85:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:85:6:85:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:85:6:85:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:86:6:86:9 | ...[...] | summaries.rb:79:32:79:46 | call to source : | summaries.rb:86:6:86:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source : | call to source : | -| summaries.rb:86:6:86:9 | ...[...] | summaries.rb:79:32:79:46 | call to source : | summaries.rb:86:6:86:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source : | call to source : | -| summaries.rb:86:6:86:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:86:6:86:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:86:6:86:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:86:6:86:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:88:6:88:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:88:6:88:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:88:6:88:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:88:6:88:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:89:6:89:9 | ...[...] | summaries.rb:79:15:79:29 | call to source : | summaries.rb:89:6:89:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source : | call to source : | -| summaries.rb:89:6:89:9 | ...[...] | summaries.rb:79:15:79:29 | call to source : | summaries.rb:89:6:89:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source : | call to source : | -| summaries.rb:89:6:89:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:89:6:89:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:89:6:89:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:89:6:89:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:90:6:90:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:90:6:90:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:90:6:90:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:90:6:90:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:93:6:93:9 | ...[...] | summaries.rb:79:15:79:29 | call to source : | summaries.rb:93:6:93:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source : | call to source : | -| summaries.rb:93:6:93:9 | ...[...] | summaries.rb:79:15:79:29 | call to source : | summaries.rb:93:6:93:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source : | call to source : | -| summaries.rb:96:6:96:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:96:6:96:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:96:6:96:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:96:6:96:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:97:6:97:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:97:6:97:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:97:6:97:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:97:6:97:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:98:6:98:9 | ...[...] | summaries.rb:79:32:79:46 | call to source : | summaries.rb:98:6:98:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source : | call to source : | -| summaries.rb:98:6:98:9 | ...[...] | summaries.rb:79:32:79:46 | call to source : | summaries.rb:98:6:98:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source : | call to source : | -| summaries.rb:98:6:98:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:98:6:98:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:98:6:98:9 | ...[...] | summaries.rb:81:13:81:27 | call to source : | summaries.rb:98:6:98:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source : | call to source : | -| summaries.rb:102:6:102:9 | ...[...] | summaries.rb:79:32:79:46 | call to source : | summaries.rb:102:6:102:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source : | call to source : | -| summaries.rb:102:6:102:9 | ...[...] | summaries.rb:79:32:79:46 | call to source : | summaries.rb:102:6:102:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source : | call to source : | -| summaries.rb:108:6:108:9 | ...[...] | summaries.rb:103:8:103:22 | call to source : | summaries.rb:108:6:108:9 | ...[...] | $@ | summaries.rb:103:8:103:22 | call to source : | call to source : | -| summaries.rb:108:6:108:9 | ...[...] | summaries.rb:103:8:103:22 | call to source : | summaries.rb:108:6:108:9 | ...[...] | $@ | summaries.rb:103:8:103:22 | call to source : | call to source : | -| summaries.rb:112:6:112:16 | call to get_value | summaries.rb:111:13:111:26 | call to source : | summaries.rb:112:6:112:16 | call to get_value | $@ | summaries.rb:111:13:111:26 | call to source : | call to source : | -| summaries.rb:112:6:112:16 | call to get_value | summaries.rb:111:13:111:26 | call to source : | summaries.rb:112:6:112:16 | call to get_value | $@ | summaries.rb:111:13:111:26 | call to source : | call to source : | -| summaries.rb:124:6:124:6 | y | summaries.rb:1:20:1:36 | call to source : | summaries.rb:124:6:124:6 | y | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:125:6:125:6 | z | summaries.rb:1:20:1:36 | call to source : | summaries.rb:125:6:125:6 | z | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:129:6:129:6 | x | summaries.rb:1:20:1:36 | call to source : | summaries.rb:129:6:129:6 | x | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:131:16:131:22 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:131:16:131:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:131:16:131:22 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:131:16:131:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:132:21:132:27 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:132:21:132:27 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:132:21:132:27 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:132:21:132:27 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:135:26:135:32 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:135:26:135:32 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:135:26:135:32 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:135:26:135:32 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:137:23:137:29 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:137:23:137:29 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:137:23:137:29 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:137:23:137:29 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:140:19:140:25 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:140:19:140:25 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:140:19:140:25 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:140:19:140:25 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:141:19:141:25 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:141:19:141:25 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:141:19:141:25 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:141:19:141:25 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:145:26:145:32 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:145:26:145:32 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:145:26:145:32 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:145:26:145:32 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:147:16:147:22 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:147:16:147:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:147:16:147:22 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:147:16:147:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:150:39:150:45 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:150:39:150:45 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | -| summaries.rb:150:39:150:45 | tainted | summaries.rb:1:20:1:36 | call to source : | summaries.rb:150:39:150:45 | tainted | $@ | summaries.rb:1:20:1:36 | call to source : | call to source : | +| summaries.rb:2:6:2:12 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:2:6:2:12 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:2:6:2:12 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:2:6:2:12 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:5:8:5:8 | x | summaries.rb:1:20:1:36 | call to source | summaries.rb:5:8:5:8 | x | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:5:8:5:8 | x | summaries.rb:1:20:1:36 | call to source | summaries.rb:5:8:5:8 | x | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:9:6:9:13 | tainted2 | summaries.rb:1:20:1:36 | call to source | summaries.rb:9:6:9:13 | tainted2 | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:9:6:9:13 | tainted2 | summaries.rb:1:20:1:36 | call to source | summaries.rb:9:6:9:13 | tainted2 | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:12:8:12:8 | x | summaries.rb:1:20:1:36 | call to source | summaries.rb:12:8:12:8 | x | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:12:8:12:8 | x | summaries.rb:1:20:1:36 | call to source | summaries.rb:12:8:12:8 | x | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:18:6:18:13 | tainted3 | summaries.rb:1:20:1:36 | call to source | summaries.rb:18:6:18:13 | tainted3 | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:18:6:18:13 | tainted3 | summaries.rb:1:20:1:36 | call to source | summaries.rb:18:6:18:13 | tainted3 | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:21:6:21:13 | tainted4 | summaries.rb:1:20:1:36 | call to source | summaries.rb:21:6:21:13 | tainted4 | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:27:6:27:13 | tainted5 | summaries.rb:1:20:1:36 | call to source | summaries.rb:27:6:27:13 | tainted5 | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:30:6:30:42 | call to onlyWithBlock | summaries.rb:1:20:1:36 | call to source | summaries.rb:30:6:30:42 | call to onlyWithBlock | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:31:6:31:34 | call to onlyWithoutBlock | summaries.rb:1:20:1:36 | call to source | summaries.rb:31:6:31:34 | call to onlyWithoutBlock | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:34:16:34:22 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:34:16:34:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:34:16:34:22 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:34:16:34:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:35:16:35:22 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:35:16:35:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:35:16:35:22 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:35:16:35:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:36:21:36:27 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:36:21:36:27 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:36:21:36:27 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:36:21:36:27 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:37:36:37:42 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:37:36:37:42 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:37:36:37:42 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:37:36:37:42 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:41:8:41:25 | call to matchedByName | summaries.rb:40:7:40:17 | call to source | summaries.rb:41:8:41:25 | call to matchedByName | $@ | summaries.rb:40:7:40:17 | call to source | call to source | +| summaries.rb:42:8:42:25 | call to matchedByName | summaries.rb:40:7:40:17 | call to source | summaries.rb:42:8:42:25 | call to matchedByName | $@ | summaries.rb:40:7:40:17 | call to source | call to source | +| summaries.rb:44:8:44:27 | call to matchedByNameRcv | summaries.rb:40:7:40:17 | call to source | summaries.rb:44:8:44:27 | call to matchedByNameRcv | $@ | summaries.rb:40:7:40:17 | call to source | call to source | +| summaries.rb:48:8:48:42 | call to preserveTaint | summaries.rb:48:24:48:41 | call to source | summaries.rb:48:8:48:42 | call to preserveTaint | $@ | summaries.rb:48:24:48:41 | call to source | call to source | +| summaries.rb:51:6:51:31 | call to namedArg | summaries.rb:1:20:1:36 | call to source | summaries.rb:51:6:51:31 | call to namedArg | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:54:6:54:25 | call to namedArg | summaries.rb:53:15:53:31 | call to source | summaries.rb:54:6:54:25 | call to namedArg | $@ | summaries.rb:53:15:53:31 | call to source | call to source | +| summaries.rb:56:6:56:29 | call to anyArg | summaries.rb:1:20:1:36 | call to source | summaries.rb:56:6:56:29 | call to anyArg | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:57:6:57:24 | call to anyArg | summaries.rb:1:20:1:36 | call to source | summaries.rb:57:6:57:24 | call to anyArg | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:59:6:59:34 | call to anyNamedArg | summaries.rb:1:20:1:36 | call to source | summaries.rb:59:6:59:34 | call to anyNamedArg | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:63:6:63:39 | call to anyPositionFromOne | summaries.rb:1:20:1:36 | call to source | summaries.rb:63:6:63:39 | call to anyPositionFromOne | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:66:8:66:8 | x | summaries.rb:1:20:1:36 | call to source | summaries.rb:66:8:66:8 | x | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:73:8:73:54 | call to preserveTaint | summaries.rb:73:24:73:53 | call to source | summaries.rb:73:8:73:54 | call to preserveTaint | $@ | summaries.rb:73:24:73:53 | call to source | call to source | +| summaries.rb:76:8:76:57 | call to preserveTaint | summaries.rb:76:26:76:56 | call to source | summaries.rb:76:8:76:57 | call to preserveTaint | $@ | summaries.rb:76:26:76:56 | call to source | call to source | +| summaries.rb:82:6:82:24 | call to readElementOne | summaries.rb:79:15:79:29 | call to source | summaries.rb:82:6:82:24 | call to readElementOne | $@ | summaries.rb:79:15:79:29 | call to source | call to source | +| summaries.rb:82:6:82:24 | call to readElementOne | summaries.rb:79:15:79:29 | call to source | summaries.rb:82:6:82:24 | call to readElementOne | $@ | summaries.rb:79:15:79:29 | call to source | call to source | +| summaries.rb:82:6:82:24 | call to readElementOne | summaries.rb:81:13:81:27 | call to source | summaries.rb:82:6:82:24 | call to readElementOne | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:82:6:82:24 | call to readElementOne | summaries.rb:81:13:81:27 | call to source | summaries.rb:82:6:82:24 | call to readElementOne | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:83:6:83:31 | call to readExactlyElementOne | summaries.rb:79:15:79:29 | call to source | summaries.rb:83:6:83:31 | call to readExactlyElementOne | $@ | summaries.rb:79:15:79:29 | call to source | call to source | +| summaries.rb:83:6:83:31 | call to readExactlyElementOne | summaries.rb:79:15:79:29 | call to source | summaries.rb:83:6:83:31 | call to readExactlyElementOne | $@ | summaries.rb:79:15:79:29 | call to source | call to source | +| summaries.rb:84:6:84:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:84:6:84:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:84:6:84:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:84:6:84:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:85:6:85:9 | ...[...] | summaries.rb:79:15:79:29 | call to source | summaries.rb:85:6:85:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source | call to source | +| summaries.rb:85:6:85:9 | ...[...] | summaries.rb:79:15:79:29 | call to source | summaries.rb:85:6:85:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source | call to source | +| summaries.rb:85:6:85:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:85:6:85:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:85:6:85:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:85:6:85:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:86:6:86:9 | ...[...] | summaries.rb:79:32:79:46 | call to source | summaries.rb:86:6:86:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source | call to source | +| summaries.rb:86:6:86:9 | ...[...] | summaries.rb:79:32:79:46 | call to source | summaries.rb:86:6:86:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source | call to source | +| summaries.rb:86:6:86:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:86:6:86:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:86:6:86:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:86:6:86:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:88:6:88:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:88:6:88:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:88:6:88:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:88:6:88:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:89:6:89:9 | ...[...] | summaries.rb:79:15:79:29 | call to source | summaries.rb:89:6:89:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source | call to source | +| summaries.rb:89:6:89:9 | ...[...] | summaries.rb:79:15:79:29 | call to source | summaries.rb:89:6:89:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source | call to source | +| summaries.rb:89:6:89:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:89:6:89:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:89:6:89:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:89:6:89:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:90:6:90:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:90:6:90:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:90:6:90:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:90:6:90:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:93:6:93:9 | ...[...] | summaries.rb:79:15:79:29 | call to source | summaries.rb:93:6:93:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source | call to source | +| summaries.rb:93:6:93:9 | ...[...] | summaries.rb:79:15:79:29 | call to source | summaries.rb:93:6:93:9 | ...[...] | $@ | summaries.rb:79:15:79:29 | call to source | call to source | +| summaries.rb:96:6:96:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:96:6:96:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:96:6:96:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:96:6:96:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:97:6:97:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:97:6:97:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:97:6:97:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:97:6:97:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:98:6:98:9 | ...[...] | summaries.rb:79:32:79:46 | call to source | summaries.rb:98:6:98:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source | call to source | +| summaries.rb:98:6:98:9 | ...[...] | summaries.rb:79:32:79:46 | call to source | summaries.rb:98:6:98:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source | call to source | +| summaries.rb:98:6:98:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:98:6:98:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:98:6:98:9 | ...[...] | summaries.rb:81:13:81:27 | call to source | summaries.rb:98:6:98:9 | ...[...] | $@ | summaries.rb:81:13:81:27 | call to source | call to source | +| summaries.rb:102:6:102:9 | ...[...] | summaries.rb:79:32:79:46 | call to source | summaries.rb:102:6:102:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source | call to source | +| summaries.rb:102:6:102:9 | ...[...] | summaries.rb:79:32:79:46 | call to source | summaries.rb:102:6:102:9 | ...[...] | $@ | summaries.rb:79:32:79:46 | call to source | call to source | +| summaries.rb:108:6:108:9 | ...[...] | summaries.rb:103:8:103:22 | call to source | summaries.rb:108:6:108:9 | ...[...] | $@ | summaries.rb:103:8:103:22 | call to source | call to source | +| summaries.rb:108:6:108:9 | ...[...] | summaries.rb:103:8:103:22 | call to source | summaries.rb:108:6:108:9 | ...[...] | $@ | summaries.rb:103:8:103:22 | call to source | call to source | +| summaries.rb:112:6:112:16 | call to get_value | summaries.rb:111:13:111:26 | call to source | summaries.rb:112:6:112:16 | call to get_value | $@ | summaries.rb:111:13:111:26 | call to source | call to source | +| summaries.rb:112:6:112:16 | call to get_value | summaries.rb:111:13:111:26 | call to source | summaries.rb:112:6:112:16 | call to get_value | $@ | summaries.rb:111:13:111:26 | call to source | call to source | +| summaries.rb:124:6:124:6 | y | summaries.rb:1:20:1:36 | call to source | summaries.rb:124:6:124:6 | y | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:125:6:125:6 | z | summaries.rb:1:20:1:36 | call to source | summaries.rb:125:6:125:6 | z | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:129:6:129:6 | x | summaries.rb:1:20:1:36 | call to source | summaries.rb:129:6:129:6 | x | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:131:16:131:22 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:131:16:131:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:131:16:131:22 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:131:16:131:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:132:21:132:27 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:132:21:132:27 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:132:21:132:27 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:132:21:132:27 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:135:26:135:32 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:135:26:135:32 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:135:26:135:32 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:135:26:135:32 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:137:23:137:29 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:137:23:137:29 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:137:23:137:29 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:137:23:137:29 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:140:19:140:25 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:140:19:140:25 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:140:19:140:25 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:140:19:140:25 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:141:19:141:25 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:141:19:141:25 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:141:19:141:25 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:141:19:141:25 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:145:26:145:32 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:145:26:145:32 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:145:26:145:32 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:145:26:145:32 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:147:16:147:22 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:147:16:147:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:147:16:147:22 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:147:16:147:22 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:150:39:150:45 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:150:39:150:45 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | +| summaries.rb:150:39:150:45 | tainted | summaries.rb:1:20:1:36 | call to source | summaries.rb:150:39:150:45 | tainted | $@ | summaries.rb:1:20:1:36 | call to source | call to source | warning | CSV type row should have 3 columns but has 1: TooFewColumns | | CSV type row should have 3 columns but has 6: TooManyColumns;;Member[Foo].Instance;too;many;columns | diff --git a/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.expected b/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.expected index 775e19dc217..2fb3829dd40 100644 --- a/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.expected +++ b/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.expected @@ -5,278 +5,278 @@ failures | filter_flow.rb:71:10:71:17 | call to bar | Unexpected result: hasTaintFlow= | | filter_flow.rb:87:11:87:14 | @foo | Unexpected result: hasTaintFlow= | edges -| filter_flow.rb:14:5:14:8 | [post] self [@foo] : | filter_flow.rb:17:3:18:5 | self in b [@foo] : | -| filter_flow.rb:14:12:14:17 | call to params : | filter_flow.rb:14:12:14:23 | ...[...] : | -| filter_flow.rb:14:12:14:23 | ...[...] : | filter_flow.rb:14:5:14:8 | [post] self [@foo] : | -| filter_flow.rb:17:3:18:5 | self in b [@foo] : | filter_flow.rb:20:3:22:5 | self in c [@foo] : | -| filter_flow.rb:20:3:22:5 | self in c [@foo] : | filter_flow.rb:21:10:21:13 | self [@foo] : | -| filter_flow.rb:21:10:21:13 | self [@foo] : | filter_flow.rb:21:10:21:13 | @foo | -| filter_flow.rb:30:5:30:8 | [post] self [@foo] : | filter_flow.rb:33:3:35:5 | self in b [@foo] : | -| filter_flow.rb:30:12:30:17 | call to params : | filter_flow.rb:30:12:30:23 | ...[...] : | -| filter_flow.rb:30:12:30:23 | ...[...] : | filter_flow.rb:30:5:30:8 | [post] self [@foo] : | -| filter_flow.rb:33:3:35:5 | self in b [@foo] : | filter_flow.rb:37:3:39:5 | self in c [@foo] : | -| filter_flow.rb:37:3:39:5 | self in c [@foo] : | filter_flow.rb:38:10:38:13 | self [@foo] : | -| filter_flow.rb:38:10:38:13 | self [@foo] : | filter_flow.rb:38:10:38:13 | @foo | -| filter_flow.rb:47:5:47:8 | [post] self [@foo] : | filter_flow.rb:51:3:52:5 | self in b [@foo] : | -| filter_flow.rb:47:12:47:17 | call to params : | filter_flow.rb:47:12:47:23 | ...[...] : | -| filter_flow.rb:47:12:47:23 | ...[...] : | filter_flow.rb:47:5:47:8 | [post] self [@foo] : | -| filter_flow.rb:51:3:52:5 | self in b [@foo] : | filter_flow.rb:54:3:56:5 | self in c [@foo] : | -| filter_flow.rb:54:3:56:5 | self in c [@foo] : | filter_flow.rb:55:10:55:13 | self [@foo] : | -| filter_flow.rb:55:10:55:13 | self [@foo] : | filter_flow.rb:55:10:55:13 | @foo | -| filter_flow.rb:64:5:64:8 | [post] @foo [@bar] : | filter_flow.rb:64:5:64:8 | [post] self [@foo, @bar] : | -| filter_flow.rb:64:5:64:8 | [post] self [@foo, @bar] : | filter_flow.rb:67:3:68:5 | self in b [@foo, @bar] : | -| filter_flow.rb:64:16:64:21 | call to params : | filter_flow.rb:64:16:64:27 | ...[...] : | -| filter_flow.rb:64:16:64:27 | ...[...] : | filter_flow.rb:64:5:64:8 | [post] @foo [@bar] : | -| filter_flow.rb:67:3:68:5 | self in b [@foo, @bar] : | filter_flow.rb:70:3:72:5 | self in c [@foo, @bar] : | -| filter_flow.rb:70:3:72:5 | self in c [@foo, @bar] : | filter_flow.rb:71:10:71:13 | self [@foo, @bar] : | -| filter_flow.rb:71:10:71:13 | @foo [@bar] : | filter_flow.rb:71:10:71:17 | call to bar | -| filter_flow.rb:71:10:71:13 | self [@foo, @bar] : | filter_flow.rb:71:10:71:13 | @foo [@bar] : | -| filter_flow.rb:80:5:80:8 | [post] self [@foo] : | filter_flow.rb:83:3:84:5 | self in b [@foo] : | -| filter_flow.rb:83:3:84:5 | self in b [@foo] : | filter_flow.rb:86:3:88:5 | self in c [@foo] : | -| filter_flow.rb:86:3:88:5 | self in c [@foo] : | filter_flow.rb:87:11:87:14 | self [@foo] : | -| filter_flow.rb:87:11:87:14 | self [@foo] : | filter_flow.rb:87:11:87:14 | @foo | -| filter_flow.rb:91:5:91:8 | [post] self [@foo] : | filter_flow.rb:80:5:80:8 | [post] self [@foo] : | -| filter_flow.rb:91:12:91:17 | call to params : | filter_flow.rb:91:12:91:23 | ...[...] : | -| filter_flow.rb:91:12:91:23 | ...[...] : | filter_flow.rb:91:5:91:8 | [post] self [@foo] : | -| params_flow.rb:3:10:3:15 | call to params : | params_flow.rb:3:10:3:19 | ...[...] | -| params_flow.rb:7:10:7:15 | call to params : | params_flow.rb:7:10:7:23 | call to as_json | -| params_flow.rb:15:10:15:15 | call to params : | params_flow.rb:15:10:15:33 | call to permit | -| params_flow.rb:19:10:19:15 | call to params : | params_flow.rb:19:10:19:34 | call to require | -| params_flow.rb:23:10:23:15 | call to params : | params_flow.rb:23:10:23:35 | call to required | -| params_flow.rb:27:10:27:15 | call to params : | params_flow.rb:27:10:27:24 | call to deep_dup | -| params_flow.rb:31:10:31:15 | call to params : | params_flow.rb:31:10:31:45 | call to deep_transform_keys | -| params_flow.rb:35:10:35:15 | call to params : | params_flow.rb:35:10:35:46 | call to deep_transform_keys! | -| params_flow.rb:39:10:39:15 | call to params : | params_flow.rb:39:10:39:48 | call to delete_if | -| params_flow.rb:43:10:43:15 | call to params : | params_flow.rb:43:10:43:32 | call to extract! | -| params_flow.rb:47:10:47:15 | call to params : | params_flow.rb:47:10:47:46 | call to keep_if | -| params_flow.rb:51:10:51:15 | call to params : | params_flow.rb:51:10:51:45 | call to select | -| params_flow.rb:55:10:55:15 | call to params : | params_flow.rb:55:10:55:46 | call to select! | -| params_flow.rb:59:10:59:15 | call to params : | params_flow.rb:59:10:59:45 | call to reject | -| params_flow.rb:63:10:63:15 | call to params : | params_flow.rb:63:10:63:46 | call to reject! | -| params_flow.rb:67:10:67:15 | call to params : | params_flow.rb:67:10:67:20 | call to to_h | -| params_flow.rb:71:10:71:15 | call to params : | params_flow.rb:71:10:71:23 | call to to_hash | -| params_flow.rb:75:10:75:15 | call to params : | params_flow.rb:75:10:75:24 | call to to_query | -| params_flow.rb:79:10:79:15 | call to params : | params_flow.rb:79:10:79:24 | call to to_param | -| params_flow.rb:83:10:83:15 | call to params : | params_flow.rb:83:10:83:27 | call to to_unsafe_h | -| params_flow.rb:87:10:87:15 | call to params : | params_flow.rb:87:10:87:30 | call to to_unsafe_hash | -| params_flow.rb:91:10:91:15 | call to params : | params_flow.rb:91:10:91:40 | call to transform_keys | -| params_flow.rb:95:10:95:15 | call to params : | params_flow.rb:95:10:95:41 | call to transform_keys! | -| params_flow.rb:99:10:99:15 | call to params : | params_flow.rb:99:10:99:42 | call to transform_values | -| params_flow.rb:103:10:103:15 | call to params : | params_flow.rb:103:10:103:43 | call to transform_values! | -| params_flow.rb:107:10:107:15 | call to params : | params_flow.rb:107:10:107:33 | call to values_at | -| params_flow.rb:111:10:111:15 | call to params : | params_flow.rb:111:10:111:29 | call to merge | -| params_flow.rb:112:23:112:28 | call to params : | params_flow.rb:112:10:112:29 | call to merge | -| params_flow.rb:116:10:116:15 | call to params : | params_flow.rb:116:10:116:37 | call to reverse_merge | -| params_flow.rb:117:31:117:36 | call to params : | params_flow.rb:117:10:117:37 | call to reverse_merge | -| params_flow.rb:121:10:121:15 | call to params : | params_flow.rb:121:10:121:43 | call to with_defaults | -| params_flow.rb:122:31:122:36 | call to params : | params_flow.rb:122:10:122:37 | call to with_defaults | -| params_flow.rb:126:10:126:15 | call to params : | params_flow.rb:126:10:126:30 | call to merge! | -| params_flow.rb:127:24:127:29 | call to params : | params_flow.rb:127:10:127:30 | call to merge! | -| params_flow.rb:130:5:130:5 | [post] p : | params_flow.rb:131:10:131:10 | p | -| params_flow.rb:130:14:130:19 | call to params : | params_flow.rb:130:5:130:5 | [post] p : | -| params_flow.rb:135:10:135:15 | call to params : | params_flow.rb:135:10:135:38 | call to reverse_merge! | -| params_flow.rb:136:32:136:37 | call to params : | params_flow.rb:136:10:136:38 | call to reverse_merge! | -| params_flow.rb:139:5:139:5 | [post] p : | params_flow.rb:140:10:140:10 | p | -| params_flow.rb:139:22:139:27 | call to params : | params_flow.rb:139:5:139:5 | [post] p : | -| params_flow.rb:144:10:144:15 | call to params : | params_flow.rb:144:10:144:44 | call to with_defaults! | -| params_flow.rb:145:32:145:37 | call to params : | params_flow.rb:145:10:145:38 | call to with_defaults! | -| params_flow.rb:148:5:148:5 | [post] p : | params_flow.rb:149:10:149:10 | p | -| params_flow.rb:148:22:148:27 | call to params : | params_flow.rb:148:5:148:5 | [post] p : | -| params_flow.rb:153:10:153:15 | call to params : | params_flow.rb:153:10:153:44 | call to reverse_update | -| params_flow.rb:154:32:154:37 | call to params : | params_flow.rb:154:10:154:38 | call to reverse_update | -| params_flow.rb:157:5:157:5 | [post] p : | params_flow.rb:158:10:158:10 | p | -| params_flow.rb:157:22:157:27 | call to params : | params_flow.rb:157:5:157:5 | [post] p : | -| params_flow.rb:166:10:166:15 | call to params : | params_flow.rb:166:10:166:19 | ...[...] | -| params_flow.rb:172:10:172:15 | call to params : | params_flow.rb:172:10:172:19 | ...[...] | -| params_flow.rb:176:10:176:15 | call to params : | params_flow.rb:176:10:176:19 | ...[...] | +| filter_flow.rb:14:5:14:8 | [post] self [@foo] | filter_flow.rb:17:3:18:5 | self in b [@foo] | +| filter_flow.rb:14:12:14:17 | call to params | filter_flow.rb:14:12:14:23 | ...[...] | +| filter_flow.rb:14:12:14:23 | ...[...] | filter_flow.rb:14:5:14:8 | [post] self [@foo] | +| filter_flow.rb:17:3:18:5 | self in b [@foo] | filter_flow.rb:20:3:22:5 | self in c [@foo] | +| filter_flow.rb:20:3:22:5 | self in c [@foo] | filter_flow.rb:21:10:21:13 | self [@foo] | +| filter_flow.rb:21:10:21:13 | self [@foo] | filter_flow.rb:21:10:21:13 | @foo | +| filter_flow.rb:30:5:30:8 | [post] self [@foo] | filter_flow.rb:33:3:35:5 | self in b [@foo] | +| filter_flow.rb:30:12:30:17 | call to params | filter_flow.rb:30:12:30:23 | ...[...] | +| filter_flow.rb:30:12:30:23 | ...[...] | filter_flow.rb:30:5:30:8 | [post] self [@foo] | +| filter_flow.rb:33:3:35:5 | self in b [@foo] | filter_flow.rb:37:3:39:5 | self in c [@foo] | +| filter_flow.rb:37:3:39:5 | self in c [@foo] | filter_flow.rb:38:10:38:13 | self [@foo] | +| filter_flow.rb:38:10:38:13 | self [@foo] | filter_flow.rb:38:10:38:13 | @foo | +| filter_flow.rb:47:5:47:8 | [post] self [@foo] | filter_flow.rb:51:3:52:5 | self in b [@foo] | +| filter_flow.rb:47:12:47:17 | call to params | filter_flow.rb:47:12:47:23 | ...[...] | +| filter_flow.rb:47:12:47:23 | ...[...] | filter_flow.rb:47:5:47:8 | [post] self [@foo] | +| filter_flow.rb:51:3:52:5 | self in b [@foo] | filter_flow.rb:54:3:56:5 | self in c [@foo] | +| filter_flow.rb:54:3:56:5 | self in c [@foo] | filter_flow.rb:55:10:55:13 | self [@foo] | +| filter_flow.rb:55:10:55:13 | self [@foo] | filter_flow.rb:55:10:55:13 | @foo | +| filter_flow.rb:64:5:64:8 | [post] @foo [@bar] | filter_flow.rb:64:5:64:8 | [post] self [@foo, @bar] | +| filter_flow.rb:64:5:64:8 | [post] self [@foo, @bar] | filter_flow.rb:67:3:68:5 | self in b [@foo, @bar] | +| filter_flow.rb:64:16:64:21 | call to params | filter_flow.rb:64:16:64:27 | ...[...] | +| filter_flow.rb:64:16:64:27 | ...[...] | filter_flow.rb:64:5:64:8 | [post] @foo [@bar] | +| filter_flow.rb:67:3:68:5 | self in b [@foo, @bar] | filter_flow.rb:70:3:72:5 | self in c [@foo, @bar] | +| filter_flow.rb:70:3:72:5 | self in c [@foo, @bar] | filter_flow.rb:71:10:71:13 | self [@foo, @bar] | +| filter_flow.rb:71:10:71:13 | @foo [@bar] | filter_flow.rb:71:10:71:17 | call to bar | +| filter_flow.rb:71:10:71:13 | self [@foo, @bar] | filter_flow.rb:71:10:71:13 | @foo [@bar] | +| filter_flow.rb:80:5:80:8 | [post] self [@foo] | filter_flow.rb:83:3:84:5 | self in b [@foo] | +| filter_flow.rb:83:3:84:5 | self in b [@foo] | filter_flow.rb:86:3:88:5 | self in c [@foo] | +| filter_flow.rb:86:3:88:5 | self in c [@foo] | filter_flow.rb:87:11:87:14 | self [@foo] | +| filter_flow.rb:87:11:87:14 | self [@foo] | filter_flow.rb:87:11:87:14 | @foo | +| filter_flow.rb:91:5:91:8 | [post] self [@foo] | filter_flow.rb:80:5:80:8 | [post] self [@foo] | +| filter_flow.rb:91:12:91:17 | call to params | filter_flow.rb:91:12:91:23 | ...[...] | +| filter_flow.rb:91:12:91:23 | ...[...] | filter_flow.rb:91:5:91:8 | [post] self [@foo] | +| params_flow.rb:3:10:3:15 | call to params | params_flow.rb:3:10:3:19 | ...[...] | +| params_flow.rb:7:10:7:15 | call to params | params_flow.rb:7:10:7:23 | call to as_json | +| params_flow.rb:15:10:15:15 | call to params | params_flow.rb:15:10:15:33 | call to permit | +| params_flow.rb:19:10:19:15 | call to params | params_flow.rb:19:10:19:34 | call to require | +| params_flow.rb:23:10:23:15 | call to params | params_flow.rb:23:10:23:35 | call to required | +| params_flow.rb:27:10:27:15 | call to params | params_flow.rb:27:10:27:24 | call to deep_dup | +| params_flow.rb:31:10:31:15 | call to params | params_flow.rb:31:10:31:45 | call to deep_transform_keys | +| params_flow.rb:35:10:35:15 | call to params | params_flow.rb:35:10:35:46 | call to deep_transform_keys! | +| params_flow.rb:39:10:39:15 | call to params | params_flow.rb:39:10:39:48 | call to delete_if | +| params_flow.rb:43:10:43:15 | call to params | params_flow.rb:43:10:43:32 | call to extract! | +| params_flow.rb:47:10:47:15 | call to params | params_flow.rb:47:10:47:46 | call to keep_if | +| params_flow.rb:51:10:51:15 | call to params | params_flow.rb:51:10:51:45 | call to select | +| params_flow.rb:55:10:55:15 | call to params | params_flow.rb:55:10:55:46 | call to select! | +| params_flow.rb:59:10:59:15 | call to params | params_flow.rb:59:10:59:45 | call to reject | +| params_flow.rb:63:10:63:15 | call to params | params_flow.rb:63:10:63:46 | call to reject! | +| params_flow.rb:67:10:67:15 | call to params | params_flow.rb:67:10:67:20 | call to to_h | +| params_flow.rb:71:10:71:15 | call to params | params_flow.rb:71:10:71:23 | call to to_hash | +| params_flow.rb:75:10:75:15 | call to params | params_flow.rb:75:10:75:24 | call to to_query | +| params_flow.rb:79:10:79:15 | call to params | params_flow.rb:79:10:79:24 | call to to_param | +| params_flow.rb:83:10:83:15 | call to params | params_flow.rb:83:10:83:27 | call to to_unsafe_h | +| params_flow.rb:87:10:87:15 | call to params | params_flow.rb:87:10:87:30 | call to to_unsafe_hash | +| params_flow.rb:91:10:91:15 | call to params | params_flow.rb:91:10:91:40 | call to transform_keys | +| params_flow.rb:95:10:95:15 | call to params | params_flow.rb:95:10:95:41 | call to transform_keys! | +| params_flow.rb:99:10:99:15 | call to params | params_flow.rb:99:10:99:42 | call to transform_values | +| params_flow.rb:103:10:103:15 | call to params | params_flow.rb:103:10:103:43 | call to transform_values! | +| params_flow.rb:107:10:107:15 | call to params | params_flow.rb:107:10:107:33 | call to values_at | +| params_flow.rb:111:10:111:15 | call to params | params_flow.rb:111:10:111:29 | call to merge | +| params_flow.rb:112:23:112:28 | call to params | params_flow.rb:112:10:112:29 | call to merge | +| params_flow.rb:116:10:116:15 | call to params | params_flow.rb:116:10:116:37 | call to reverse_merge | +| params_flow.rb:117:31:117:36 | call to params | params_flow.rb:117:10:117:37 | call to reverse_merge | +| params_flow.rb:121:10:121:15 | call to params | params_flow.rb:121:10:121:43 | call to with_defaults | +| params_flow.rb:122:31:122:36 | call to params | params_flow.rb:122:10:122:37 | call to with_defaults | +| params_flow.rb:126:10:126:15 | call to params | params_flow.rb:126:10:126:30 | call to merge! | +| params_flow.rb:127:24:127:29 | call to params | params_flow.rb:127:10:127:30 | call to merge! | +| params_flow.rb:130:5:130:5 | [post] p | params_flow.rb:131:10:131:10 | p | +| params_flow.rb:130:14:130:19 | call to params | params_flow.rb:130:5:130:5 | [post] p | +| params_flow.rb:135:10:135:15 | call to params | params_flow.rb:135:10:135:38 | call to reverse_merge! | +| params_flow.rb:136:32:136:37 | call to params | params_flow.rb:136:10:136:38 | call to reverse_merge! | +| params_flow.rb:139:5:139:5 | [post] p | params_flow.rb:140:10:140:10 | p | +| params_flow.rb:139:22:139:27 | call to params | params_flow.rb:139:5:139:5 | [post] p | +| params_flow.rb:144:10:144:15 | call to params | params_flow.rb:144:10:144:44 | call to with_defaults! | +| params_flow.rb:145:32:145:37 | call to params | params_flow.rb:145:10:145:38 | call to with_defaults! | +| params_flow.rb:148:5:148:5 | [post] p | params_flow.rb:149:10:149:10 | p | +| params_flow.rb:148:22:148:27 | call to params | params_flow.rb:148:5:148:5 | [post] p | +| params_flow.rb:153:10:153:15 | call to params | params_flow.rb:153:10:153:44 | call to reverse_update | +| params_flow.rb:154:32:154:37 | call to params | params_flow.rb:154:10:154:38 | call to reverse_update | +| params_flow.rb:157:5:157:5 | [post] p | params_flow.rb:158:10:158:10 | p | +| params_flow.rb:157:22:157:27 | call to params | params_flow.rb:157:5:157:5 | [post] p | +| params_flow.rb:166:10:166:15 | call to params | params_flow.rb:166:10:166:19 | ...[...] | +| params_flow.rb:172:10:172:15 | call to params | params_flow.rb:172:10:172:19 | ...[...] | +| params_flow.rb:176:10:176:15 | call to params | params_flow.rb:176:10:176:19 | ...[...] | nodes -| filter_flow.rb:14:5:14:8 | [post] self [@foo] : | semmle.label | [post] self [@foo] : | -| filter_flow.rb:14:12:14:17 | call to params : | semmle.label | call to params : | -| filter_flow.rb:14:12:14:23 | ...[...] : | semmle.label | ...[...] : | -| filter_flow.rb:17:3:18:5 | self in b [@foo] : | semmle.label | self in b [@foo] : | -| filter_flow.rb:20:3:22:5 | self in c [@foo] : | semmle.label | self in c [@foo] : | +| filter_flow.rb:14:5:14:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | +| filter_flow.rb:14:12:14:17 | call to params | semmle.label | call to params | +| filter_flow.rb:14:12:14:23 | ...[...] | semmle.label | ...[...] | +| filter_flow.rb:17:3:18:5 | self in b [@foo] | semmle.label | self in b [@foo] | +| filter_flow.rb:20:3:22:5 | self in c [@foo] | semmle.label | self in c [@foo] | | filter_flow.rb:21:10:21:13 | @foo | semmle.label | @foo | -| filter_flow.rb:21:10:21:13 | self [@foo] : | semmle.label | self [@foo] : | -| filter_flow.rb:30:5:30:8 | [post] self [@foo] : | semmle.label | [post] self [@foo] : | -| filter_flow.rb:30:12:30:17 | call to params : | semmle.label | call to params : | -| filter_flow.rb:30:12:30:23 | ...[...] : | semmle.label | ...[...] : | -| filter_flow.rb:33:3:35:5 | self in b [@foo] : | semmle.label | self in b [@foo] : | -| filter_flow.rb:37:3:39:5 | self in c [@foo] : | semmle.label | self in c [@foo] : | +| filter_flow.rb:21:10:21:13 | self [@foo] | semmle.label | self [@foo] | +| filter_flow.rb:30:5:30:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | +| filter_flow.rb:30:12:30:17 | call to params | semmle.label | call to params | +| filter_flow.rb:30:12:30:23 | ...[...] | semmle.label | ...[...] | +| filter_flow.rb:33:3:35:5 | self in b [@foo] | semmle.label | self in b [@foo] | +| filter_flow.rb:37:3:39:5 | self in c [@foo] | semmle.label | self in c [@foo] | | filter_flow.rb:38:10:38:13 | @foo | semmle.label | @foo | -| filter_flow.rb:38:10:38:13 | self [@foo] : | semmle.label | self [@foo] : | -| filter_flow.rb:47:5:47:8 | [post] self [@foo] : | semmle.label | [post] self [@foo] : | -| filter_flow.rb:47:12:47:17 | call to params : | semmle.label | call to params : | -| filter_flow.rb:47:12:47:23 | ...[...] : | semmle.label | ...[...] : | -| filter_flow.rb:51:3:52:5 | self in b [@foo] : | semmle.label | self in b [@foo] : | -| filter_flow.rb:54:3:56:5 | self in c [@foo] : | semmle.label | self in c [@foo] : | +| filter_flow.rb:38:10:38:13 | self [@foo] | semmle.label | self [@foo] | +| filter_flow.rb:47:5:47:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | +| filter_flow.rb:47:12:47:17 | call to params | semmle.label | call to params | +| filter_flow.rb:47:12:47:23 | ...[...] | semmle.label | ...[...] | +| filter_flow.rb:51:3:52:5 | self in b [@foo] | semmle.label | self in b [@foo] | +| filter_flow.rb:54:3:56:5 | self in c [@foo] | semmle.label | self in c [@foo] | | filter_flow.rb:55:10:55:13 | @foo | semmle.label | @foo | -| filter_flow.rb:55:10:55:13 | self [@foo] : | semmle.label | self [@foo] : | -| filter_flow.rb:64:5:64:8 | [post] @foo [@bar] : | semmle.label | [post] @foo [@bar] : | -| filter_flow.rb:64:5:64:8 | [post] self [@foo, @bar] : | semmle.label | [post] self [@foo, @bar] : | -| filter_flow.rb:64:16:64:21 | call to params : | semmle.label | call to params : | -| filter_flow.rb:64:16:64:27 | ...[...] : | semmle.label | ...[...] : | -| filter_flow.rb:67:3:68:5 | self in b [@foo, @bar] : | semmle.label | self in b [@foo, @bar] : | -| filter_flow.rb:70:3:72:5 | self in c [@foo, @bar] : | semmle.label | self in c [@foo, @bar] : | -| filter_flow.rb:71:10:71:13 | @foo [@bar] : | semmle.label | @foo [@bar] : | -| filter_flow.rb:71:10:71:13 | self [@foo, @bar] : | semmle.label | self [@foo, @bar] : | +| filter_flow.rb:55:10:55:13 | self [@foo] | semmle.label | self [@foo] | +| filter_flow.rb:64:5:64:8 | [post] @foo [@bar] | semmle.label | [post] @foo [@bar] | +| filter_flow.rb:64:5:64:8 | [post] self [@foo, @bar] | semmle.label | [post] self [@foo, @bar] | +| filter_flow.rb:64:16:64:21 | call to params | semmle.label | call to params | +| filter_flow.rb:64:16:64:27 | ...[...] | semmle.label | ...[...] | +| filter_flow.rb:67:3:68:5 | self in b [@foo, @bar] | semmle.label | self in b [@foo, @bar] | +| filter_flow.rb:70:3:72:5 | self in c [@foo, @bar] | semmle.label | self in c [@foo, @bar] | +| filter_flow.rb:71:10:71:13 | @foo [@bar] | semmle.label | @foo [@bar] | +| filter_flow.rb:71:10:71:13 | self [@foo, @bar] | semmle.label | self [@foo, @bar] | | filter_flow.rb:71:10:71:17 | call to bar | semmle.label | call to bar | -| filter_flow.rb:80:5:80:8 | [post] self [@foo] : | semmle.label | [post] self [@foo] : | -| filter_flow.rb:83:3:84:5 | self in b [@foo] : | semmle.label | self in b [@foo] : | -| filter_flow.rb:86:3:88:5 | self in c [@foo] : | semmle.label | self in c [@foo] : | +| filter_flow.rb:80:5:80:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | +| filter_flow.rb:83:3:84:5 | self in b [@foo] | semmle.label | self in b [@foo] | +| filter_flow.rb:86:3:88:5 | self in c [@foo] | semmle.label | self in c [@foo] | | filter_flow.rb:87:11:87:14 | @foo | semmle.label | @foo | -| filter_flow.rb:87:11:87:14 | self [@foo] : | semmle.label | self [@foo] : | -| filter_flow.rb:91:5:91:8 | [post] self [@foo] : | semmle.label | [post] self [@foo] : | -| filter_flow.rb:91:12:91:17 | call to params : | semmle.label | call to params : | -| filter_flow.rb:91:12:91:23 | ...[...] : | semmle.label | ...[...] : | -| params_flow.rb:3:10:3:15 | call to params : | semmle.label | call to params : | +| filter_flow.rb:87:11:87:14 | self [@foo] | semmle.label | self [@foo] | +| filter_flow.rb:91:5:91:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | +| filter_flow.rb:91:12:91:17 | call to params | semmle.label | call to params | +| filter_flow.rb:91:12:91:23 | ...[...] | semmle.label | ...[...] | +| params_flow.rb:3:10:3:15 | call to params | semmle.label | call to params | | params_flow.rb:3:10:3:19 | ...[...] | semmle.label | ...[...] | -| params_flow.rb:7:10:7:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:7:10:7:15 | call to params | semmle.label | call to params | | params_flow.rb:7:10:7:23 | call to as_json | semmle.label | call to as_json | -| params_flow.rb:15:10:15:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:15:10:15:15 | call to params | semmle.label | call to params | | params_flow.rb:15:10:15:33 | call to permit | semmle.label | call to permit | -| params_flow.rb:19:10:19:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:19:10:19:15 | call to params | semmle.label | call to params | | params_flow.rb:19:10:19:34 | call to require | semmle.label | call to require | -| params_flow.rb:23:10:23:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:23:10:23:15 | call to params | semmle.label | call to params | | params_flow.rb:23:10:23:35 | call to required | semmle.label | call to required | -| params_flow.rb:27:10:27:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:27:10:27:15 | call to params | semmle.label | call to params | | params_flow.rb:27:10:27:24 | call to deep_dup | semmle.label | call to deep_dup | -| params_flow.rb:31:10:31:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:31:10:31:15 | call to params | semmle.label | call to params | | params_flow.rb:31:10:31:45 | call to deep_transform_keys | semmle.label | call to deep_transform_keys | -| params_flow.rb:35:10:35:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:35:10:35:15 | call to params | semmle.label | call to params | | params_flow.rb:35:10:35:46 | call to deep_transform_keys! | semmle.label | call to deep_transform_keys! | -| params_flow.rb:39:10:39:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:39:10:39:15 | call to params | semmle.label | call to params | | params_flow.rb:39:10:39:48 | call to delete_if | semmle.label | call to delete_if | -| params_flow.rb:43:10:43:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:43:10:43:15 | call to params | semmle.label | call to params | | params_flow.rb:43:10:43:32 | call to extract! | semmle.label | call to extract! | -| params_flow.rb:47:10:47:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:47:10:47:15 | call to params | semmle.label | call to params | | params_flow.rb:47:10:47:46 | call to keep_if | semmle.label | call to keep_if | -| params_flow.rb:51:10:51:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:51:10:51:15 | call to params | semmle.label | call to params | | params_flow.rb:51:10:51:45 | call to select | semmle.label | call to select | -| params_flow.rb:55:10:55:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:55:10:55:15 | call to params | semmle.label | call to params | | params_flow.rb:55:10:55:46 | call to select! | semmle.label | call to select! | -| params_flow.rb:59:10:59:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:59:10:59:15 | call to params | semmle.label | call to params | | params_flow.rb:59:10:59:45 | call to reject | semmle.label | call to reject | -| params_flow.rb:63:10:63:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:63:10:63:15 | call to params | semmle.label | call to params | | params_flow.rb:63:10:63:46 | call to reject! | semmle.label | call to reject! | -| params_flow.rb:67:10:67:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:67:10:67:15 | call to params | semmle.label | call to params | | params_flow.rb:67:10:67:20 | call to to_h | semmle.label | call to to_h | -| params_flow.rb:71:10:71:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:71:10:71:15 | call to params | semmle.label | call to params | | params_flow.rb:71:10:71:23 | call to to_hash | semmle.label | call to to_hash | -| params_flow.rb:75:10:75:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:75:10:75:15 | call to params | semmle.label | call to params | | params_flow.rb:75:10:75:24 | call to to_query | semmle.label | call to to_query | -| params_flow.rb:79:10:79:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:79:10:79:15 | call to params | semmle.label | call to params | | params_flow.rb:79:10:79:24 | call to to_param | semmle.label | call to to_param | -| params_flow.rb:83:10:83:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:83:10:83:15 | call to params | semmle.label | call to params | | params_flow.rb:83:10:83:27 | call to to_unsafe_h | semmle.label | call to to_unsafe_h | -| params_flow.rb:87:10:87:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:87:10:87:15 | call to params | semmle.label | call to params | | params_flow.rb:87:10:87:30 | call to to_unsafe_hash | semmle.label | call to to_unsafe_hash | -| params_flow.rb:91:10:91:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:91:10:91:15 | call to params | semmle.label | call to params | | params_flow.rb:91:10:91:40 | call to transform_keys | semmle.label | call to transform_keys | -| params_flow.rb:95:10:95:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:95:10:95:15 | call to params | semmle.label | call to params | | params_flow.rb:95:10:95:41 | call to transform_keys! | semmle.label | call to transform_keys! | -| params_flow.rb:99:10:99:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:99:10:99:15 | call to params | semmle.label | call to params | | params_flow.rb:99:10:99:42 | call to transform_values | semmle.label | call to transform_values | -| params_flow.rb:103:10:103:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:103:10:103:15 | call to params | semmle.label | call to params | | params_flow.rb:103:10:103:43 | call to transform_values! | semmle.label | call to transform_values! | -| params_flow.rb:107:10:107:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:107:10:107:15 | call to params | semmle.label | call to params | | params_flow.rb:107:10:107:33 | call to values_at | semmle.label | call to values_at | -| params_flow.rb:111:10:111:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:111:10:111:15 | call to params | semmle.label | call to params | | params_flow.rb:111:10:111:29 | call to merge | semmle.label | call to merge | | params_flow.rb:112:10:112:29 | call to merge | semmle.label | call to merge | -| params_flow.rb:112:23:112:28 | call to params : | semmle.label | call to params : | -| params_flow.rb:116:10:116:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:112:23:112:28 | call to params | semmle.label | call to params | +| params_flow.rb:116:10:116:15 | call to params | semmle.label | call to params | | params_flow.rb:116:10:116:37 | call to reverse_merge | semmle.label | call to reverse_merge | | params_flow.rb:117:10:117:37 | call to reverse_merge | semmle.label | call to reverse_merge | -| params_flow.rb:117:31:117:36 | call to params : | semmle.label | call to params : | -| params_flow.rb:121:10:121:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:117:31:117:36 | call to params | semmle.label | call to params | +| params_flow.rb:121:10:121:15 | call to params | semmle.label | call to params | | params_flow.rb:121:10:121:43 | call to with_defaults | semmle.label | call to with_defaults | | params_flow.rb:122:10:122:37 | call to with_defaults | semmle.label | call to with_defaults | -| params_flow.rb:122:31:122:36 | call to params : | semmle.label | call to params : | -| params_flow.rb:126:10:126:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:122:31:122:36 | call to params | semmle.label | call to params | +| params_flow.rb:126:10:126:15 | call to params | semmle.label | call to params | | params_flow.rb:126:10:126:30 | call to merge! | semmle.label | call to merge! | | params_flow.rb:127:10:127:30 | call to merge! | semmle.label | call to merge! | -| params_flow.rb:127:24:127:29 | call to params : | semmle.label | call to params : | -| params_flow.rb:130:5:130:5 | [post] p : | semmle.label | [post] p : | -| params_flow.rb:130:14:130:19 | call to params : | semmle.label | call to params : | +| params_flow.rb:127:24:127:29 | call to params | semmle.label | call to params | +| params_flow.rb:130:5:130:5 | [post] p | semmle.label | [post] p | +| params_flow.rb:130:14:130:19 | call to params | semmle.label | call to params | | params_flow.rb:131:10:131:10 | p | semmle.label | p | -| params_flow.rb:135:10:135:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:135:10:135:15 | call to params | semmle.label | call to params | | params_flow.rb:135:10:135:38 | call to reverse_merge! | semmle.label | call to reverse_merge! | | params_flow.rb:136:10:136:38 | call to reverse_merge! | semmle.label | call to reverse_merge! | -| params_flow.rb:136:32:136:37 | call to params : | semmle.label | call to params : | -| params_flow.rb:139:5:139:5 | [post] p : | semmle.label | [post] p : | -| params_flow.rb:139:22:139:27 | call to params : | semmle.label | call to params : | +| params_flow.rb:136:32:136:37 | call to params | semmle.label | call to params | +| params_flow.rb:139:5:139:5 | [post] p | semmle.label | [post] p | +| params_flow.rb:139:22:139:27 | call to params | semmle.label | call to params | | params_flow.rb:140:10:140:10 | p | semmle.label | p | -| params_flow.rb:144:10:144:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:144:10:144:15 | call to params | semmle.label | call to params | | params_flow.rb:144:10:144:44 | call to with_defaults! | semmle.label | call to with_defaults! | | params_flow.rb:145:10:145:38 | call to with_defaults! | semmle.label | call to with_defaults! | -| params_flow.rb:145:32:145:37 | call to params : | semmle.label | call to params : | -| params_flow.rb:148:5:148:5 | [post] p : | semmle.label | [post] p : | -| params_flow.rb:148:22:148:27 | call to params : | semmle.label | call to params : | +| params_flow.rb:145:32:145:37 | call to params | semmle.label | call to params | +| params_flow.rb:148:5:148:5 | [post] p | semmle.label | [post] p | +| params_flow.rb:148:22:148:27 | call to params | semmle.label | call to params | | params_flow.rb:149:10:149:10 | p | semmle.label | p | -| params_flow.rb:153:10:153:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:153:10:153:15 | call to params | semmle.label | call to params | | params_flow.rb:153:10:153:44 | call to reverse_update | semmle.label | call to reverse_update | | params_flow.rb:154:10:154:38 | call to reverse_update | semmle.label | call to reverse_update | -| params_flow.rb:154:32:154:37 | call to params : | semmle.label | call to params : | -| params_flow.rb:157:5:157:5 | [post] p : | semmle.label | [post] p : | -| params_flow.rb:157:22:157:27 | call to params : | semmle.label | call to params : | +| params_flow.rb:154:32:154:37 | call to params | semmle.label | call to params | +| params_flow.rb:157:5:157:5 | [post] p | semmle.label | [post] p | +| params_flow.rb:157:22:157:27 | call to params | semmle.label | call to params | | params_flow.rb:158:10:158:10 | p | semmle.label | p | -| params_flow.rb:166:10:166:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:166:10:166:15 | call to params | semmle.label | call to params | | params_flow.rb:166:10:166:19 | ...[...] | semmle.label | ...[...] | -| params_flow.rb:172:10:172:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:172:10:172:15 | call to params | semmle.label | call to params | | params_flow.rb:172:10:172:19 | ...[...] | semmle.label | ...[...] | -| params_flow.rb:176:10:176:15 | call to params : | semmle.label | call to params : | +| params_flow.rb:176:10:176:15 | call to params | semmle.label | call to params | | params_flow.rb:176:10:176:19 | ...[...] | semmle.label | ...[...] | subpaths #select -| filter_flow.rb:21:10:21:13 | @foo | filter_flow.rb:14:12:14:17 | call to params : | filter_flow.rb:21:10:21:13 | @foo | $@ | filter_flow.rb:14:12:14:17 | call to params : | call to params : | -| filter_flow.rb:38:10:38:13 | @foo | filter_flow.rb:30:12:30:17 | call to params : | filter_flow.rb:38:10:38:13 | @foo | $@ | filter_flow.rb:30:12:30:17 | call to params : | call to params : | -| filter_flow.rb:55:10:55:13 | @foo | filter_flow.rb:47:12:47:17 | call to params : | filter_flow.rb:55:10:55:13 | @foo | $@ | filter_flow.rb:47:12:47:17 | call to params : | call to params : | -| filter_flow.rb:71:10:71:17 | call to bar | filter_flow.rb:64:16:64:21 | call to params : | filter_flow.rb:71:10:71:17 | call to bar | $@ | filter_flow.rb:64:16:64:21 | call to params : | call to params : | -| filter_flow.rb:87:11:87:14 | @foo | filter_flow.rb:91:12:91:17 | call to params : | filter_flow.rb:87:11:87:14 | @foo | $@ | filter_flow.rb:91:12:91:17 | call to params : | call to params : | -| params_flow.rb:3:10:3:19 | ...[...] | params_flow.rb:3:10:3:15 | call to params : | params_flow.rb:3:10:3:19 | ...[...] | $@ | params_flow.rb:3:10:3:15 | call to params : | call to params : | -| params_flow.rb:7:10:7:23 | call to as_json | params_flow.rb:7:10:7:15 | call to params : | params_flow.rb:7:10:7:23 | call to as_json | $@ | params_flow.rb:7:10:7:15 | call to params : | call to params : | -| params_flow.rb:15:10:15:33 | call to permit | params_flow.rb:15:10:15:15 | call to params : | params_flow.rb:15:10:15:33 | call to permit | $@ | params_flow.rb:15:10:15:15 | call to params : | call to params : | -| params_flow.rb:19:10:19:34 | call to require | params_flow.rb:19:10:19:15 | call to params : | params_flow.rb:19:10:19:34 | call to require | $@ | params_flow.rb:19:10:19:15 | call to params : | call to params : | -| params_flow.rb:23:10:23:35 | call to required | params_flow.rb:23:10:23:15 | call to params : | params_flow.rb:23:10:23:35 | call to required | $@ | params_flow.rb:23:10:23:15 | call to params : | call to params : | -| params_flow.rb:27:10:27:24 | call to deep_dup | params_flow.rb:27:10:27:15 | call to params : | params_flow.rb:27:10:27:24 | call to deep_dup | $@ | params_flow.rb:27:10:27:15 | call to params : | call to params : | -| params_flow.rb:31:10:31:45 | call to deep_transform_keys | params_flow.rb:31:10:31:15 | call to params : | params_flow.rb:31:10:31:45 | call to deep_transform_keys | $@ | params_flow.rb:31:10:31:15 | call to params : | call to params : | -| params_flow.rb:35:10:35:46 | call to deep_transform_keys! | params_flow.rb:35:10:35:15 | call to params : | params_flow.rb:35:10:35:46 | call to deep_transform_keys! | $@ | params_flow.rb:35:10:35:15 | call to params : | call to params : | -| params_flow.rb:39:10:39:48 | call to delete_if | params_flow.rb:39:10:39:15 | call to params : | params_flow.rb:39:10:39:48 | call to delete_if | $@ | params_flow.rb:39:10:39:15 | call to params : | call to params : | -| params_flow.rb:43:10:43:32 | call to extract! | params_flow.rb:43:10:43:15 | call to params : | params_flow.rb:43:10:43:32 | call to extract! | $@ | params_flow.rb:43:10:43:15 | call to params : | call to params : | -| params_flow.rb:47:10:47:46 | call to keep_if | params_flow.rb:47:10:47:15 | call to params : | params_flow.rb:47:10:47:46 | call to keep_if | $@ | params_flow.rb:47:10:47:15 | call to params : | call to params : | -| params_flow.rb:51:10:51:45 | call to select | params_flow.rb:51:10:51:15 | call to params : | params_flow.rb:51:10:51:45 | call to select | $@ | params_flow.rb:51:10:51:15 | call to params : | call to params : | -| params_flow.rb:55:10:55:46 | call to select! | params_flow.rb:55:10:55:15 | call to params : | params_flow.rb:55:10:55:46 | call to select! | $@ | params_flow.rb:55:10:55:15 | call to params : | call to params : | -| params_flow.rb:59:10:59:45 | call to reject | params_flow.rb:59:10:59:15 | call to params : | params_flow.rb:59:10:59:45 | call to reject | $@ | params_flow.rb:59:10:59:15 | call to params : | call to params : | -| params_flow.rb:63:10:63:46 | call to reject! | params_flow.rb:63:10:63:15 | call to params : | params_flow.rb:63:10:63:46 | call to reject! | $@ | params_flow.rb:63:10:63:15 | call to params : | call to params : | -| params_flow.rb:67:10:67:20 | call to to_h | params_flow.rb:67:10:67:15 | call to params : | params_flow.rb:67:10:67:20 | call to to_h | $@ | params_flow.rb:67:10:67:15 | call to params : | call to params : | -| params_flow.rb:71:10:71:23 | call to to_hash | params_flow.rb:71:10:71:15 | call to params : | params_flow.rb:71:10:71:23 | call to to_hash | $@ | params_flow.rb:71:10:71:15 | call to params : | call to params : | -| params_flow.rb:75:10:75:24 | call to to_query | params_flow.rb:75:10:75:15 | call to params : | params_flow.rb:75:10:75:24 | call to to_query | $@ | params_flow.rb:75:10:75:15 | call to params : | call to params : | -| params_flow.rb:79:10:79:24 | call to to_param | params_flow.rb:79:10:79:15 | call to params : | params_flow.rb:79:10:79:24 | call to to_param | $@ | params_flow.rb:79:10:79:15 | call to params : | call to params : | -| params_flow.rb:83:10:83:27 | call to to_unsafe_h | params_flow.rb:83:10:83:15 | call to params : | params_flow.rb:83:10:83:27 | call to to_unsafe_h | $@ | params_flow.rb:83:10:83:15 | call to params : | call to params : | -| params_flow.rb:87:10:87:30 | call to to_unsafe_hash | params_flow.rb:87:10:87:15 | call to params : | params_flow.rb:87:10:87:30 | call to to_unsafe_hash | $@ | params_flow.rb:87:10:87:15 | call to params : | call to params : | -| params_flow.rb:91:10:91:40 | call to transform_keys | params_flow.rb:91:10:91:15 | call to params : | params_flow.rb:91:10:91:40 | call to transform_keys | $@ | params_flow.rb:91:10:91:15 | call to params : | call to params : | -| params_flow.rb:95:10:95:41 | call to transform_keys! | params_flow.rb:95:10:95:15 | call to params : | params_flow.rb:95:10:95:41 | call to transform_keys! | $@ | params_flow.rb:95:10:95:15 | call to params : | call to params : | -| params_flow.rb:99:10:99:42 | call to transform_values | params_flow.rb:99:10:99:15 | call to params : | params_flow.rb:99:10:99:42 | call to transform_values | $@ | params_flow.rb:99:10:99:15 | call to params : | call to params : | -| params_flow.rb:103:10:103:43 | call to transform_values! | params_flow.rb:103:10:103:15 | call to params : | params_flow.rb:103:10:103:43 | call to transform_values! | $@ | params_flow.rb:103:10:103:15 | call to params : | call to params : | -| params_flow.rb:107:10:107:33 | call to values_at | params_flow.rb:107:10:107:15 | call to params : | params_flow.rb:107:10:107:33 | call to values_at | $@ | params_flow.rb:107:10:107:15 | call to params : | call to params : | -| params_flow.rb:111:10:111:29 | call to merge | params_flow.rb:111:10:111:15 | call to params : | params_flow.rb:111:10:111:29 | call to merge | $@ | params_flow.rb:111:10:111:15 | call to params : | call to params : | -| params_flow.rb:112:10:112:29 | call to merge | params_flow.rb:112:23:112:28 | call to params : | params_flow.rb:112:10:112:29 | call to merge | $@ | params_flow.rb:112:23:112:28 | call to params : | call to params : | -| params_flow.rb:116:10:116:37 | call to reverse_merge | params_flow.rb:116:10:116:15 | call to params : | params_flow.rb:116:10:116:37 | call to reverse_merge | $@ | params_flow.rb:116:10:116:15 | call to params : | call to params : | -| params_flow.rb:117:10:117:37 | call to reverse_merge | params_flow.rb:117:31:117:36 | call to params : | params_flow.rb:117:10:117:37 | call to reverse_merge | $@ | params_flow.rb:117:31:117:36 | call to params : | call to params : | -| params_flow.rb:121:10:121:43 | call to with_defaults | params_flow.rb:121:10:121:15 | call to params : | params_flow.rb:121:10:121:43 | call to with_defaults | $@ | params_flow.rb:121:10:121:15 | call to params : | call to params : | -| params_flow.rb:122:10:122:37 | call to with_defaults | params_flow.rb:122:31:122:36 | call to params : | params_flow.rb:122:10:122:37 | call to with_defaults | $@ | params_flow.rb:122:31:122:36 | call to params : | call to params : | -| params_flow.rb:126:10:126:30 | call to merge! | params_flow.rb:126:10:126:15 | call to params : | params_flow.rb:126:10:126:30 | call to merge! | $@ | params_flow.rb:126:10:126:15 | call to params : | call to params : | -| params_flow.rb:127:10:127:30 | call to merge! | params_flow.rb:127:24:127:29 | call to params : | params_flow.rb:127:10:127:30 | call to merge! | $@ | params_flow.rb:127:24:127:29 | call to params : | call to params : | -| params_flow.rb:131:10:131:10 | p | params_flow.rb:130:14:130:19 | call to params : | params_flow.rb:131:10:131:10 | p | $@ | params_flow.rb:130:14:130:19 | call to params : | call to params : | -| params_flow.rb:135:10:135:38 | call to reverse_merge! | params_flow.rb:135:10:135:15 | call to params : | params_flow.rb:135:10:135:38 | call to reverse_merge! | $@ | params_flow.rb:135:10:135:15 | call to params : | call to params : | -| params_flow.rb:136:10:136:38 | call to reverse_merge! | params_flow.rb:136:32:136:37 | call to params : | params_flow.rb:136:10:136:38 | call to reverse_merge! | $@ | params_flow.rb:136:32:136:37 | call to params : | call to params : | -| params_flow.rb:140:10:140:10 | p | params_flow.rb:139:22:139:27 | call to params : | params_flow.rb:140:10:140:10 | p | $@ | params_flow.rb:139:22:139:27 | call to params : | call to params : | -| params_flow.rb:144:10:144:44 | call to with_defaults! | params_flow.rb:144:10:144:15 | call to params : | params_flow.rb:144:10:144:44 | call to with_defaults! | $@ | params_flow.rb:144:10:144:15 | call to params : | call to params : | -| params_flow.rb:145:10:145:38 | call to with_defaults! | params_flow.rb:145:32:145:37 | call to params : | params_flow.rb:145:10:145:38 | call to with_defaults! | $@ | params_flow.rb:145:32:145:37 | call to params : | call to params : | -| params_flow.rb:149:10:149:10 | p | params_flow.rb:148:22:148:27 | call to params : | params_flow.rb:149:10:149:10 | p | $@ | params_flow.rb:148:22:148:27 | call to params : | call to params : | -| params_flow.rb:153:10:153:44 | call to reverse_update | params_flow.rb:153:10:153:15 | call to params : | params_flow.rb:153:10:153:44 | call to reverse_update | $@ | params_flow.rb:153:10:153:15 | call to params : | call to params : | -| params_flow.rb:154:10:154:38 | call to reverse_update | params_flow.rb:154:32:154:37 | call to params : | params_flow.rb:154:10:154:38 | call to reverse_update | $@ | params_flow.rb:154:32:154:37 | call to params : | call to params : | -| params_flow.rb:158:10:158:10 | p | params_flow.rb:157:22:157:27 | call to params : | params_flow.rb:158:10:158:10 | p | $@ | params_flow.rb:157:22:157:27 | call to params : | call to params : | -| params_flow.rb:166:10:166:19 | ...[...] | params_flow.rb:166:10:166:15 | call to params : | params_flow.rb:166:10:166:19 | ...[...] | $@ | params_flow.rb:166:10:166:15 | call to params : | call to params : | -| params_flow.rb:172:10:172:19 | ...[...] | params_flow.rb:172:10:172:15 | call to params : | params_flow.rb:172:10:172:19 | ...[...] | $@ | params_flow.rb:172:10:172:15 | call to params : | call to params : | -| params_flow.rb:176:10:176:19 | ...[...] | params_flow.rb:176:10:176:15 | call to params : | params_flow.rb:176:10:176:19 | ...[...] | $@ | params_flow.rb:176:10:176:15 | call to params : | call to params : | +| filter_flow.rb:21:10:21:13 | @foo | filter_flow.rb:14:12:14:17 | call to params | filter_flow.rb:21:10:21:13 | @foo | $@ | filter_flow.rb:14:12:14:17 | call to params | call to params | +| filter_flow.rb:38:10:38:13 | @foo | filter_flow.rb:30:12:30:17 | call to params | filter_flow.rb:38:10:38:13 | @foo | $@ | filter_flow.rb:30:12:30:17 | call to params | call to params | +| filter_flow.rb:55:10:55:13 | @foo | filter_flow.rb:47:12:47:17 | call to params | filter_flow.rb:55:10:55:13 | @foo | $@ | filter_flow.rb:47:12:47:17 | call to params | call to params | +| filter_flow.rb:71:10:71:17 | call to bar | filter_flow.rb:64:16:64:21 | call to params | filter_flow.rb:71:10:71:17 | call to bar | $@ | filter_flow.rb:64:16:64:21 | call to params | call to params | +| filter_flow.rb:87:11:87:14 | @foo | filter_flow.rb:91:12:91:17 | call to params | filter_flow.rb:87:11:87:14 | @foo | $@ | filter_flow.rb:91:12:91:17 | call to params | call to params | +| params_flow.rb:3:10:3:19 | ...[...] | params_flow.rb:3:10:3:15 | call to params | params_flow.rb:3:10:3:19 | ...[...] | $@ | params_flow.rb:3:10:3:15 | call to params | call to params | +| params_flow.rb:7:10:7:23 | call to as_json | params_flow.rb:7:10:7:15 | call to params | params_flow.rb:7:10:7:23 | call to as_json | $@ | params_flow.rb:7:10:7:15 | call to params | call to params | +| params_flow.rb:15:10:15:33 | call to permit | params_flow.rb:15:10:15:15 | call to params | params_flow.rb:15:10:15:33 | call to permit | $@ | params_flow.rb:15:10:15:15 | call to params | call to params | +| params_flow.rb:19:10:19:34 | call to require | params_flow.rb:19:10:19:15 | call to params | params_flow.rb:19:10:19:34 | call to require | $@ | params_flow.rb:19:10:19:15 | call to params | call to params | +| params_flow.rb:23:10:23:35 | call to required | params_flow.rb:23:10:23:15 | call to params | params_flow.rb:23:10:23:35 | call to required | $@ | params_flow.rb:23:10:23:15 | call to params | call to params | +| params_flow.rb:27:10:27:24 | call to deep_dup | params_flow.rb:27:10:27:15 | call to params | params_flow.rb:27:10:27:24 | call to deep_dup | $@ | params_flow.rb:27:10:27:15 | call to params | call to params | +| params_flow.rb:31:10:31:45 | call to deep_transform_keys | params_flow.rb:31:10:31:15 | call to params | params_flow.rb:31:10:31:45 | call to deep_transform_keys | $@ | params_flow.rb:31:10:31:15 | call to params | call to params | +| params_flow.rb:35:10:35:46 | call to deep_transform_keys! | params_flow.rb:35:10:35:15 | call to params | params_flow.rb:35:10:35:46 | call to deep_transform_keys! | $@ | params_flow.rb:35:10:35:15 | call to params | call to params | +| params_flow.rb:39:10:39:48 | call to delete_if | params_flow.rb:39:10:39:15 | call to params | params_flow.rb:39:10:39:48 | call to delete_if | $@ | params_flow.rb:39:10:39:15 | call to params | call to params | +| params_flow.rb:43:10:43:32 | call to extract! | params_flow.rb:43:10:43:15 | call to params | params_flow.rb:43:10:43:32 | call to extract! | $@ | params_flow.rb:43:10:43:15 | call to params | call to params | +| params_flow.rb:47:10:47:46 | call to keep_if | params_flow.rb:47:10:47:15 | call to params | params_flow.rb:47:10:47:46 | call to keep_if | $@ | params_flow.rb:47:10:47:15 | call to params | call to params | +| params_flow.rb:51:10:51:45 | call to select | params_flow.rb:51:10:51:15 | call to params | params_flow.rb:51:10:51:45 | call to select | $@ | params_flow.rb:51:10:51:15 | call to params | call to params | +| params_flow.rb:55:10:55:46 | call to select! | params_flow.rb:55:10:55:15 | call to params | params_flow.rb:55:10:55:46 | call to select! | $@ | params_flow.rb:55:10:55:15 | call to params | call to params | +| params_flow.rb:59:10:59:45 | call to reject | params_flow.rb:59:10:59:15 | call to params | params_flow.rb:59:10:59:45 | call to reject | $@ | params_flow.rb:59:10:59:15 | call to params | call to params | +| params_flow.rb:63:10:63:46 | call to reject! | params_flow.rb:63:10:63:15 | call to params | params_flow.rb:63:10:63:46 | call to reject! | $@ | params_flow.rb:63:10:63:15 | call to params | call to params | +| params_flow.rb:67:10:67:20 | call to to_h | params_flow.rb:67:10:67:15 | call to params | params_flow.rb:67:10:67:20 | call to to_h | $@ | params_flow.rb:67:10:67:15 | call to params | call to params | +| params_flow.rb:71:10:71:23 | call to to_hash | params_flow.rb:71:10:71:15 | call to params | params_flow.rb:71:10:71:23 | call to to_hash | $@ | params_flow.rb:71:10:71:15 | call to params | call to params | +| params_flow.rb:75:10:75:24 | call to to_query | params_flow.rb:75:10:75:15 | call to params | params_flow.rb:75:10:75:24 | call to to_query | $@ | params_flow.rb:75:10:75:15 | call to params | call to params | +| params_flow.rb:79:10:79:24 | call to to_param | params_flow.rb:79:10:79:15 | call to params | params_flow.rb:79:10:79:24 | call to to_param | $@ | params_flow.rb:79:10:79:15 | call to params | call to params | +| params_flow.rb:83:10:83:27 | call to to_unsafe_h | params_flow.rb:83:10:83:15 | call to params | params_flow.rb:83:10:83:27 | call to to_unsafe_h | $@ | params_flow.rb:83:10:83:15 | call to params | call to params | +| params_flow.rb:87:10:87:30 | call to to_unsafe_hash | params_flow.rb:87:10:87:15 | call to params | params_flow.rb:87:10:87:30 | call to to_unsafe_hash | $@ | params_flow.rb:87:10:87:15 | call to params | call to params | +| params_flow.rb:91:10:91:40 | call to transform_keys | params_flow.rb:91:10:91:15 | call to params | params_flow.rb:91:10:91:40 | call to transform_keys | $@ | params_flow.rb:91:10:91:15 | call to params | call to params | +| params_flow.rb:95:10:95:41 | call to transform_keys! | params_flow.rb:95:10:95:15 | call to params | params_flow.rb:95:10:95:41 | call to transform_keys! | $@ | params_flow.rb:95:10:95:15 | call to params | call to params | +| params_flow.rb:99:10:99:42 | call to transform_values | params_flow.rb:99:10:99:15 | call to params | params_flow.rb:99:10:99:42 | call to transform_values | $@ | params_flow.rb:99:10:99:15 | call to params | call to params | +| params_flow.rb:103:10:103:43 | call to transform_values! | params_flow.rb:103:10:103:15 | call to params | params_flow.rb:103:10:103:43 | call to transform_values! | $@ | params_flow.rb:103:10:103:15 | call to params | call to params | +| params_flow.rb:107:10:107:33 | call to values_at | params_flow.rb:107:10:107:15 | call to params | params_flow.rb:107:10:107:33 | call to values_at | $@ | params_flow.rb:107:10:107:15 | call to params | call to params | +| params_flow.rb:111:10:111:29 | call to merge | params_flow.rb:111:10:111:15 | call to params | params_flow.rb:111:10:111:29 | call to merge | $@ | params_flow.rb:111:10:111:15 | call to params | call to params | +| params_flow.rb:112:10:112:29 | call to merge | params_flow.rb:112:23:112:28 | call to params | params_flow.rb:112:10:112:29 | call to merge | $@ | params_flow.rb:112:23:112:28 | call to params | call to params | +| params_flow.rb:116:10:116:37 | call to reverse_merge | params_flow.rb:116:10:116:15 | call to params | params_flow.rb:116:10:116:37 | call to reverse_merge | $@ | params_flow.rb:116:10:116:15 | call to params | call to params | +| params_flow.rb:117:10:117:37 | call to reverse_merge | params_flow.rb:117:31:117:36 | call to params | params_flow.rb:117:10:117:37 | call to reverse_merge | $@ | params_flow.rb:117:31:117:36 | call to params | call to params | +| params_flow.rb:121:10:121:43 | call to with_defaults | params_flow.rb:121:10:121:15 | call to params | params_flow.rb:121:10:121:43 | call to with_defaults | $@ | params_flow.rb:121:10:121:15 | call to params | call to params | +| params_flow.rb:122:10:122:37 | call to with_defaults | params_flow.rb:122:31:122:36 | call to params | params_flow.rb:122:10:122:37 | call to with_defaults | $@ | params_flow.rb:122:31:122:36 | call to params | call to params | +| params_flow.rb:126:10:126:30 | call to merge! | params_flow.rb:126:10:126:15 | call to params | params_flow.rb:126:10:126:30 | call to merge! | $@ | params_flow.rb:126:10:126:15 | call to params | call to params | +| params_flow.rb:127:10:127:30 | call to merge! | params_flow.rb:127:24:127:29 | call to params | params_flow.rb:127:10:127:30 | call to merge! | $@ | params_flow.rb:127:24:127:29 | call to params | call to params | +| params_flow.rb:131:10:131:10 | p | params_flow.rb:130:14:130:19 | call to params | params_flow.rb:131:10:131:10 | p | $@ | params_flow.rb:130:14:130:19 | call to params | call to params | +| params_flow.rb:135:10:135:38 | call to reverse_merge! | params_flow.rb:135:10:135:15 | call to params | params_flow.rb:135:10:135:38 | call to reverse_merge! | $@ | params_flow.rb:135:10:135:15 | call to params | call to params | +| params_flow.rb:136:10:136:38 | call to reverse_merge! | params_flow.rb:136:32:136:37 | call to params | params_flow.rb:136:10:136:38 | call to reverse_merge! | $@ | params_flow.rb:136:32:136:37 | call to params | call to params | +| params_flow.rb:140:10:140:10 | p | params_flow.rb:139:22:139:27 | call to params | params_flow.rb:140:10:140:10 | p | $@ | params_flow.rb:139:22:139:27 | call to params | call to params | +| params_flow.rb:144:10:144:44 | call to with_defaults! | params_flow.rb:144:10:144:15 | call to params | params_flow.rb:144:10:144:44 | call to with_defaults! | $@ | params_flow.rb:144:10:144:15 | call to params | call to params | +| params_flow.rb:145:10:145:38 | call to with_defaults! | params_flow.rb:145:32:145:37 | call to params | params_flow.rb:145:10:145:38 | call to with_defaults! | $@ | params_flow.rb:145:32:145:37 | call to params | call to params | +| params_flow.rb:149:10:149:10 | p | params_flow.rb:148:22:148:27 | call to params | params_flow.rb:149:10:149:10 | p | $@ | params_flow.rb:148:22:148:27 | call to params | call to params | +| params_flow.rb:153:10:153:44 | call to reverse_update | params_flow.rb:153:10:153:15 | call to params | params_flow.rb:153:10:153:44 | call to reverse_update | $@ | params_flow.rb:153:10:153:15 | call to params | call to params | +| params_flow.rb:154:10:154:38 | call to reverse_update | params_flow.rb:154:32:154:37 | call to params | params_flow.rb:154:10:154:38 | call to reverse_update | $@ | params_flow.rb:154:32:154:37 | call to params | call to params | +| params_flow.rb:158:10:158:10 | p | params_flow.rb:157:22:157:27 | call to params | params_flow.rb:158:10:158:10 | p | $@ | params_flow.rb:157:22:157:27 | call to params | call to params | +| params_flow.rb:166:10:166:19 | ...[...] | params_flow.rb:166:10:166:15 | call to params | params_flow.rb:166:10:166:19 | ...[...] | $@ | params_flow.rb:166:10:166:15 | call to params | call to params | +| params_flow.rb:172:10:172:19 | ...[...] | params_flow.rb:172:10:172:15 | call to params | params_flow.rb:172:10:172:19 | ...[...] | $@ | params_flow.rb:172:10:172:15 | call to params | call to params | +| params_flow.rb:176:10:176:19 | ...[...] | params_flow.rb:176:10:176:15 | call to params | params_flow.rb:176:10:176:19 | ...[...] | $@ | params_flow.rb:176:10:176:15 | call to params | call to params | diff --git a/ruby/ql/test/library-tests/frameworks/action_mailer/params-flow.expected b/ruby/ql/test/library-tests/frameworks/action_mailer/params-flow.expected index a4a7be5b17a..39a6a7b8d8e 100644 --- a/ruby/ql/test/library-tests/frameworks/action_mailer/params-flow.expected +++ b/ruby/ql/test/library-tests/frameworks/action_mailer/params-flow.expected @@ -1,9 +1,9 @@ failures edges -| mailer.rb:3:10:3:15 | call to params : | mailer.rb:3:10:3:21 | ...[...] | +| mailer.rb:3:10:3:15 | call to params | mailer.rb:3:10:3:21 | ...[...] | nodes -| mailer.rb:3:10:3:15 | call to params : | semmle.label | call to params : | +| mailer.rb:3:10:3:15 | call to params | semmle.label | call to params | | mailer.rb:3:10:3:21 | ...[...] | semmle.label | ...[...] | subpaths #select -| mailer.rb:3:10:3:21 | ...[...] | mailer.rb:3:10:3:15 | call to params : | mailer.rb:3:10:3:21 | ...[...] | $@ | mailer.rb:3:10:3:15 | call to params : | call to params : | +| mailer.rb:3:10:3:21 | ...[...] | mailer.rb:3:10:3:15 | call to params | mailer.rb:3:10:3:21 | ...[...] | $@ | mailer.rb:3:10:3:15 | call to params | call to params | diff --git a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected index e10e038a7cc..7bce95e2b45 100644 --- a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected +++ b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected @@ -1,1351 +1,1351 @@ failures | hash_extensions.rb:126:10:126:19 | call to sole | Unexpected result: hasValueFlow=b | edges -| active_support.rb:10:5:10:5 | x : | active_support.rb:11:10:11:10 | x : | -| active_support.rb:10:9:10:18 | call to source : | active_support.rb:10:5:10:5 | x : | -| active_support.rb:11:10:11:10 | x : | active_support.rb:11:10:11:19 | call to at | -| active_support.rb:15:5:15:5 | x : | active_support.rb:16:10:16:10 | x : | -| active_support.rb:15:9:15:18 | call to source : | active_support.rb:15:5:15:5 | x : | -| active_support.rb:16:10:16:10 | x : | active_support.rb:16:10:16:19 | call to camelize | -| active_support.rb:20:5:20:5 | x : | active_support.rb:21:10:21:10 | x : | -| active_support.rb:20:9:20:18 | call to source : | active_support.rb:20:5:20:5 | x : | -| active_support.rb:21:10:21:10 | x : | active_support.rb:21:10:21:20 | call to camelcase | -| active_support.rb:25:5:25:5 | x : | active_support.rb:26:10:26:10 | x : | -| active_support.rb:25:9:25:18 | call to source : | active_support.rb:25:5:25:5 | x : | -| active_support.rb:26:10:26:10 | x : | active_support.rb:26:10:26:19 | call to classify | -| active_support.rb:30:5:30:5 | x : | active_support.rb:31:10:31:10 | x : | -| active_support.rb:30:9:30:18 | call to source : | active_support.rb:30:5:30:5 | x : | -| active_support.rb:31:10:31:10 | x : | active_support.rb:31:10:31:20 | call to dasherize | -| active_support.rb:35:5:35:5 | x : | active_support.rb:36:10:36:10 | x : | -| active_support.rb:35:9:35:18 | call to source : | active_support.rb:35:5:35:5 | x : | -| active_support.rb:36:10:36:10 | x : | active_support.rb:36:10:36:24 | call to deconstantize | -| active_support.rb:40:5:40:5 | x : | active_support.rb:41:10:41:10 | x : | -| active_support.rb:40:9:40:18 | call to source : | active_support.rb:40:5:40:5 | x : | -| active_support.rb:41:10:41:10 | x : | active_support.rb:41:10:41:21 | call to demodulize | -| active_support.rb:45:5:45:5 | x : | active_support.rb:46:10:46:10 | x : | -| active_support.rb:45:9:45:18 | call to source : | active_support.rb:45:5:45:5 | x : | -| active_support.rb:46:10:46:10 | x : | active_support.rb:46:10:46:19 | call to first | -| active_support.rb:50:5:50:5 | x : | active_support.rb:51:10:51:10 | x : | -| active_support.rb:50:9:50:18 | call to source : | active_support.rb:50:5:50:5 | x : | -| active_support.rb:51:10:51:10 | x : | active_support.rb:51:10:51:22 | call to foreign_key | -| active_support.rb:55:5:55:5 | x : | active_support.rb:56:10:56:10 | x : | -| active_support.rb:55:9:55:18 | call to source : | active_support.rb:55:5:55:5 | x : | -| active_support.rb:56:10:56:10 | x : | active_support.rb:56:10:56:18 | call to from | -| active_support.rb:60:5:60:5 | x : | active_support.rb:61:10:61:10 | x : | -| active_support.rb:60:9:60:18 | call to source : | active_support.rb:60:5:60:5 | x : | -| active_support.rb:61:10:61:10 | x : | active_support.rb:61:10:61:20 | call to html_safe | -| active_support.rb:65:5:65:5 | x : | active_support.rb:66:10:66:10 | x : | -| active_support.rb:65:9:65:18 | call to source : | active_support.rb:65:5:65:5 | x : | -| active_support.rb:66:10:66:10 | x : | active_support.rb:66:10:66:19 | call to humanize | -| active_support.rb:70:5:70:5 | x : | active_support.rb:71:10:71:10 | x : | -| active_support.rb:70:9:70:18 | call to source : | active_support.rb:70:5:70:5 | x : | -| active_support.rb:71:10:71:10 | x : | active_support.rb:71:10:71:20 | call to indent | -| active_support.rb:75:5:75:5 | x : | active_support.rb:76:10:76:10 | x : | -| active_support.rb:75:9:75:18 | call to source : | active_support.rb:75:5:75:5 | x : | -| active_support.rb:76:10:76:10 | x : | active_support.rb:76:10:76:21 | call to indent! | -| active_support.rb:80:5:80:5 | x : | active_support.rb:81:10:81:10 | x : | -| active_support.rb:80:9:80:18 | call to source : | active_support.rb:80:5:80:5 | x : | -| active_support.rb:81:10:81:10 | x : | active_support.rb:81:10:81:18 | call to inquiry | -| active_support.rb:85:5:85:5 | x : | active_support.rb:86:10:86:10 | x : | -| active_support.rb:85:9:85:18 | call to source : | active_support.rb:85:5:85:5 | x : | -| active_support.rb:86:10:86:10 | x : | active_support.rb:86:10:86:18 | call to last | -| active_support.rb:90:5:90:5 | x : | active_support.rb:91:10:91:10 | x : | -| active_support.rb:90:9:90:18 | call to source : | active_support.rb:90:5:90:5 | x : | -| active_support.rb:91:10:91:10 | x : | active_support.rb:91:10:91:19 | call to mb_chars | -| active_support.rb:95:5:95:5 | x : | active_support.rb:96:10:96:10 | x : | -| active_support.rb:95:9:95:18 | call to source : | active_support.rb:95:5:95:5 | x : | -| active_support.rb:96:10:96:10 | x : | active_support.rb:96:10:96:23 | call to parameterize | -| active_support.rb:100:5:100:5 | x : | active_support.rb:101:10:101:10 | x : | -| active_support.rb:100:9:100:18 | call to source : | active_support.rb:100:5:100:5 | x : | -| active_support.rb:101:10:101:10 | x : | active_support.rb:101:10:101:20 | call to pluralize | -| active_support.rb:105:5:105:5 | x : | active_support.rb:106:10:106:10 | x : | -| active_support.rb:105:9:105:18 | call to source : | active_support.rb:105:5:105:5 | x : | -| active_support.rb:106:10:106:10 | x : | active_support.rb:106:10:106:24 | call to remove | -| active_support.rb:110:5:110:5 | x : | active_support.rb:111:10:111:10 | x : | -| active_support.rb:110:9:110:18 | call to source : | active_support.rb:110:5:110:5 | x : | -| active_support.rb:111:10:111:10 | x : | active_support.rb:111:10:111:25 | call to remove! | -| active_support.rb:115:5:115:5 | x : | active_support.rb:116:10:116:10 | x : | -| active_support.rb:115:9:115:18 | call to source : | active_support.rb:115:5:115:5 | x : | -| active_support.rb:116:10:116:10 | x : | active_support.rb:116:10:116:22 | call to singularize | -| active_support.rb:120:5:120:5 | x : | active_support.rb:121:10:121:10 | x : | -| active_support.rb:120:9:120:18 | call to source : | active_support.rb:120:5:120:5 | x : | -| active_support.rb:121:10:121:10 | x : | active_support.rb:121:10:121:17 | call to squish | -| active_support.rb:125:5:125:5 | x : | active_support.rb:126:10:126:10 | x : | -| active_support.rb:125:9:125:18 | call to source : | active_support.rb:125:5:125:5 | x : | -| active_support.rb:126:10:126:10 | x : | active_support.rb:126:10:126:18 | call to squish! | -| active_support.rb:130:5:130:5 | x : | active_support.rb:131:10:131:10 | x : | -| active_support.rb:130:9:130:18 | call to source : | active_support.rb:130:5:130:5 | x : | -| active_support.rb:131:10:131:10 | x : | active_support.rb:131:10:131:24 | call to strip_heredoc | -| active_support.rb:135:5:135:5 | x : | active_support.rb:136:10:136:10 | x : | -| active_support.rb:135:9:135:18 | call to source : | active_support.rb:135:5:135:5 | x : | -| active_support.rb:136:10:136:10 | x : | active_support.rb:136:10:136:19 | call to tableize | -| active_support.rb:140:5:140:5 | x : | active_support.rb:141:10:141:10 | x : | -| active_support.rb:140:9:140:18 | call to source : | active_support.rb:140:5:140:5 | x : | -| active_support.rb:141:10:141:10 | x : | active_support.rb:141:10:141:20 | call to titlecase | -| active_support.rb:145:5:145:5 | x : | active_support.rb:146:10:146:10 | x : | -| active_support.rb:145:9:145:18 | call to source : | active_support.rb:145:5:145:5 | x : | -| active_support.rb:146:10:146:10 | x : | active_support.rb:146:10:146:19 | call to titleize | -| active_support.rb:150:5:150:5 | x : | active_support.rb:151:10:151:10 | x : | -| active_support.rb:150:9:150:18 | call to source : | active_support.rb:150:5:150:5 | x : | -| active_support.rb:151:10:151:10 | x : | active_support.rb:151:10:151:16 | call to to | -| active_support.rb:155:5:155:5 | x : | active_support.rb:156:10:156:10 | x : | -| active_support.rb:155:9:155:18 | call to source : | active_support.rb:155:5:155:5 | x : | -| active_support.rb:156:10:156:10 | x : | active_support.rb:156:10:156:22 | call to truncate | -| active_support.rb:160:5:160:5 | x : | active_support.rb:161:10:161:10 | x : | -| active_support.rb:160:9:160:18 | call to source : | active_support.rb:160:5:160:5 | x : | -| active_support.rb:161:10:161:10 | x : | active_support.rb:161:10:161:28 | call to truncate_bytes | -| active_support.rb:165:5:165:5 | x : | active_support.rb:166:10:166:10 | x : | -| active_support.rb:165:9:165:18 | call to source : | active_support.rb:165:5:165:5 | x : | -| active_support.rb:166:10:166:10 | x : | active_support.rb:166:10:166:28 | call to truncate_words | -| active_support.rb:170:5:170:5 | x : | active_support.rb:171:10:171:10 | x : | -| active_support.rb:170:9:170:18 | call to source : | active_support.rb:170:5:170:5 | x : | -| active_support.rb:171:10:171:10 | x : | active_support.rb:171:10:171:21 | call to underscore | -| active_support.rb:175:5:175:5 | x : | active_support.rb:176:10:176:10 | x : | -| active_support.rb:175:9:175:18 | call to source : | active_support.rb:175:5:175:5 | x : | -| active_support.rb:176:10:176:10 | x : | active_support.rb:176:10:176:23 | call to upcase_first | -| active_support.rb:180:5:180:5 | x [element 0] : | active_support.rb:181:9:181:9 | x [element 0] : | -| active_support.rb:180:5:180:5 | x [element 0] : | active_support.rb:181:9:181:9 | x [element 0] : | -| active_support.rb:180:10:180:17 | call to source : | active_support.rb:180:5:180:5 | x [element 0] : | -| active_support.rb:180:10:180:17 | call to source : | active_support.rb:180:5:180:5 | x [element 0] : | -| active_support.rb:181:5:181:5 | y [element] : | active_support.rb:182:10:182:10 | y [element] : | -| active_support.rb:181:5:181:5 | y [element] : | active_support.rb:182:10:182:10 | y [element] : | -| active_support.rb:181:9:181:9 | x [element 0] : | active_support.rb:181:9:181:23 | call to compact_blank [element] : | -| active_support.rb:181:9:181:9 | x [element 0] : | active_support.rb:181:9:181:23 | call to compact_blank [element] : | -| active_support.rb:181:9:181:23 | call to compact_blank [element] : | active_support.rb:181:5:181:5 | y [element] : | -| active_support.rb:181:9:181:23 | call to compact_blank [element] : | active_support.rb:181:5:181:5 | y [element] : | -| active_support.rb:182:10:182:10 | y [element] : | active_support.rb:182:10:182:13 | ...[...] | -| active_support.rb:182:10:182:10 | y [element] : | active_support.rb:182:10:182:13 | ...[...] | -| active_support.rb:186:5:186:5 | x [element 0] : | active_support.rb:187:9:187:9 | x [element 0] : | -| active_support.rb:186:5:186:5 | x [element 0] : | active_support.rb:187:9:187:9 | x [element 0] : | -| active_support.rb:186:10:186:18 | call to source : | active_support.rb:186:5:186:5 | x [element 0] : | -| active_support.rb:186:10:186:18 | call to source : | active_support.rb:186:5:186:5 | x [element 0] : | -| active_support.rb:187:5:187:5 | y [element] : | active_support.rb:188:10:188:10 | y [element] : | -| active_support.rb:187:5:187:5 | y [element] : | active_support.rb:188:10:188:10 | y [element] : | -| active_support.rb:187:9:187:9 | x [element 0] : | active_support.rb:187:9:187:21 | call to excluding [element] : | -| active_support.rb:187:9:187:9 | x [element 0] : | active_support.rb:187:9:187:21 | call to excluding [element] : | -| active_support.rb:187:9:187:21 | call to excluding [element] : | active_support.rb:187:5:187:5 | y [element] : | -| active_support.rb:187:9:187:21 | call to excluding [element] : | active_support.rb:187:5:187:5 | y [element] : | -| active_support.rb:188:10:188:10 | y [element] : | active_support.rb:188:10:188:13 | ...[...] | -| active_support.rb:188:10:188:10 | y [element] : | active_support.rb:188:10:188:13 | ...[...] | -| active_support.rb:192:5:192:5 | x [element 0] : | active_support.rb:193:9:193:9 | x [element 0] : | -| active_support.rb:192:5:192:5 | x [element 0] : | active_support.rb:193:9:193:9 | x [element 0] : | -| active_support.rb:192:10:192:18 | call to source : | active_support.rb:192:5:192:5 | x [element 0] : | -| active_support.rb:192:10:192:18 | call to source : | active_support.rb:192:5:192:5 | x [element 0] : | -| active_support.rb:193:5:193:5 | y [element] : | active_support.rb:194:10:194:10 | y [element] : | -| active_support.rb:193:5:193:5 | y [element] : | active_support.rb:194:10:194:10 | y [element] : | -| active_support.rb:193:9:193:9 | x [element 0] : | active_support.rb:193:9:193:19 | call to without [element] : | -| active_support.rb:193:9:193:9 | x [element 0] : | active_support.rb:193:9:193:19 | call to without [element] : | -| active_support.rb:193:9:193:19 | call to without [element] : | active_support.rb:193:5:193:5 | y [element] : | -| active_support.rb:193:9:193:19 | call to without [element] : | active_support.rb:193:5:193:5 | y [element] : | -| active_support.rb:194:10:194:10 | y [element] : | active_support.rb:194:10:194:13 | ...[...] | -| active_support.rb:194:10:194:10 | y [element] : | active_support.rb:194:10:194:13 | ...[...] | -| active_support.rb:198:5:198:5 | x [element 0] : | active_support.rb:199:9:199:9 | x [element 0] : | -| active_support.rb:198:5:198:5 | x [element 0] : | active_support.rb:199:9:199:9 | x [element 0] : | -| active_support.rb:198:10:198:18 | call to source : | active_support.rb:198:5:198:5 | x [element 0] : | -| active_support.rb:198:10:198:18 | call to source : | active_support.rb:198:5:198:5 | x [element 0] : | -| active_support.rb:199:5:199:5 | y [element] : | active_support.rb:200:10:200:10 | y [element] : | -| active_support.rb:199:5:199:5 | y [element] : | active_support.rb:200:10:200:10 | y [element] : | -| active_support.rb:199:9:199:9 | x [element 0] : | active_support.rb:199:9:199:37 | call to in_order_of [element] : | -| active_support.rb:199:9:199:9 | x [element 0] : | active_support.rb:199:9:199:37 | call to in_order_of [element] : | -| active_support.rb:199:9:199:37 | call to in_order_of [element] : | active_support.rb:199:5:199:5 | y [element] : | -| active_support.rb:199:9:199:37 | call to in_order_of [element] : | active_support.rb:199:5:199:5 | y [element] : | -| active_support.rb:200:10:200:10 | y [element] : | active_support.rb:200:10:200:13 | ...[...] | -| active_support.rb:200:10:200:10 | y [element] : | active_support.rb:200:10:200:13 | ...[...] | -| active_support.rb:204:5:204:5 | a [element 0] : | active_support.rb:205:9:205:9 | a [element 0] : | -| active_support.rb:204:5:204:5 | a [element 0] : | active_support.rb:205:9:205:9 | a [element 0] : | -| active_support.rb:204:5:204:5 | a [element 0] : | active_support.rb:206:10:206:10 | a [element 0] : | -| active_support.rb:204:5:204:5 | a [element 0] : | active_support.rb:206:10:206:10 | a [element 0] : | -| active_support.rb:204:10:204:18 | call to source : | active_support.rb:204:5:204:5 | a [element 0] : | -| active_support.rb:204:10:204:18 | call to source : | active_support.rb:204:5:204:5 | a [element 0] : | -| active_support.rb:205:5:205:5 | b [element 0] : | active_support.rb:208:10:208:10 | b [element 0] : | -| active_support.rb:205:5:205:5 | b [element 0] : | active_support.rb:208:10:208:10 | b [element 0] : | -| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:208:10:208:10 | b [element] : | -| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:208:10:208:10 | b [element] : | -| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:209:10:209:10 | b [element] : | -| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:209:10:209:10 | b [element] : | -| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:210:10:210:10 | b [element] : | -| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:210:10:210:10 | b [element] : | -| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:211:10:211:10 | b [element] : | -| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:211:10:211:10 | b [element] : | -| active_support.rb:205:9:205:9 | a [element 0] : | active_support.rb:205:9:205:41 | call to including [element 0] : | -| active_support.rb:205:9:205:9 | a [element 0] : | active_support.rb:205:9:205:41 | call to including [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element 0] : | active_support.rb:205:5:205:5 | b [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element 0] : | active_support.rb:205:5:205:5 | b [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:205:5:205:5 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:205:5:205:5 | b [element] : | -| active_support.rb:205:21:205:29 | call to source : | active_support.rb:205:9:205:41 | call to including [element] : | -| active_support.rb:205:21:205:29 | call to source : | active_support.rb:205:9:205:41 | call to including [element] : | -| active_support.rb:205:32:205:40 | call to source : | active_support.rb:205:9:205:41 | call to including [element] : | -| active_support.rb:205:32:205:40 | call to source : | active_support.rb:205:9:205:41 | call to including [element] : | -| active_support.rb:206:10:206:10 | a [element 0] : | active_support.rb:206:10:206:13 | ...[...] | -| active_support.rb:206:10:206:10 | a [element 0] : | active_support.rb:206:10:206:13 | ...[...] | -| active_support.rb:208:10:208:10 | b [element 0] : | active_support.rb:208:10:208:13 | ...[...] | -| active_support.rb:208:10:208:10 | b [element 0] : | active_support.rb:208:10:208:13 | ...[...] | -| active_support.rb:208:10:208:10 | b [element] : | active_support.rb:208:10:208:13 | ...[...] | -| active_support.rb:208:10:208:10 | b [element] : | active_support.rb:208:10:208:13 | ...[...] | -| active_support.rb:209:10:209:10 | b [element] : | active_support.rb:209:10:209:13 | ...[...] | -| active_support.rb:209:10:209:10 | b [element] : | active_support.rb:209:10:209:13 | ...[...] | -| active_support.rb:210:10:210:10 | b [element] : | active_support.rb:210:10:210:13 | ...[...] | -| active_support.rb:210:10:210:10 | b [element] : | active_support.rb:210:10:210:13 | ...[...] | -| active_support.rb:211:10:211:10 | b [element] : | active_support.rb:211:10:211:13 | ...[...] | -| active_support.rb:211:10:211:10 | b [element] : | active_support.rb:211:10:211:13 | ...[...] | -| active_support.rb:215:3:215:3 | x : | active_support.rb:216:34:216:34 | x : | -| active_support.rb:215:7:215:16 | call to source : | active_support.rb:215:3:215:3 | x : | -| active_support.rb:216:3:216:3 | y : | active_support.rb:217:8:217:8 | y | -| active_support.rb:216:7:216:35 | call to new : | active_support.rb:216:3:216:3 | y : | -| active_support.rb:216:34:216:34 | x : | active_support.rb:216:7:216:35 | call to new : | -| active_support.rb:222:3:222:3 | b : | active_support.rb:223:21:223:21 | b : | -| active_support.rb:222:7:222:16 | call to source : | active_support.rb:222:3:222:3 | b : | -| active_support.rb:223:3:223:3 | y : | active_support.rb:224:8:224:8 | y | -| active_support.rb:223:7:223:22 | call to safe_concat : | active_support.rb:223:3:223:3 | y : | -| active_support.rb:223:21:223:21 | b : | active_support.rb:223:7:223:22 | call to safe_concat : | -| active_support.rb:229:3:229:3 | b : | active_support.rb:230:17:230:17 | b : | -| active_support.rb:229:7:229:16 | call to source : | active_support.rb:229:3:229:3 | b : | -| active_support.rb:230:3:230:3 | [post] x : | active_support.rb:231:8:231:8 | x | -| active_support.rb:230:17:230:17 | b : | active_support.rb:230:3:230:3 | [post] x : | -| active_support.rb:235:3:235:3 | a : | active_support.rb:237:34:237:34 | a : | -| active_support.rb:235:7:235:16 | call to source : | active_support.rb:235:3:235:3 | a : | -| active_support.rb:237:3:237:3 | x : | active_support.rb:238:7:238:7 | x : | -| active_support.rb:237:7:237:35 | call to new : | active_support.rb:237:3:237:3 | x : | -| active_support.rb:237:34:237:34 | a : | active_support.rb:237:7:237:35 | call to new : | -| active_support.rb:238:3:238:3 | y : | active_support.rb:239:8:239:8 | y | -| active_support.rb:238:7:238:7 | x : | active_support.rb:238:7:238:17 | call to concat : | -| active_support.rb:238:7:238:17 | call to concat : | active_support.rb:238:3:238:3 | y : | -| active_support.rb:243:3:243:3 | a : | active_support.rb:245:34:245:34 | a : | -| active_support.rb:243:7:243:16 | call to source : | active_support.rb:243:3:243:3 | a : | -| active_support.rb:245:3:245:3 | x : | active_support.rb:246:7:246:7 | x : | -| active_support.rb:245:7:245:35 | call to new : | active_support.rb:245:3:245:3 | x : | -| active_support.rb:245:34:245:34 | a : | active_support.rb:245:7:245:35 | call to new : | -| active_support.rb:246:3:246:3 | y : | active_support.rb:247:8:247:8 | y | -| active_support.rb:246:7:246:7 | x : | active_support.rb:246:7:246:20 | call to insert : | -| active_support.rb:246:7:246:20 | call to insert : | active_support.rb:246:3:246:3 | y : | -| active_support.rb:251:3:251:3 | a : | active_support.rb:253:34:253:34 | a : | -| active_support.rb:251:7:251:16 | call to source : | active_support.rb:251:3:251:3 | a : | -| active_support.rb:253:3:253:3 | x : | active_support.rb:254:7:254:7 | x : | -| active_support.rb:253:7:253:35 | call to new : | active_support.rb:253:3:253:3 | x : | -| active_support.rb:253:34:253:34 | a : | active_support.rb:253:7:253:35 | call to new : | -| active_support.rb:254:3:254:3 | y : | active_support.rb:255:8:255:8 | y | -| active_support.rb:254:7:254:7 | x : | active_support.rb:254:7:254:18 | call to prepend : | -| active_support.rb:254:7:254:18 | call to prepend : | active_support.rb:254:3:254:3 | y : | -| active_support.rb:259:3:259:3 | a : | active_support.rb:260:34:260:34 | a : | -| active_support.rb:259:7:259:16 | call to source : | active_support.rb:259:3:259:3 | a : | -| active_support.rb:260:3:260:3 | x : | active_support.rb:261:7:261:7 | x : | -| active_support.rb:260:7:260:35 | call to new : | active_support.rb:260:3:260:3 | x : | -| active_support.rb:260:34:260:34 | a : | active_support.rb:260:7:260:35 | call to new : | -| active_support.rb:261:3:261:3 | y : | active_support.rb:262:8:262:8 | y | -| active_support.rb:261:7:261:7 | x : | active_support.rb:261:7:261:12 | call to to_s : | -| active_support.rb:261:7:261:12 | call to to_s : | active_support.rb:261:3:261:3 | y : | -| active_support.rb:266:3:266:3 | a : | active_support.rb:267:34:267:34 | a : | -| active_support.rb:266:7:266:16 | call to source : | active_support.rb:266:3:266:3 | a : | -| active_support.rb:267:3:267:3 | x : | active_support.rb:268:7:268:7 | x : | -| active_support.rb:267:7:267:35 | call to new : | active_support.rb:267:3:267:3 | x : | -| active_support.rb:267:34:267:34 | a : | active_support.rb:267:7:267:35 | call to new : | -| active_support.rb:268:3:268:3 | y : | active_support.rb:269:8:269:8 | y | -| active_support.rb:268:7:268:7 | x : | active_support.rb:268:7:268:16 | call to to_param : | -| active_support.rb:268:7:268:16 | call to to_param : | active_support.rb:268:3:268:3 | y : | -| active_support.rb:273:3:273:3 | a : | active_support.rb:274:20:274:20 | a : | -| active_support.rb:273:7:273:16 | call to source : | active_support.rb:273:3:273:3 | a : | -| active_support.rb:274:3:274:3 | x : | active_support.rb:275:7:275:7 | x : | -| active_support.rb:274:7:274:21 | call to new : | active_support.rb:274:3:274:3 | x : | -| active_support.rb:274:20:274:20 | a : | active_support.rb:274:7:274:21 | call to new : | -| active_support.rb:275:3:275:3 | y : | active_support.rb:276:8:276:8 | y | -| active_support.rb:275:3:275:3 | y : | active_support.rb:277:7:277:7 | y : | -| active_support.rb:275:7:275:7 | x : | active_support.rb:275:7:275:17 | call to existence : | -| active_support.rb:275:7:275:17 | call to existence : | active_support.rb:275:3:275:3 | y : | -| active_support.rb:277:3:277:3 | z : | active_support.rb:278:8:278:8 | z | -| active_support.rb:277:7:277:7 | y : | active_support.rb:277:7:277:17 | call to existence : | -| active_support.rb:277:7:277:17 | call to existence : | active_support.rb:277:3:277:3 | z : | -| active_support.rb:282:3:282:3 | x : | active_support.rb:283:8:283:8 | x : | -| active_support.rb:282:3:282:3 | x : | active_support.rb:283:8:283:8 | x : | -| active_support.rb:282:7:282:16 | call to source : | active_support.rb:282:3:282:3 | x : | -| active_support.rb:282:7:282:16 | call to source : | active_support.rb:282:3:282:3 | x : | -| active_support.rb:283:8:283:8 | x : | active_support.rb:283:8:283:17 | call to presence | -| active_support.rb:283:8:283:8 | x : | active_support.rb:283:8:283:17 | call to presence | -| active_support.rb:285:3:285:3 | y : | active_support.rb:286:8:286:8 | y : | -| active_support.rb:285:3:285:3 | y : | active_support.rb:286:8:286:8 | y : | -| active_support.rb:285:7:285:16 | call to source : | active_support.rb:285:3:285:3 | y : | -| active_support.rb:285:7:285:16 | call to source : | active_support.rb:285:3:285:3 | y : | -| active_support.rb:286:8:286:8 | y : | active_support.rb:286:8:286:17 | call to presence | -| active_support.rb:286:8:286:8 | y : | active_support.rb:286:8:286:17 | call to presence | -| active_support.rb:290:3:290:3 | x : | active_support.rb:291:8:291:8 | x : | -| active_support.rb:290:3:290:3 | x : | active_support.rb:291:8:291:8 | x : | -| active_support.rb:290:7:290:16 | call to source : | active_support.rb:290:3:290:3 | x : | -| active_support.rb:290:7:290:16 | call to source : | active_support.rb:290:3:290:3 | x : | -| active_support.rb:291:8:291:8 | x : | active_support.rb:291:8:291:17 | call to deep_dup | -| active_support.rb:291:8:291:8 | x : | active_support.rb:291:8:291:17 | call to deep_dup | -| active_support.rb:303:3:303:3 | a : | active_support.rb:304:19:304:19 | a : | -| active_support.rb:303:7:303:16 | call to source : | active_support.rb:303:3:303:3 | a : | -| active_support.rb:304:3:304:3 | b : | active_support.rb:305:8:305:8 | b | -| active_support.rb:304:7:304:19 | call to json_escape : | active_support.rb:304:3:304:3 | b : | -| active_support.rb:304:19:304:19 | a : | active_support.rb:304:7:304:19 | call to json_escape : | -| active_support.rb:309:5:309:5 | x : | active_support.rb:310:37:310:37 | x : | -| active_support.rb:309:9:309:18 | call to source : | active_support.rb:309:5:309:5 | x : | -| active_support.rb:310:37:310:37 | x : | active_support.rb:310:10:310:38 | call to encode | -| active_support.rb:314:5:314:5 | x : | active_support.rb:315:37:315:37 | x : | -| active_support.rb:314:9:314:18 | call to source : | active_support.rb:314:5:314:5 | x : | -| active_support.rb:315:37:315:37 | x : | active_support.rb:315:10:315:38 | call to decode | -| active_support.rb:319:5:319:5 | x : | active_support.rb:320:35:320:35 | x : | -| active_support.rb:319:9:319:18 | call to source : | active_support.rb:319:5:319:5 | x : | -| active_support.rb:320:35:320:35 | x : | active_support.rb:320:10:320:36 | call to dump | -| active_support.rb:324:5:324:5 | x : | active_support.rb:325:35:325:35 | x : | -| active_support.rb:324:9:324:18 | call to source : | active_support.rb:324:5:324:5 | x : | -| active_support.rb:325:35:325:35 | x : | active_support.rb:325:10:325:36 | call to load | -| active_support.rb:329:5:329:5 | x : | active_support.rb:330:10:330:10 | x : | -| active_support.rb:329:5:329:5 | x : | active_support.rb:331:10:331:10 | x : | -| active_support.rb:329:9:329:18 | call to source : | active_support.rb:329:5:329:5 | x : | -| active_support.rb:330:5:330:5 | y [element 0] : | active_support.rb:332:10:332:10 | y [element 0] : | -| active_support.rb:330:10:330:10 | x : | active_support.rb:330:5:330:5 | y [element 0] : | -| active_support.rb:331:10:331:10 | x : | active_support.rb:331:10:331:18 | call to to_json | -| active_support.rb:332:10:332:10 | y [element 0] : | active_support.rb:332:10:332:18 | call to to_json | -| hash_extensions.rb:2:5:2:5 | h [element :a] : | hash_extensions.rb:3:9:3:9 | h [element :a] : | -| hash_extensions.rb:2:5:2:5 | h [element :a] : | hash_extensions.rb:3:9:3:9 | h [element :a] : | -| hash_extensions.rb:2:14:2:24 | call to source : | hash_extensions.rb:2:5:2:5 | h [element :a] : | -| hash_extensions.rb:2:14:2:24 | call to source : | hash_extensions.rb:2:5:2:5 | h [element :a] : | -| hash_extensions.rb:3:5:3:5 | x [element] : | hash_extensions.rb:4:10:4:10 | x [element] : | -| hash_extensions.rb:3:5:3:5 | x [element] : | hash_extensions.rb:4:10:4:10 | x [element] : | -| hash_extensions.rb:3:9:3:9 | h [element :a] : | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | -| hash_extensions.rb:3:9:3:9 | h [element :a] : | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | hash_extensions.rb:3:5:3:5 | x [element] : | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | hash_extensions.rb:3:5:3:5 | x [element] : | -| hash_extensions.rb:4:10:4:10 | x [element] : | hash_extensions.rb:4:10:4:14 | ...[...] | -| hash_extensions.rb:4:10:4:10 | x [element] : | hash_extensions.rb:4:10:4:14 | ...[...] | -| hash_extensions.rb:10:5:10:5 | h [element :a] : | hash_extensions.rb:11:9:11:9 | h [element :a] : | -| hash_extensions.rb:10:5:10:5 | h [element :a] : | hash_extensions.rb:11:9:11:9 | h [element :a] : | -| hash_extensions.rb:10:14:10:24 | call to source : | hash_extensions.rb:10:5:10:5 | h [element :a] : | -| hash_extensions.rb:10:14:10:24 | call to source : | hash_extensions.rb:10:5:10:5 | h [element :a] : | -| hash_extensions.rb:11:5:11:5 | x [element] : | hash_extensions.rb:12:10:12:10 | x [element] : | -| hash_extensions.rb:11:5:11:5 | x [element] : | hash_extensions.rb:12:10:12:10 | x [element] : | -| hash_extensions.rb:11:9:11:9 | h [element :a] : | hash_extensions.rb:11:9:11:20 | call to to_options [element] : | -| hash_extensions.rb:11:9:11:9 | h [element :a] : | hash_extensions.rb:11:9:11:20 | call to to_options [element] : | -| hash_extensions.rb:11:9:11:20 | call to to_options [element] : | hash_extensions.rb:11:5:11:5 | x [element] : | -| hash_extensions.rb:11:9:11:20 | call to to_options [element] : | hash_extensions.rb:11:5:11:5 | x [element] : | -| hash_extensions.rb:12:10:12:10 | x [element] : | hash_extensions.rb:12:10:12:14 | ...[...] | -| hash_extensions.rb:12:10:12:10 | x [element] : | hash_extensions.rb:12:10:12:14 | ...[...] | -| hash_extensions.rb:18:5:18:5 | h [element :a] : | hash_extensions.rb:19:9:19:9 | h [element :a] : | -| hash_extensions.rb:18:5:18:5 | h [element :a] : | hash_extensions.rb:19:9:19:9 | h [element :a] : | -| hash_extensions.rb:18:14:18:24 | call to source : | hash_extensions.rb:18:5:18:5 | h [element :a] : | -| hash_extensions.rb:18:14:18:24 | call to source : | hash_extensions.rb:18:5:18:5 | h [element :a] : | -| hash_extensions.rb:19:5:19:5 | x [element] : | hash_extensions.rb:20:10:20:10 | x [element] : | -| hash_extensions.rb:19:5:19:5 | x [element] : | hash_extensions.rb:20:10:20:10 | x [element] : | -| hash_extensions.rb:19:9:19:9 | h [element :a] : | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | -| hash_extensions.rb:19:9:19:9 | h [element :a] : | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | hash_extensions.rb:19:5:19:5 | x [element] : | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | hash_extensions.rb:19:5:19:5 | x [element] : | -| hash_extensions.rb:20:10:20:10 | x [element] : | hash_extensions.rb:20:10:20:14 | ...[...] | -| hash_extensions.rb:20:10:20:10 | x [element] : | hash_extensions.rb:20:10:20:14 | ...[...] | -| hash_extensions.rb:26:5:26:5 | h [element :a] : | hash_extensions.rb:27:9:27:9 | h [element :a] : | -| hash_extensions.rb:26:5:26:5 | h [element :a] : | hash_extensions.rb:27:9:27:9 | h [element :a] : | -| hash_extensions.rb:26:14:26:24 | call to source : | hash_extensions.rb:26:5:26:5 | h [element :a] : | -| hash_extensions.rb:26:14:26:24 | call to source : | hash_extensions.rb:26:5:26:5 | h [element :a] : | -| hash_extensions.rb:27:5:27:5 | x [element] : | hash_extensions.rb:28:10:28:10 | x [element] : | -| hash_extensions.rb:27:5:27:5 | x [element] : | hash_extensions.rb:28:10:28:10 | x [element] : | -| hash_extensions.rb:27:9:27:9 | h [element :a] : | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | -| hash_extensions.rb:27:9:27:9 | h [element :a] : | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | hash_extensions.rb:27:5:27:5 | x [element] : | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | hash_extensions.rb:27:5:27:5 | x [element] : | -| hash_extensions.rb:28:10:28:10 | x [element] : | hash_extensions.rb:28:10:28:14 | ...[...] | -| hash_extensions.rb:28:10:28:10 | x [element] : | hash_extensions.rb:28:10:28:14 | ...[...] | -| hash_extensions.rb:34:5:34:5 | h [element :a] : | hash_extensions.rb:35:9:35:9 | h [element :a] : | -| hash_extensions.rb:34:5:34:5 | h [element :a] : | hash_extensions.rb:35:9:35:9 | h [element :a] : | -| hash_extensions.rb:34:14:34:24 | call to source : | hash_extensions.rb:34:5:34:5 | h [element :a] : | -| hash_extensions.rb:34:14:34:24 | call to source : | hash_extensions.rb:34:5:34:5 | h [element :a] : | -| hash_extensions.rb:35:5:35:5 | x [element] : | hash_extensions.rb:36:10:36:10 | x [element] : | -| hash_extensions.rb:35:5:35:5 | x [element] : | hash_extensions.rb:36:10:36:10 | x [element] : | -| hash_extensions.rb:35:9:35:9 | h [element :a] : | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | -| hash_extensions.rb:35:9:35:9 | h [element :a] : | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | hash_extensions.rb:35:5:35:5 | x [element] : | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | hash_extensions.rb:35:5:35:5 | x [element] : | -| hash_extensions.rb:36:10:36:10 | x [element] : | hash_extensions.rb:36:10:36:14 | ...[...] | -| hash_extensions.rb:36:10:36:10 | x [element] : | hash_extensions.rb:36:10:36:14 | ...[...] | -| hash_extensions.rb:42:5:42:5 | h [element :a] : | hash_extensions.rb:43:9:43:9 | h [element :a] : | -| hash_extensions.rb:42:5:42:5 | h [element :a] : | hash_extensions.rb:43:9:43:9 | h [element :a] : | -| hash_extensions.rb:42:14:42:24 | call to source : | hash_extensions.rb:42:5:42:5 | h [element :a] : | -| hash_extensions.rb:42:14:42:24 | call to source : | hash_extensions.rb:42:5:42:5 | h [element :a] : | -| hash_extensions.rb:43:5:43:5 | x [element] : | hash_extensions.rb:44:10:44:10 | x [element] : | -| hash_extensions.rb:43:5:43:5 | x [element] : | hash_extensions.rb:44:10:44:10 | x [element] : | -| hash_extensions.rb:43:9:43:9 | h [element :a] : | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | -| hash_extensions.rb:43:9:43:9 | h [element :a] : | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | hash_extensions.rb:43:5:43:5 | x [element] : | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | hash_extensions.rb:43:5:43:5 | x [element] : | -| hash_extensions.rb:44:10:44:10 | x [element] : | hash_extensions.rb:44:10:44:14 | ...[...] | -| hash_extensions.rb:44:10:44:10 | x [element] : | hash_extensions.rb:44:10:44:14 | ...[...] | -| hash_extensions.rb:50:5:50:5 | h [element :a] : | hash_extensions.rb:51:9:51:9 | h [element :a] : | -| hash_extensions.rb:50:5:50:5 | h [element :a] : | hash_extensions.rb:51:9:51:9 | h [element :a] : | -| hash_extensions.rb:50:5:50:5 | h [element :b] : | hash_extensions.rb:51:9:51:9 | h [element :b] : | -| hash_extensions.rb:50:5:50:5 | h [element :b] : | hash_extensions.rb:51:9:51:9 | h [element :b] : | -| hash_extensions.rb:50:5:50:5 | h [element :d] : | hash_extensions.rb:51:9:51:9 | h [element :d] : | -| hash_extensions.rb:50:5:50:5 | h [element :d] : | hash_extensions.rb:51:9:51:9 | h [element :d] : | -| hash_extensions.rb:50:14:50:23 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :a] : | -| hash_extensions.rb:50:14:50:23 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :a] : | -| hash_extensions.rb:50:29:50:38 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :b] : | -| hash_extensions.rb:50:29:50:38 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :b] : | -| hash_extensions.rb:50:52:50:61 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :d] : | -| hash_extensions.rb:50:52:50:61 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :d] : | -| hash_extensions.rb:51:5:51:5 | x [element :a] : | hash_extensions.rb:58:10:58:10 | x [element :a] : | -| hash_extensions.rb:51:5:51:5 | x [element :a] : | hash_extensions.rb:58:10:58:10 | x [element :a] : | -| hash_extensions.rb:51:5:51:5 | x [element :b] : | hash_extensions.rb:59:10:59:10 | x [element :b] : | -| hash_extensions.rb:51:5:51:5 | x [element :b] : | hash_extensions.rb:59:10:59:10 | x [element :b] : | -| hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | hash_extensions.rb:56:10:56:10 | h [element :d] : | -| hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | hash_extensions.rb:56:10:56:10 | h [element :d] : | -| hash_extensions.rb:51:9:51:9 | h [element :a] : | hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | -| hash_extensions.rb:51:9:51:9 | h [element :a] : | hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | -| hash_extensions.rb:51:9:51:9 | h [element :b] : | hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | -| hash_extensions.rb:51:9:51:9 | h [element :b] : | hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | -| hash_extensions.rb:51:9:51:9 | h [element :d] : | hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | -| hash_extensions.rb:51:9:51:9 | h [element :d] : | hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | hash_extensions.rb:51:5:51:5 | x [element :a] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | hash_extensions.rb:51:5:51:5 | x [element :a] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | hash_extensions.rb:51:5:51:5 | x [element :b] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | hash_extensions.rb:51:5:51:5 | x [element :b] : | -| hash_extensions.rb:56:10:56:10 | h [element :d] : | hash_extensions.rb:56:10:56:14 | ...[...] | -| hash_extensions.rb:56:10:56:10 | h [element :d] : | hash_extensions.rb:56:10:56:14 | ...[...] | -| hash_extensions.rb:58:10:58:10 | x [element :a] : | hash_extensions.rb:58:10:58:14 | ...[...] | -| hash_extensions.rb:58:10:58:10 | x [element :a] : | hash_extensions.rb:58:10:58:14 | ...[...] | -| hash_extensions.rb:59:10:59:10 | x [element :b] : | hash_extensions.rb:59:10:59:14 | ...[...] | -| hash_extensions.rb:59:10:59:10 | x [element :b] : | hash_extensions.rb:59:10:59:14 | ...[...] | -| hash_extensions.rb:67:5:67:10 | values [element 0] : | hash_extensions.rb:68:9:68:14 | values [element 0] : | -| hash_extensions.rb:67:5:67:10 | values [element 0] : | hash_extensions.rb:68:9:68:14 | values [element 0] : | -| hash_extensions.rb:67:5:67:10 | values [element 1] : | hash_extensions.rb:68:9:68:14 | values [element 1] : | -| hash_extensions.rb:67:5:67:10 | values [element 1] : | hash_extensions.rb:68:9:68:14 | values [element 1] : | -| hash_extensions.rb:67:5:67:10 | values [element 2] : | hash_extensions.rb:68:9:68:14 | values [element 2] : | -| hash_extensions.rb:67:5:67:10 | values [element 2] : | hash_extensions.rb:68:9:68:14 | values [element 2] : | -| hash_extensions.rb:67:15:67:25 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 0] : | -| hash_extensions.rb:67:15:67:25 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 0] : | -| hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 1] : | -| hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 1] : | -| hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 2] : | -| hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 2] : | -| hash_extensions.rb:68:5:68:5 | h [element] : | hash_extensions.rb:73:10:73:10 | h [element] : | -| hash_extensions.rb:68:5:68:5 | h [element] : | hash_extensions.rb:73:10:73:10 | h [element] : | -| hash_extensions.rb:68:5:68:5 | h [element] : | hash_extensions.rb:74:10:74:10 | h [element] : | -| hash_extensions.rb:68:5:68:5 | h [element] : | hash_extensions.rb:74:10:74:10 | h [element] : | -| hash_extensions.rb:68:9:68:14 | values [element 0] : | hash_extensions.rb:68:9:71:7 | call to index_by [element] : | -| hash_extensions.rb:68:9:68:14 | values [element 0] : | hash_extensions.rb:68:9:71:7 | call to index_by [element] : | -| hash_extensions.rb:68:9:68:14 | values [element 0] : | hash_extensions.rb:68:29:68:33 | value : | -| hash_extensions.rb:68:9:68:14 | values [element 0] : | hash_extensions.rb:68:29:68:33 | value : | -| hash_extensions.rb:68:9:68:14 | values [element 1] : | hash_extensions.rb:68:9:71:7 | call to index_by [element] : | -| hash_extensions.rb:68:9:68:14 | values [element 1] : | hash_extensions.rb:68:9:71:7 | call to index_by [element] : | -| hash_extensions.rb:68:9:68:14 | values [element 1] : | hash_extensions.rb:68:29:68:33 | value : | -| hash_extensions.rb:68:9:68:14 | values [element 1] : | hash_extensions.rb:68:29:68:33 | value : | -| hash_extensions.rb:68:9:68:14 | values [element 2] : | hash_extensions.rb:68:9:71:7 | call to index_by [element] : | -| hash_extensions.rb:68:9:68:14 | values [element 2] : | hash_extensions.rb:68:9:71:7 | call to index_by [element] : | -| hash_extensions.rb:68:9:68:14 | values [element 2] : | hash_extensions.rb:68:29:68:33 | value : | -| hash_extensions.rb:68:9:68:14 | values [element 2] : | hash_extensions.rb:68:29:68:33 | value : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:68:5:68:5 | h [element] : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:68:5:68:5 | h [element] : | -| hash_extensions.rb:68:29:68:33 | value : | hash_extensions.rb:69:14:69:18 | value | -| hash_extensions.rb:68:29:68:33 | value : | hash_extensions.rb:69:14:69:18 | value | -| hash_extensions.rb:73:10:73:10 | h [element] : | hash_extensions.rb:73:10:73:16 | ...[...] | -| hash_extensions.rb:73:10:73:10 | h [element] : | hash_extensions.rb:73:10:73:16 | ...[...] | -| hash_extensions.rb:74:10:74:10 | h [element] : | hash_extensions.rb:74:10:74:16 | ...[...] | -| hash_extensions.rb:74:10:74:10 | h [element] : | hash_extensions.rb:74:10:74:16 | ...[...] | -| hash_extensions.rb:80:5:80:10 | values [element 0] : | hash_extensions.rb:81:9:81:14 | values [element 0] : | -| hash_extensions.rb:80:5:80:10 | values [element 0] : | hash_extensions.rb:81:9:81:14 | values [element 0] : | -| hash_extensions.rb:80:5:80:10 | values [element 1] : | hash_extensions.rb:81:9:81:14 | values [element 1] : | -| hash_extensions.rb:80:5:80:10 | values [element 1] : | hash_extensions.rb:81:9:81:14 | values [element 1] : | -| hash_extensions.rb:80:5:80:10 | values [element 2] : | hash_extensions.rb:81:9:81:14 | values [element 2] : | -| hash_extensions.rb:80:5:80:10 | values [element 2] : | hash_extensions.rb:81:9:81:14 | values [element 2] : | -| hash_extensions.rb:80:15:80:25 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 0] : | -| hash_extensions.rb:80:15:80:25 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 0] : | -| hash_extensions.rb:80:28:80:38 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 1] : | -| hash_extensions.rb:80:28:80:38 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 1] : | -| hash_extensions.rb:80:41:80:51 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 2] : | -| hash_extensions.rb:80:41:80:51 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 2] : | -| hash_extensions.rb:81:5:81:5 | h [element] : | hash_extensions.rb:86:10:86:10 | h [element] : | -| hash_extensions.rb:81:5:81:5 | h [element] : | hash_extensions.rb:86:10:86:10 | h [element] : | -| hash_extensions.rb:81:5:81:5 | h [element] : | hash_extensions.rb:87:10:87:10 | h [element] : | -| hash_extensions.rb:81:5:81:5 | h [element] : | hash_extensions.rb:87:10:87:10 | h [element] : | -| hash_extensions.rb:81:9:81:14 | values [element 0] : | hash_extensions.rb:81:31:81:33 | key : | -| hash_extensions.rb:81:9:81:14 | values [element 0] : | hash_extensions.rb:81:31:81:33 | key : | -| hash_extensions.rb:81:9:81:14 | values [element 1] : | hash_extensions.rb:81:31:81:33 | key : | -| hash_extensions.rb:81:9:81:14 | values [element 1] : | hash_extensions.rb:81:31:81:33 | key : | -| hash_extensions.rb:81:9:81:14 | values [element 2] : | hash_extensions.rb:81:31:81:33 | key : | -| hash_extensions.rb:81:9:81:14 | values [element 2] : | hash_extensions.rb:81:31:81:33 | key : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:81:5:81:5 | h [element] : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:81:5:81:5 | h [element] : | -| hash_extensions.rb:81:31:81:33 | key : | hash_extensions.rb:82:14:82:16 | key | -| hash_extensions.rb:81:31:81:33 | key : | hash_extensions.rb:82:14:82:16 | key | -| hash_extensions.rb:83:9:83:19 | call to source : | hash_extensions.rb:81:9:84:7 | call to index_with [element] : | -| hash_extensions.rb:83:9:83:19 | call to source : | hash_extensions.rb:81:9:84:7 | call to index_with [element] : | -| hash_extensions.rb:86:10:86:10 | h [element] : | hash_extensions.rb:86:10:86:16 | ...[...] | -| hash_extensions.rb:86:10:86:10 | h [element] : | hash_extensions.rb:86:10:86:16 | ...[...] | -| hash_extensions.rb:87:10:87:10 | h [element] : | hash_extensions.rb:87:10:87:16 | ...[...] | -| hash_extensions.rb:87:10:87:10 | h [element] : | hash_extensions.rb:87:10:87:16 | ...[...] | -| hash_extensions.rb:89:5:89:5 | j [element] : | hash_extensions.rb:91:10:91:10 | j [element] : | -| hash_extensions.rb:89:5:89:5 | j [element] : | hash_extensions.rb:91:10:91:10 | j [element] : | -| hash_extensions.rb:89:5:89:5 | j [element] : | hash_extensions.rb:92:10:92:10 | j [element] : | -| hash_extensions.rb:89:5:89:5 | j [element] : | hash_extensions.rb:92:10:92:10 | j [element] : | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | hash_extensions.rb:89:5:89:5 | j [element] : | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | hash_extensions.rb:89:5:89:5 | j [element] : | -| hash_extensions.rb:89:27:89:37 | call to source : | hash_extensions.rb:89:9:89:38 | call to index_with [element] : | -| hash_extensions.rb:89:27:89:37 | call to source : | hash_extensions.rb:89:9:89:38 | call to index_with [element] : | -| hash_extensions.rb:91:10:91:10 | j [element] : | hash_extensions.rb:91:10:91:16 | ...[...] | -| hash_extensions.rb:91:10:91:10 | j [element] : | hash_extensions.rb:91:10:91:16 | ...[...] | -| hash_extensions.rb:92:10:92:10 | j [element] : | hash_extensions.rb:92:10:92:16 | ...[...] | -| hash_extensions.rb:92:10:92:10 | j [element] : | hash_extensions.rb:92:10:92:16 | ...[...] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | -| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | hash_extensions.rb:99:10:99:25 | call to pick | -| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | hash_extensions.rb:99:10:99:25 | call to pick | -| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | hash_extensions.rb:100:10:100:27 | call to pick | -| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | hash_extensions.rb:100:10:100:27 | call to pick | -| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | hash_extensions.rb:101:10:101:32 | call to pick [element 0] : | -| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | hash_extensions.rb:101:10:101:32 | call to pick [element 0] : | -| hash_extensions.rb:101:10:101:32 | call to pick [element 0] : | hash_extensions.rb:101:10:101:35 | ...[...] | -| hash_extensions.rb:101:10:101:32 | call to pick [element 0] : | hash_extensions.rb:101:10:101:35 | ...[...] | -| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | hash_extensions.rb:102:10:102:32 | call to pick [element 1] : | -| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | hash_extensions.rb:102:10:102:32 | call to pick [element 1] : | -| hash_extensions.rb:102:10:102:32 | call to pick [element 1] : | hash_extensions.rb:102:10:102:35 | ...[...] | -| hash_extensions.rb:102:10:102:32 | call to pick [element 1] : | hash_extensions.rb:102:10:102:35 | ...[...] | -| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | hash_extensions.rb:103:10:103:32 | call to pick [element 0] : | -| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | hash_extensions.rb:103:10:103:32 | call to pick [element 0] : | -| hash_extensions.rb:103:10:103:32 | call to pick [element 0] : | hash_extensions.rb:103:10:103:35 | ...[...] | -| hash_extensions.rb:103:10:103:32 | call to pick [element 0] : | hash_extensions.rb:103:10:103:35 | ...[...] | -| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | hash_extensions.rb:104:10:104:32 | call to pick [element 1] : | -| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | hash_extensions.rb:104:10:104:32 | call to pick [element 1] : | -| hash_extensions.rb:104:10:104:32 | call to pick [element 1] : | hash_extensions.rb:104:10:104:35 | ...[...] | -| hash_extensions.rb:104:10:104:32 | call to pick [element 1] : | hash_extensions.rb:104:10:104:35 | ...[...] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | -| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | -| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | -| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | -| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | hash_extensions.rb:111:10:111:28 | call to pluck [element] : | -| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | hash_extensions.rb:111:10:111:28 | call to pluck [element] : | -| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | hash_extensions.rb:111:10:111:28 | call to pluck [element] : | -| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | hash_extensions.rb:111:10:111:28 | call to pluck [element] : | -| hash_extensions.rb:111:10:111:28 | call to pluck [element] : | hash_extensions.rb:111:10:111:31 | ...[...] | -| hash_extensions.rb:111:10:111:28 | call to pluck [element] : | hash_extensions.rb:111:10:111:31 | ...[...] | -| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] : | -| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] : | -| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] : | -| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] : | -| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] : | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] : | -| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] : | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] : | -| hash_extensions.rb:112:10:112:36 | ...[...] [element 0] : | hash_extensions.rb:112:10:112:39 | ...[...] | -| hash_extensions.rb:112:10:112:36 | ...[...] [element 0] : | hash_extensions.rb:112:10:112:39 | ...[...] | -| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] : | -| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] : | -| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] : | -| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] : | -| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] : | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] : | -| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] : | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] : | -| hash_extensions.rb:113:10:113:36 | ...[...] [element 1] : | hash_extensions.rb:113:10:113:39 | ...[...] | -| hash_extensions.rb:113:10:113:36 | ...[...] [element 1] : | hash_extensions.rb:113:10:113:39 | ...[...] | -| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] : | -| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] : | -| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] : | -| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] : | -| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] : | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] : | -| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] : | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] : | -| hash_extensions.rb:114:10:114:36 | ...[...] [element 0] : | hash_extensions.rb:114:10:114:39 | ...[...] | -| hash_extensions.rb:114:10:114:36 | ...[...] [element 0] : | hash_extensions.rb:114:10:114:39 | ...[...] | -| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] : | -| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] : | -| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] : | -| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] : | -| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] : | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] : | -| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] : | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] : | -| hash_extensions.rb:115:10:115:36 | ...[...] [element 1] : | hash_extensions.rb:115:10:115:39 | ...[...] | -| hash_extensions.rb:115:10:115:36 | ...[...] [element 1] : | hash_extensions.rb:115:10:115:39 | ...[...] | -| hash_extensions.rb:122:5:122:10 | single [element 0] : | hash_extensions.rb:125:10:125:15 | single [element 0] : | -| hash_extensions.rb:122:5:122:10 | single [element 0] : | hash_extensions.rb:125:10:125:15 | single [element 0] : | -| hash_extensions.rb:122:15:122:25 | call to source : | hash_extensions.rb:122:5:122:10 | single [element 0] : | -| hash_extensions.rb:122:15:122:25 | call to source : | hash_extensions.rb:122:5:122:10 | single [element 0] : | -| hash_extensions.rb:123:5:123:9 | multi [element 0] : | hash_extensions.rb:126:10:126:14 | multi [element 0] : | -| hash_extensions.rb:123:5:123:9 | multi [element 0] : | hash_extensions.rb:126:10:126:14 | multi [element 0] : | -| hash_extensions.rb:123:14:123:24 | call to source : | hash_extensions.rb:123:5:123:9 | multi [element 0] : | -| hash_extensions.rb:123:14:123:24 | call to source : | hash_extensions.rb:123:5:123:9 | multi [element 0] : | -| hash_extensions.rb:125:10:125:15 | single [element 0] : | hash_extensions.rb:125:10:125:20 | call to sole | -| hash_extensions.rb:125:10:125:15 | single [element 0] : | hash_extensions.rb:125:10:125:20 | call to sole | -| hash_extensions.rb:126:10:126:14 | multi [element 0] : | hash_extensions.rb:126:10:126:19 | call to sole | -| hash_extensions.rb:126:10:126:14 | multi [element 0] : | hash_extensions.rb:126:10:126:19 | call to sole | +| active_support.rb:10:5:10:5 | x | active_support.rb:11:10:11:10 | x | +| active_support.rb:10:9:10:18 | call to source | active_support.rb:10:5:10:5 | x | +| active_support.rb:11:10:11:10 | x | active_support.rb:11:10:11:19 | call to at | +| active_support.rb:15:5:15:5 | x | active_support.rb:16:10:16:10 | x | +| active_support.rb:15:9:15:18 | call to source | active_support.rb:15:5:15:5 | x | +| active_support.rb:16:10:16:10 | x | active_support.rb:16:10:16:19 | call to camelize | +| active_support.rb:20:5:20:5 | x | active_support.rb:21:10:21:10 | x | +| active_support.rb:20:9:20:18 | call to source | active_support.rb:20:5:20:5 | x | +| active_support.rb:21:10:21:10 | x | active_support.rb:21:10:21:20 | call to camelcase | +| active_support.rb:25:5:25:5 | x | active_support.rb:26:10:26:10 | x | +| active_support.rb:25:9:25:18 | call to source | active_support.rb:25:5:25:5 | x | +| active_support.rb:26:10:26:10 | x | active_support.rb:26:10:26:19 | call to classify | +| active_support.rb:30:5:30:5 | x | active_support.rb:31:10:31:10 | x | +| active_support.rb:30:9:30:18 | call to source | active_support.rb:30:5:30:5 | x | +| active_support.rb:31:10:31:10 | x | active_support.rb:31:10:31:20 | call to dasherize | +| active_support.rb:35:5:35:5 | x | active_support.rb:36:10:36:10 | x | +| active_support.rb:35:9:35:18 | call to source | active_support.rb:35:5:35:5 | x | +| active_support.rb:36:10:36:10 | x | active_support.rb:36:10:36:24 | call to deconstantize | +| active_support.rb:40:5:40:5 | x | active_support.rb:41:10:41:10 | x | +| active_support.rb:40:9:40:18 | call to source | active_support.rb:40:5:40:5 | x | +| active_support.rb:41:10:41:10 | x | active_support.rb:41:10:41:21 | call to demodulize | +| active_support.rb:45:5:45:5 | x | active_support.rb:46:10:46:10 | x | +| active_support.rb:45:9:45:18 | call to source | active_support.rb:45:5:45:5 | x | +| active_support.rb:46:10:46:10 | x | active_support.rb:46:10:46:19 | call to first | +| active_support.rb:50:5:50:5 | x | active_support.rb:51:10:51:10 | x | +| active_support.rb:50:9:50:18 | call to source | active_support.rb:50:5:50:5 | x | +| active_support.rb:51:10:51:10 | x | active_support.rb:51:10:51:22 | call to foreign_key | +| active_support.rb:55:5:55:5 | x | active_support.rb:56:10:56:10 | x | +| active_support.rb:55:9:55:18 | call to source | active_support.rb:55:5:55:5 | x | +| active_support.rb:56:10:56:10 | x | active_support.rb:56:10:56:18 | call to from | +| active_support.rb:60:5:60:5 | x | active_support.rb:61:10:61:10 | x | +| active_support.rb:60:9:60:18 | call to source | active_support.rb:60:5:60:5 | x | +| active_support.rb:61:10:61:10 | x | active_support.rb:61:10:61:20 | call to html_safe | +| active_support.rb:65:5:65:5 | x | active_support.rb:66:10:66:10 | x | +| active_support.rb:65:9:65:18 | call to source | active_support.rb:65:5:65:5 | x | +| active_support.rb:66:10:66:10 | x | active_support.rb:66:10:66:19 | call to humanize | +| active_support.rb:70:5:70:5 | x | active_support.rb:71:10:71:10 | x | +| active_support.rb:70:9:70:18 | call to source | active_support.rb:70:5:70:5 | x | +| active_support.rb:71:10:71:10 | x | active_support.rb:71:10:71:20 | call to indent | +| active_support.rb:75:5:75:5 | x | active_support.rb:76:10:76:10 | x | +| active_support.rb:75:9:75:18 | call to source | active_support.rb:75:5:75:5 | x | +| active_support.rb:76:10:76:10 | x | active_support.rb:76:10:76:21 | call to indent! | +| active_support.rb:80:5:80:5 | x | active_support.rb:81:10:81:10 | x | +| active_support.rb:80:9:80:18 | call to source | active_support.rb:80:5:80:5 | x | +| active_support.rb:81:10:81:10 | x | active_support.rb:81:10:81:18 | call to inquiry | +| active_support.rb:85:5:85:5 | x | active_support.rb:86:10:86:10 | x | +| active_support.rb:85:9:85:18 | call to source | active_support.rb:85:5:85:5 | x | +| active_support.rb:86:10:86:10 | x | active_support.rb:86:10:86:18 | call to last | +| active_support.rb:90:5:90:5 | x | active_support.rb:91:10:91:10 | x | +| active_support.rb:90:9:90:18 | call to source | active_support.rb:90:5:90:5 | x | +| active_support.rb:91:10:91:10 | x | active_support.rb:91:10:91:19 | call to mb_chars | +| active_support.rb:95:5:95:5 | x | active_support.rb:96:10:96:10 | x | +| active_support.rb:95:9:95:18 | call to source | active_support.rb:95:5:95:5 | x | +| active_support.rb:96:10:96:10 | x | active_support.rb:96:10:96:23 | call to parameterize | +| active_support.rb:100:5:100:5 | x | active_support.rb:101:10:101:10 | x | +| active_support.rb:100:9:100:18 | call to source | active_support.rb:100:5:100:5 | x | +| active_support.rb:101:10:101:10 | x | active_support.rb:101:10:101:20 | call to pluralize | +| active_support.rb:105:5:105:5 | x | active_support.rb:106:10:106:10 | x | +| active_support.rb:105:9:105:18 | call to source | active_support.rb:105:5:105:5 | x | +| active_support.rb:106:10:106:10 | x | active_support.rb:106:10:106:24 | call to remove | +| active_support.rb:110:5:110:5 | x | active_support.rb:111:10:111:10 | x | +| active_support.rb:110:9:110:18 | call to source | active_support.rb:110:5:110:5 | x | +| active_support.rb:111:10:111:10 | x | active_support.rb:111:10:111:25 | call to remove! | +| active_support.rb:115:5:115:5 | x | active_support.rb:116:10:116:10 | x | +| active_support.rb:115:9:115:18 | call to source | active_support.rb:115:5:115:5 | x | +| active_support.rb:116:10:116:10 | x | active_support.rb:116:10:116:22 | call to singularize | +| active_support.rb:120:5:120:5 | x | active_support.rb:121:10:121:10 | x | +| active_support.rb:120:9:120:18 | call to source | active_support.rb:120:5:120:5 | x | +| active_support.rb:121:10:121:10 | x | active_support.rb:121:10:121:17 | call to squish | +| active_support.rb:125:5:125:5 | x | active_support.rb:126:10:126:10 | x | +| active_support.rb:125:9:125:18 | call to source | active_support.rb:125:5:125:5 | x | +| active_support.rb:126:10:126:10 | x | active_support.rb:126:10:126:18 | call to squish! | +| active_support.rb:130:5:130:5 | x | active_support.rb:131:10:131:10 | x | +| active_support.rb:130:9:130:18 | call to source | active_support.rb:130:5:130:5 | x | +| active_support.rb:131:10:131:10 | x | active_support.rb:131:10:131:24 | call to strip_heredoc | +| active_support.rb:135:5:135:5 | x | active_support.rb:136:10:136:10 | x | +| active_support.rb:135:9:135:18 | call to source | active_support.rb:135:5:135:5 | x | +| active_support.rb:136:10:136:10 | x | active_support.rb:136:10:136:19 | call to tableize | +| active_support.rb:140:5:140:5 | x | active_support.rb:141:10:141:10 | x | +| active_support.rb:140:9:140:18 | call to source | active_support.rb:140:5:140:5 | x | +| active_support.rb:141:10:141:10 | x | active_support.rb:141:10:141:20 | call to titlecase | +| active_support.rb:145:5:145:5 | x | active_support.rb:146:10:146:10 | x | +| active_support.rb:145:9:145:18 | call to source | active_support.rb:145:5:145:5 | x | +| active_support.rb:146:10:146:10 | x | active_support.rb:146:10:146:19 | call to titleize | +| active_support.rb:150:5:150:5 | x | active_support.rb:151:10:151:10 | x | +| active_support.rb:150:9:150:18 | call to source | active_support.rb:150:5:150:5 | x | +| active_support.rb:151:10:151:10 | x | active_support.rb:151:10:151:16 | call to to | +| active_support.rb:155:5:155:5 | x | active_support.rb:156:10:156:10 | x | +| active_support.rb:155:9:155:18 | call to source | active_support.rb:155:5:155:5 | x | +| active_support.rb:156:10:156:10 | x | active_support.rb:156:10:156:22 | call to truncate | +| active_support.rb:160:5:160:5 | x | active_support.rb:161:10:161:10 | x | +| active_support.rb:160:9:160:18 | call to source | active_support.rb:160:5:160:5 | x | +| active_support.rb:161:10:161:10 | x | active_support.rb:161:10:161:28 | call to truncate_bytes | +| active_support.rb:165:5:165:5 | x | active_support.rb:166:10:166:10 | x | +| active_support.rb:165:9:165:18 | call to source | active_support.rb:165:5:165:5 | x | +| active_support.rb:166:10:166:10 | x | active_support.rb:166:10:166:28 | call to truncate_words | +| active_support.rb:170:5:170:5 | x | active_support.rb:171:10:171:10 | x | +| active_support.rb:170:9:170:18 | call to source | active_support.rb:170:5:170:5 | x | +| active_support.rb:171:10:171:10 | x | active_support.rb:171:10:171:21 | call to underscore | +| active_support.rb:175:5:175:5 | x | active_support.rb:176:10:176:10 | x | +| active_support.rb:175:9:175:18 | call to source | active_support.rb:175:5:175:5 | x | +| active_support.rb:176:10:176:10 | x | active_support.rb:176:10:176:23 | call to upcase_first | +| active_support.rb:180:5:180:5 | x [element 0] | active_support.rb:181:9:181:9 | x [element 0] | +| active_support.rb:180:5:180:5 | x [element 0] | active_support.rb:181:9:181:9 | x [element 0] | +| active_support.rb:180:10:180:17 | call to source | active_support.rb:180:5:180:5 | x [element 0] | +| active_support.rb:180:10:180:17 | call to source | active_support.rb:180:5:180:5 | x [element 0] | +| active_support.rb:181:5:181:5 | y [element] | active_support.rb:182:10:182:10 | y [element] | +| active_support.rb:181:5:181:5 | y [element] | active_support.rb:182:10:182:10 | y [element] | +| active_support.rb:181:9:181:9 | x [element 0] | active_support.rb:181:9:181:23 | call to compact_blank [element] | +| active_support.rb:181:9:181:9 | x [element 0] | active_support.rb:181:9:181:23 | call to compact_blank [element] | +| active_support.rb:181:9:181:23 | call to compact_blank [element] | active_support.rb:181:5:181:5 | y [element] | +| active_support.rb:181:9:181:23 | call to compact_blank [element] | active_support.rb:181:5:181:5 | y [element] | +| active_support.rb:182:10:182:10 | y [element] | active_support.rb:182:10:182:13 | ...[...] | +| active_support.rb:182:10:182:10 | y [element] | active_support.rb:182:10:182:13 | ...[...] | +| active_support.rb:186:5:186:5 | x [element 0] | active_support.rb:187:9:187:9 | x [element 0] | +| active_support.rb:186:5:186:5 | x [element 0] | active_support.rb:187:9:187:9 | x [element 0] | +| active_support.rb:186:10:186:18 | call to source | active_support.rb:186:5:186:5 | x [element 0] | +| active_support.rb:186:10:186:18 | call to source | active_support.rb:186:5:186:5 | x [element 0] | +| active_support.rb:187:5:187:5 | y [element] | active_support.rb:188:10:188:10 | y [element] | +| active_support.rb:187:5:187:5 | y [element] | active_support.rb:188:10:188:10 | y [element] | +| active_support.rb:187:9:187:9 | x [element 0] | active_support.rb:187:9:187:21 | call to excluding [element] | +| active_support.rb:187:9:187:9 | x [element 0] | active_support.rb:187:9:187:21 | call to excluding [element] | +| active_support.rb:187:9:187:21 | call to excluding [element] | active_support.rb:187:5:187:5 | y [element] | +| active_support.rb:187:9:187:21 | call to excluding [element] | active_support.rb:187:5:187:5 | y [element] | +| active_support.rb:188:10:188:10 | y [element] | active_support.rb:188:10:188:13 | ...[...] | +| active_support.rb:188:10:188:10 | y [element] | active_support.rb:188:10:188:13 | ...[...] | +| active_support.rb:192:5:192:5 | x [element 0] | active_support.rb:193:9:193:9 | x [element 0] | +| active_support.rb:192:5:192:5 | x [element 0] | active_support.rb:193:9:193:9 | x [element 0] | +| active_support.rb:192:10:192:18 | call to source | active_support.rb:192:5:192:5 | x [element 0] | +| active_support.rb:192:10:192:18 | call to source | active_support.rb:192:5:192:5 | x [element 0] | +| active_support.rb:193:5:193:5 | y [element] | active_support.rb:194:10:194:10 | y [element] | +| active_support.rb:193:5:193:5 | y [element] | active_support.rb:194:10:194:10 | y [element] | +| active_support.rb:193:9:193:9 | x [element 0] | active_support.rb:193:9:193:19 | call to without [element] | +| active_support.rb:193:9:193:9 | x [element 0] | active_support.rb:193:9:193:19 | call to without [element] | +| active_support.rb:193:9:193:19 | call to without [element] | active_support.rb:193:5:193:5 | y [element] | +| active_support.rb:193:9:193:19 | call to without [element] | active_support.rb:193:5:193:5 | y [element] | +| active_support.rb:194:10:194:10 | y [element] | active_support.rb:194:10:194:13 | ...[...] | +| active_support.rb:194:10:194:10 | y [element] | active_support.rb:194:10:194:13 | ...[...] | +| active_support.rb:198:5:198:5 | x [element 0] | active_support.rb:199:9:199:9 | x [element 0] | +| active_support.rb:198:5:198:5 | x [element 0] | active_support.rb:199:9:199:9 | x [element 0] | +| active_support.rb:198:10:198:18 | call to source | active_support.rb:198:5:198:5 | x [element 0] | +| active_support.rb:198:10:198:18 | call to source | active_support.rb:198:5:198:5 | x [element 0] | +| active_support.rb:199:5:199:5 | y [element] | active_support.rb:200:10:200:10 | y [element] | +| active_support.rb:199:5:199:5 | y [element] | active_support.rb:200:10:200:10 | y [element] | +| active_support.rb:199:9:199:9 | x [element 0] | active_support.rb:199:9:199:37 | call to in_order_of [element] | +| active_support.rb:199:9:199:9 | x [element 0] | active_support.rb:199:9:199:37 | call to in_order_of [element] | +| active_support.rb:199:9:199:37 | call to in_order_of [element] | active_support.rb:199:5:199:5 | y [element] | +| active_support.rb:199:9:199:37 | call to in_order_of [element] | active_support.rb:199:5:199:5 | y [element] | +| active_support.rb:200:10:200:10 | y [element] | active_support.rb:200:10:200:13 | ...[...] | +| active_support.rb:200:10:200:10 | y [element] | active_support.rb:200:10:200:13 | ...[...] | +| active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:205:9:205:9 | a [element 0] | +| active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:205:9:205:9 | a [element 0] | +| active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:206:10:206:10 | a [element 0] | +| active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:206:10:206:10 | a [element 0] | +| active_support.rb:204:10:204:18 | call to source | active_support.rb:204:5:204:5 | a [element 0] | +| active_support.rb:204:10:204:18 | call to source | active_support.rb:204:5:204:5 | a [element 0] | +| active_support.rb:205:5:205:5 | b [element 0] | active_support.rb:208:10:208:10 | b [element 0] | +| active_support.rb:205:5:205:5 | b [element 0] | active_support.rb:208:10:208:10 | b [element 0] | +| active_support.rb:205:5:205:5 | b [element] | active_support.rb:208:10:208:10 | b [element] | +| active_support.rb:205:5:205:5 | b [element] | active_support.rb:208:10:208:10 | b [element] | +| active_support.rb:205:5:205:5 | b [element] | active_support.rb:209:10:209:10 | b [element] | +| active_support.rb:205:5:205:5 | b [element] | active_support.rb:209:10:209:10 | b [element] | +| active_support.rb:205:5:205:5 | b [element] | active_support.rb:210:10:210:10 | b [element] | +| active_support.rb:205:5:205:5 | b [element] | active_support.rb:210:10:210:10 | b [element] | +| active_support.rb:205:5:205:5 | b [element] | active_support.rb:211:10:211:10 | b [element] | +| active_support.rb:205:5:205:5 | b [element] | active_support.rb:211:10:211:10 | b [element] | +| active_support.rb:205:9:205:9 | a [element 0] | active_support.rb:205:9:205:41 | call to including [element 0] | +| active_support.rb:205:9:205:9 | a [element 0] | active_support.rb:205:9:205:41 | call to including [element 0] | +| active_support.rb:205:9:205:41 | call to including [element 0] | active_support.rb:205:5:205:5 | b [element 0] | +| active_support.rb:205:9:205:41 | call to including [element 0] | active_support.rb:205:5:205:5 | b [element 0] | +| active_support.rb:205:9:205:41 | call to including [element] | active_support.rb:205:5:205:5 | b [element] | +| active_support.rb:205:9:205:41 | call to including [element] | active_support.rb:205:5:205:5 | b [element] | +| active_support.rb:205:21:205:29 | call to source | active_support.rb:205:9:205:41 | call to including [element] | +| active_support.rb:205:21:205:29 | call to source | active_support.rb:205:9:205:41 | call to including [element] | +| active_support.rb:205:32:205:40 | call to source | active_support.rb:205:9:205:41 | call to including [element] | +| active_support.rb:205:32:205:40 | call to source | active_support.rb:205:9:205:41 | call to including [element] | +| active_support.rb:206:10:206:10 | a [element 0] | active_support.rb:206:10:206:13 | ...[...] | +| active_support.rb:206:10:206:10 | a [element 0] | active_support.rb:206:10:206:13 | ...[...] | +| active_support.rb:208:10:208:10 | b [element 0] | active_support.rb:208:10:208:13 | ...[...] | +| active_support.rb:208:10:208:10 | b [element 0] | active_support.rb:208:10:208:13 | ...[...] | +| active_support.rb:208:10:208:10 | b [element] | active_support.rb:208:10:208:13 | ...[...] | +| active_support.rb:208:10:208:10 | b [element] | active_support.rb:208:10:208:13 | ...[...] | +| active_support.rb:209:10:209:10 | b [element] | active_support.rb:209:10:209:13 | ...[...] | +| active_support.rb:209:10:209:10 | b [element] | active_support.rb:209:10:209:13 | ...[...] | +| active_support.rb:210:10:210:10 | b [element] | active_support.rb:210:10:210:13 | ...[...] | +| active_support.rb:210:10:210:10 | b [element] | active_support.rb:210:10:210:13 | ...[...] | +| active_support.rb:211:10:211:10 | b [element] | active_support.rb:211:10:211:13 | ...[...] | +| active_support.rb:211:10:211:10 | b [element] | active_support.rb:211:10:211:13 | ...[...] | +| active_support.rb:215:3:215:3 | x | active_support.rb:216:34:216:34 | x | +| active_support.rb:215:7:215:16 | call to source | active_support.rb:215:3:215:3 | x | +| active_support.rb:216:3:216:3 | y | active_support.rb:217:8:217:8 | y | +| active_support.rb:216:7:216:35 | call to new | active_support.rb:216:3:216:3 | y | +| active_support.rb:216:34:216:34 | x | active_support.rb:216:7:216:35 | call to new | +| active_support.rb:222:3:222:3 | b | active_support.rb:223:21:223:21 | b | +| active_support.rb:222:7:222:16 | call to source | active_support.rb:222:3:222:3 | b | +| active_support.rb:223:3:223:3 | y | active_support.rb:224:8:224:8 | y | +| active_support.rb:223:7:223:22 | call to safe_concat | active_support.rb:223:3:223:3 | y | +| active_support.rb:223:21:223:21 | b | active_support.rb:223:7:223:22 | call to safe_concat | +| active_support.rb:229:3:229:3 | b | active_support.rb:230:17:230:17 | b | +| active_support.rb:229:7:229:16 | call to source | active_support.rb:229:3:229:3 | b | +| active_support.rb:230:3:230:3 | [post] x | active_support.rb:231:8:231:8 | x | +| active_support.rb:230:17:230:17 | b | active_support.rb:230:3:230:3 | [post] x | +| active_support.rb:235:3:235:3 | a | active_support.rb:237:34:237:34 | a | +| active_support.rb:235:7:235:16 | call to source | active_support.rb:235:3:235:3 | a | +| active_support.rb:237:3:237:3 | x | active_support.rb:238:7:238:7 | x | +| active_support.rb:237:7:237:35 | call to new | active_support.rb:237:3:237:3 | x | +| active_support.rb:237:34:237:34 | a | active_support.rb:237:7:237:35 | call to new | +| active_support.rb:238:3:238:3 | y | active_support.rb:239:8:239:8 | y | +| active_support.rb:238:7:238:7 | x | active_support.rb:238:7:238:17 | call to concat | +| active_support.rb:238:7:238:17 | call to concat | active_support.rb:238:3:238:3 | y | +| active_support.rb:243:3:243:3 | a | active_support.rb:245:34:245:34 | a | +| active_support.rb:243:7:243:16 | call to source | active_support.rb:243:3:243:3 | a | +| active_support.rb:245:3:245:3 | x | active_support.rb:246:7:246:7 | x | +| active_support.rb:245:7:245:35 | call to new | active_support.rb:245:3:245:3 | x | +| active_support.rb:245:34:245:34 | a | active_support.rb:245:7:245:35 | call to new | +| active_support.rb:246:3:246:3 | y | active_support.rb:247:8:247:8 | y | +| active_support.rb:246:7:246:7 | x | active_support.rb:246:7:246:20 | call to insert | +| active_support.rb:246:7:246:20 | call to insert | active_support.rb:246:3:246:3 | y | +| active_support.rb:251:3:251:3 | a | active_support.rb:253:34:253:34 | a | +| active_support.rb:251:7:251:16 | call to source | active_support.rb:251:3:251:3 | a | +| active_support.rb:253:3:253:3 | x | active_support.rb:254:7:254:7 | x | +| active_support.rb:253:7:253:35 | call to new | active_support.rb:253:3:253:3 | x | +| active_support.rb:253:34:253:34 | a | active_support.rb:253:7:253:35 | call to new | +| active_support.rb:254:3:254:3 | y | active_support.rb:255:8:255:8 | y | +| active_support.rb:254:7:254:7 | x | active_support.rb:254:7:254:18 | call to prepend | +| active_support.rb:254:7:254:18 | call to prepend | active_support.rb:254:3:254:3 | y | +| active_support.rb:259:3:259:3 | a | active_support.rb:260:34:260:34 | a | +| active_support.rb:259:7:259:16 | call to source | active_support.rb:259:3:259:3 | a | +| active_support.rb:260:3:260:3 | x | active_support.rb:261:7:261:7 | x | +| active_support.rb:260:7:260:35 | call to new | active_support.rb:260:3:260:3 | x | +| active_support.rb:260:34:260:34 | a | active_support.rb:260:7:260:35 | call to new | +| active_support.rb:261:3:261:3 | y | active_support.rb:262:8:262:8 | y | +| active_support.rb:261:7:261:7 | x | active_support.rb:261:7:261:12 | call to to_s | +| active_support.rb:261:7:261:12 | call to to_s | active_support.rb:261:3:261:3 | y | +| active_support.rb:266:3:266:3 | a | active_support.rb:267:34:267:34 | a | +| active_support.rb:266:7:266:16 | call to source | active_support.rb:266:3:266:3 | a | +| active_support.rb:267:3:267:3 | x | active_support.rb:268:7:268:7 | x | +| active_support.rb:267:7:267:35 | call to new | active_support.rb:267:3:267:3 | x | +| active_support.rb:267:34:267:34 | a | active_support.rb:267:7:267:35 | call to new | +| active_support.rb:268:3:268:3 | y | active_support.rb:269:8:269:8 | y | +| active_support.rb:268:7:268:7 | x | active_support.rb:268:7:268:16 | call to to_param | +| active_support.rb:268:7:268:16 | call to to_param | active_support.rb:268:3:268:3 | y | +| active_support.rb:273:3:273:3 | a | active_support.rb:274:20:274:20 | a | +| active_support.rb:273:7:273:16 | call to source | active_support.rb:273:3:273:3 | a | +| active_support.rb:274:3:274:3 | x | active_support.rb:275:7:275:7 | x | +| active_support.rb:274:7:274:21 | call to new | active_support.rb:274:3:274:3 | x | +| active_support.rb:274:20:274:20 | a | active_support.rb:274:7:274:21 | call to new | +| active_support.rb:275:3:275:3 | y | active_support.rb:276:8:276:8 | y | +| active_support.rb:275:3:275:3 | y | active_support.rb:277:7:277:7 | y | +| active_support.rb:275:7:275:7 | x | active_support.rb:275:7:275:17 | call to existence | +| active_support.rb:275:7:275:17 | call to existence | active_support.rb:275:3:275:3 | y | +| active_support.rb:277:3:277:3 | z | active_support.rb:278:8:278:8 | z | +| active_support.rb:277:7:277:7 | y | active_support.rb:277:7:277:17 | call to existence | +| active_support.rb:277:7:277:17 | call to existence | active_support.rb:277:3:277:3 | z | +| active_support.rb:282:3:282:3 | x | active_support.rb:283:8:283:8 | x | +| active_support.rb:282:3:282:3 | x | active_support.rb:283:8:283:8 | x | +| active_support.rb:282:7:282:16 | call to source | active_support.rb:282:3:282:3 | x | +| active_support.rb:282:7:282:16 | call to source | active_support.rb:282:3:282:3 | x | +| active_support.rb:283:8:283:8 | x | active_support.rb:283:8:283:17 | call to presence | +| active_support.rb:283:8:283:8 | x | active_support.rb:283:8:283:17 | call to presence | +| active_support.rb:285:3:285:3 | y | active_support.rb:286:8:286:8 | y | +| active_support.rb:285:3:285:3 | y | active_support.rb:286:8:286:8 | y | +| active_support.rb:285:7:285:16 | call to source | active_support.rb:285:3:285:3 | y | +| active_support.rb:285:7:285:16 | call to source | active_support.rb:285:3:285:3 | y | +| active_support.rb:286:8:286:8 | y | active_support.rb:286:8:286:17 | call to presence | +| active_support.rb:286:8:286:8 | y | active_support.rb:286:8:286:17 | call to presence | +| active_support.rb:290:3:290:3 | x | active_support.rb:291:8:291:8 | x | +| active_support.rb:290:3:290:3 | x | active_support.rb:291:8:291:8 | x | +| active_support.rb:290:7:290:16 | call to source | active_support.rb:290:3:290:3 | x | +| active_support.rb:290:7:290:16 | call to source | active_support.rb:290:3:290:3 | x | +| active_support.rb:291:8:291:8 | x | active_support.rb:291:8:291:17 | call to deep_dup | +| active_support.rb:291:8:291:8 | x | active_support.rb:291:8:291:17 | call to deep_dup | +| active_support.rb:303:3:303:3 | a | active_support.rb:304:19:304:19 | a | +| active_support.rb:303:7:303:16 | call to source | active_support.rb:303:3:303:3 | a | +| active_support.rb:304:3:304:3 | b | active_support.rb:305:8:305:8 | b | +| active_support.rb:304:7:304:19 | call to json_escape | active_support.rb:304:3:304:3 | b | +| active_support.rb:304:19:304:19 | a | active_support.rb:304:7:304:19 | call to json_escape | +| active_support.rb:309:5:309:5 | x | active_support.rb:310:37:310:37 | x | +| active_support.rb:309:9:309:18 | call to source | active_support.rb:309:5:309:5 | x | +| active_support.rb:310:37:310:37 | x | active_support.rb:310:10:310:38 | call to encode | +| active_support.rb:314:5:314:5 | x | active_support.rb:315:37:315:37 | x | +| active_support.rb:314:9:314:18 | call to source | active_support.rb:314:5:314:5 | x | +| active_support.rb:315:37:315:37 | x | active_support.rb:315:10:315:38 | call to decode | +| active_support.rb:319:5:319:5 | x | active_support.rb:320:35:320:35 | x | +| active_support.rb:319:9:319:18 | call to source | active_support.rb:319:5:319:5 | x | +| active_support.rb:320:35:320:35 | x | active_support.rb:320:10:320:36 | call to dump | +| active_support.rb:324:5:324:5 | x | active_support.rb:325:35:325:35 | x | +| active_support.rb:324:9:324:18 | call to source | active_support.rb:324:5:324:5 | x | +| active_support.rb:325:35:325:35 | x | active_support.rb:325:10:325:36 | call to load | +| active_support.rb:329:5:329:5 | x | active_support.rb:330:10:330:10 | x | +| active_support.rb:329:5:329:5 | x | active_support.rb:331:10:331:10 | x | +| active_support.rb:329:9:329:18 | call to source | active_support.rb:329:5:329:5 | x | +| active_support.rb:330:5:330:5 | y [element 0] | active_support.rb:332:10:332:10 | y [element 0] | +| active_support.rb:330:10:330:10 | x | active_support.rb:330:5:330:5 | y [element 0] | +| active_support.rb:331:10:331:10 | x | active_support.rb:331:10:331:18 | call to to_json | +| active_support.rb:332:10:332:10 | y [element 0] | active_support.rb:332:10:332:18 | call to to_json | +| hash_extensions.rb:2:5:2:5 | h [element :a] | hash_extensions.rb:3:9:3:9 | h [element :a] | +| hash_extensions.rb:2:5:2:5 | h [element :a] | hash_extensions.rb:3:9:3:9 | h [element :a] | +| hash_extensions.rb:2:14:2:24 | call to source | hash_extensions.rb:2:5:2:5 | h [element :a] | +| hash_extensions.rb:2:14:2:24 | call to source | hash_extensions.rb:2:5:2:5 | h [element :a] | +| hash_extensions.rb:3:5:3:5 | x [element] | hash_extensions.rb:4:10:4:10 | x [element] | +| hash_extensions.rb:3:5:3:5 | x [element] | hash_extensions.rb:4:10:4:10 | x [element] | +| hash_extensions.rb:3:9:3:9 | h [element :a] | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | +| hash_extensions.rb:3:9:3:9 | h [element :a] | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | +| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | hash_extensions.rb:3:5:3:5 | x [element] | +| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | hash_extensions.rb:3:5:3:5 | x [element] | +| hash_extensions.rb:4:10:4:10 | x [element] | hash_extensions.rb:4:10:4:14 | ...[...] | +| hash_extensions.rb:4:10:4:10 | x [element] | hash_extensions.rb:4:10:4:14 | ...[...] | +| hash_extensions.rb:10:5:10:5 | h [element :a] | hash_extensions.rb:11:9:11:9 | h [element :a] | +| hash_extensions.rb:10:5:10:5 | h [element :a] | hash_extensions.rb:11:9:11:9 | h [element :a] | +| hash_extensions.rb:10:14:10:24 | call to source | hash_extensions.rb:10:5:10:5 | h [element :a] | +| hash_extensions.rb:10:14:10:24 | call to source | hash_extensions.rb:10:5:10:5 | h [element :a] | +| hash_extensions.rb:11:5:11:5 | x [element] | hash_extensions.rb:12:10:12:10 | x [element] | +| hash_extensions.rb:11:5:11:5 | x [element] | hash_extensions.rb:12:10:12:10 | x [element] | +| hash_extensions.rb:11:9:11:9 | h [element :a] | hash_extensions.rb:11:9:11:20 | call to to_options [element] | +| hash_extensions.rb:11:9:11:9 | h [element :a] | hash_extensions.rb:11:9:11:20 | call to to_options [element] | +| hash_extensions.rb:11:9:11:20 | call to to_options [element] | hash_extensions.rb:11:5:11:5 | x [element] | +| hash_extensions.rb:11:9:11:20 | call to to_options [element] | hash_extensions.rb:11:5:11:5 | x [element] | +| hash_extensions.rb:12:10:12:10 | x [element] | hash_extensions.rb:12:10:12:14 | ...[...] | +| hash_extensions.rb:12:10:12:10 | x [element] | hash_extensions.rb:12:10:12:14 | ...[...] | +| hash_extensions.rb:18:5:18:5 | h [element :a] | hash_extensions.rb:19:9:19:9 | h [element :a] | +| hash_extensions.rb:18:5:18:5 | h [element :a] | hash_extensions.rb:19:9:19:9 | h [element :a] | +| hash_extensions.rb:18:14:18:24 | call to source | hash_extensions.rb:18:5:18:5 | h [element :a] | +| hash_extensions.rb:18:14:18:24 | call to source | hash_extensions.rb:18:5:18:5 | h [element :a] | +| hash_extensions.rb:19:5:19:5 | x [element] | hash_extensions.rb:20:10:20:10 | x [element] | +| hash_extensions.rb:19:5:19:5 | x [element] | hash_extensions.rb:20:10:20:10 | x [element] | +| hash_extensions.rb:19:9:19:9 | h [element :a] | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | +| hash_extensions.rb:19:9:19:9 | h [element :a] | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | +| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | hash_extensions.rb:19:5:19:5 | x [element] | +| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | hash_extensions.rb:19:5:19:5 | x [element] | +| hash_extensions.rb:20:10:20:10 | x [element] | hash_extensions.rb:20:10:20:14 | ...[...] | +| hash_extensions.rb:20:10:20:10 | x [element] | hash_extensions.rb:20:10:20:14 | ...[...] | +| hash_extensions.rb:26:5:26:5 | h [element :a] | hash_extensions.rb:27:9:27:9 | h [element :a] | +| hash_extensions.rb:26:5:26:5 | h [element :a] | hash_extensions.rb:27:9:27:9 | h [element :a] | +| hash_extensions.rb:26:14:26:24 | call to source | hash_extensions.rb:26:5:26:5 | h [element :a] | +| hash_extensions.rb:26:14:26:24 | call to source | hash_extensions.rb:26:5:26:5 | h [element :a] | +| hash_extensions.rb:27:5:27:5 | x [element] | hash_extensions.rb:28:10:28:10 | x [element] | +| hash_extensions.rb:27:5:27:5 | x [element] | hash_extensions.rb:28:10:28:10 | x [element] | +| hash_extensions.rb:27:9:27:9 | h [element :a] | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | +| hash_extensions.rb:27:9:27:9 | h [element :a] | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | +| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | hash_extensions.rb:27:5:27:5 | x [element] | +| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | hash_extensions.rb:27:5:27:5 | x [element] | +| hash_extensions.rb:28:10:28:10 | x [element] | hash_extensions.rb:28:10:28:14 | ...[...] | +| hash_extensions.rb:28:10:28:10 | x [element] | hash_extensions.rb:28:10:28:14 | ...[...] | +| hash_extensions.rb:34:5:34:5 | h [element :a] | hash_extensions.rb:35:9:35:9 | h [element :a] | +| hash_extensions.rb:34:5:34:5 | h [element :a] | hash_extensions.rb:35:9:35:9 | h [element :a] | +| hash_extensions.rb:34:14:34:24 | call to source | hash_extensions.rb:34:5:34:5 | h [element :a] | +| hash_extensions.rb:34:14:34:24 | call to source | hash_extensions.rb:34:5:34:5 | h [element :a] | +| hash_extensions.rb:35:5:35:5 | x [element] | hash_extensions.rb:36:10:36:10 | x [element] | +| hash_extensions.rb:35:5:35:5 | x [element] | hash_extensions.rb:36:10:36:10 | x [element] | +| hash_extensions.rb:35:9:35:9 | h [element :a] | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | +| hash_extensions.rb:35:9:35:9 | h [element :a] | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | +| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | hash_extensions.rb:35:5:35:5 | x [element] | +| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | hash_extensions.rb:35:5:35:5 | x [element] | +| hash_extensions.rb:36:10:36:10 | x [element] | hash_extensions.rb:36:10:36:14 | ...[...] | +| hash_extensions.rb:36:10:36:10 | x [element] | hash_extensions.rb:36:10:36:14 | ...[...] | +| hash_extensions.rb:42:5:42:5 | h [element :a] | hash_extensions.rb:43:9:43:9 | h [element :a] | +| hash_extensions.rb:42:5:42:5 | h [element :a] | hash_extensions.rb:43:9:43:9 | h [element :a] | +| hash_extensions.rb:42:14:42:24 | call to source | hash_extensions.rb:42:5:42:5 | h [element :a] | +| hash_extensions.rb:42:14:42:24 | call to source | hash_extensions.rb:42:5:42:5 | h [element :a] | +| hash_extensions.rb:43:5:43:5 | x [element] | hash_extensions.rb:44:10:44:10 | x [element] | +| hash_extensions.rb:43:5:43:5 | x [element] | hash_extensions.rb:44:10:44:10 | x [element] | +| hash_extensions.rb:43:9:43:9 | h [element :a] | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | +| hash_extensions.rb:43:9:43:9 | h [element :a] | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | +| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | hash_extensions.rb:43:5:43:5 | x [element] | +| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | hash_extensions.rb:43:5:43:5 | x [element] | +| hash_extensions.rb:44:10:44:10 | x [element] | hash_extensions.rb:44:10:44:14 | ...[...] | +| hash_extensions.rb:44:10:44:10 | x [element] | hash_extensions.rb:44:10:44:14 | ...[...] | +| hash_extensions.rb:50:5:50:5 | h [element :a] | hash_extensions.rb:51:9:51:9 | h [element :a] | +| hash_extensions.rb:50:5:50:5 | h [element :a] | hash_extensions.rb:51:9:51:9 | h [element :a] | +| hash_extensions.rb:50:5:50:5 | h [element :b] | hash_extensions.rb:51:9:51:9 | h [element :b] | +| hash_extensions.rb:50:5:50:5 | h [element :b] | hash_extensions.rb:51:9:51:9 | h [element :b] | +| hash_extensions.rb:50:5:50:5 | h [element :d] | hash_extensions.rb:51:9:51:9 | h [element :d] | +| hash_extensions.rb:50:5:50:5 | h [element :d] | hash_extensions.rb:51:9:51:9 | h [element :d] | +| hash_extensions.rb:50:14:50:23 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :a] | +| hash_extensions.rb:50:14:50:23 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :a] | +| hash_extensions.rb:50:29:50:38 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :b] | +| hash_extensions.rb:50:29:50:38 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :b] | +| hash_extensions.rb:50:52:50:61 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :d] | +| hash_extensions.rb:50:52:50:61 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :d] | +| hash_extensions.rb:51:5:51:5 | x [element :a] | hash_extensions.rb:58:10:58:10 | x [element :a] | +| hash_extensions.rb:51:5:51:5 | x [element :a] | hash_extensions.rb:58:10:58:10 | x [element :a] | +| hash_extensions.rb:51:5:51:5 | x [element :b] | hash_extensions.rb:59:10:59:10 | x [element :b] | +| hash_extensions.rb:51:5:51:5 | x [element :b] | hash_extensions.rb:59:10:59:10 | x [element :b] | +| hash_extensions.rb:51:9:51:9 | [post] h [element :d] | hash_extensions.rb:56:10:56:10 | h [element :d] | +| hash_extensions.rb:51:9:51:9 | [post] h [element :d] | hash_extensions.rb:56:10:56:10 | h [element :d] | +| hash_extensions.rb:51:9:51:9 | h [element :a] | hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | +| hash_extensions.rb:51:9:51:9 | h [element :a] | hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | +| hash_extensions.rb:51:9:51:9 | h [element :b] | hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | +| hash_extensions.rb:51:9:51:9 | h [element :b] | hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | +| hash_extensions.rb:51:9:51:9 | h [element :d] | hash_extensions.rb:51:9:51:9 | [post] h [element :d] | +| hash_extensions.rb:51:9:51:9 | h [element :d] | hash_extensions.rb:51:9:51:9 | [post] h [element :d] | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | hash_extensions.rb:51:5:51:5 | x [element :a] | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | hash_extensions.rb:51:5:51:5 | x [element :a] | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | hash_extensions.rb:51:5:51:5 | x [element :b] | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | hash_extensions.rb:51:5:51:5 | x [element :b] | +| hash_extensions.rb:56:10:56:10 | h [element :d] | hash_extensions.rb:56:10:56:14 | ...[...] | +| hash_extensions.rb:56:10:56:10 | h [element :d] | hash_extensions.rb:56:10:56:14 | ...[...] | +| hash_extensions.rb:58:10:58:10 | x [element :a] | hash_extensions.rb:58:10:58:14 | ...[...] | +| hash_extensions.rb:58:10:58:10 | x [element :a] | hash_extensions.rb:58:10:58:14 | ...[...] | +| hash_extensions.rb:59:10:59:10 | x [element :b] | hash_extensions.rb:59:10:59:14 | ...[...] | +| hash_extensions.rb:59:10:59:10 | x [element :b] | hash_extensions.rb:59:10:59:14 | ...[...] | +| hash_extensions.rb:67:5:67:10 | values [element 0] | hash_extensions.rb:68:9:68:14 | values [element 0] | +| hash_extensions.rb:67:5:67:10 | values [element 0] | hash_extensions.rb:68:9:68:14 | values [element 0] | +| hash_extensions.rb:67:5:67:10 | values [element 1] | hash_extensions.rb:68:9:68:14 | values [element 1] | +| hash_extensions.rb:67:5:67:10 | values [element 1] | hash_extensions.rb:68:9:68:14 | values [element 1] | +| hash_extensions.rb:67:5:67:10 | values [element 2] | hash_extensions.rb:68:9:68:14 | values [element 2] | +| hash_extensions.rb:67:5:67:10 | values [element 2] | hash_extensions.rb:68:9:68:14 | values [element 2] | +| hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:67:5:67:10 | values [element 0] | +| hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:67:5:67:10 | values [element 0] | +| hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:67:5:67:10 | values [element 1] | +| hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:67:5:67:10 | values [element 1] | +| hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:67:5:67:10 | values [element 2] | +| hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:67:5:67:10 | values [element 2] | +| hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:73:10:73:10 | h [element] | +| hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:73:10:73:10 | h [element] | +| hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:74:10:74:10 | h [element] | +| hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:74:10:74:10 | h [element] | +| hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | +| hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | +| hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:29:68:33 | value | +| hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:29:68:33 | value | +| hash_extensions.rb:68:9:68:14 | values [element 1] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | +| hash_extensions.rb:68:9:68:14 | values [element 1] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | +| hash_extensions.rb:68:9:68:14 | values [element 1] | hash_extensions.rb:68:29:68:33 | value | +| hash_extensions.rb:68:9:68:14 | values [element 1] | hash_extensions.rb:68:29:68:33 | value | +| hash_extensions.rb:68:9:68:14 | values [element 2] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | +| hash_extensions.rb:68:9:68:14 | values [element 2] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | +| hash_extensions.rb:68:9:68:14 | values [element 2] | hash_extensions.rb:68:29:68:33 | value | +| hash_extensions.rb:68:9:68:14 | values [element 2] | hash_extensions.rb:68:29:68:33 | value | +| hash_extensions.rb:68:9:71:7 | call to index_by [element] | hash_extensions.rb:68:5:68:5 | h [element] | +| hash_extensions.rb:68:9:71:7 | call to index_by [element] | hash_extensions.rb:68:5:68:5 | h [element] | +| hash_extensions.rb:68:29:68:33 | value | hash_extensions.rb:69:14:69:18 | value | +| hash_extensions.rb:68:29:68:33 | value | hash_extensions.rb:69:14:69:18 | value | +| hash_extensions.rb:73:10:73:10 | h [element] | hash_extensions.rb:73:10:73:16 | ...[...] | +| hash_extensions.rb:73:10:73:10 | h [element] | hash_extensions.rb:73:10:73:16 | ...[...] | +| hash_extensions.rb:74:10:74:10 | h [element] | hash_extensions.rb:74:10:74:16 | ...[...] | +| hash_extensions.rb:74:10:74:10 | h [element] | hash_extensions.rb:74:10:74:16 | ...[...] | +| hash_extensions.rb:80:5:80:10 | values [element 0] | hash_extensions.rb:81:9:81:14 | values [element 0] | +| hash_extensions.rb:80:5:80:10 | values [element 0] | hash_extensions.rb:81:9:81:14 | values [element 0] | +| hash_extensions.rb:80:5:80:10 | values [element 1] | hash_extensions.rb:81:9:81:14 | values [element 1] | +| hash_extensions.rb:80:5:80:10 | values [element 1] | hash_extensions.rb:81:9:81:14 | values [element 1] | +| hash_extensions.rb:80:5:80:10 | values [element 2] | hash_extensions.rb:81:9:81:14 | values [element 2] | +| hash_extensions.rb:80:5:80:10 | values [element 2] | hash_extensions.rb:81:9:81:14 | values [element 2] | +| hash_extensions.rb:80:15:80:25 | call to source | hash_extensions.rb:80:5:80:10 | values [element 0] | +| hash_extensions.rb:80:15:80:25 | call to source | hash_extensions.rb:80:5:80:10 | values [element 0] | +| hash_extensions.rb:80:28:80:38 | call to source | hash_extensions.rb:80:5:80:10 | values [element 1] | +| hash_extensions.rb:80:28:80:38 | call to source | hash_extensions.rb:80:5:80:10 | values [element 1] | +| hash_extensions.rb:80:41:80:51 | call to source | hash_extensions.rb:80:5:80:10 | values [element 2] | +| hash_extensions.rb:80:41:80:51 | call to source | hash_extensions.rb:80:5:80:10 | values [element 2] | +| hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:86:10:86:10 | h [element] | +| hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:86:10:86:10 | h [element] | +| hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:87:10:87:10 | h [element] | +| hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:87:10:87:10 | h [element] | +| hash_extensions.rb:81:9:81:14 | values [element 0] | hash_extensions.rb:81:31:81:33 | key | +| hash_extensions.rb:81:9:81:14 | values [element 0] | hash_extensions.rb:81:31:81:33 | key | +| hash_extensions.rb:81:9:81:14 | values [element 1] | hash_extensions.rb:81:31:81:33 | key | +| hash_extensions.rb:81:9:81:14 | values [element 1] | hash_extensions.rb:81:31:81:33 | key | +| hash_extensions.rb:81:9:81:14 | values [element 2] | hash_extensions.rb:81:31:81:33 | key | +| hash_extensions.rb:81:9:81:14 | values [element 2] | hash_extensions.rb:81:31:81:33 | key | +| hash_extensions.rb:81:9:84:7 | call to index_with [element] | hash_extensions.rb:81:5:81:5 | h [element] | +| hash_extensions.rb:81:9:84:7 | call to index_with [element] | hash_extensions.rb:81:5:81:5 | h [element] | +| hash_extensions.rb:81:31:81:33 | key | hash_extensions.rb:82:14:82:16 | key | +| hash_extensions.rb:81:31:81:33 | key | hash_extensions.rb:82:14:82:16 | key | +| hash_extensions.rb:83:9:83:19 | call to source | hash_extensions.rb:81:9:84:7 | call to index_with [element] | +| hash_extensions.rb:83:9:83:19 | call to source | hash_extensions.rb:81:9:84:7 | call to index_with [element] | +| hash_extensions.rb:86:10:86:10 | h [element] | hash_extensions.rb:86:10:86:16 | ...[...] | +| hash_extensions.rb:86:10:86:10 | h [element] | hash_extensions.rb:86:10:86:16 | ...[...] | +| hash_extensions.rb:87:10:87:10 | h [element] | hash_extensions.rb:87:10:87:16 | ...[...] | +| hash_extensions.rb:87:10:87:10 | h [element] | hash_extensions.rb:87:10:87:16 | ...[...] | +| hash_extensions.rb:89:5:89:5 | j [element] | hash_extensions.rb:91:10:91:10 | j [element] | +| hash_extensions.rb:89:5:89:5 | j [element] | hash_extensions.rb:91:10:91:10 | j [element] | +| hash_extensions.rb:89:5:89:5 | j [element] | hash_extensions.rb:92:10:92:10 | j [element] | +| hash_extensions.rb:89:5:89:5 | j [element] | hash_extensions.rb:92:10:92:10 | j [element] | +| hash_extensions.rb:89:9:89:38 | call to index_with [element] | hash_extensions.rb:89:5:89:5 | j [element] | +| hash_extensions.rb:89:9:89:38 | call to index_with [element] | hash_extensions.rb:89:5:89:5 | j [element] | +| hash_extensions.rb:89:27:89:37 | call to source | hash_extensions.rb:89:9:89:38 | call to index_with [element] | +| hash_extensions.rb:89:27:89:37 | call to source | hash_extensions.rb:89:9:89:38 | call to index_with [element] | +| hash_extensions.rb:91:10:91:10 | j [element] | hash_extensions.rb:91:10:91:16 | ...[...] | +| hash_extensions.rb:91:10:91:10 | j [element] | hash_extensions.rb:91:10:91:16 | ...[...] | +| hash_extensions.rb:92:10:92:10 | j [element] | hash_extensions.rb:92:10:92:16 | ...[...] | +| hash_extensions.rb:92:10:92:10 | j [element] | hash_extensions.rb:92:10:92:16 | ...[...] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | +| hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | +| hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | +| hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | +| hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | +| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | hash_extensions.rb:99:10:99:25 | call to pick | +| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | hash_extensions.rb:99:10:99:25 | call to pick | +| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | hash_extensions.rb:100:10:100:27 | call to pick | +| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | hash_extensions.rb:100:10:100:27 | call to pick | +| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | hash_extensions.rb:101:10:101:32 | call to pick [element 0] | +| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | hash_extensions.rb:101:10:101:32 | call to pick [element 0] | +| hash_extensions.rb:101:10:101:32 | call to pick [element 0] | hash_extensions.rb:101:10:101:35 | ...[...] | +| hash_extensions.rb:101:10:101:32 | call to pick [element 0] | hash_extensions.rb:101:10:101:35 | ...[...] | +| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | hash_extensions.rb:102:10:102:32 | call to pick [element 1] | +| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | hash_extensions.rb:102:10:102:32 | call to pick [element 1] | +| hash_extensions.rb:102:10:102:32 | call to pick [element 1] | hash_extensions.rb:102:10:102:35 | ...[...] | +| hash_extensions.rb:102:10:102:32 | call to pick [element 1] | hash_extensions.rb:102:10:102:35 | ...[...] | +| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | hash_extensions.rb:103:10:103:32 | call to pick [element 0] | +| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | hash_extensions.rb:103:10:103:32 | call to pick [element 0] | +| hash_extensions.rb:103:10:103:32 | call to pick [element 0] | hash_extensions.rb:103:10:103:35 | ...[...] | +| hash_extensions.rb:103:10:103:32 | call to pick [element 0] | hash_extensions.rb:103:10:103:35 | ...[...] | +| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | hash_extensions.rb:104:10:104:32 | call to pick [element 1] | +| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | hash_extensions.rb:104:10:104:32 | call to pick [element 1] | +| hash_extensions.rb:104:10:104:32 | call to pick [element 1] | hash_extensions.rb:104:10:104:35 | ...[...] | +| hash_extensions.rb:104:10:104:32 | call to pick [element 1] | hash_extensions.rb:104:10:104:35 | ...[...] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | +| hash_extensions.rb:110:21:110:31 | call to source | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | +| hash_extensions.rb:110:21:110:31 | call to source | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | +| hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | +| hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | +| hash_extensions.rb:110:65:110:75 | call to source | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | +| hash_extensions.rb:110:65:110:75 | call to source | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | +| hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | +| hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | +| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | +| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | +| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | +| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | +| hash_extensions.rb:111:10:111:28 | call to pluck [element] | hash_extensions.rb:111:10:111:31 | ...[...] | +| hash_extensions.rb:111:10:111:28 | call to pluck [element] | hash_extensions.rb:111:10:111:31 | ...[...] | +| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | +| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | +| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | +| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | +| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | +| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | +| hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | hash_extensions.rb:112:10:112:39 | ...[...] | +| hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | hash_extensions.rb:112:10:112:39 | ...[...] | +| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | +| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | +| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | +| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | +| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | +| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | +| hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | hash_extensions.rb:113:10:113:39 | ...[...] | +| hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | hash_extensions.rb:113:10:113:39 | ...[...] | +| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | +| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | +| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | +| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | +| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | +| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | +| hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | hash_extensions.rb:114:10:114:39 | ...[...] | +| hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | hash_extensions.rb:114:10:114:39 | ...[...] | +| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | +| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | +| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | +| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | +| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | +| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | +| hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | hash_extensions.rb:115:10:115:39 | ...[...] | +| hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | hash_extensions.rb:115:10:115:39 | ...[...] | +| hash_extensions.rb:122:5:122:10 | single [element 0] | hash_extensions.rb:125:10:125:15 | single [element 0] | +| hash_extensions.rb:122:5:122:10 | single [element 0] | hash_extensions.rb:125:10:125:15 | single [element 0] | +| hash_extensions.rb:122:15:122:25 | call to source | hash_extensions.rb:122:5:122:10 | single [element 0] | +| hash_extensions.rb:122:15:122:25 | call to source | hash_extensions.rb:122:5:122:10 | single [element 0] | +| hash_extensions.rb:123:5:123:9 | multi [element 0] | hash_extensions.rb:126:10:126:14 | multi [element 0] | +| hash_extensions.rb:123:5:123:9 | multi [element 0] | hash_extensions.rb:126:10:126:14 | multi [element 0] | +| hash_extensions.rb:123:14:123:24 | call to source | hash_extensions.rb:123:5:123:9 | multi [element 0] | +| hash_extensions.rb:123:14:123:24 | call to source | hash_extensions.rb:123:5:123:9 | multi [element 0] | +| hash_extensions.rb:125:10:125:15 | single [element 0] | hash_extensions.rb:125:10:125:20 | call to sole | +| hash_extensions.rb:125:10:125:15 | single [element 0] | hash_extensions.rb:125:10:125:20 | call to sole | +| hash_extensions.rb:126:10:126:14 | multi [element 0] | hash_extensions.rb:126:10:126:19 | call to sole | +| hash_extensions.rb:126:10:126:14 | multi [element 0] | hash_extensions.rb:126:10:126:19 | call to sole | nodes -| active_support.rb:10:5:10:5 | x : | semmle.label | x : | -| active_support.rb:10:9:10:18 | call to source : | semmle.label | call to source : | -| active_support.rb:11:10:11:10 | x : | semmle.label | x : | +| active_support.rb:10:5:10:5 | x | semmle.label | x | +| active_support.rb:10:9:10:18 | call to source | semmle.label | call to source | +| active_support.rb:11:10:11:10 | x | semmle.label | x | | active_support.rb:11:10:11:19 | call to at | semmle.label | call to at | -| active_support.rb:15:5:15:5 | x : | semmle.label | x : | -| active_support.rb:15:9:15:18 | call to source : | semmle.label | call to source : | -| active_support.rb:16:10:16:10 | x : | semmle.label | x : | +| active_support.rb:15:5:15:5 | x | semmle.label | x | +| active_support.rb:15:9:15:18 | call to source | semmle.label | call to source | +| active_support.rb:16:10:16:10 | x | semmle.label | x | | active_support.rb:16:10:16:19 | call to camelize | semmle.label | call to camelize | -| active_support.rb:20:5:20:5 | x : | semmle.label | x : | -| active_support.rb:20:9:20:18 | call to source : | semmle.label | call to source : | -| active_support.rb:21:10:21:10 | x : | semmle.label | x : | +| active_support.rb:20:5:20:5 | x | semmle.label | x | +| active_support.rb:20:9:20:18 | call to source | semmle.label | call to source | +| active_support.rb:21:10:21:10 | x | semmle.label | x | | active_support.rb:21:10:21:20 | call to camelcase | semmle.label | call to camelcase | -| active_support.rb:25:5:25:5 | x : | semmle.label | x : | -| active_support.rb:25:9:25:18 | call to source : | semmle.label | call to source : | -| active_support.rb:26:10:26:10 | x : | semmle.label | x : | +| active_support.rb:25:5:25:5 | x | semmle.label | x | +| active_support.rb:25:9:25:18 | call to source | semmle.label | call to source | +| active_support.rb:26:10:26:10 | x | semmle.label | x | | active_support.rb:26:10:26:19 | call to classify | semmle.label | call to classify | -| active_support.rb:30:5:30:5 | x : | semmle.label | x : | -| active_support.rb:30:9:30:18 | call to source : | semmle.label | call to source : | -| active_support.rb:31:10:31:10 | x : | semmle.label | x : | +| active_support.rb:30:5:30:5 | x | semmle.label | x | +| active_support.rb:30:9:30:18 | call to source | semmle.label | call to source | +| active_support.rb:31:10:31:10 | x | semmle.label | x | | active_support.rb:31:10:31:20 | call to dasherize | semmle.label | call to dasherize | -| active_support.rb:35:5:35:5 | x : | semmle.label | x : | -| active_support.rb:35:9:35:18 | call to source : | semmle.label | call to source : | -| active_support.rb:36:10:36:10 | x : | semmle.label | x : | +| active_support.rb:35:5:35:5 | x | semmle.label | x | +| active_support.rb:35:9:35:18 | call to source | semmle.label | call to source | +| active_support.rb:36:10:36:10 | x | semmle.label | x | | active_support.rb:36:10:36:24 | call to deconstantize | semmle.label | call to deconstantize | -| active_support.rb:40:5:40:5 | x : | semmle.label | x : | -| active_support.rb:40:9:40:18 | call to source : | semmle.label | call to source : | -| active_support.rb:41:10:41:10 | x : | semmle.label | x : | +| active_support.rb:40:5:40:5 | x | semmle.label | x | +| active_support.rb:40:9:40:18 | call to source | semmle.label | call to source | +| active_support.rb:41:10:41:10 | x | semmle.label | x | | active_support.rb:41:10:41:21 | call to demodulize | semmle.label | call to demodulize | -| active_support.rb:45:5:45:5 | x : | semmle.label | x : | -| active_support.rb:45:9:45:18 | call to source : | semmle.label | call to source : | -| active_support.rb:46:10:46:10 | x : | semmle.label | x : | +| active_support.rb:45:5:45:5 | x | semmle.label | x | +| active_support.rb:45:9:45:18 | call to source | semmle.label | call to source | +| active_support.rb:46:10:46:10 | x | semmle.label | x | | active_support.rb:46:10:46:19 | call to first | semmle.label | call to first | -| active_support.rb:50:5:50:5 | x : | semmle.label | x : | -| active_support.rb:50:9:50:18 | call to source : | semmle.label | call to source : | -| active_support.rb:51:10:51:10 | x : | semmle.label | x : | +| active_support.rb:50:5:50:5 | x | semmle.label | x | +| active_support.rb:50:9:50:18 | call to source | semmle.label | call to source | +| active_support.rb:51:10:51:10 | x | semmle.label | x | | active_support.rb:51:10:51:22 | call to foreign_key | semmle.label | call to foreign_key | -| active_support.rb:55:5:55:5 | x : | semmle.label | x : | -| active_support.rb:55:9:55:18 | call to source : | semmle.label | call to source : | -| active_support.rb:56:10:56:10 | x : | semmle.label | x : | +| active_support.rb:55:5:55:5 | x | semmle.label | x | +| active_support.rb:55:9:55:18 | call to source | semmle.label | call to source | +| active_support.rb:56:10:56:10 | x | semmle.label | x | | active_support.rb:56:10:56:18 | call to from | semmle.label | call to from | -| active_support.rb:60:5:60:5 | x : | semmle.label | x : | -| active_support.rb:60:9:60:18 | call to source : | semmle.label | call to source : | -| active_support.rb:61:10:61:10 | x : | semmle.label | x : | +| active_support.rb:60:5:60:5 | x | semmle.label | x | +| active_support.rb:60:9:60:18 | call to source | semmle.label | call to source | +| active_support.rb:61:10:61:10 | x | semmle.label | x | | active_support.rb:61:10:61:20 | call to html_safe | semmle.label | call to html_safe | -| active_support.rb:65:5:65:5 | x : | semmle.label | x : | -| active_support.rb:65:9:65:18 | call to source : | semmle.label | call to source : | -| active_support.rb:66:10:66:10 | x : | semmle.label | x : | +| active_support.rb:65:5:65:5 | x | semmle.label | x | +| active_support.rb:65:9:65:18 | call to source | semmle.label | call to source | +| active_support.rb:66:10:66:10 | x | semmle.label | x | | active_support.rb:66:10:66:19 | call to humanize | semmle.label | call to humanize | -| active_support.rb:70:5:70:5 | x : | semmle.label | x : | -| active_support.rb:70:9:70:18 | call to source : | semmle.label | call to source : | -| active_support.rb:71:10:71:10 | x : | semmle.label | x : | +| active_support.rb:70:5:70:5 | x | semmle.label | x | +| active_support.rb:70:9:70:18 | call to source | semmle.label | call to source | +| active_support.rb:71:10:71:10 | x | semmle.label | x | | active_support.rb:71:10:71:20 | call to indent | semmle.label | call to indent | -| active_support.rb:75:5:75:5 | x : | semmle.label | x : | -| active_support.rb:75:9:75:18 | call to source : | semmle.label | call to source : | -| active_support.rb:76:10:76:10 | x : | semmle.label | x : | +| active_support.rb:75:5:75:5 | x | semmle.label | x | +| active_support.rb:75:9:75:18 | call to source | semmle.label | call to source | +| active_support.rb:76:10:76:10 | x | semmle.label | x | | active_support.rb:76:10:76:21 | call to indent! | semmle.label | call to indent! | -| active_support.rb:80:5:80:5 | x : | semmle.label | x : | -| active_support.rb:80:9:80:18 | call to source : | semmle.label | call to source : | -| active_support.rb:81:10:81:10 | x : | semmle.label | x : | +| active_support.rb:80:5:80:5 | x | semmle.label | x | +| active_support.rb:80:9:80:18 | call to source | semmle.label | call to source | +| active_support.rb:81:10:81:10 | x | semmle.label | x | | active_support.rb:81:10:81:18 | call to inquiry | semmle.label | call to inquiry | -| active_support.rb:85:5:85:5 | x : | semmle.label | x : | -| active_support.rb:85:9:85:18 | call to source : | semmle.label | call to source : | -| active_support.rb:86:10:86:10 | x : | semmle.label | x : | +| active_support.rb:85:5:85:5 | x | semmle.label | x | +| active_support.rb:85:9:85:18 | call to source | semmle.label | call to source | +| active_support.rb:86:10:86:10 | x | semmle.label | x | | active_support.rb:86:10:86:18 | call to last | semmle.label | call to last | -| active_support.rb:90:5:90:5 | x : | semmle.label | x : | -| active_support.rb:90:9:90:18 | call to source : | semmle.label | call to source : | -| active_support.rb:91:10:91:10 | x : | semmle.label | x : | +| active_support.rb:90:5:90:5 | x | semmle.label | x | +| active_support.rb:90:9:90:18 | call to source | semmle.label | call to source | +| active_support.rb:91:10:91:10 | x | semmle.label | x | | active_support.rb:91:10:91:19 | call to mb_chars | semmle.label | call to mb_chars | -| active_support.rb:95:5:95:5 | x : | semmle.label | x : | -| active_support.rb:95:9:95:18 | call to source : | semmle.label | call to source : | -| active_support.rb:96:10:96:10 | x : | semmle.label | x : | +| active_support.rb:95:5:95:5 | x | semmle.label | x | +| active_support.rb:95:9:95:18 | call to source | semmle.label | call to source | +| active_support.rb:96:10:96:10 | x | semmle.label | x | | active_support.rb:96:10:96:23 | call to parameterize | semmle.label | call to parameterize | -| active_support.rb:100:5:100:5 | x : | semmle.label | x : | -| active_support.rb:100:9:100:18 | call to source : | semmle.label | call to source : | -| active_support.rb:101:10:101:10 | x : | semmle.label | x : | +| active_support.rb:100:5:100:5 | x | semmle.label | x | +| active_support.rb:100:9:100:18 | call to source | semmle.label | call to source | +| active_support.rb:101:10:101:10 | x | semmle.label | x | | active_support.rb:101:10:101:20 | call to pluralize | semmle.label | call to pluralize | -| active_support.rb:105:5:105:5 | x : | semmle.label | x : | -| active_support.rb:105:9:105:18 | call to source : | semmle.label | call to source : | -| active_support.rb:106:10:106:10 | x : | semmle.label | x : | +| active_support.rb:105:5:105:5 | x | semmle.label | x | +| active_support.rb:105:9:105:18 | call to source | semmle.label | call to source | +| active_support.rb:106:10:106:10 | x | semmle.label | x | | active_support.rb:106:10:106:24 | call to remove | semmle.label | call to remove | -| active_support.rb:110:5:110:5 | x : | semmle.label | x : | -| active_support.rb:110:9:110:18 | call to source : | semmle.label | call to source : | -| active_support.rb:111:10:111:10 | x : | semmle.label | x : | +| active_support.rb:110:5:110:5 | x | semmle.label | x | +| active_support.rb:110:9:110:18 | call to source | semmle.label | call to source | +| active_support.rb:111:10:111:10 | x | semmle.label | x | | active_support.rb:111:10:111:25 | call to remove! | semmle.label | call to remove! | -| active_support.rb:115:5:115:5 | x : | semmle.label | x : | -| active_support.rb:115:9:115:18 | call to source : | semmle.label | call to source : | -| active_support.rb:116:10:116:10 | x : | semmle.label | x : | +| active_support.rb:115:5:115:5 | x | semmle.label | x | +| active_support.rb:115:9:115:18 | call to source | semmle.label | call to source | +| active_support.rb:116:10:116:10 | x | semmle.label | x | | active_support.rb:116:10:116:22 | call to singularize | semmle.label | call to singularize | -| active_support.rb:120:5:120:5 | x : | semmle.label | x : | -| active_support.rb:120:9:120:18 | call to source : | semmle.label | call to source : | -| active_support.rb:121:10:121:10 | x : | semmle.label | x : | +| active_support.rb:120:5:120:5 | x | semmle.label | x | +| active_support.rb:120:9:120:18 | call to source | semmle.label | call to source | +| active_support.rb:121:10:121:10 | x | semmle.label | x | | active_support.rb:121:10:121:17 | call to squish | semmle.label | call to squish | -| active_support.rb:125:5:125:5 | x : | semmle.label | x : | -| active_support.rb:125:9:125:18 | call to source : | semmle.label | call to source : | -| active_support.rb:126:10:126:10 | x : | semmle.label | x : | +| active_support.rb:125:5:125:5 | x | semmle.label | x | +| active_support.rb:125:9:125:18 | call to source | semmle.label | call to source | +| active_support.rb:126:10:126:10 | x | semmle.label | x | | active_support.rb:126:10:126:18 | call to squish! | semmle.label | call to squish! | -| active_support.rb:130:5:130:5 | x : | semmle.label | x : | -| active_support.rb:130:9:130:18 | call to source : | semmle.label | call to source : | -| active_support.rb:131:10:131:10 | x : | semmle.label | x : | +| active_support.rb:130:5:130:5 | x | semmle.label | x | +| active_support.rb:130:9:130:18 | call to source | semmle.label | call to source | +| active_support.rb:131:10:131:10 | x | semmle.label | x | | active_support.rb:131:10:131:24 | call to strip_heredoc | semmle.label | call to strip_heredoc | -| active_support.rb:135:5:135:5 | x : | semmle.label | x : | -| active_support.rb:135:9:135:18 | call to source : | semmle.label | call to source : | -| active_support.rb:136:10:136:10 | x : | semmle.label | x : | +| active_support.rb:135:5:135:5 | x | semmle.label | x | +| active_support.rb:135:9:135:18 | call to source | semmle.label | call to source | +| active_support.rb:136:10:136:10 | x | semmle.label | x | | active_support.rb:136:10:136:19 | call to tableize | semmle.label | call to tableize | -| active_support.rb:140:5:140:5 | x : | semmle.label | x : | -| active_support.rb:140:9:140:18 | call to source : | semmle.label | call to source : | -| active_support.rb:141:10:141:10 | x : | semmle.label | x : | +| active_support.rb:140:5:140:5 | x | semmle.label | x | +| active_support.rb:140:9:140:18 | call to source | semmle.label | call to source | +| active_support.rb:141:10:141:10 | x | semmle.label | x | | active_support.rb:141:10:141:20 | call to titlecase | semmle.label | call to titlecase | -| active_support.rb:145:5:145:5 | x : | semmle.label | x : | -| active_support.rb:145:9:145:18 | call to source : | semmle.label | call to source : | -| active_support.rb:146:10:146:10 | x : | semmle.label | x : | +| active_support.rb:145:5:145:5 | x | semmle.label | x | +| active_support.rb:145:9:145:18 | call to source | semmle.label | call to source | +| active_support.rb:146:10:146:10 | x | semmle.label | x | | active_support.rb:146:10:146:19 | call to titleize | semmle.label | call to titleize | -| active_support.rb:150:5:150:5 | x : | semmle.label | x : | -| active_support.rb:150:9:150:18 | call to source : | semmle.label | call to source : | -| active_support.rb:151:10:151:10 | x : | semmle.label | x : | +| active_support.rb:150:5:150:5 | x | semmle.label | x | +| active_support.rb:150:9:150:18 | call to source | semmle.label | call to source | +| active_support.rb:151:10:151:10 | x | semmle.label | x | | active_support.rb:151:10:151:16 | call to to | semmle.label | call to to | -| active_support.rb:155:5:155:5 | x : | semmle.label | x : | -| active_support.rb:155:9:155:18 | call to source : | semmle.label | call to source : | -| active_support.rb:156:10:156:10 | x : | semmle.label | x : | +| active_support.rb:155:5:155:5 | x | semmle.label | x | +| active_support.rb:155:9:155:18 | call to source | semmle.label | call to source | +| active_support.rb:156:10:156:10 | x | semmle.label | x | | active_support.rb:156:10:156:22 | call to truncate | semmle.label | call to truncate | -| active_support.rb:160:5:160:5 | x : | semmle.label | x : | -| active_support.rb:160:9:160:18 | call to source : | semmle.label | call to source : | -| active_support.rb:161:10:161:10 | x : | semmle.label | x : | +| active_support.rb:160:5:160:5 | x | semmle.label | x | +| active_support.rb:160:9:160:18 | call to source | semmle.label | call to source | +| active_support.rb:161:10:161:10 | x | semmle.label | x | | active_support.rb:161:10:161:28 | call to truncate_bytes | semmle.label | call to truncate_bytes | -| active_support.rb:165:5:165:5 | x : | semmle.label | x : | -| active_support.rb:165:9:165:18 | call to source : | semmle.label | call to source : | -| active_support.rb:166:10:166:10 | x : | semmle.label | x : | +| active_support.rb:165:5:165:5 | x | semmle.label | x | +| active_support.rb:165:9:165:18 | call to source | semmle.label | call to source | +| active_support.rb:166:10:166:10 | x | semmle.label | x | | active_support.rb:166:10:166:28 | call to truncate_words | semmle.label | call to truncate_words | -| active_support.rb:170:5:170:5 | x : | semmle.label | x : | -| active_support.rb:170:9:170:18 | call to source : | semmle.label | call to source : | -| active_support.rb:171:10:171:10 | x : | semmle.label | x : | +| active_support.rb:170:5:170:5 | x | semmle.label | x | +| active_support.rb:170:9:170:18 | call to source | semmle.label | call to source | +| active_support.rb:171:10:171:10 | x | semmle.label | x | | active_support.rb:171:10:171:21 | call to underscore | semmle.label | call to underscore | -| active_support.rb:175:5:175:5 | x : | semmle.label | x : | -| active_support.rb:175:9:175:18 | call to source : | semmle.label | call to source : | -| active_support.rb:176:10:176:10 | x : | semmle.label | x : | +| active_support.rb:175:5:175:5 | x | semmle.label | x | +| active_support.rb:175:9:175:18 | call to source | semmle.label | call to source | +| active_support.rb:176:10:176:10 | x | semmle.label | x | | active_support.rb:176:10:176:23 | call to upcase_first | semmle.label | call to upcase_first | -| active_support.rb:180:5:180:5 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:180:5:180:5 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:180:10:180:17 | call to source : | semmle.label | call to source : | -| active_support.rb:180:10:180:17 | call to source : | semmle.label | call to source : | -| active_support.rb:181:5:181:5 | y [element] : | semmle.label | y [element] : | -| active_support.rb:181:5:181:5 | y [element] : | semmle.label | y [element] : | -| active_support.rb:181:9:181:9 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:181:9:181:9 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:181:9:181:23 | call to compact_blank [element] : | semmle.label | call to compact_blank [element] : | -| active_support.rb:181:9:181:23 | call to compact_blank [element] : | semmle.label | call to compact_blank [element] : | -| active_support.rb:182:10:182:10 | y [element] : | semmle.label | y [element] : | -| active_support.rb:182:10:182:10 | y [element] : | semmle.label | y [element] : | +| active_support.rb:180:5:180:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:180:5:180:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:180:10:180:17 | call to source | semmle.label | call to source | +| active_support.rb:180:10:180:17 | call to source | semmle.label | call to source | +| active_support.rb:181:5:181:5 | y [element] | semmle.label | y [element] | +| active_support.rb:181:5:181:5 | y [element] | semmle.label | y [element] | +| active_support.rb:181:9:181:9 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:181:9:181:9 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:181:9:181:23 | call to compact_blank [element] | semmle.label | call to compact_blank [element] | +| active_support.rb:181:9:181:23 | call to compact_blank [element] | semmle.label | call to compact_blank [element] | +| active_support.rb:182:10:182:10 | y [element] | semmle.label | y [element] | +| active_support.rb:182:10:182:10 | y [element] | semmle.label | y [element] | | active_support.rb:182:10:182:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:182:10:182:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:186:5:186:5 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:186:5:186:5 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:186:10:186:18 | call to source : | semmle.label | call to source : | -| active_support.rb:186:10:186:18 | call to source : | semmle.label | call to source : | -| active_support.rb:187:5:187:5 | y [element] : | semmle.label | y [element] : | -| active_support.rb:187:5:187:5 | y [element] : | semmle.label | y [element] : | -| active_support.rb:187:9:187:9 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:187:9:187:9 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:187:9:187:21 | call to excluding [element] : | semmle.label | call to excluding [element] : | -| active_support.rb:187:9:187:21 | call to excluding [element] : | semmle.label | call to excluding [element] : | -| active_support.rb:188:10:188:10 | y [element] : | semmle.label | y [element] : | -| active_support.rb:188:10:188:10 | y [element] : | semmle.label | y [element] : | +| active_support.rb:186:5:186:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:186:5:186:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:186:10:186:18 | call to source | semmle.label | call to source | +| active_support.rb:186:10:186:18 | call to source | semmle.label | call to source | +| active_support.rb:187:5:187:5 | y [element] | semmle.label | y [element] | +| active_support.rb:187:5:187:5 | y [element] | semmle.label | y [element] | +| active_support.rb:187:9:187:9 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:187:9:187:9 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:187:9:187:21 | call to excluding [element] | semmle.label | call to excluding [element] | +| active_support.rb:187:9:187:21 | call to excluding [element] | semmle.label | call to excluding [element] | +| active_support.rb:188:10:188:10 | y [element] | semmle.label | y [element] | +| active_support.rb:188:10:188:10 | y [element] | semmle.label | y [element] | | active_support.rb:188:10:188:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:188:10:188:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:192:5:192:5 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:192:5:192:5 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:192:10:192:18 | call to source : | semmle.label | call to source : | -| active_support.rb:192:10:192:18 | call to source : | semmle.label | call to source : | -| active_support.rb:193:5:193:5 | y [element] : | semmle.label | y [element] : | -| active_support.rb:193:5:193:5 | y [element] : | semmle.label | y [element] : | -| active_support.rb:193:9:193:9 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:193:9:193:9 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:193:9:193:19 | call to without [element] : | semmle.label | call to without [element] : | -| active_support.rb:193:9:193:19 | call to without [element] : | semmle.label | call to without [element] : | -| active_support.rb:194:10:194:10 | y [element] : | semmle.label | y [element] : | -| active_support.rb:194:10:194:10 | y [element] : | semmle.label | y [element] : | +| active_support.rb:192:5:192:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:192:5:192:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:192:10:192:18 | call to source | semmle.label | call to source | +| active_support.rb:192:10:192:18 | call to source | semmle.label | call to source | +| active_support.rb:193:5:193:5 | y [element] | semmle.label | y [element] | +| active_support.rb:193:5:193:5 | y [element] | semmle.label | y [element] | +| active_support.rb:193:9:193:9 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:193:9:193:9 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:193:9:193:19 | call to without [element] | semmle.label | call to without [element] | +| active_support.rb:193:9:193:19 | call to without [element] | semmle.label | call to without [element] | +| active_support.rb:194:10:194:10 | y [element] | semmle.label | y [element] | +| active_support.rb:194:10:194:10 | y [element] | semmle.label | y [element] | | active_support.rb:194:10:194:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:194:10:194:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:198:5:198:5 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:198:5:198:5 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:198:10:198:18 | call to source : | semmle.label | call to source : | -| active_support.rb:198:10:198:18 | call to source : | semmle.label | call to source : | -| active_support.rb:199:5:199:5 | y [element] : | semmle.label | y [element] : | -| active_support.rb:199:5:199:5 | y [element] : | semmle.label | y [element] : | -| active_support.rb:199:9:199:9 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:199:9:199:9 | x [element 0] : | semmle.label | x [element 0] : | -| active_support.rb:199:9:199:37 | call to in_order_of [element] : | semmle.label | call to in_order_of [element] : | -| active_support.rb:199:9:199:37 | call to in_order_of [element] : | semmle.label | call to in_order_of [element] : | -| active_support.rb:200:10:200:10 | y [element] : | semmle.label | y [element] : | -| active_support.rb:200:10:200:10 | y [element] : | semmle.label | y [element] : | +| active_support.rb:198:5:198:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:198:5:198:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:198:10:198:18 | call to source | semmle.label | call to source | +| active_support.rb:198:10:198:18 | call to source | semmle.label | call to source | +| active_support.rb:199:5:199:5 | y [element] | semmle.label | y [element] | +| active_support.rb:199:5:199:5 | y [element] | semmle.label | y [element] | +| active_support.rb:199:9:199:9 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:199:9:199:9 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:199:9:199:37 | call to in_order_of [element] | semmle.label | call to in_order_of [element] | +| active_support.rb:199:9:199:37 | call to in_order_of [element] | semmle.label | call to in_order_of [element] | +| active_support.rb:200:10:200:10 | y [element] | semmle.label | y [element] | +| active_support.rb:200:10:200:10 | y [element] | semmle.label | y [element] | | active_support.rb:200:10:200:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:200:10:200:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:204:5:204:5 | a [element 0] : | semmle.label | a [element 0] : | -| active_support.rb:204:5:204:5 | a [element 0] : | semmle.label | a [element 0] : | -| active_support.rb:204:10:204:18 | call to source : | semmle.label | call to source : | -| active_support.rb:204:10:204:18 | call to source : | semmle.label | call to source : | -| active_support.rb:205:5:205:5 | b [element 0] : | semmle.label | b [element 0] : | -| active_support.rb:205:5:205:5 | b [element 0] : | semmle.label | b [element 0] : | -| active_support.rb:205:5:205:5 | b [element] : | semmle.label | b [element] : | -| active_support.rb:205:5:205:5 | b [element] : | semmle.label | b [element] : | -| active_support.rb:205:9:205:9 | a [element 0] : | semmle.label | a [element 0] : | -| active_support.rb:205:9:205:9 | a [element 0] : | semmle.label | a [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element 0] : | semmle.label | call to including [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element 0] : | semmle.label | call to including [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element] : | semmle.label | call to including [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | semmle.label | call to including [element] : | -| active_support.rb:205:21:205:29 | call to source : | semmle.label | call to source : | -| active_support.rb:205:21:205:29 | call to source : | semmle.label | call to source : | -| active_support.rb:205:32:205:40 | call to source : | semmle.label | call to source : | -| active_support.rb:205:32:205:40 | call to source : | semmle.label | call to source : | -| active_support.rb:206:10:206:10 | a [element 0] : | semmle.label | a [element 0] : | -| active_support.rb:206:10:206:10 | a [element 0] : | semmle.label | a [element 0] : | +| active_support.rb:204:5:204:5 | a [element 0] | semmle.label | a [element 0] | +| active_support.rb:204:5:204:5 | a [element 0] | semmle.label | a [element 0] | +| active_support.rb:204:10:204:18 | call to source | semmle.label | call to source | +| active_support.rb:204:10:204:18 | call to source | semmle.label | call to source | +| active_support.rb:205:5:205:5 | b [element 0] | semmle.label | b [element 0] | +| active_support.rb:205:5:205:5 | b [element 0] | semmle.label | b [element 0] | +| active_support.rb:205:5:205:5 | b [element] | semmle.label | b [element] | +| active_support.rb:205:5:205:5 | b [element] | semmle.label | b [element] | +| active_support.rb:205:9:205:9 | a [element 0] | semmle.label | a [element 0] | +| active_support.rb:205:9:205:9 | a [element 0] | semmle.label | a [element 0] | +| active_support.rb:205:9:205:41 | call to including [element 0] | semmle.label | call to including [element 0] | +| active_support.rb:205:9:205:41 | call to including [element 0] | semmle.label | call to including [element 0] | +| active_support.rb:205:9:205:41 | call to including [element] | semmle.label | call to including [element] | +| active_support.rb:205:9:205:41 | call to including [element] | semmle.label | call to including [element] | +| active_support.rb:205:21:205:29 | call to source | semmle.label | call to source | +| active_support.rb:205:21:205:29 | call to source | semmle.label | call to source | +| active_support.rb:205:32:205:40 | call to source | semmle.label | call to source | +| active_support.rb:205:32:205:40 | call to source | semmle.label | call to source | +| active_support.rb:206:10:206:10 | a [element 0] | semmle.label | a [element 0] | +| active_support.rb:206:10:206:10 | a [element 0] | semmle.label | a [element 0] | | active_support.rb:206:10:206:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:206:10:206:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:208:10:208:10 | b [element 0] : | semmle.label | b [element 0] : | -| active_support.rb:208:10:208:10 | b [element 0] : | semmle.label | b [element 0] : | -| active_support.rb:208:10:208:10 | b [element] : | semmle.label | b [element] : | -| active_support.rb:208:10:208:10 | b [element] : | semmle.label | b [element] : | +| active_support.rb:208:10:208:10 | b [element 0] | semmle.label | b [element 0] | +| active_support.rb:208:10:208:10 | b [element 0] | semmle.label | b [element 0] | +| active_support.rb:208:10:208:10 | b [element] | semmle.label | b [element] | +| active_support.rb:208:10:208:10 | b [element] | semmle.label | b [element] | | active_support.rb:208:10:208:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:208:10:208:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:209:10:209:10 | b [element] : | semmle.label | b [element] : | -| active_support.rb:209:10:209:10 | b [element] : | semmle.label | b [element] : | +| active_support.rb:209:10:209:10 | b [element] | semmle.label | b [element] | +| active_support.rb:209:10:209:10 | b [element] | semmle.label | b [element] | | active_support.rb:209:10:209:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:209:10:209:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:210:10:210:10 | b [element] : | semmle.label | b [element] : | -| active_support.rb:210:10:210:10 | b [element] : | semmle.label | b [element] : | +| active_support.rb:210:10:210:10 | b [element] | semmle.label | b [element] | +| active_support.rb:210:10:210:10 | b [element] | semmle.label | b [element] | | active_support.rb:210:10:210:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:210:10:210:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:211:10:211:10 | b [element] : | semmle.label | b [element] : | -| active_support.rb:211:10:211:10 | b [element] : | semmle.label | b [element] : | +| active_support.rb:211:10:211:10 | b [element] | semmle.label | b [element] | +| active_support.rb:211:10:211:10 | b [element] | semmle.label | b [element] | | active_support.rb:211:10:211:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:211:10:211:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:215:3:215:3 | x : | semmle.label | x : | -| active_support.rb:215:7:215:16 | call to source : | semmle.label | call to source : | -| active_support.rb:216:3:216:3 | y : | semmle.label | y : | -| active_support.rb:216:7:216:35 | call to new : | semmle.label | call to new : | -| active_support.rb:216:34:216:34 | x : | semmle.label | x : | +| active_support.rb:215:3:215:3 | x | semmle.label | x | +| active_support.rb:215:7:215:16 | call to source | semmle.label | call to source | +| active_support.rb:216:3:216:3 | y | semmle.label | y | +| active_support.rb:216:7:216:35 | call to new | semmle.label | call to new | +| active_support.rb:216:34:216:34 | x | semmle.label | x | | active_support.rb:217:8:217:8 | y | semmle.label | y | -| active_support.rb:222:3:222:3 | b : | semmle.label | b : | -| active_support.rb:222:7:222:16 | call to source : | semmle.label | call to source : | -| active_support.rb:223:3:223:3 | y : | semmle.label | y : | -| active_support.rb:223:7:223:22 | call to safe_concat : | semmle.label | call to safe_concat : | -| active_support.rb:223:21:223:21 | b : | semmle.label | b : | +| active_support.rb:222:3:222:3 | b | semmle.label | b | +| active_support.rb:222:7:222:16 | call to source | semmle.label | call to source | +| active_support.rb:223:3:223:3 | y | semmle.label | y | +| active_support.rb:223:7:223:22 | call to safe_concat | semmle.label | call to safe_concat | +| active_support.rb:223:21:223:21 | b | semmle.label | b | | active_support.rb:224:8:224:8 | y | semmle.label | y | -| active_support.rb:229:3:229:3 | b : | semmle.label | b : | -| active_support.rb:229:7:229:16 | call to source : | semmle.label | call to source : | -| active_support.rb:230:3:230:3 | [post] x : | semmle.label | [post] x : | -| active_support.rb:230:17:230:17 | b : | semmle.label | b : | +| active_support.rb:229:3:229:3 | b | semmle.label | b | +| active_support.rb:229:7:229:16 | call to source | semmle.label | call to source | +| active_support.rb:230:3:230:3 | [post] x | semmle.label | [post] x | +| active_support.rb:230:17:230:17 | b | semmle.label | b | | active_support.rb:231:8:231:8 | x | semmle.label | x | -| active_support.rb:235:3:235:3 | a : | semmle.label | a : | -| active_support.rb:235:7:235:16 | call to source : | semmle.label | call to source : | -| active_support.rb:237:3:237:3 | x : | semmle.label | x : | -| active_support.rb:237:7:237:35 | call to new : | semmle.label | call to new : | -| active_support.rb:237:34:237:34 | a : | semmle.label | a : | -| active_support.rb:238:3:238:3 | y : | semmle.label | y : | -| active_support.rb:238:7:238:7 | x : | semmle.label | x : | -| active_support.rb:238:7:238:17 | call to concat : | semmle.label | call to concat : | +| active_support.rb:235:3:235:3 | a | semmle.label | a | +| active_support.rb:235:7:235:16 | call to source | semmle.label | call to source | +| active_support.rb:237:3:237:3 | x | semmle.label | x | +| active_support.rb:237:7:237:35 | call to new | semmle.label | call to new | +| active_support.rb:237:34:237:34 | a | semmle.label | a | +| active_support.rb:238:3:238:3 | y | semmle.label | y | +| active_support.rb:238:7:238:7 | x | semmle.label | x | +| active_support.rb:238:7:238:17 | call to concat | semmle.label | call to concat | | active_support.rb:239:8:239:8 | y | semmle.label | y | -| active_support.rb:243:3:243:3 | a : | semmle.label | a : | -| active_support.rb:243:7:243:16 | call to source : | semmle.label | call to source : | -| active_support.rb:245:3:245:3 | x : | semmle.label | x : | -| active_support.rb:245:7:245:35 | call to new : | semmle.label | call to new : | -| active_support.rb:245:34:245:34 | a : | semmle.label | a : | -| active_support.rb:246:3:246:3 | y : | semmle.label | y : | -| active_support.rb:246:7:246:7 | x : | semmle.label | x : | -| active_support.rb:246:7:246:20 | call to insert : | semmle.label | call to insert : | +| active_support.rb:243:3:243:3 | a | semmle.label | a | +| active_support.rb:243:7:243:16 | call to source | semmle.label | call to source | +| active_support.rb:245:3:245:3 | x | semmle.label | x | +| active_support.rb:245:7:245:35 | call to new | semmle.label | call to new | +| active_support.rb:245:34:245:34 | a | semmle.label | a | +| active_support.rb:246:3:246:3 | y | semmle.label | y | +| active_support.rb:246:7:246:7 | x | semmle.label | x | +| active_support.rb:246:7:246:20 | call to insert | semmle.label | call to insert | | active_support.rb:247:8:247:8 | y | semmle.label | y | -| active_support.rb:251:3:251:3 | a : | semmle.label | a : | -| active_support.rb:251:7:251:16 | call to source : | semmle.label | call to source : | -| active_support.rb:253:3:253:3 | x : | semmle.label | x : | -| active_support.rb:253:7:253:35 | call to new : | semmle.label | call to new : | -| active_support.rb:253:34:253:34 | a : | semmle.label | a : | -| active_support.rb:254:3:254:3 | y : | semmle.label | y : | -| active_support.rb:254:7:254:7 | x : | semmle.label | x : | -| active_support.rb:254:7:254:18 | call to prepend : | semmle.label | call to prepend : | +| active_support.rb:251:3:251:3 | a | semmle.label | a | +| active_support.rb:251:7:251:16 | call to source | semmle.label | call to source | +| active_support.rb:253:3:253:3 | x | semmle.label | x | +| active_support.rb:253:7:253:35 | call to new | semmle.label | call to new | +| active_support.rb:253:34:253:34 | a | semmle.label | a | +| active_support.rb:254:3:254:3 | y | semmle.label | y | +| active_support.rb:254:7:254:7 | x | semmle.label | x | +| active_support.rb:254:7:254:18 | call to prepend | semmle.label | call to prepend | | active_support.rb:255:8:255:8 | y | semmle.label | y | -| active_support.rb:259:3:259:3 | a : | semmle.label | a : | -| active_support.rb:259:7:259:16 | call to source : | semmle.label | call to source : | -| active_support.rb:260:3:260:3 | x : | semmle.label | x : | -| active_support.rb:260:7:260:35 | call to new : | semmle.label | call to new : | -| active_support.rb:260:34:260:34 | a : | semmle.label | a : | -| active_support.rb:261:3:261:3 | y : | semmle.label | y : | -| active_support.rb:261:7:261:7 | x : | semmle.label | x : | -| active_support.rb:261:7:261:12 | call to to_s : | semmle.label | call to to_s : | +| active_support.rb:259:3:259:3 | a | semmle.label | a | +| active_support.rb:259:7:259:16 | call to source | semmle.label | call to source | +| active_support.rb:260:3:260:3 | x | semmle.label | x | +| active_support.rb:260:7:260:35 | call to new | semmle.label | call to new | +| active_support.rb:260:34:260:34 | a | semmle.label | a | +| active_support.rb:261:3:261:3 | y | semmle.label | y | +| active_support.rb:261:7:261:7 | x | semmle.label | x | +| active_support.rb:261:7:261:12 | call to to_s | semmle.label | call to to_s | | active_support.rb:262:8:262:8 | y | semmle.label | y | -| active_support.rb:266:3:266:3 | a : | semmle.label | a : | -| active_support.rb:266:7:266:16 | call to source : | semmle.label | call to source : | -| active_support.rb:267:3:267:3 | x : | semmle.label | x : | -| active_support.rb:267:7:267:35 | call to new : | semmle.label | call to new : | -| active_support.rb:267:34:267:34 | a : | semmle.label | a : | -| active_support.rb:268:3:268:3 | y : | semmle.label | y : | -| active_support.rb:268:7:268:7 | x : | semmle.label | x : | -| active_support.rb:268:7:268:16 | call to to_param : | semmle.label | call to to_param : | +| active_support.rb:266:3:266:3 | a | semmle.label | a | +| active_support.rb:266:7:266:16 | call to source | semmle.label | call to source | +| active_support.rb:267:3:267:3 | x | semmle.label | x | +| active_support.rb:267:7:267:35 | call to new | semmle.label | call to new | +| active_support.rb:267:34:267:34 | a | semmle.label | a | +| active_support.rb:268:3:268:3 | y | semmle.label | y | +| active_support.rb:268:7:268:7 | x | semmle.label | x | +| active_support.rb:268:7:268:16 | call to to_param | semmle.label | call to to_param | | active_support.rb:269:8:269:8 | y | semmle.label | y | -| active_support.rb:273:3:273:3 | a : | semmle.label | a : | -| active_support.rb:273:7:273:16 | call to source : | semmle.label | call to source : | -| active_support.rb:274:3:274:3 | x : | semmle.label | x : | -| active_support.rb:274:7:274:21 | call to new : | semmle.label | call to new : | -| active_support.rb:274:20:274:20 | a : | semmle.label | a : | -| active_support.rb:275:3:275:3 | y : | semmle.label | y : | -| active_support.rb:275:7:275:7 | x : | semmle.label | x : | -| active_support.rb:275:7:275:17 | call to existence : | semmle.label | call to existence : | +| active_support.rb:273:3:273:3 | a | semmle.label | a | +| active_support.rb:273:7:273:16 | call to source | semmle.label | call to source | +| active_support.rb:274:3:274:3 | x | semmle.label | x | +| active_support.rb:274:7:274:21 | call to new | semmle.label | call to new | +| active_support.rb:274:20:274:20 | a | semmle.label | a | +| active_support.rb:275:3:275:3 | y | semmle.label | y | +| active_support.rb:275:7:275:7 | x | semmle.label | x | +| active_support.rb:275:7:275:17 | call to existence | semmle.label | call to existence | | active_support.rb:276:8:276:8 | y | semmle.label | y | -| active_support.rb:277:3:277:3 | z : | semmle.label | z : | -| active_support.rb:277:7:277:7 | y : | semmle.label | y : | -| active_support.rb:277:7:277:17 | call to existence : | semmle.label | call to existence : | +| active_support.rb:277:3:277:3 | z | semmle.label | z | +| active_support.rb:277:7:277:7 | y | semmle.label | y | +| active_support.rb:277:7:277:17 | call to existence | semmle.label | call to existence | | active_support.rb:278:8:278:8 | z | semmle.label | z | -| active_support.rb:282:3:282:3 | x : | semmle.label | x : | -| active_support.rb:282:3:282:3 | x : | semmle.label | x : | -| active_support.rb:282:7:282:16 | call to source : | semmle.label | call to source : | -| active_support.rb:282:7:282:16 | call to source : | semmle.label | call to source : | -| active_support.rb:283:8:283:8 | x : | semmle.label | x : | -| active_support.rb:283:8:283:8 | x : | semmle.label | x : | +| active_support.rb:282:3:282:3 | x | semmle.label | x | +| active_support.rb:282:3:282:3 | x | semmle.label | x | +| active_support.rb:282:7:282:16 | call to source | semmle.label | call to source | +| active_support.rb:282:7:282:16 | call to source | semmle.label | call to source | +| active_support.rb:283:8:283:8 | x | semmle.label | x | +| active_support.rb:283:8:283:8 | x | semmle.label | x | | active_support.rb:283:8:283:17 | call to presence | semmle.label | call to presence | | active_support.rb:283:8:283:17 | call to presence | semmle.label | call to presence | -| active_support.rb:285:3:285:3 | y : | semmle.label | y : | -| active_support.rb:285:3:285:3 | y : | semmle.label | y : | -| active_support.rb:285:7:285:16 | call to source : | semmle.label | call to source : | -| active_support.rb:285:7:285:16 | call to source : | semmle.label | call to source : | -| active_support.rb:286:8:286:8 | y : | semmle.label | y : | -| active_support.rb:286:8:286:8 | y : | semmle.label | y : | +| active_support.rb:285:3:285:3 | y | semmle.label | y | +| active_support.rb:285:3:285:3 | y | semmle.label | y | +| active_support.rb:285:7:285:16 | call to source | semmle.label | call to source | +| active_support.rb:285:7:285:16 | call to source | semmle.label | call to source | +| active_support.rb:286:8:286:8 | y | semmle.label | y | +| active_support.rb:286:8:286:8 | y | semmle.label | y | | active_support.rb:286:8:286:17 | call to presence | semmle.label | call to presence | | active_support.rb:286:8:286:17 | call to presence | semmle.label | call to presence | -| active_support.rb:290:3:290:3 | x : | semmle.label | x : | -| active_support.rb:290:3:290:3 | x : | semmle.label | x : | -| active_support.rb:290:7:290:16 | call to source : | semmle.label | call to source : | -| active_support.rb:290:7:290:16 | call to source : | semmle.label | call to source : | -| active_support.rb:291:8:291:8 | x : | semmle.label | x : | -| active_support.rb:291:8:291:8 | x : | semmle.label | x : | +| active_support.rb:290:3:290:3 | x | semmle.label | x | +| active_support.rb:290:3:290:3 | x | semmle.label | x | +| active_support.rb:290:7:290:16 | call to source | semmle.label | call to source | +| active_support.rb:290:7:290:16 | call to source | semmle.label | call to source | +| active_support.rb:291:8:291:8 | x | semmle.label | x | +| active_support.rb:291:8:291:8 | x | semmle.label | x | | active_support.rb:291:8:291:17 | call to deep_dup | semmle.label | call to deep_dup | | active_support.rb:291:8:291:17 | call to deep_dup | semmle.label | call to deep_dup | -| active_support.rb:303:3:303:3 | a : | semmle.label | a : | -| active_support.rb:303:7:303:16 | call to source : | semmle.label | call to source : | -| active_support.rb:304:3:304:3 | b : | semmle.label | b : | -| active_support.rb:304:7:304:19 | call to json_escape : | semmle.label | call to json_escape : | -| active_support.rb:304:19:304:19 | a : | semmle.label | a : | +| active_support.rb:303:3:303:3 | a | semmle.label | a | +| active_support.rb:303:7:303:16 | call to source | semmle.label | call to source | +| active_support.rb:304:3:304:3 | b | semmle.label | b | +| active_support.rb:304:7:304:19 | call to json_escape | semmle.label | call to json_escape | +| active_support.rb:304:19:304:19 | a | semmle.label | a | | active_support.rb:305:8:305:8 | b | semmle.label | b | -| active_support.rb:309:5:309:5 | x : | semmle.label | x : | -| active_support.rb:309:9:309:18 | call to source : | semmle.label | call to source : | +| active_support.rb:309:5:309:5 | x | semmle.label | x | +| active_support.rb:309:9:309:18 | call to source | semmle.label | call to source | | active_support.rb:310:10:310:38 | call to encode | semmle.label | call to encode | -| active_support.rb:310:37:310:37 | x : | semmle.label | x : | -| active_support.rb:314:5:314:5 | x : | semmle.label | x : | -| active_support.rb:314:9:314:18 | call to source : | semmle.label | call to source : | +| active_support.rb:310:37:310:37 | x | semmle.label | x | +| active_support.rb:314:5:314:5 | x | semmle.label | x | +| active_support.rb:314:9:314:18 | call to source | semmle.label | call to source | | active_support.rb:315:10:315:38 | call to decode | semmle.label | call to decode | -| active_support.rb:315:37:315:37 | x : | semmle.label | x : | -| active_support.rb:319:5:319:5 | x : | semmle.label | x : | -| active_support.rb:319:9:319:18 | call to source : | semmle.label | call to source : | +| active_support.rb:315:37:315:37 | x | semmle.label | x | +| active_support.rb:319:5:319:5 | x | semmle.label | x | +| active_support.rb:319:9:319:18 | call to source | semmle.label | call to source | | active_support.rb:320:10:320:36 | call to dump | semmle.label | call to dump | -| active_support.rb:320:35:320:35 | x : | semmle.label | x : | -| active_support.rb:324:5:324:5 | x : | semmle.label | x : | -| active_support.rb:324:9:324:18 | call to source : | semmle.label | call to source : | +| active_support.rb:320:35:320:35 | x | semmle.label | x | +| active_support.rb:324:5:324:5 | x | semmle.label | x | +| active_support.rb:324:9:324:18 | call to source | semmle.label | call to source | | active_support.rb:325:10:325:36 | call to load | semmle.label | call to load | -| active_support.rb:325:35:325:35 | x : | semmle.label | x : | -| active_support.rb:329:5:329:5 | x : | semmle.label | x : | -| active_support.rb:329:9:329:18 | call to source : | semmle.label | call to source : | -| active_support.rb:330:5:330:5 | y [element 0] : | semmle.label | y [element 0] : | -| active_support.rb:330:10:330:10 | x : | semmle.label | x : | -| active_support.rb:331:10:331:10 | x : | semmle.label | x : | +| active_support.rb:325:35:325:35 | x | semmle.label | x | +| active_support.rb:329:5:329:5 | x | semmle.label | x | +| active_support.rb:329:9:329:18 | call to source | semmle.label | call to source | +| active_support.rb:330:5:330:5 | y [element 0] | semmle.label | y [element 0] | +| active_support.rb:330:10:330:10 | x | semmle.label | x | +| active_support.rb:331:10:331:10 | x | semmle.label | x | | active_support.rb:331:10:331:18 | call to to_json | semmle.label | call to to_json | -| active_support.rb:332:10:332:10 | y [element 0] : | semmle.label | y [element 0] : | +| active_support.rb:332:10:332:10 | y [element 0] | semmle.label | y [element 0] | | active_support.rb:332:10:332:18 | call to to_json | semmle.label | call to to_json | -| hash_extensions.rb:2:5:2:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:2:5:2:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:2:14:2:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:2:14:2:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:3:5:3:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:3:5:3:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:3:9:3:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:3:9:3:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | semmle.label | call to stringify_keys [element] : | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | semmle.label | call to stringify_keys [element] : | -| hash_extensions.rb:4:10:4:10 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:4:10:4:10 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:2:5:2:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:2:5:2:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:2:14:2:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:2:14:2:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:3:5:3:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:3:5:3:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:3:9:3:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:3:9:3:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | semmle.label | call to stringify_keys [element] | +| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | semmle.label | call to stringify_keys [element] | +| hash_extensions.rb:4:10:4:10 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:4:10:4:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:4:10:4:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:4:10:4:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:10:5:10:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:10:5:10:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:10:14:10:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:10:14:10:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:11:5:11:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:11:5:11:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:11:9:11:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:11:9:11:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:11:9:11:20 | call to to_options [element] : | semmle.label | call to to_options [element] : | -| hash_extensions.rb:11:9:11:20 | call to to_options [element] : | semmle.label | call to to_options [element] : | -| hash_extensions.rb:12:10:12:10 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:12:10:12:10 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:10:5:10:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:10:5:10:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:10:14:10:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:10:14:10:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:11:5:11:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:11:5:11:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:11:9:11:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:11:9:11:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:11:9:11:20 | call to to_options [element] | semmle.label | call to to_options [element] | +| hash_extensions.rb:11:9:11:20 | call to to_options [element] | semmle.label | call to to_options [element] | +| hash_extensions.rb:12:10:12:10 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:12:10:12:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:12:10:12:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:12:10:12:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:18:5:18:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:18:5:18:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:18:14:18:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:18:14:18:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:19:5:19:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:19:5:19:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:19:9:19:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:19:9:19:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | semmle.label | call to symbolize_keys [element] : | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | semmle.label | call to symbolize_keys [element] : | -| hash_extensions.rb:20:10:20:10 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:20:10:20:10 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:18:5:18:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:18:5:18:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:18:14:18:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:18:14:18:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:19:5:19:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:19:5:19:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:19:9:19:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:19:9:19:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | semmle.label | call to symbolize_keys [element] | +| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | semmle.label | call to symbolize_keys [element] | +| hash_extensions.rb:20:10:20:10 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:20:10:20:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:20:10:20:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:20:10:20:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:26:5:26:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:26:5:26:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:26:14:26:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:26:14:26:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:27:5:27:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:27:5:27:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:27:9:27:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:27:9:27:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | semmle.label | call to deep_stringify_keys [element] : | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | semmle.label | call to deep_stringify_keys [element] : | -| hash_extensions.rb:28:10:28:10 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:28:10:28:10 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:26:5:26:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:26:5:26:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:26:14:26:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:26:14:26:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:27:5:27:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:27:5:27:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:27:9:27:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:27:9:27:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | semmle.label | call to deep_stringify_keys [element] | +| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | semmle.label | call to deep_stringify_keys [element] | +| hash_extensions.rb:28:10:28:10 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:28:10:28:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:28:10:28:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:28:10:28:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:34:5:34:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:34:5:34:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:34:14:34:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:34:14:34:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:35:5:35:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:35:5:35:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:35:9:35:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:35:9:35:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | semmle.label | call to deep_symbolize_keys [element] : | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | semmle.label | call to deep_symbolize_keys [element] : | -| hash_extensions.rb:36:10:36:10 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:36:10:36:10 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:34:5:34:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:34:5:34:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:34:14:34:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:34:14:34:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:35:5:35:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:35:5:35:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:35:9:35:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:35:9:35:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | semmle.label | call to deep_symbolize_keys [element] | +| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | semmle.label | call to deep_symbolize_keys [element] | +| hash_extensions.rb:36:10:36:10 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:36:10:36:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:36:10:36:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:36:10:36:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:42:5:42:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:42:5:42:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:42:14:42:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:42:14:42:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:43:5:43:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:43:5:43:5 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:43:9:43:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:43:9:43:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | semmle.label | call to with_indifferent_access [element] : | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | semmle.label | call to with_indifferent_access [element] : | -| hash_extensions.rb:44:10:44:10 | x [element] : | semmle.label | x [element] : | -| hash_extensions.rb:44:10:44:10 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:42:5:42:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:42:5:42:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:42:14:42:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:42:14:42:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:43:5:43:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:43:5:43:5 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:43:9:43:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:43:9:43:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | semmle.label | call to with_indifferent_access [element] | +| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | semmle.label | call to with_indifferent_access [element] | +| hash_extensions.rb:44:10:44:10 | x [element] | semmle.label | x [element] | +| hash_extensions.rb:44:10:44:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:44:10:44:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:44:10:44:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:50:5:50:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:50:5:50:5 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:50:5:50:5 | h [element :b] : | semmle.label | h [element :b] : | -| hash_extensions.rb:50:5:50:5 | h [element :b] : | semmle.label | h [element :b] : | -| hash_extensions.rb:50:5:50:5 | h [element :d] : | semmle.label | h [element :d] : | -| hash_extensions.rb:50:5:50:5 | h [element :d] : | semmle.label | h [element :d] : | -| hash_extensions.rb:50:14:50:23 | call to taint : | semmle.label | call to taint : | -| hash_extensions.rb:50:14:50:23 | call to taint : | semmle.label | call to taint : | -| hash_extensions.rb:50:29:50:38 | call to taint : | semmle.label | call to taint : | -| hash_extensions.rb:50:29:50:38 | call to taint : | semmle.label | call to taint : | -| hash_extensions.rb:50:52:50:61 | call to taint : | semmle.label | call to taint : | -| hash_extensions.rb:50:52:50:61 | call to taint : | semmle.label | call to taint : | -| hash_extensions.rb:51:5:51:5 | x [element :a] : | semmle.label | x [element :a] : | -| hash_extensions.rb:51:5:51:5 | x [element :a] : | semmle.label | x [element :a] : | -| hash_extensions.rb:51:5:51:5 | x [element :b] : | semmle.label | x [element :b] : | -| hash_extensions.rb:51:5:51:5 | x [element :b] : | semmle.label | x [element :b] : | -| hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | semmle.label | [post] h [element :d] : | -| hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | semmle.label | [post] h [element :d] : | -| hash_extensions.rb:51:9:51:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:51:9:51:9 | h [element :a] : | semmle.label | h [element :a] : | -| hash_extensions.rb:51:9:51:9 | h [element :b] : | semmle.label | h [element :b] : | -| hash_extensions.rb:51:9:51:9 | h [element :b] : | semmle.label | h [element :b] : | -| hash_extensions.rb:51:9:51:9 | h [element :d] : | semmle.label | h [element :d] : | -| hash_extensions.rb:51:9:51:9 | h [element :d] : | semmle.label | h [element :d] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | semmle.label | call to extract! [element :a] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | semmle.label | call to extract! [element :a] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | semmle.label | call to extract! [element :b] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | semmle.label | call to extract! [element :b] : | -| hash_extensions.rb:56:10:56:10 | h [element :d] : | semmle.label | h [element :d] : | -| hash_extensions.rb:56:10:56:10 | h [element :d] : | semmle.label | h [element :d] : | +| hash_extensions.rb:50:5:50:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:50:5:50:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:50:5:50:5 | h [element :b] | semmle.label | h [element :b] | +| hash_extensions.rb:50:5:50:5 | h [element :b] | semmle.label | h [element :b] | +| hash_extensions.rb:50:5:50:5 | h [element :d] | semmle.label | h [element :d] | +| hash_extensions.rb:50:5:50:5 | h [element :d] | semmle.label | h [element :d] | +| hash_extensions.rb:50:14:50:23 | call to taint | semmle.label | call to taint | +| hash_extensions.rb:50:14:50:23 | call to taint | semmle.label | call to taint | +| hash_extensions.rb:50:29:50:38 | call to taint | semmle.label | call to taint | +| hash_extensions.rb:50:29:50:38 | call to taint | semmle.label | call to taint | +| hash_extensions.rb:50:52:50:61 | call to taint | semmle.label | call to taint | +| hash_extensions.rb:50:52:50:61 | call to taint | semmle.label | call to taint | +| hash_extensions.rb:51:5:51:5 | x [element :a] | semmle.label | x [element :a] | +| hash_extensions.rb:51:5:51:5 | x [element :a] | semmle.label | x [element :a] | +| hash_extensions.rb:51:5:51:5 | x [element :b] | semmle.label | x [element :b] | +| hash_extensions.rb:51:5:51:5 | x [element :b] | semmle.label | x [element :b] | +| hash_extensions.rb:51:9:51:9 | [post] h [element :d] | semmle.label | [post] h [element :d] | +| hash_extensions.rb:51:9:51:9 | [post] h [element :d] | semmle.label | [post] h [element :d] | +| hash_extensions.rb:51:9:51:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:51:9:51:9 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:51:9:51:9 | h [element :b] | semmle.label | h [element :b] | +| hash_extensions.rb:51:9:51:9 | h [element :b] | semmle.label | h [element :b] | +| hash_extensions.rb:51:9:51:9 | h [element :d] | semmle.label | h [element :d] | +| hash_extensions.rb:51:9:51:9 | h [element :d] | semmle.label | h [element :d] | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | semmle.label | call to extract! [element :a] | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | semmle.label | call to extract! [element :a] | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | semmle.label | call to extract! [element :b] | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | semmle.label | call to extract! [element :b] | +| hash_extensions.rb:56:10:56:10 | h [element :d] | semmle.label | h [element :d] | +| hash_extensions.rb:56:10:56:10 | h [element :d] | semmle.label | h [element :d] | | hash_extensions.rb:56:10:56:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:56:10:56:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:58:10:58:10 | x [element :a] : | semmle.label | x [element :a] : | -| hash_extensions.rb:58:10:58:10 | x [element :a] : | semmle.label | x [element :a] : | +| hash_extensions.rb:58:10:58:10 | x [element :a] | semmle.label | x [element :a] | +| hash_extensions.rb:58:10:58:10 | x [element :a] | semmle.label | x [element :a] | | hash_extensions.rb:58:10:58:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:58:10:58:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:59:10:59:10 | x [element :b] : | semmle.label | x [element :b] : | -| hash_extensions.rb:59:10:59:10 | x [element :b] : | semmle.label | x [element :b] : | +| hash_extensions.rb:59:10:59:10 | x [element :b] | semmle.label | x [element :b] | +| hash_extensions.rb:59:10:59:10 | x [element :b] | semmle.label | x [element :b] | | hash_extensions.rb:59:10:59:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:59:10:59:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:67:5:67:10 | values [element 0] : | semmle.label | values [element 0] : | -| hash_extensions.rb:67:5:67:10 | values [element 0] : | semmle.label | values [element 0] : | -| hash_extensions.rb:67:5:67:10 | values [element 1] : | semmle.label | values [element 1] : | -| hash_extensions.rb:67:5:67:10 | values [element 1] : | semmle.label | values [element 1] : | -| hash_extensions.rb:67:5:67:10 | values [element 2] : | semmle.label | values [element 2] : | -| hash_extensions.rb:67:5:67:10 | values [element 2] : | semmle.label | values [element 2] : | -| hash_extensions.rb:67:15:67:25 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:67:15:67:25 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:67:28:67:38 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:67:28:67:38 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:67:41:67:51 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:67:41:67:51 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:68:5:68:5 | h [element] : | semmle.label | h [element] : | -| hash_extensions.rb:68:5:68:5 | h [element] : | semmle.label | h [element] : | -| hash_extensions.rb:68:9:68:14 | values [element 0] : | semmle.label | values [element 0] : | -| hash_extensions.rb:68:9:68:14 | values [element 0] : | semmle.label | values [element 0] : | -| hash_extensions.rb:68:9:68:14 | values [element 1] : | semmle.label | values [element 1] : | -| hash_extensions.rb:68:9:68:14 | values [element 1] : | semmle.label | values [element 1] : | -| hash_extensions.rb:68:9:68:14 | values [element 2] : | semmle.label | values [element 2] : | -| hash_extensions.rb:68:9:68:14 | values [element 2] : | semmle.label | values [element 2] : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | semmle.label | call to index_by [element] : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | semmle.label | call to index_by [element] : | -| hash_extensions.rb:68:29:68:33 | value : | semmle.label | value : | -| hash_extensions.rb:68:29:68:33 | value : | semmle.label | value : | +| hash_extensions.rb:67:5:67:10 | values [element 0] | semmle.label | values [element 0] | +| hash_extensions.rb:67:5:67:10 | values [element 0] | semmle.label | values [element 0] | +| hash_extensions.rb:67:5:67:10 | values [element 1] | semmle.label | values [element 1] | +| hash_extensions.rb:67:5:67:10 | values [element 1] | semmle.label | values [element 1] | +| hash_extensions.rb:67:5:67:10 | values [element 2] | semmle.label | values [element 2] | +| hash_extensions.rb:67:5:67:10 | values [element 2] | semmle.label | values [element 2] | +| hash_extensions.rb:67:15:67:25 | call to source | semmle.label | call to source | +| hash_extensions.rb:67:15:67:25 | call to source | semmle.label | call to source | +| hash_extensions.rb:67:28:67:38 | call to source | semmle.label | call to source | +| hash_extensions.rb:67:28:67:38 | call to source | semmle.label | call to source | +| hash_extensions.rb:67:41:67:51 | call to source | semmle.label | call to source | +| hash_extensions.rb:67:41:67:51 | call to source | semmle.label | call to source | +| hash_extensions.rb:68:5:68:5 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:68:5:68:5 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:68:9:68:14 | values [element 0] | semmle.label | values [element 0] | +| hash_extensions.rb:68:9:68:14 | values [element 0] | semmle.label | values [element 0] | +| hash_extensions.rb:68:9:68:14 | values [element 1] | semmle.label | values [element 1] | +| hash_extensions.rb:68:9:68:14 | values [element 1] | semmle.label | values [element 1] | +| hash_extensions.rb:68:9:68:14 | values [element 2] | semmle.label | values [element 2] | +| hash_extensions.rb:68:9:68:14 | values [element 2] | semmle.label | values [element 2] | +| hash_extensions.rb:68:9:71:7 | call to index_by [element] | semmle.label | call to index_by [element] | +| hash_extensions.rb:68:9:71:7 | call to index_by [element] | semmle.label | call to index_by [element] | +| hash_extensions.rb:68:29:68:33 | value | semmle.label | value | +| hash_extensions.rb:68:29:68:33 | value | semmle.label | value | | hash_extensions.rb:69:14:69:18 | value | semmle.label | value | | hash_extensions.rb:69:14:69:18 | value | semmle.label | value | -| hash_extensions.rb:73:10:73:10 | h [element] : | semmle.label | h [element] : | -| hash_extensions.rb:73:10:73:10 | h [element] : | semmle.label | h [element] : | +| hash_extensions.rb:73:10:73:10 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:73:10:73:10 | h [element] | semmle.label | h [element] | | hash_extensions.rb:73:10:73:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:73:10:73:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:74:10:74:10 | h [element] : | semmle.label | h [element] : | -| hash_extensions.rb:74:10:74:10 | h [element] : | semmle.label | h [element] : | +| hash_extensions.rb:74:10:74:10 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:74:10:74:10 | h [element] | semmle.label | h [element] | | hash_extensions.rb:74:10:74:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:74:10:74:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:80:5:80:10 | values [element 0] : | semmle.label | values [element 0] : | -| hash_extensions.rb:80:5:80:10 | values [element 0] : | semmle.label | values [element 0] : | -| hash_extensions.rb:80:5:80:10 | values [element 1] : | semmle.label | values [element 1] : | -| hash_extensions.rb:80:5:80:10 | values [element 1] : | semmle.label | values [element 1] : | -| hash_extensions.rb:80:5:80:10 | values [element 2] : | semmle.label | values [element 2] : | -| hash_extensions.rb:80:5:80:10 | values [element 2] : | semmle.label | values [element 2] : | -| hash_extensions.rb:80:15:80:25 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:80:15:80:25 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:80:28:80:38 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:80:28:80:38 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:80:41:80:51 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:80:41:80:51 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:81:5:81:5 | h [element] : | semmle.label | h [element] : | -| hash_extensions.rb:81:5:81:5 | h [element] : | semmle.label | h [element] : | -| hash_extensions.rb:81:9:81:14 | values [element 0] : | semmle.label | values [element 0] : | -| hash_extensions.rb:81:9:81:14 | values [element 0] : | semmle.label | values [element 0] : | -| hash_extensions.rb:81:9:81:14 | values [element 1] : | semmle.label | values [element 1] : | -| hash_extensions.rb:81:9:81:14 | values [element 1] : | semmle.label | values [element 1] : | -| hash_extensions.rb:81:9:81:14 | values [element 2] : | semmle.label | values [element 2] : | -| hash_extensions.rb:81:9:81:14 | values [element 2] : | semmle.label | values [element 2] : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | semmle.label | call to index_with [element] : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | semmle.label | call to index_with [element] : | -| hash_extensions.rb:81:31:81:33 | key : | semmle.label | key : | -| hash_extensions.rb:81:31:81:33 | key : | semmle.label | key : | +| hash_extensions.rb:80:5:80:10 | values [element 0] | semmle.label | values [element 0] | +| hash_extensions.rb:80:5:80:10 | values [element 0] | semmle.label | values [element 0] | +| hash_extensions.rb:80:5:80:10 | values [element 1] | semmle.label | values [element 1] | +| hash_extensions.rb:80:5:80:10 | values [element 1] | semmle.label | values [element 1] | +| hash_extensions.rb:80:5:80:10 | values [element 2] | semmle.label | values [element 2] | +| hash_extensions.rb:80:5:80:10 | values [element 2] | semmle.label | values [element 2] | +| hash_extensions.rb:80:15:80:25 | call to source | semmle.label | call to source | +| hash_extensions.rb:80:15:80:25 | call to source | semmle.label | call to source | +| hash_extensions.rb:80:28:80:38 | call to source | semmle.label | call to source | +| hash_extensions.rb:80:28:80:38 | call to source | semmle.label | call to source | +| hash_extensions.rb:80:41:80:51 | call to source | semmle.label | call to source | +| hash_extensions.rb:80:41:80:51 | call to source | semmle.label | call to source | +| hash_extensions.rb:81:5:81:5 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:81:5:81:5 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:81:9:81:14 | values [element 0] | semmle.label | values [element 0] | +| hash_extensions.rb:81:9:81:14 | values [element 0] | semmle.label | values [element 0] | +| hash_extensions.rb:81:9:81:14 | values [element 1] | semmle.label | values [element 1] | +| hash_extensions.rb:81:9:81:14 | values [element 1] | semmle.label | values [element 1] | +| hash_extensions.rb:81:9:81:14 | values [element 2] | semmle.label | values [element 2] | +| hash_extensions.rb:81:9:81:14 | values [element 2] | semmle.label | values [element 2] | +| hash_extensions.rb:81:9:84:7 | call to index_with [element] | semmle.label | call to index_with [element] | +| hash_extensions.rb:81:9:84:7 | call to index_with [element] | semmle.label | call to index_with [element] | +| hash_extensions.rb:81:31:81:33 | key | semmle.label | key | +| hash_extensions.rb:81:31:81:33 | key | semmle.label | key | | hash_extensions.rb:82:14:82:16 | key | semmle.label | key | | hash_extensions.rb:82:14:82:16 | key | semmle.label | key | -| hash_extensions.rb:83:9:83:19 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:83:9:83:19 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:86:10:86:10 | h [element] : | semmle.label | h [element] : | -| hash_extensions.rb:86:10:86:10 | h [element] : | semmle.label | h [element] : | +| hash_extensions.rb:83:9:83:19 | call to source | semmle.label | call to source | +| hash_extensions.rb:83:9:83:19 | call to source | semmle.label | call to source | +| hash_extensions.rb:86:10:86:10 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:86:10:86:10 | h [element] | semmle.label | h [element] | | hash_extensions.rb:86:10:86:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:86:10:86:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:87:10:87:10 | h [element] : | semmle.label | h [element] : | -| hash_extensions.rb:87:10:87:10 | h [element] : | semmle.label | h [element] : | +| hash_extensions.rb:87:10:87:10 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:87:10:87:10 | h [element] | semmle.label | h [element] | | hash_extensions.rb:87:10:87:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:87:10:87:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:89:5:89:5 | j [element] : | semmle.label | j [element] : | -| hash_extensions.rb:89:5:89:5 | j [element] : | semmle.label | j [element] : | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | semmle.label | call to index_with [element] : | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | semmle.label | call to index_with [element] : | -| hash_extensions.rb:89:27:89:37 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:89:27:89:37 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:91:10:91:10 | j [element] : | semmle.label | j [element] : | -| hash_extensions.rb:91:10:91:10 | j [element] : | semmle.label | j [element] : | +| hash_extensions.rb:89:5:89:5 | j [element] | semmle.label | j [element] | +| hash_extensions.rb:89:5:89:5 | j [element] | semmle.label | j [element] | +| hash_extensions.rb:89:9:89:38 | call to index_with [element] | semmle.label | call to index_with [element] | +| hash_extensions.rb:89:9:89:38 | call to index_with [element] | semmle.label | call to index_with [element] | +| hash_extensions.rb:89:27:89:37 | call to source | semmle.label | call to source | +| hash_extensions.rb:89:27:89:37 | call to source | semmle.label | call to source | +| hash_extensions.rb:91:10:91:10 | j [element] | semmle.label | j [element] | +| hash_extensions.rb:91:10:91:10 | j [element] | semmle.label | j [element] | | hash_extensions.rb:91:10:91:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:91:10:91:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:92:10:92:10 | j [element] : | semmle.label | j [element] : | -| hash_extensions.rb:92:10:92:10 | j [element] : | semmle.label | j [element] : | +| hash_extensions.rb:92:10:92:10 | j [element] | semmle.label | j [element] | +| hash_extensions.rb:92:10:92:10 | j [element] | semmle.label | j [element] | | hash_extensions.rb:92:10:92:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:92:10:92:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:98:21:98:31 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:98:21:98:31 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:98:40:98:54 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:98:40:98:54 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:98:21:98:31 | call to source | semmle.label | call to source | +| hash_extensions.rb:98:21:98:31 | call to source | semmle.label | call to source | +| hash_extensions.rb:98:40:98:54 | call to source | semmle.label | call to source | +| hash_extensions.rb:98:40:98:54 | call to source | semmle.label | call to source | +| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | | hash_extensions.rb:99:10:99:25 | call to pick | semmle.label | call to pick | | hash_extensions.rb:99:10:99:25 | call to pick | semmle.label | call to pick | -| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | +| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | | hash_extensions.rb:100:10:100:27 | call to pick | semmle.label | call to pick | | hash_extensions.rb:100:10:100:27 | call to pick | semmle.label | call to pick | -| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:101:10:101:32 | call to pick [element 0] : | semmle.label | call to pick [element 0] : | -| hash_extensions.rb:101:10:101:32 | call to pick [element 0] : | semmle.label | call to pick [element 0] : | +| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:101:10:101:32 | call to pick [element 0] | semmle.label | call to pick [element 0] | +| hash_extensions.rb:101:10:101:32 | call to pick [element 0] | semmle.label | call to pick [element 0] | | hash_extensions.rb:101:10:101:35 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:101:10:101:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:102:10:102:32 | call to pick [element 1] : | semmle.label | call to pick [element 1] : | -| hash_extensions.rb:102:10:102:32 | call to pick [element 1] : | semmle.label | call to pick [element 1] : | +| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:102:10:102:32 | call to pick [element 1] | semmle.label | call to pick [element 1] | +| hash_extensions.rb:102:10:102:32 | call to pick [element 1] | semmle.label | call to pick [element 1] | | hash_extensions.rb:102:10:102:35 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:102:10:102:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:103:10:103:32 | call to pick [element 0] : | semmle.label | call to pick [element 0] : | -| hash_extensions.rb:103:10:103:32 | call to pick [element 0] : | semmle.label | call to pick [element 0] : | +| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:103:10:103:32 | call to pick [element 0] | semmle.label | call to pick [element 0] | +| hash_extensions.rb:103:10:103:32 | call to pick [element 0] | semmle.label | call to pick [element 0] | | hash_extensions.rb:103:10:103:35 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:103:10:103:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:104:10:104:32 | call to pick [element 1] : | semmle.label | call to pick [element 1] : | -| hash_extensions.rb:104:10:104:32 | call to pick [element 1] : | semmle.label | call to pick [element 1] : | +| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:104:10:104:32 | call to pick [element 1] | semmle.label | call to pick [element 1] | +| hash_extensions.rb:104:10:104:32 | call to pick [element 1] | semmle.label | call to pick [element 1] | | hash_extensions.rb:104:10:104:35 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:104:10:104:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | semmle.label | values [element 1, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | semmle.label | values [element 1, element :id] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | semmle.label | values [element 1, element :name] : | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | semmle.label | values [element 1, element :name] : | -| hash_extensions.rb:110:21:110:31 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:110:21:110:31 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:110:40:110:54 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:110:40:110:54 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:110:65:110:75 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:110:65:110:75 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:110:84:110:99 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:110:84:110:99 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | semmle.label | values [element 1, element :name] : | -| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | semmle.label | values [element 1, element :name] : | -| hash_extensions.rb:111:10:111:28 | call to pluck [element] : | semmle.label | call to pluck [element] : | -| hash_extensions.rb:111:10:111:28 | call to pluck [element] : | semmle.label | call to pluck [element] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | +| hash_extensions.rb:110:21:110:31 | call to source | semmle.label | call to source | +| hash_extensions.rb:110:21:110:31 | call to source | semmle.label | call to source | +| hash_extensions.rb:110:40:110:54 | call to source | semmle.label | call to source | +| hash_extensions.rb:110:40:110:54 | call to source | semmle.label | call to source | +| hash_extensions.rb:110:65:110:75 | call to source | semmle.label | call to source | +| hash_extensions.rb:110:65:110:75 | call to source | semmle.label | call to source | +| hash_extensions.rb:110:84:110:99 | call to source | semmle.label | call to source | +| hash_extensions.rb:110:84:110:99 | call to source | semmle.label | call to source | +| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | +| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | +| hash_extensions.rb:111:10:111:28 | call to pluck [element] | semmle.label | call to pluck [element] | +| hash_extensions.rb:111:10:111:28 | call to pluck [element] | semmle.label | call to pluck [element] | | hash_extensions.rb:111:10:111:31 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:111:10:111:31 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | semmle.label | values [element 1, element :id] : | -| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | semmle.label | values [element 1, element :id] : | -| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] : | semmle.label | call to pluck [element, element 0] : | -| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] : | semmle.label | call to pluck [element, element 0] : | -| hash_extensions.rb:112:10:112:36 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | -| hash_extensions.rb:112:10:112:36 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | +| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | +| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | +| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | semmle.label | call to pluck [element, element 0] | +| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | semmle.label | call to pluck [element, element 0] | +| hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | +| hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | hash_extensions.rb:112:10:112:39 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:112:10:112:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | semmle.label | values [element 1, element :name] : | -| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | semmle.label | values [element 1, element :name] : | -| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] : | semmle.label | call to pluck [element, element 1] : | -| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] : | semmle.label | call to pluck [element, element 1] : | -| hash_extensions.rb:113:10:113:36 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| hash_extensions.rb:113:10:113:36 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | +| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | +| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | +| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | semmle.label | call to pluck [element, element 1] | +| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | semmle.label | call to pluck [element, element 1] | +| hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | hash_extensions.rb:113:10:113:39 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:113:10:113:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | -| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | semmle.label | values [element 1, element :name] : | -| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | semmle.label | values [element 1, element :name] : | -| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] : | semmle.label | call to pluck [element, element 0] : | -| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] : | semmle.label | call to pluck [element, element 0] : | -| hash_extensions.rb:114:10:114:36 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | -| hash_extensions.rb:114:10:114:36 | ...[...] [element 0] : | semmle.label | ...[...] [element 0] : | +| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | +| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | +| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | semmle.label | call to pluck [element, element 0] | +| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | semmle.label | call to pluck [element, element 0] | +| hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | +| hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | hash_extensions.rb:114:10:114:39 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:114:10:114:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | -| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | semmle.label | values [element 1, element :id] : | -| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | semmle.label | values [element 1, element :id] : | -| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] : | semmle.label | call to pluck [element, element 1] : | -| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] : | semmle.label | call to pluck [element, element 1] : | -| hash_extensions.rb:115:10:115:36 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | -| hash_extensions.rb:115:10:115:36 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | +| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | +| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | +| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | semmle.label | call to pluck [element, element 1] | +| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | semmle.label | call to pluck [element, element 1] | +| hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | hash_extensions.rb:115:10:115:39 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:115:10:115:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:122:5:122:10 | single [element 0] : | semmle.label | single [element 0] : | -| hash_extensions.rb:122:5:122:10 | single [element 0] : | semmle.label | single [element 0] : | -| hash_extensions.rb:122:15:122:25 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:122:15:122:25 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:123:5:123:9 | multi [element 0] : | semmle.label | multi [element 0] : | -| hash_extensions.rb:123:5:123:9 | multi [element 0] : | semmle.label | multi [element 0] : | -| hash_extensions.rb:123:14:123:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:123:14:123:24 | call to source : | semmle.label | call to source : | -| hash_extensions.rb:125:10:125:15 | single [element 0] : | semmle.label | single [element 0] : | -| hash_extensions.rb:125:10:125:15 | single [element 0] : | semmle.label | single [element 0] : | +| hash_extensions.rb:122:5:122:10 | single [element 0] | semmle.label | single [element 0] | +| hash_extensions.rb:122:5:122:10 | single [element 0] | semmle.label | single [element 0] | +| hash_extensions.rb:122:15:122:25 | call to source | semmle.label | call to source | +| hash_extensions.rb:122:15:122:25 | call to source | semmle.label | call to source | +| hash_extensions.rb:123:5:123:9 | multi [element 0] | semmle.label | multi [element 0] | +| hash_extensions.rb:123:5:123:9 | multi [element 0] | semmle.label | multi [element 0] | +| hash_extensions.rb:123:14:123:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:123:14:123:24 | call to source | semmle.label | call to source | +| hash_extensions.rb:125:10:125:15 | single [element 0] | semmle.label | single [element 0] | +| hash_extensions.rb:125:10:125:15 | single [element 0] | semmle.label | single [element 0] | | hash_extensions.rb:125:10:125:20 | call to sole | semmle.label | call to sole | | hash_extensions.rb:125:10:125:20 | call to sole | semmle.label | call to sole | -| hash_extensions.rb:126:10:126:14 | multi [element 0] : | semmle.label | multi [element 0] : | -| hash_extensions.rb:126:10:126:14 | multi [element 0] : | semmle.label | multi [element 0] : | +| hash_extensions.rb:126:10:126:14 | multi [element 0] | semmle.label | multi [element 0] | +| hash_extensions.rb:126:10:126:14 | multi [element 0] | semmle.label | multi [element 0] | | hash_extensions.rb:126:10:126:19 | call to sole | semmle.label | call to sole | | hash_extensions.rb:126:10:126:19 | call to sole | semmle.label | call to sole | subpaths #select -| active_support.rb:182:10:182:13 | ...[...] | active_support.rb:180:10:180:17 | call to source : | active_support.rb:182:10:182:13 | ...[...] | $@ | active_support.rb:180:10:180:17 | call to source : | call to source : | -| active_support.rb:188:10:188:13 | ...[...] | active_support.rb:186:10:186:18 | call to source : | active_support.rb:188:10:188:13 | ...[...] | $@ | active_support.rb:186:10:186:18 | call to source : | call to source : | -| active_support.rb:194:10:194:13 | ...[...] | active_support.rb:192:10:192:18 | call to source : | active_support.rb:194:10:194:13 | ...[...] | $@ | active_support.rb:192:10:192:18 | call to source : | call to source : | -| active_support.rb:200:10:200:13 | ...[...] | active_support.rb:198:10:198:18 | call to source : | active_support.rb:200:10:200:13 | ...[...] | $@ | active_support.rb:198:10:198:18 | call to source : | call to source : | -| active_support.rb:206:10:206:13 | ...[...] | active_support.rb:204:10:204:18 | call to source : | active_support.rb:206:10:206:13 | ...[...] | $@ | active_support.rb:204:10:204:18 | call to source : | call to source : | -| active_support.rb:208:10:208:13 | ...[...] | active_support.rb:204:10:204:18 | call to source : | active_support.rb:208:10:208:13 | ...[...] | $@ | active_support.rb:204:10:204:18 | call to source : | call to source : | -| active_support.rb:208:10:208:13 | ...[...] | active_support.rb:205:21:205:29 | call to source : | active_support.rb:208:10:208:13 | ...[...] | $@ | active_support.rb:205:21:205:29 | call to source : | call to source : | -| active_support.rb:208:10:208:13 | ...[...] | active_support.rb:205:32:205:40 | call to source : | active_support.rb:208:10:208:13 | ...[...] | $@ | active_support.rb:205:32:205:40 | call to source : | call to source : | -| active_support.rb:209:10:209:13 | ...[...] | active_support.rb:205:21:205:29 | call to source : | active_support.rb:209:10:209:13 | ...[...] | $@ | active_support.rb:205:21:205:29 | call to source : | call to source : | -| active_support.rb:209:10:209:13 | ...[...] | active_support.rb:205:32:205:40 | call to source : | active_support.rb:209:10:209:13 | ...[...] | $@ | active_support.rb:205:32:205:40 | call to source : | call to source : | -| active_support.rb:210:10:210:13 | ...[...] | active_support.rb:205:21:205:29 | call to source : | active_support.rb:210:10:210:13 | ...[...] | $@ | active_support.rb:205:21:205:29 | call to source : | call to source : | -| active_support.rb:210:10:210:13 | ...[...] | active_support.rb:205:32:205:40 | call to source : | active_support.rb:210:10:210:13 | ...[...] | $@ | active_support.rb:205:32:205:40 | call to source : | call to source : | -| active_support.rb:211:10:211:13 | ...[...] | active_support.rb:205:21:205:29 | call to source : | active_support.rb:211:10:211:13 | ...[...] | $@ | active_support.rb:205:21:205:29 | call to source : | call to source : | -| active_support.rb:211:10:211:13 | ...[...] | active_support.rb:205:32:205:40 | call to source : | active_support.rb:211:10:211:13 | ...[...] | $@ | active_support.rb:205:32:205:40 | call to source : | call to source : | -| active_support.rb:283:8:283:17 | call to presence | active_support.rb:282:7:282:16 | call to source : | active_support.rb:283:8:283:17 | call to presence | $@ | active_support.rb:282:7:282:16 | call to source : | call to source : | -| active_support.rb:286:8:286:17 | call to presence | active_support.rb:285:7:285:16 | call to source : | active_support.rb:286:8:286:17 | call to presence | $@ | active_support.rb:285:7:285:16 | call to source : | call to source : | -| active_support.rb:291:8:291:17 | call to deep_dup | active_support.rb:290:7:290:16 | call to source : | active_support.rb:291:8:291:17 | call to deep_dup | $@ | active_support.rb:290:7:290:16 | call to source : | call to source : | -| hash_extensions.rb:4:10:4:14 | ...[...] | hash_extensions.rb:2:14:2:24 | call to source : | hash_extensions.rb:4:10:4:14 | ...[...] | $@ | hash_extensions.rb:2:14:2:24 | call to source : | call to source : | -| hash_extensions.rb:12:10:12:14 | ...[...] | hash_extensions.rb:10:14:10:24 | call to source : | hash_extensions.rb:12:10:12:14 | ...[...] | $@ | hash_extensions.rb:10:14:10:24 | call to source : | call to source : | -| hash_extensions.rb:20:10:20:14 | ...[...] | hash_extensions.rb:18:14:18:24 | call to source : | hash_extensions.rb:20:10:20:14 | ...[...] | $@ | hash_extensions.rb:18:14:18:24 | call to source : | call to source : | -| hash_extensions.rb:28:10:28:14 | ...[...] | hash_extensions.rb:26:14:26:24 | call to source : | hash_extensions.rb:28:10:28:14 | ...[...] | $@ | hash_extensions.rb:26:14:26:24 | call to source : | call to source : | -| hash_extensions.rb:36:10:36:14 | ...[...] | hash_extensions.rb:34:14:34:24 | call to source : | hash_extensions.rb:36:10:36:14 | ...[...] | $@ | hash_extensions.rb:34:14:34:24 | call to source : | call to source : | -| hash_extensions.rb:44:10:44:14 | ...[...] | hash_extensions.rb:42:14:42:24 | call to source : | hash_extensions.rb:44:10:44:14 | ...[...] | $@ | hash_extensions.rb:42:14:42:24 | call to source : | call to source : | -| hash_extensions.rb:56:10:56:14 | ...[...] | hash_extensions.rb:50:52:50:61 | call to taint : | hash_extensions.rb:56:10:56:14 | ...[...] | $@ | hash_extensions.rb:50:52:50:61 | call to taint : | call to taint : | -| hash_extensions.rb:58:10:58:14 | ...[...] | hash_extensions.rb:50:14:50:23 | call to taint : | hash_extensions.rb:58:10:58:14 | ...[...] | $@ | hash_extensions.rb:50:14:50:23 | call to taint : | call to taint : | -| hash_extensions.rb:59:10:59:14 | ...[...] | hash_extensions.rb:50:29:50:38 | call to taint : | hash_extensions.rb:59:10:59:14 | ...[...] | $@ | hash_extensions.rb:50:29:50:38 | call to taint : | call to taint : | -| hash_extensions.rb:69:14:69:18 | value | hash_extensions.rb:67:15:67:25 | call to source : | hash_extensions.rb:69:14:69:18 | value | $@ | hash_extensions.rb:67:15:67:25 | call to source : | call to source : | -| hash_extensions.rb:69:14:69:18 | value | hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:69:14:69:18 | value | $@ | hash_extensions.rb:67:28:67:38 | call to source : | call to source : | -| hash_extensions.rb:69:14:69:18 | value | hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:69:14:69:18 | value | $@ | hash_extensions.rb:67:41:67:51 | call to source : | call to source : | -| hash_extensions.rb:73:10:73:16 | ...[...] | hash_extensions.rb:67:15:67:25 | call to source : | hash_extensions.rb:73:10:73:16 | ...[...] | $@ | hash_extensions.rb:67:15:67:25 | call to source : | call to source : | -| hash_extensions.rb:73:10:73:16 | ...[...] | hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:73:10:73:16 | ...[...] | $@ | hash_extensions.rb:67:28:67:38 | call to source : | call to source : | -| hash_extensions.rb:73:10:73:16 | ...[...] | hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:73:10:73:16 | ...[...] | $@ | hash_extensions.rb:67:41:67:51 | call to source : | call to source : | -| hash_extensions.rb:74:10:74:16 | ...[...] | hash_extensions.rb:67:15:67:25 | call to source : | hash_extensions.rb:74:10:74:16 | ...[...] | $@ | hash_extensions.rb:67:15:67:25 | call to source : | call to source : | -| hash_extensions.rb:74:10:74:16 | ...[...] | hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:74:10:74:16 | ...[...] | $@ | hash_extensions.rb:67:28:67:38 | call to source : | call to source : | -| hash_extensions.rb:74:10:74:16 | ...[...] | hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:74:10:74:16 | ...[...] | $@ | hash_extensions.rb:67:41:67:51 | call to source : | call to source : | -| hash_extensions.rb:82:14:82:16 | key | hash_extensions.rb:80:15:80:25 | call to source : | hash_extensions.rb:82:14:82:16 | key | $@ | hash_extensions.rb:80:15:80:25 | call to source : | call to source : | -| hash_extensions.rb:82:14:82:16 | key | hash_extensions.rb:80:28:80:38 | call to source : | hash_extensions.rb:82:14:82:16 | key | $@ | hash_extensions.rb:80:28:80:38 | call to source : | call to source : | -| hash_extensions.rb:82:14:82:16 | key | hash_extensions.rb:80:41:80:51 | call to source : | hash_extensions.rb:82:14:82:16 | key | $@ | hash_extensions.rb:80:41:80:51 | call to source : | call to source : | -| hash_extensions.rb:86:10:86:16 | ...[...] | hash_extensions.rb:83:9:83:19 | call to source : | hash_extensions.rb:86:10:86:16 | ...[...] | $@ | hash_extensions.rb:83:9:83:19 | call to source : | call to source : | -| hash_extensions.rb:87:10:87:16 | ...[...] | hash_extensions.rb:83:9:83:19 | call to source : | hash_extensions.rb:87:10:87:16 | ...[...] | $@ | hash_extensions.rb:83:9:83:19 | call to source : | call to source : | -| hash_extensions.rb:91:10:91:16 | ...[...] | hash_extensions.rb:89:27:89:37 | call to source : | hash_extensions.rb:91:10:91:16 | ...[...] | $@ | hash_extensions.rb:89:27:89:37 | call to source : | call to source : | -| hash_extensions.rb:92:10:92:16 | ...[...] | hash_extensions.rb:89:27:89:37 | call to source : | hash_extensions.rb:92:10:92:16 | ...[...] | $@ | hash_extensions.rb:89:27:89:37 | call to source : | call to source : | -| hash_extensions.rb:99:10:99:25 | call to pick | hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:99:10:99:25 | call to pick | $@ | hash_extensions.rb:98:21:98:31 | call to source : | call to source : | -| hash_extensions.rb:100:10:100:27 | call to pick | hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:100:10:100:27 | call to pick | $@ | hash_extensions.rb:98:40:98:54 | call to source : | call to source : | -| hash_extensions.rb:101:10:101:35 | ...[...] | hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:101:10:101:35 | ...[...] | $@ | hash_extensions.rb:98:21:98:31 | call to source : | call to source : | -| hash_extensions.rb:102:10:102:35 | ...[...] | hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:102:10:102:35 | ...[...] | $@ | hash_extensions.rb:98:40:98:54 | call to source : | call to source : | -| hash_extensions.rb:103:10:103:35 | ...[...] | hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:103:10:103:35 | ...[...] | $@ | hash_extensions.rb:98:40:98:54 | call to source : | call to source : | -| hash_extensions.rb:104:10:104:35 | ...[...] | hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:104:10:104:35 | ...[...] | $@ | hash_extensions.rb:98:21:98:31 | call to source : | call to source : | -| hash_extensions.rb:111:10:111:31 | ...[...] | hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:111:10:111:31 | ...[...] | $@ | hash_extensions.rb:110:40:110:54 | call to source : | call to source : | -| hash_extensions.rb:111:10:111:31 | ...[...] | hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:111:10:111:31 | ...[...] | $@ | hash_extensions.rb:110:84:110:99 | call to source : | call to source : | -| hash_extensions.rb:112:10:112:39 | ...[...] | hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:112:10:112:39 | ...[...] | $@ | hash_extensions.rb:110:21:110:31 | call to source : | call to source : | -| hash_extensions.rb:112:10:112:39 | ...[...] | hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:112:10:112:39 | ...[...] | $@ | hash_extensions.rb:110:65:110:75 | call to source : | call to source : | -| hash_extensions.rb:113:10:113:39 | ...[...] | hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:113:10:113:39 | ...[...] | $@ | hash_extensions.rb:110:40:110:54 | call to source : | call to source : | -| hash_extensions.rb:113:10:113:39 | ...[...] | hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:113:10:113:39 | ...[...] | $@ | hash_extensions.rb:110:84:110:99 | call to source : | call to source : | -| hash_extensions.rb:114:10:114:39 | ...[...] | hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:114:10:114:39 | ...[...] | $@ | hash_extensions.rb:110:40:110:54 | call to source : | call to source : | -| hash_extensions.rb:114:10:114:39 | ...[...] | hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:114:10:114:39 | ...[...] | $@ | hash_extensions.rb:110:84:110:99 | call to source : | call to source : | -| hash_extensions.rb:115:10:115:39 | ...[...] | hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:115:10:115:39 | ...[...] | $@ | hash_extensions.rb:110:21:110:31 | call to source : | call to source : | -| hash_extensions.rb:115:10:115:39 | ...[...] | hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:115:10:115:39 | ...[...] | $@ | hash_extensions.rb:110:65:110:75 | call to source : | call to source : | -| hash_extensions.rb:125:10:125:20 | call to sole | hash_extensions.rb:122:15:122:25 | call to source : | hash_extensions.rb:125:10:125:20 | call to sole | $@ | hash_extensions.rb:122:15:122:25 | call to source : | call to source : | -| hash_extensions.rb:126:10:126:19 | call to sole | hash_extensions.rb:123:14:123:24 | call to source : | hash_extensions.rb:126:10:126:19 | call to sole | $@ | hash_extensions.rb:123:14:123:24 | call to source : | call to source : | +| active_support.rb:182:10:182:13 | ...[...] | active_support.rb:180:10:180:17 | call to source | active_support.rb:182:10:182:13 | ...[...] | $@ | active_support.rb:180:10:180:17 | call to source | call to source | +| active_support.rb:188:10:188:13 | ...[...] | active_support.rb:186:10:186:18 | call to source | active_support.rb:188:10:188:13 | ...[...] | $@ | active_support.rb:186:10:186:18 | call to source | call to source | +| active_support.rb:194:10:194:13 | ...[...] | active_support.rb:192:10:192:18 | call to source | active_support.rb:194:10:194:13 | ...[...] | $@ | active_support.rb:192:10:192:18 | call to source | call to source | +| active_support.rb:200:10:200:13 | ...[...] | active_support.rb:198:10:198:18 | call to source | active_support.rb:200:10:200:13 | ...[...] | $@ | active_support.rb:198:10:198:18 | call to source | call to source | +| active_support.rb:206:10:206:13 | ...[...] | active_support.rb:204:10:204:18 | call to source | active_support.rb:206:10:206:13 | ...[...] | $@ | active_support.rb:204:10:204:18 | call to source | call to source | +| active_support.rb:208:10:208:13 | ...[...] | active_support.rb:204:10:204:18 | call to source | active_support.rb:208:10:208:13 | ...[...] | $@ | active_support.rb:204:10:204:18 | call to source | call to source | +| active_support.rb:208:10:208:13 | ...[...] | active_support.rb:205:21:205:29 | call to source | active_support.rb:208:10:208:13 | ...[...] | $@ | active_support.rb:205:21:205:29 | call to source | call to source | +| active_support.rb:208:10:208:13 | ...[...] | active_support.rb:205:32:205:40 | call to source | active_support.rb:208:10:208:13 | ...[...] | $@ | active_support.rb:205:32:205:40 | call to source | call to source | +| active_support.rb:209:10:209:13 | ...[...] | active_support.rb:205:21:205:29 | call to source | active_support.rb:209:10:209:13 | ...[...] | $@ | active_support.rb:205:21:205:29 | call to source | call to source | +| active_support.rb:209:10:209:13 | ...[...] | active_support.rb:205:32:205:40 | call to source | active_support.rb:209:10:209:13 | ...[...] | $@ | active_support.rb:205:32:205:40 | call to source | call to source | +| active_support.rb:210:10:210:13 | ...[...] | active_support.rb:205:21:205:29 | call to source | active_support.rb:210:10:210:13 | ...[...] | $@ | active_support.rb:205:21:205:29 | call to source | call to source | +| active_support.rb:210:10:210:13 | ...[...] | active_support.rb:205:32:205:40 | call to source | active_support.rb:210:10:210:13 | ...[...] | $@ | active_support.rb:205:32:205:40 | call to source | call to source | +| active_support.rb:211:10:211:13 | ...[...] | active_support.rb:205:21:205:29 | call to source | active_support.rb:211:10:211:13 | ...[...] | $@ | active_support.rb:205:21:205:29 | call to source | call to source | +| active_support.rb:211:10:211:13 | ...[...] | active_support.rb:205:32:205:40 | call to source | active_support.rb:211:10:211:13 | ...[...] | $@ | active_support.rb:205:32:205:40 | call to source | call to source | +| active_support.rb:283:8:283:17 | call to presence | active_support.rb:282:7:282:16 | call to source | active_support.rb:283:8:283:17 | call to presence | $@ | active_support.rb:282:7:282:16 | call to source | call to source | +| active_support.rb:286:8:286:17 | call to presence | active_support.rb:285:7:285:16 | call to source | active_support.rb:286:8:286:17 | call to presence | $@ | active_support.rb:285:7:285:16 | call to source | call to source | +| active_support.rb:291:8:291:17 | call to deep_dup | active_support.rb:290:7:290:16 | call to source | active_support.rb:291:8:291:17 | call to deep_dup | $@ | active_support.rb:290:7:290:16 | call to source | call to source | +| hash_extensions.rb:4:10:4:14 | ...[...] | hash_extensions.rb:2:14:2:24 | call to source | hash_extensions.rb:4:10:4:14 | ...[...] | $@ | hash_extensions.rb:2:14:2:24 | call to source | call to source | +| hash_extensions.rb:12:10:12:14 | ...[...] | hash_extensions.rb:10:14:10:24 | call to source | hash_extensions.rb:12:10:12:14 | ...[...] | $@ | hash_extensions.rb:10:14:10:24 | call to source | call to source | +| hash_extensions.rb:20:10:20:14 | ...[...] | hash_extensions.rb:18:14:18:24 | call to source | hash_extensions.rb:20:10:20:14 | ...[...] | $@ | hash_extensions.rb:18:14:18:24 | call to source | call to source | +| hash_extensions.rb:28:10:28:14 | ...[...] | hash_extensions.rb:26:14:26:24 | call to source | hash_extensions.rb:28:10:28:14 | ...[...] | $@ | hash_extensions.rb:26:14:26:24 | call to source | call to source | +| hash_extensions.rb:36:10:36:14 | ...[...] | hash_extensions.rb:34:14:34:24 | call to source | hash_extensions.rb:36:10:36:14 | ...[...] | $@ | hash_extensions.rb:34:14:34:24 | call to source | call to source | +| hash_extensions.rb:44:10:44:14 | ...[...] | hash_extensions.rb:42:14:42:24 | call to source | hash_extensions.rb:44:10:44:14 | ...[...] | $@ | hash_extensions.rb:42:14:42:24 | call to source | call to source | +| hash_extensions.rb:56:10:56:14 | ...[...] | hash_extensions.rb:50:52:50:61 | call to taint | hash_extensions.rb:56:10:56:14 | ...[...] | $@ | hash_extensions.rb:50:52:50:61 | call to taint | call to taint | +| hash_extensions.rb:58:10:58:14 | ...[...] | hash_extensions.rb:50:14:50:23 | call to taint | hash_extensions.rb:58:10:58:14 | ...[...] | $@ | hash_extensions.rb:50:14:50:23 | call to taint | call to taint | +| hash_extensions.rb:59:10:59:14 | ...[...] | hash_extensions.rb:50:29:50:38 | call to taint | hash_extensions.rb:59:10:59:14 | ...[...] | $@ | hash_extensions.rb:50:29:50:38 | call to taint | call to taint | +| hash_extensions.rb:69:14:69:18 | value | hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:69:14:69:18 | value | $@ | hash_extensions.rb:67:15:67:25 | call to source | call to source | +| hash_extensions.rb:69:14:69:18 | value | hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:69:14:69:18 | value | $@ | hash_extensions.rb:67:28:67:38 | call to source | call to source | +| hash_extensions.rb:69:14:69:18 | value | hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:69:14:69:18 | value | $@ | hash_extensions.rb:67:41:67:51 | call to source | call to source | +| hash_extensions.rb:73:10:73:16 | ...[...] | hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:73:10:73:16 | ...[...] | $@ | hash_extensions.rb:67:15:67:25 | call to source | call to source | +| hash_extensions.rb:73:10:73:16 | ...[...] | hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:73:10:73:16 | ...[...] | $@ | hash_extensions.rb:67:28:67:38 | call to source | call to source | +| hash_extensions.rb:73:10:73:16 | ...[...] | hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:73:10:73:16 | ...[...] | $@ | hash_extensions.rb:67:41:67:51 | call to source | call to source | +| hash_extensions.rb:74:10:74:16 | ...[...] | hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:74:10:74:16 | ...[...] | $@ | hash_extensions.rb:67:15:67:25 | call to source | call to source | +| hash_extensions.rb:74:10:74:16 | ...[...] | hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:74:10:74:16 | ...[...] | $@ | hash_extensions.rb:67:28:67:38 | call to source | call to source | +| hash_extensions.rb:74:10:74:16 | ...[...] | hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:74:10:74:16 | ...[...] | $@ | hash_extensions.rb:67:41:67:51 | call to source | call to source | +| hash_extensions.rb:82:14:82:16 | key | hash_extensions.rb:80:15:80:25 | call to source | hash_extensions.rb:82:14:82:16 | key | $@ | hash_extensions.rb:80:15:80:25 | call to source | call to source | +| hash_extensions.rb:82:14:82:16 | key | hash_extensions.rb:80:28:80:38 | call to source | hash_extensions.rb:82:14:82:16 | key | $@ | hash_extensions.rb:80:28:80:38 | call to source | call to source | +| hash_extensions.rb:82:14:82:16 | key | hash_extensions.rb:80:41:80:51 | call to source | hash_extensions.rb:82:14:82:16 | key | $@ | hash_extensions.rb:80:41:80:51 | call to source | call to source | +| hash_extensions.rb:86:10:86:16 | ...[...] | hash_extensions.rb:83:9:83:19 | call to source | hash_extensions.rb:86:10:86:16 | ...[...] | $@ | hash_extensions.rb:83:9:83:19 | call to source | call to source | +| hash_extensions.rb:87:10:87:16 | ...[...] | hash_extensions.rb:83:9:83:19 | call to source | hash_extensions.rb:87:10:87:16 | ...[...] | $@ | hash_extensions.rb:83:9:83:19 | call to source | call to source | +| hash_extensions.rb:91:10:91:16 | ...[...] | hash_extensions.rb:89:27:89:37 | call to source | hash_extensions.rb:91:10:91:16 | ...[...] | $@ | hash_extensions.rb:89:27:89:37 | call to source | call to source | +| hash_extensions.rb:92:10:92:16 | ...[...] | hash_extensions.rb:89:27:89:37 | call to source | hash_extensions.rb:92:10:92:16 | ...[...] | $@ | hash_extensions.rb:89:27:89:37 | call to source | call to source | +| hash_extensions.rb:99:10:99:25 | call to pick | hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:99:10:99:25 | call to pick | $@ | hash_extensions.rb:98:21:98:31 | call to source | call to source | +| hash_extensions.rb:100:10:100:27 | call to pick | hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:100:10:100:27 | call to pick | $@ | hash_extensions.rb:98:40:98:54 | call to source | call to source | +| hash_extensions.rb:101:10:101:35 | ...[...] | hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:101:10:101:35 | ...[...] | $@ | hash_extensions.rb:98:21:98:31 | call to source | call to source | +| hash_extensions.rb:102:10:102:35 | ...[...] | hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:102:10:102:35 | ...[...] | $@ | hash_extensions.rb:98:40:98:54 | call to source | call to source | +| hash_extensions.rb:103:10:103:35 | ...[...] | hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:103:10:103:35 | ...[...] | $@ | hash_extensions.rb:98:40:98:54 | call to source | call to source | +| hash_extensions.rb:104:10:104:35 | ...[...] | hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:104:10:104:35 | ...[...] | $@ | hash_extensions.rb:98:21:98:31 | call to source | call to source | +| hash_extensions.rb:111:10:111:31 | ...[...] | hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:111:10:111:31 | ...[...] | $@ | hash_extensions.rb:110:40:110:54 | call to source | call to source | +| hash_extensions.rb:111:10:111:31 | ...[...] | hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:111:10:111:31 | ...[...] | $@ | hash_extensions.rb:110:84:110:99 | call to source | call to source | +| hash_extensions.rb:112:10:112:39 | ...[...] | hash_extensions.rb:110:21:110:31 | call to source | hash_extensions.rb:112:10:112:39 | ...[...] | $@ | hash_extensions.rb:110:21:110:31 | call to source | call to source | +| hash_extensions.rb:112:10:112:39 | ...[...] | hash_extensions.rb:110:65:110:75 | call to source | hash_extensions.rb:112:10:112:39 | ...[...] | $@ | hash_extensions.rb:110:65:110:75 | call to source | call to source | +| hash_extensions.rb:113:10:113:39 | ...[...] | hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:113:10:113:39 | ...[...] | $@ | hash_extensions.rb:110:40:110:54 | call to source | call to source | +| hash_extensions.rb:113:10:113:39 | ...[...] | hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:113:10:113:39 | ...[...] | $@ | hash_extensions.rb:110:84:110:99 | call to source | call to source | +| hash_extensions.rb:114:10:114:39 | ...[...] | hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:114:10:114:39 | ...[...] | $@ | hash_extensions.rb:110:40:110:54 | call to source | call to source | +| hash_extensions.rb:114:10:114:39 | ...[...] | hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:114:10:114:39 | ...[...] | $@ | hash_extensions.rb:110:84:110:99 | call to source | call to source | +| hash_extensions.rb:115:10:115:39 | ...[...] | hash_extensions.rb:110:21:110:31 | call to source | hash_extensions.rb:115:10:115:39 | ...[...] | $@ | hash_extensions.rb:110:21:110:31 | call to source | call to source | +| hash_extensions.rb:115:10:115:39 | ...[...] | hash_extensions.rb:110:65:110:75 | call to source | hash_extensions.rb:115:10:115:39 | ...[...] | $@ | hash_extensions.rb:110:65:110:75 | call to source | call to source | +| hash_extensions.rb:125:10:125:20 | call to sole | hash_extensions.rb:122:15:122:25 | call to source | hash_extensions.rb:125:10:125:20 | call to sole | $@ | hash_extensions.rb:122:15:122:25 | call to source | call to source | +| hash_extensions.rb:126:10:126:19 | call to sole | hash_extensions.rb:123:14:123:24 | call to source | hash_extensions.rb:126:10:126:19 | call to sole | $@ | hash_extensions.rb:123:14:123:24 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/frameworks/arel/Arel.expected b/ruby/ql/test/library-tests/frameworks/arel/Arel.expected index 63cd556e836..d34ccbcb1a1 100644 --- a/ruby/ql/test/library-tests/frameworks/arel/Arel.expected +++ b/ruby/ql/test/library-tests/frameworks/arel/Arel.expected @@ -1,3 +1,3 @@ failures #select -| arel.rb:3:8:3:18 | call to sql | arel.rb:2:7:2:14 | call to source : | arel.rb:3:8:3:18 | call to sql | $@ | arel.rb:2:7:2:14 | call to source : | call to source : | +| arel.rb:3:8:3:18 | call to sql | arel.rb:2:7:2:14 | call to source | arel.rb:3:8:3:18 | call to sql | $@ | arel.rb:2:7:2:14 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/frameworks/json/JsonDataFlow.expected b/ruby/ql/test/library-tests/frameworks/json/JsonDataFlow.expected index d7173f8b110..db04aefd22f 100644 --- a/ruby/ql/test/library-tests/frameworks/json/JsonDataFlow.expected +++ b/ruby/ql/test/library-tests/frameworks/json/JsonDataFlow.expected @@ -1,34 +1,34 @@ failures edges -| json.rb:1:17:1:26 | call to source : | json.rb:1:6:1:27 | call to parse | -| json.rb:2:18:2:27 | call to source : | json.rb:2:6:2:28 | call to parse! | -| json.rb:3:16:3:25 | call to source : | json.rb:3:6:3:26 | call to load | -| json.rb:4:19:4:28 | call to source : | json.rb:4:6:4:29 | call to restore | -| json.rb:6:20:6:29 | call to source : | json.rb:6:6:6:30 | call to generate | -| json.rb:7:25:7:34 | call to source : | json.rb:7:6:7:35 | call to fast_generate | -| json.rb:8:27:8:36 | call to source : | json.rb:8:6:8:37 | call to pretty_generate | -| json.rb:9:16:9:25 | call to source : | json.rb:9:6:9:26 | call to dump | -| json.rb:10:19:10:28 | call to source : | json.rb:10:6:10:29 | call to unparse | -| json.rb:11:24:11:33 | call to source : | json.rb:11:6:11:34 | call to fast_unparse | +| json.rb:1:17:1:26 | call to source | json.rb:1:6:1:27 | call to parse | +| json.rb:2:18:2:27 | call to source | json.rb:2:6:2:28 | call to parse! | +| json.rb:3:16:3:25 | call to source | json.rb:3:6:3:26 | call to load | +| json.rb:4:19:4:28 | call to source | json.rb:4:6:4:29 | call to restore | +| json.rb:6:20:6:29 | call to source | json.rb:6:6:6:30 | call to generate | +| json.rb:7:25:7:34 | call to source | json.rb:7:6:7:35 | call to fast_generate | +| json.rb:8:27:8:36 | call to source | json.rb:8:6:8:37 | call to pretty_generate | +| json.rb:9:16:9:25 | call to source | json.rb:9:6:9:26 | call to dump | +| json.rb:10:19:10:28 | call to source | json.rb:10:6:10:29 | call to unparse | +| json.rb:11:24:11:33 | call to source | json.rb:11:6:11:34 | call to fast_unparse | nodes | json.rb:1:6:1:27 | call to parse | semmle.label | call to parse | -| json.rb:1:17:1:26 | call to source : | semmle.label | call to source : | +| json.rb:1:17:1:26 | call to source | semmle.label | call to source | | json.rb:2:6:2:28 | call to parse! | semmle.label | call to parse! | -| json.rb:2:18:2:27 | call to source : | semmle.label | call to source : | +| json.rb:2:18:2:27 | call to source | semmle.label | call to source | | json.rb:3:6:3:26 | call to load | semmle.label | call to load | -| json.rb:3:16:3:25 | call to source : | semmle.label | call to source : | +| json.rb:3:16:3:25 | call to source | semmle.label | call to source | | json.rb:4:6:4:29 | call to restore | semmle.label | call to restore | -| json.rb:4:19:4:28 | call to source : | semmle.label | call to source : | +| json.rb:4:19:4:28 | call to source | semmle.label | call to source | | json.rb:6:6:6:30 | call to generate | semmle.label | call to generate | -| json.rb:6:20:6:29 | call to source : | semmle.label | call to source : | +| json.rb:6:20:6:29 | call to source | semmle.label | call to source | | json.rb:7:6:7:35 | call to fast_generate | semmle.label | call to fast_generate | -| json.rb:7:25:7:34 | call to source : | semmle.label | call to source : | +| json.rb:7:25:7:34 | call to source | semmle.label | call to source | | json.rb:8:6:8:37 | call to pretty_generate | semmle.label | call to pretty_generate | -| json.rb:8:27:8:36 | call to source : | semmle.label | call to source : | +| json.rb:8:27:8:36 | call to source | semmle.label | call to source | | json.rb:9:6:9:26 | call to dump | semmle.label | call to dump | -| json.rb:9:16:9:25 | call to source : | semmle.label | call to source : | +| json.rb:9:16:9:25 | call to source | semmle.label | call to source | | json.rb:10:6:10:29 | call to unparse | semmle.label | call to unparse | -| json.rb:10:19:10:28 | call to source : | semmle.label | call to source : | +| json.rb:10:19:10:28 | call to source | semmle.label | call to source | | json.rb:11:6:11:34 | call to fast_unparse | semmle.label | call to fast_unparse | -| json.rb:11:24:11:33 | call to source : | semmle.label | call to source : | +| json.rb:11:24:11:33 | call to source | semmle.label | call to source | subpaths diff --git a/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected b/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected index e97392c13eb..2ace7832268 100644 --- a/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected +++ b/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected @@ -1,25 +1,25 @@ failures | views/index.erb:2:10:2:12 | call to foo | Unexpected result: hasTaintFlow= | edges -| app.rb:75:5:75:8 | [post] self [@foo] : | app.rb:76:32:76:35 | self [@foo] : | -| app.rb:75:12:75:17 | call to params : | app.rb:75:12:75:24 | ...[...] : | -| app.rb:75:12:75:24 | ...[...] : | app.rb:75:5:75:8 | [post] self [@foo] : | -| app.rb:76:32:76:35 | @foo : | views/index.erb:2:10:2:12 | call to foo | -| app.rb:76:32:76:35 | self [@foo] : | app.rb:76:32:76:35 | @foo : | -| app.rb:95:10:95:14 | self [@user] : | app.rb:95:10:95:14 | @user | -| app.rb:103:5:103:9 | [post] self [@user] : | app.rb:95:10:95:14 | self [@user] : | -| app.rb:103:13:103:22 | call to source : | app.rb:103:5:103:9 | [post] self [@user] : | +| app.rb:75:5:75:8 | [post] self [@foo] | app.rb:76:32:76:35 | self [@foo] | +| app.rb:75:12:75:17 | call to params | app.rb:75:12:75:24 | ...[...] | +| app.rb:75:12:75:24 | ...[...] | app.rb:75:5:75:8 | [post] self [@foo] | +| app.rb:76:32:76:35 | @foo | views/index.erb:2:10:2:12 | call to foo | +| app.rb:76:32:76:35 | self [@foo] | app.rb:76:32:76:35 | @foo | +| app.rb:95:10:95:14 | self [@user] | app.rb:95:10:95:14 | @user | +| app.rb:103:5:103:9 | [post] self [@user] | app.rb:95:10:95:14 | self [@user] | +| app.rb:103:13:103:22 | call to source | app.rb:103:5:103:9 | [post] self [@user] | nodes -| app.rb:75:5:75:8 | [post] self [@foo] : | semmle.label | [post] self [@foo] : | -| app.rb:75:12:75:17 | call to params : | semmle.label | call to params : | -| app.rb:75:12:75:24 | ...[...] : | semmle.label | ...[...] : | -| app.rb:76:32:76:35 | @foo : | semmle.label | @foo : | -| app.rb:76:32:76:35 | self [@foo] : | semmle.label | self [@foo] : | +| app.rb:75:5:75:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | +| app.rb:75:12:75:17 | call to params | semmle.label | call to params | +| app.rb:75:12:75:24 | ...[...] | semmle.label | ...[...] | +| app.rb:76:32:76:35 | @foo | semmle.label | @foo | +| app.rb:76:32:76:35 | self [@foo] | semmle.label | self [@foo] | | app.rb:95:10:95:14 | @user | semmle.label | @user | -| app.rb:95:10:95:14 | self [@user] : | semmle.label | self [@user] : | -| app.rb:103:5:103:9 | [post] self [@user] : | semmle.label | [post] self [@user] : | -| app.rb:103:13:103:22 | call to source : | semmle.label | call to source : | +| app.rb:95:10:95:14 | self [@user] | semmle.label | self [@user] | +| app.rb:103:5:103:9 | [post] self [@user] | semmle.label | [post] self [@user] | +| app.rb:103:13:103:22 | call to source | semmle.label | call to source | | views/index.erb:2:10:2:12 | call to foo | semmle.label | call to foo | subpaths #select -| views/index.erb:2:10:2:12 | call to foo | app.rb:75:12:75:17 | call to params : | views/index.erb:2:10:2:12 | call to foo | $@ | app.rb:75:12:75:17 | call to params : | call to params : | +| views/index.erb:2:10:2:12 | call to foo | app.rb:75:12:75:17 | call to params | views/index.erb:2:10:2:12 | call to foo | $@ | app.rb:75:12:75:17 | call to params | call to params | diff --git a/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected b/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected index a3e20d71b20..cf4eac6f53d 100644 --- a/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected +++ b/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected @@ -1,39 +1,39 @@ edges -| ErbInjection.rb:5:5:5:8 | name : | ErbInjection.rb:8:5:8:12 | bad_text : | -| ErbInjection.rb:5:5:5:8 | name : | ErbInjection.rb:11:11:11:14 | name : | -| ErbInjection.rb:5:12:5:17 | call to params : | ErbInjection.rb:5:12:5:24 | ...[...] : | -| ErbInjection.rb:5:12:5:24 | ...[...] : | ErbInjection.rb:5:5:5:8 | name : | -| ErbInjection.rb:8:5:8:12 | bad_text : | ErbInjection.rb:15:24:15:31 | bad_text | -| ErbInjection.rb:8:16:11:14 | ... % ... : | ErbInjection.rb:8:5:8:12 | bad_text : | -| ErbInjection.rb:11:11:11:14 | name : | ErbInjection.rb:8:16:11:14 | ... % ... : | -| SlimInjection.rb:5:5:5:8 | name : | SlimInjection.rb:8:5:8:12 | bad_text : | -| SlimInjection.rb:5:5:5:8 | name : | SlimInjection.rb:11:11:11:14 | name : | -| SlimInjection.rb:5:5:5:8 | name : | SlimInjection.rb:17:5:17:13 | bad2_text : | -| SlimInjection.rb:5:12:5:17 | call to params : | SlimInjection.rb:5:12:5:24 | ...[...] : | -| SlimInjection.rb:5:12:5:24 | ...[...] : | SlimInjection.rb:5:5:5:8 | name : | -| SlimInjection.rb:8:5:8:12 | bad_text : | SlimInjection.rb:14:25:14:32 | bad_text | -| SlimInjection.rb:8:16:11:14 | ... % ... : | SlimInjection.rb:8:5:8:12 | bad_text : | -| SlimInjection.rb:11:11:11:14 | name : | SlimInjection.rb:8:16:11:14 | ... % ... : | -| SlimInjection.rb:17:5:17:13 | bad2_text : | SlimInjection.rb:23:25:23:33 | bad2_text | +| ErbInjection.rb:5:5:5:8 | name | ErbInjection.rb:8:5:8:12 | bad_text | +| ErbInjection.rb:5:5:5:8 | name | ErbInjection.rb:11:11:11:14 | name | +| ErbInjection.rb:5:12:5:17 | call to params | ErbInjection.rb:5:12:5:24 | ...[...] | +| ErbInjection.rb:5:12:5:24 | ...[...] | ErbInjection.rb:5:5:5:8 | name | +| ErbInjection.rb:8:5:8:12 | bad_text | ErbInjection.rb:15:24:15:31 | bad_text | +| ErbInjection.rb:8:16:11:14 | ... % ... | ErbInjection.rb:8:5:8:12 | bad_text | +| ErbInjection.rb:11:11:11:14 | name | ErbInjection.rb:8:16:11:14 | ... % ... | +| SlimInjection.rb:5:5:5:8 | name | SlimInjection.rb:8:5:8:12 | bad_text | +| SlimInjection.rb:5:5:5:8 | name | SlimInjection.rb:11:11:11:14 | name | +| SlimInjection.rb:5:5:5:8 | name | SlimInjection.rb:17:5:17:13 | bad2_text | +| SlimInjection.rb:5:12:5:17 | call to params | SlimInjection.rb:5:12:5:24 | ...[...] | +| SlimInjection.rb:5:12:5:24 | ...[...] | SlimInjection.rb:5:5:5:8 | name | +| SlimInjection.rb:8:5:8:12 | bad_text | SlimInjection.rb:14:25:14:32 | bad_text | +| SlimInjection.rb:8:16:11:14 | ... % ... | SlimInjection.rb:8:5:8:12 | bad_text | +| SlimInjection.rb:11:11:11:14 | name | SlimInjection.rb:8:16:11:14 | ... % ... | +| SlimInjection.rb:17:5:17:13 | bad2_text | SlimInjection.rb:23:25:23:33 | bad2_text | nodes -| ErbInjection.rb:5:5:5:8 | name : | semmle.label | name : | -| ErbInjection.rb:5:12:5:17 | call to params : | semmle.label | call to params : | -| ErbInjection.rb:5:12:5:24 | ...[...] : | semmle.label | ...[...] : | -| ErbInjection.rb:8:5:8:12 | bad_text : | semmle.label | bad_text : | -| ErbInjection.rb:8:16:11:14 | ... % ... : | semmle.label | ... % ... : | -| ErbInjection.rb:11:11:11:14 | name : | semmle.label | name : | +| ErbInjection.rb:5:5:5:8 | name | semmle.label | name | +| ErbInjection.rb:5:12:5:17 | call to params | semmle.label | call to params | +| ErbInjection.rb:5:12:5:24 | ...[...] | semmle.label | ...[...] | +| ErbInjection.rb:8:5:8:12 | bad_text | semmle.label | bad_text | +| ErbInjection.rb:8:16:11:14 | ... % ... | semmle.label | ... % ... | +| ErbInjection.rb:11:11:11:14 | name | semmle.label | name | | ErbInjection.rb:15:24:15:31 | bad_text | semmle.label | bad_text | -| SlimInjection.rb:5:5:5:8 | name : | semmle.label | name : | -| SlimInjection.rb:5:12:5:17 | call to params : | semmle.label | call to params : | -| SlimInjection.rb:5:12:5:24 | ...[...] : | semmle.label | ...[...] : | -| SlimInjection.rb:8:5:8:12 | bad_text : | semmle.label | bad_text : | -| SlimInjection.rb:8:16:11:14 | ... % ... : | semmle.label | ... % ... : | -| SlimInjection.rb:11:11:11:14 | name : | semmle.label | name : | +| SlimInjection.rb:5:5:5:8 | name | semmle.label | name | +| SlimInjection.rb:5:12:5:17 | call to params | semmle.label | call to params | +| SlimInjection.rb:5:12:5:24 | ...[...] | semmle.label | ...[...] | +| SlimInjection.rb:8:5:8:12 | bad_text | semmle.label | bad_text | +| SlimInjection.rb:8:16:11:14 | ... % ... | semmle.label | ... % ... | +| SlimInjection.rb:11:11:11:14 | name | semmle.label | name | | SlimInjection.rb:14:25:14:32 | bad_text | semmle.label | bad_text | -| SlimInjection.rb:17:5:17:13 | bad2_text : | semmle.label | bad2_text : | +| SlimInjection.rb:17:5:17:13 | bad2_text | semmle.label | bad2_text | | SlimInjection.rb:23:25:23:33 | bad2_text | semmle.label | bad2_text | subpaths #select -| ErbInjection.rb:15:24:15:31 | bad_text | ErbInjection.rb:5:12:5:17 | call to params : | ErbInjection.rb:15:24:15:31 | bad_text | This template depends on a $@. | ErbInjection.rb:5:12:5:17 | call to params | user-provided value | -| SlimInjection.rb:14:25:14:32 | bad_text | SlimInjection.rb:5:12:5:17 | call to params : | SlimInjection.rb:14:25:14:32 | bad_text | This template depends on a $@. | SlimInjection.rb:5:12:5:17 | call to params | user-provided value | -| SlimInjection.rb:23:25:23:33 | bad2_text | SlimInjection.rb:5:12:5:17 | call to params : | SlimInjection.rb:23:25:23:33 | bad2_text | This template depends on a $@. | SlimInjection.rb:5:12:5:17 | call to params | user-provided value | +| ErbInjection.rb:15:24:15:31 | bad_text | ErbInjection.rb:5:12:5:17 | call to params | ErbInjection.rb:15:24:15:31 | bad_text | This template depends on a $@. | ErbInjection.rb:5:12:5:17 | call to params | user-provided value | +| SlimInjection.rb:14:25:14:32 | bad_text | SlimInjection.rb:5:12:5:17 | call to params | SlimInjection.rb:14:25:14:32 | bad_text | This template depends on a $@. | SlimInjection.rb:5:12:5:17 | call to params | user-provided value | +| SlimInjection.rb:23:25:23:33 | bad2_text | SlimInjection.rb:5:12:5:17 | call to params | SlimInjection.rb:23:25:23:33 | bad2_text | This template depends on a $@. | SlimInjection.rb:5:12:5:17 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/experimental/cwe-022-ZipSlip/ZipSlip.expected b/ruby/ql/test/query-tests/experimental/cwe-022-ZipSlip/ZipSlip.expected index ca200083a96..5fe4f2ce69f 100644 --- a/ruby/ql/test/query-tests/experimental/cwe-022-ZipSlip/ZipSlip.expected +++ b/ruby/ql/test/query-tests/experimental/cwe-022-ZipSlip/ZipSlip.expected @@ -1,64 +1,64 @@ edges -| zip_slip.rb:8:5:8:11 | tarfile : | zip_slip.rb:9:5:9:11 | tarfile : | -| zip_slip.rb:8:15:8:54 | call to new : | zip_slip.rb:8:5:8:11 | tarfile : | -| zip_slip.rb:9:5:9:11 | tarfile : | zip_slip.rb:9:22:9:26 | entry : | -| zip_slip.rb:9:22:9:26 | entry : | zip_slip.rb:10:19:10:33 | call to full_name | -| zip_slip.rb:20:50:20:56 | tarfile : | zip_slip.rb:21:7:21:13 | tarfile : | -| zip_slip.rb:21:7:21:13 | tarfile : | zip_slip.rb:21:30:21:34 | entry : | -| zip_slip.rb:21:30:21:34 | entry : | zip_slip.rb:22:21:22:35 | call to full_name | -| zip_slip.rb:46:5:46:24 | call to open : | zip_slip.rb:46:35:46:39 | entry : | -| zip_slip.rb:46:35:46:39 | entry : | zip_slip.rb:47:17:47:26 | call to name | -| zip_slip.rb:56:30:56:37 | zip_file : | zip_slip.rb:57:7:57:14 | zip_file : | -| zip_slip.rb:57:7:57:14 | zip_file : | zip_slip.rb:57:25:57:29 | entry : | -| zip_slip.rb:57:25:57:29 | entry : | zip_slip.rb:58:19:58:28 | call to name | -| zip_slip.rb:90:5:90:8 | gzip : | zip_slip.rb:91:11:91:14 | gzip : | -| zip_slip.rb:90:12:90:54 | call to open : | zip_slip.rb:90:5:90:8 | gzip : | -| zip_slip.rb:91:11:91:14 | gzip : | zip_slip.rb:97:42:97:56 | compressed_file : | -| zip_slip.rb:97:42:97:56 | compressed_file : | zip_slip.rb:98:7:98:21 | compressed_file : | -| zip_slip.rb:98:7:98:21 | compressed_file : | zip_slip.rb:98:32:98:36 | entry : | -| zip_slip.rb:98:32:98:36 | entry : | zip_slip.rb:99:9:99:18 | entry_path : | -| zip_slip.rb:99:9:99:18 | entry_path : | zip_slip.rb:100:21:100:30 | entry_path | -| zip_slip.rb:123:7:123:8 | gz : | zip_slip.rb:124:7:124:8 | gz : | -| zip_slip.rb:123:12:123:34 | call to new : | zip_slip.rb:123:7:123:8 | gz : | -| zip_slip.rb:124:7:124:8 | gz : | zip_slip.rb:124:19:124:23 | entry : | -| zip_slip.rb:124:19:124:23 | entry : | zip_slip.rb:125:9:125:18 | entry_path : | -| zip_slip.rb:125:9:125:18 | entry_path : | zip_slip.rb:126:21:126:30 | entry_path | +| zip_slip.rb:8:5:8:11 | tarfile | zip_slip.rb:9:5:9:11 | tarfile | +| zip_slip.rb:8:15:8:54 | call to new | zip_slip.rb:8:5:8:11 | tarfile | +| zip_slip.rb:9:5:9:11 | tarfile | zip_slip.rb:9:22:9:26 | entry | +| zip_slip.rb:9:22:9:26 | entry | zip_slip.rb:10:19:10:33 | call to full_name | +| zip_slip.rb:20:50:20:56 | tarfile | zip_slip.rb:21:7:21:13 | tarfile | +| zip_slip.rb:21:7:21:13 | tarfile | zip_slip.rb:21:30:21:34 | entry | +| zip_slip.rb:21:30:21:34 | entry | zip_slip.rb:22:21:22:35 | call to full_name | +| zip_slip.rb:46:5:46:24 | call to open | zip_slip.rb:46:35:46:39 | entry | +| zip_slip.rb:46:35:46:39 | entry | zip_slip.rb:47:17:47:26 | call to name | +| zip_slip.rb:56:30:56:37 | zip_file | zip_slip.rb:57:7:57:14 | zip_file | +| zip_slip.rb:57:7:57:14 | zip_file | zip_slip.rb:57:25:57:29 | entry | +| zip_slip.rb:57:25:57:29 | entry | zip_slip.rb:58:19:58:28 | call to name | +| zip_slip.rb:90:5:90:8 | gzip | zip_slip.rb:91:11:91:14 | gzip | +| zip_slip.rb:90:12:90:54 | call to open | zip_slip.rb:90:5:90:8 | gzip | +| zip_slip.rb:91:11:91:14 | gzip | zip_slip.rb:97:42:97:56 | compressed_file | +| zip_slip.rb:97:42:97:56 | compressed_file | zip_slip.rb:98:7:98:21 | compressed_file | +| zip_slip.rb:98:7:98:21 | compressed_file | zip_slip.rb:98:32:98:36 | entry | +| zip_slip.rb:98:32:98:36 | entry | zip_slip.rb:99:9:99:18 | entry_path | +| zip_slip.rb:99:9:99:18 | entry_path | zip_slip.rb:100:21:100:30 | entry_path | +| zip_slip.rb:123:7:123:8 | gz | zip_slip.rb:124:7:124:8 | gz | +| zip_slip.rb:123:12:123:34 | call to new | zip_slip.rb:123:7:123:8 | gz | +| zip_slip.rb:124:7:124:8 | gz | zip_slip.rb:124:19:124:23 | entry | +| zip_slip.rb:124:19:124:23 | entry | zip_slip.rb:125:9:125:18 | entry_path | +| zip_slip.rb:125:9:125:18 | entry_path | zip_slip.rb:126:21:126:30 | entry_path | nodes -| zip_slip.rb:8:5:8:11 | tarfile : | semmle.label | tarfile : | -| zip_slip.rb:8:15:8:54 | call to new : | semmle.label | call to new : | -| zip_slip.rb:9:5:9:11 | tarfile : | semmle.label | tarfile : | -| zip_slip.rb:9:22:9:26 | entry : | semmle.label | entry : | +| zip_slip.rb:8:5:8:11 | tarfile | semmle.label | tarfile | +| zip_slip.rb:8:15:8:54 | call to new | semmle.label | call to new | +| zip_slip.rb:9:5:9:11 | tarfile | semmle.label | tarfile | +| zip_slip.rb:9:22:9:26 | entry | semmle.label | entry | | zip_slip.rb:10:19:10:33 | call to full_name | semmle.label | call to full_name | -| zip_slip.rb:20:50:20:56 | tarfile : | semmle.label | tarfile : | -| zip_slip.rb:21:7:21:13 | tarfile : | semmle.label | tarfile : | -| zip_slip.rb:21:30:21:34 | entry : | semmle.label | entry : | +| zip_slip.rb:20:50:20:56 | tarfile | semmle.label | tarfile | +| zip_slip.rb:21:7:21:13 | tarfile | semmle.label | tarfile | +| zip_slip.rb:21:30:21:34 | entry | semmle.label | entry | | zip_slip.rb:22:21:22:35 | call to full_name | semmle.label | call to full_name | -| zip_slip.rb:46:5:46:24 | call to open : | semmle.label | call to open : | -| zip_slip.rb:46:35:46:39 | entry : | semmle.label | entry : | +| zip_slip.rb:46:5:46:24 | call to open | semmle.label | call to open | +| zip_slip.rb:46:35:46:39 | entry | semmle.label | entry | | zip_slip.rb:47:17:47:26 | call to name | semmle.label | call to name | -| zip_slip.rb:56:30:56:37 | zip_file : | semmle.label | zip_file : | -| zip_slip.rb:57:7:57:14 | zip_file : | semmle.label | zip_file : | -| zip_slip.rb:57:25:57:29 | entry : | semmle.label | entry : | +| zip_slip.rb:56:30:56:37 | zip_file | semmle.label | zip_file | +| zip_slip.rb:57:7:57:14 | zip_file | semmle.label | zip_file | +| zip_slip.rb:57:25:57:29 | entry | semmle.label | entry | | zip_slip.rb:58:19:58:28 | call to name | semmle.label | call to name | -| zip_slip.rb:90:5:90:8 | gzip : | semmle.label | gzip : | -| zip_slip.rb:90:12:90:54 | call to open : | semmle.label | call to open : | -| zip_slip.rb:91:11:91:14 | gzip : | semmle.label | gzip : | -| zip_slip.rb:97:42:97:56 | compressed_file : | semmle.label | compressed_file : | -| zip_slip.rb:98:7:98:21 | compressed_file : | semmle.label | compressed_file : | -| zip_slip.rb:98:32:98:36 | entry : | semmle.label | entry : | -| zip_slip.rb:99:9:99:18 | entry_path : | semmle.label | entry_path : | +| zip_slip.rb:90:5:90:8 | gzip | semmle.label | gzip | +| zip_slip.rb:90:12:90:54 | call to open | semmle.label | call to open | +| zip_slip.rb:91:11:91:14 | gzip | semmle.label | gzip | +| zip_slip.rb:97:42:97:56 | compressed_file | semmle.label | compressed_file | +| zip_slip.rb:98:7:98:21 | compressed_file | semmle.label | compressed_file | +| zip_slip.rb:98:32:98:36 | entry | semmle.label | entry | +| zip_slip.rb:99:9:99:18 | entry_path | semmle.label | entry_path | | zip_slip.rb:100:21:100:30 | entry_path | semmle.label | entry_path | -| zip_slip.rb:123:7:123:8 | gz : | semmle.label | gz : | -| zip_slip.rb:123:12:123:34 | call to new : | semmle.label | call to new : | -| zip_slip.rb:124:7:124:8 | gz : | semmle.label | gz : | -| zip_slip.rb:124:19:124:23 | entry : | semmle.label | entry : | -| zip_slip.rb:125:9:125:18 | entry_path : | semmle.label | entry_path : | +| zip_slip.rb:123:7:123:8 | gz | semmle.label | gz | +| zip_slip.rb:123:12:123:34 | call to new | semmle.label | call to new | +| zip_slip.rb:124:7:124:8 | gz | semmle.label | gz | +| zip_slip.rb:124:19:124:23 | entry | semmle.label | entry | +| zip_slip.rb:125:9:125:18 | entry_path | semmle.label | entry_path | | zip_slip.rb:126:21:126:30 | entry_path | semmle.label | entry_path | subpaths #select -| zip_slip.rb:10:19:10:33 | call to full_name | zip_slip.rb:8:15:8:54 | call to new : | zip_slip.rb:10:19:10:33 | call to full_name | This file extraction depends on a $@. | zip_slip.rb:8:15:8:54 | call to new | potentially untrusted source | -| zip_slip.rb:22:21:22:35 | call to full_name | zip_slip.rb:20:50:20:56 | tarfile : | zip_slip.rb:22:21:22:35 | call to full_name | This file extraction depends on a $@. | zip_slip.rb:20:50:20:56 | tarfile | potentially untrusted source | -| zip_slip.rb:47:17:47:26 | call to name | zip_slip.rb:46:5:46:24 | call to open : | zip_slip.rb:47:17:47:26 | call to name | This file extraction depends on a $@. | zip_slip.rb:46:5:46:24 | call to open | potentially untrusted source | -| zip_slip.rb:58:19:58:28 | call to name | zip_slip.rb:56:30:56:37 | zip_file : | zip_slip.rb:58:19:58:28 | call to name | This file extraction depends on a $@. | zip_slip.rb:56:30:56:37 | zip_file | potentially untrusted source | -| zip_slip.rb:100:21:100:30 | entry_path | zip_slip.rb:90:12:90:54 | call to open : | zip_slip.rb:100:21:100:30 | entry_path | This file extraction depends on a $@. | zip_slip.rb:90:12:90:54 | call to open | potentially untrusted source | -| zip_slip.rb:126:21:126:30 | entry_path | zip_slip.rb:123:12:123:34 | call to new : | zip_slip.rb:126:21:126:30 | entry_path | This file extraction depends on a $@. | zip_slip.rb:123:12:123:34 | call to new | potentially untrusted source | +| zip_slip.rb:10:19:10:33 | call to full_name | zip_slip.rb:8:15:8:54 | call to new | zip_slip.rb:10:19:10:33 | call to full_name | This file extraction depends on a $@. | zip_slip.rb:8:15:8:54 | call to new | potentially untrusted source | +| zip_slip.rb:22:21:22:35 | call to full_name | zip_slip.rb:20:50:20:56 | tarfile | zip_slip.rb:22:21:22:35 | call to full_name | This file extraction depends on a $@. | zip_slip.rb:20:50:20:56 | tarfile | potentially untrusted source | +| zip_slip.rb:47:17:47:26 | call to name | zip_slip.rb:46:5:46:24 | call to open | zip_slip.rb:47:17:47:26 | call to name | This file extraction depends on a $@. | zip_slip.rb:46:5:46:24 | call to open | potentially untrusted source | +| zip_slip.rb:58:19:58:28 | call to name | zip_slip.rb:56:30:56:37 | zip_file | zip_slip.rb:58:19:58:28 | call to name | This file extraction depends on a $@. | zip_slip.rb:56:30:56:37 | zip_file | potentially untrusted source | +| zip_slip.rb:100:21:100:30 | entry_path | zip_slip.rb:90:12:90:54 | call to open | zip_slip.rb:100:21:100:30 | entry_path | This file extraction depends on a $@. | zip_slip.rb:90:12:90:54 | call to open | potentially untrusted source | +| zip_slip.rb:126:21:126:30 | entry_path | zip_slip.rb:123:12:123:34 | call to new | zip_slip.rb:126:21:126:30 | entry_path | This file extraction depends on a $@. | zip_slip.rb:123:12:123:34 | call to new | potentially untrusted source | diff --git a/ruby/ql/test/query-tests/experimental/manually-check-http-verb/ManuallyCheckHttpVerb.expected b/ruby/ql/test/query-tests/experimental/manually-check-http-verb/ManuallyCheckHttpVerb.expected index b43c529946f..1f066c979b4 100644 --- a/ruby/ql/test/query-tests/experimental/manually-check-http-verb/ManuallyCheckHttpVerb.expected +++ b/ruby/ql/test/query-tests/experimental/manually-check-http-verb/ManuallyCheckHttpVerb.expected @@ -1,42 +1,42 @@ edges -| ManuallyCheckHttpVerb.rb:11:5:11:10 | method : | ManuallyCheckHttpVerb.rb:12:8:12:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:11:14:11:24 | call to env : | ManuallyCheckHttpVerb.rb:11:14:11:42 | ...[...] : | -| ManuallyCheckHttpVerb.rb:11:14:11:42 | ...[...] : | ManuallyCheckHttpVerb.rb:11:5:11:10 | method : | -| ManuallyCheckHttpVerb.rb:19:5:19:10 | method : | ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:19:14:19:35 | call to request_method : | ManuallyCheckHttpVerb.rb:19:5:19:10 | method : | -| ManuallyCheckHttpVerb.rb:27:5:27:10 | method : | ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:27:14:27:27 | call to method : | ManuallyCheckHttpVerb.rb:27:5:27:10 | method : | -| ManuallyCheckHttpVerb.rb:35:5:35:10 | method : | ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:35:14:35:39 | call to raw_request_method : | ManuallyCheckHttpVerb.rb:35:5:35:10 | method : | -| ManuallyCheckHttpVerb.rb:51:7:51:12 | method : | ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | -| ManuallyCheckHttpVerb.rb:51:16:51:44 | call to request_method_symbol : | ManuallyCheckHttpVerb.rb:51:7:51:12 | method : | -| ManuallyCheckHttpVerb.rb:59:10:59:20 | call to env : | ManuallyCheckHttpVerb.rb:59:10:59:38 | ...[...] | +| ManuallyCheckHttpVerb.rb:11:5:11:10 | method | ManuallyCheckHttpVerb.rb:12:8:12:22 | ... == ... | +| ManuallyCheckHttpVerb.rb:11:14:11:24 | call to env | ManuallyCheckHttpVerb.rb:11:14:11:42 | ...[...] | +| ManuallyCheckHttpVerb.rb:11:14:11:42 | ...[...] | ManuallyCheckHttpVerb.rb:11:5:11:10 | method | +| ManuallyCheckHttpVerb.rb:19:5:19:10 | method | ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | +| ManuallyCheckHttpVerb.rb:19:14:19:35 | call to request_method | ManuallyCheckHttpVerb.rb:19:5:19:10 | method | +| ManuallyCheckHttpVerb.rb:27:5:27:10 | method | ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | +| ManuallyCheckHttpVerb.rb:27:14:27:27 | call to method | ManuallyCheckHttpVerb.rb:27:5:27:10 | method | +| ManuallyCheckHttpVerb.rb:35:5:35:10 | method | ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | +| ManuallyCheckHttpVerb.rb:35:14:35:39 | call to raw_request_method | ManuallyCheckHttpVerb.rb:35:5:35:10 | method | +| ManuallyCheckHttpVerb.rb:51:7:51:12 | method | ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | +| ManuallyCheckHttpVerb.rb:51:16:51:44 | call to request_method_symbol | ManuallyCheckHttpVerb.rb:51:7:51:12 | method | +| ManuallyCheckHttpVerb.rb:59:10:59:20 | call to env | ManuallyCheckHttpVerb.rb:59:10:59:38 | ...[...] | nodes | ManuallyCheckHttpVerb.rb:4:8:4:19 | call to get? | semmle.label | call to get? | -| ManuallyCheckHttpVerb.rb:11:5:11:10 | method : | semmle.label | method : | -| ManuallyCheckHttpVerb.rb:11:14:11:24 | call to env : | semmle.label | call to env : | -| ManuallyCheckHttpVerb.rb:11:14:11:42 | ...[...] : | semmle.label | ...[...] : | +| ManuallyCheckHttpVerb.rb:11:5:11:10 | method | semmle.label | method | +| ManuallyCheckHttpVerb.rb:11:14:11:24 | call to env | semmle.label | call to env | +| ManuallyCheckHttpVerb.rb:11:14:11:42 | ...[...] | semmle.label | ...[...] | | ManuallyCheckHttpVerb.rb:12:8:12:22 | ... == ... | semmle.label | ... == ... | -| ManuallyCheckHttpVerb.rb:19:5:19:10 | method : | semmle.label | method : | -| ManuallyCheckHttpVerb.rb:19:14:19:35 | call to request_method : | semmle.label | call to request_method : | +| ManuallyCheckHttpVerb.rb:19:5:19:10 | method | semmle.label | method | +| ManuallyCheckHttpVerb.rb:19:14:19:35 | call to request_method | semmle.label | call to request_method | | ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | semmle.label | ... == ... | -| ManuallyCheckHttpVerb.rb:27:5:27:10 | method : | semmle.label | method : | -| ManuallyCheckHttpVerb.rb:27:14:27:27 | call to method : | semmle.label | call to method : | +| ManuallyCheckHttpVerb.rb:27:5:27:10 | method | semmle.label | method | +| ManuallyCheckHttpVerb.rb:27:14:27:27 | call to method | semmle.label | call to method | | ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | semmle.label | ... == ... | -| ManuallyCheckHttpVerb.rb:35:5:35:10 | method : | semmle.label | method : | -| ManuallyCheckHttpVerb.rb:35:14:35:39 | call to raw_request_method : | semmle.label | call to raw_request_method : | +| ManuallyCheckHttpVerb.rb:35:5:35:10 | method | semmle.label | method | +| ManuallyCheckHttpVerb.rb:35:14:35:39 | call to raw_request_method | semmle.label | call to raw_request_method | | ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | semmle.label | ... == ... | -| ManuallyCheckHttpVerb.rb:51:7:51:12 | method : | semmle.label | method : | -| ManuallyCheckHttpVerb.rb:51:16:51:44 | call to request_method_symbol : | semmle.label | call to request_method_symbol : | +| ManuallyCheckHttpVerb.rb:51:7:51:12 | method | semmle.label | method | +| ManuallyCheckHttpVerb.rb:51:16:51:44 | call to request_method_symbol | semmle.label | call to request_method_symbol | | ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | semmle.label | ... == ... | -| ManuallyCheckHttpVerb.rb:59:10:59:20 | call to env : | semmle.label | call to env : | +| ManuallyCheckHttpVerb.rb:59:10:59:20 | call to env | semmle.label | call to env | | ManuallyCheckHttpVerb.rb:59:10:59:38 | ...[...] | semmle.label | ...[...] | subpaths #select | ManuallyCheckHttpVerb.rb:4:8:4:19 | call to get? | ManuallyCheckHttpVerb.rb:4:8:4:19 | call to get? | ManuallyCheckHttpVerb.rb:4:8:4:19 | call to get? | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | -| ManuallyCheckHttpVerb.rb:12:8:12:22 | ... == ... | ManuallyCheckHttpVerb.rb:11:14:11:24 | call to env : | ManuallyCheckHttpVerb.rb:12:8:12:22 | ... == ... | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | -| ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | ManuallyCheckHttpVerb.rb:19:14:19:35 | call to request_method : | ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | -| ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | ManuallyCheckHttpVerb.rb:27:14:27:27 | call to method : | ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | -| ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | ManuallyCheckHttpVerb.rb:35:14:35:39 | call to raw_request_method : | ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | -| ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | ManuallyCheckHttpVerb.rb:51:16:51:44 | call to request_method_symbol : | ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | -| ManuallyCheckHttpVerb.rb:59:10:59:38 | ...[...] | ManuallyCheckHttpVerb.rb:59:10:59:20 | call to env : | ManuallyCheckHttpVerb.rb:59:10:59:38 | ...[...] | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | +| ManuallyCheckHttpVerb.rb:12:8:12:22 | ... == ... | ManuallyCheckHttpVerb.rb:11:14:11:24 | call to env | ManuallyCheckHttpVerb.rb:12:8:12:22 | ... == ... | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | +| ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | ManuallyCheckHttpVerb.rb:19:14:19:35 | call to request_method | ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | +| ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | ManuallyCheckHttpVerb.rb:27:14:27:27 | call to method | ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | +| ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | ManuallyCheckHttpVerb.rb:35:14:35:39 | call to raw_request_method | ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | +| ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | ManuallyCheckHttpVerb.rb:51:16:51:44 | call to request_method_symbol | ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | +| ManuallyCheckHttpVerb.rb:59:10:59:38 | ...[...] | ManuallyCheckHttpVerb.rb:59:10:59:20 | call to env | ManuallyCheckHttpVerb.rb:59:10:59:38 | ...[...] | Manually checking HTTP verbs is an indication that multiple requests are routed to the same controller action. This could lead to bypassing necessary authorization methods and other protections, like CSRF protection. Prefer using different controller actions for each HTTP method and relying Rails routing to handle mapping resources and verbs to specific methods. | diff --git a/ruby/ql/test/query-tests/experimental/weak-params/WeakParams.expected b/ruby/ql/test/query-tests/experimental/weak-params/WeakParams.expected index 14bd3e4e13f..d84d761c17a 100644 --- a/ruby/ql/test/query-tests/experimental/weak-params/WeakParams.expected +++ b/ruby/ql/test/query-tests/experimental/weak-params/WeakParams.expected @@ -1,20 +1,20 @@ edges -| WeakParams.rb:5:28:5:53 | call to request_parameters : | WeakParams.rb:5:28:5:59 | ...[...] | -| WeakParams.rb:10:28:10:51 | call to query_parameters : | WeakParams.rb:10:28:10:57 | ...[...] | -| WeakParams.rb:15:28:15:39 | call to POST : | WeakParams.rb:15:28:15:45 | ...[...] | -| WeakParams.rb:20:28:20:38 | call to GET : | WeakParams.rb:20:28:20:44 | ...[...] | +| WeakParams.rb:5:28:5:53 | call to request_parameters | WeakParams.rb:5:28:5:59 | ...[...] | +| WeakParams.rb:10:28:10:51 | call to query_parameters | WeakParams.rb:10:28:10:57 | ...[...] | +| WeakParams.rb:15:28:15:39 | call to POST | WeakParams.rb:15:28:15:45 | ...[...] | +| WeakParams.rb:20:28:20:38 | call to GET | WeakParams.rb:20:28:20:44 | ...[...] | nodes -| WeakParams.rb:5:28:5:53 | call to request_parameters : | semmle.label | call to request_parameters : | +| WeakParams.rb:5:28:5:53 | call to request_parameters | semmle.label | call to request_parameters | | WeakParams.rb:5:28:5:59 | ...[...] | semmle.label | ...[...] | -| WeakParams.rb:10:28:10:51 | call to query_parameters : | semmle.label | call to query_parameters : | +| WeakParams.rb:10:28:10:51 | call to query_parameters | semmle.label | call to query_parameters | | WeakParams.rb:10:28:10:57 | ...[...] | semmle.label | ...[...] | -| WeakParams.rb:15:28:15:39 | call to POST : | semmle.label | call to POST : | +| WeakParams.rb:15:28:15:39 | call to POST | semmle.label | call to POST | | WeakParams.rb:15:28:15:45 | ...[...] | semmle.label | ...[...] | -| WeakParams.rb:20:28:20:38 | call to GET : | semmle.label | call to GET : | +| WeakParams.rb:20:28:20:38 | call to GET | semmle.label | call to GET | | WeakParams.rb:20:28:20:44 | ...[...] | semmle.label | ...[...] | subpaths #select -| WeakParams.rb:5:28:5:59 | ...[...] | WeakParams.rb:5:28:5:53 | call to request_parameters : | WeakParams.rb:5:28:5:59 | ...[...] | By exposing all keys in request parameters or by blindy accessing them, unintended parameters could be used and lead to mass-assignment or have other unexpected side-effects. It is safer to follow the 'strong parameters' pattern in Rails, which is outlined here: https://api.rubyonrails.org/classes/ActionController/StrongParameters.html | -| WeakParams.rb:10:28:10:57 | ...[...] | WeakParams.rb:10:28:10:51 | call to query_parameters : | WeakParams.rb:10:28:10:57 | ...[...] | By exposing all keys in request parameters or by blindy accessing them, unintended parameters could be used and lead to mass-assignment or have other unexpected side-effects. It is safer to follow the 'strong parameters' pattern in Rails, which is outlined here: https://api.rubyonrails.org/classes/ActionController/StrongParameters.html | -| WeakParams.rb:15:28:15:45 | ...[...] | WeakParams.rb:15:28:15:39 | call to POST : | WeakParams.rb:15:28:15:45 | ...[...] | By exposing all keys in request parameters or by blindy accessing them, unintended parameters could be used and lead to mass-assignment or have other unexpected side-effects. It is safer to follow the 'strong parameters' pattern in Rails, which is outlined here: https://api.rubyonrails.org/classes/ActionController/StrongParameters.html | -| WeakParams.rb:20:28:20:44 | ...[...] | WeakParams.rb:20:28:20:38 | call to GET : | WeakParams.rb:20:28:20:44 | ...[...] | By exposing all keys in request parameters or by blindy accessing them, unintended parameters could be used and lead to mass-assignment or have other unexpected side-effects. It is safer to follow the 'strong parameters' pattern in Rails, which is outlined here: https://api.rubyonrails.org/classes/ActionController/StrongParameters.html | +| WeakParams.rb:5:28:5:59 | ...[...] | WeakParams.rb:5:28:5:53 | call to request_parameters | WeakParams.rb:5:28:5:59 | ...[...] | By exposing all keys in request parameters or by blindy accessing them, unintended parameters could be used and lead to mass-assignment or have other unexpected side-effects. It is safer to follow the 'strong parameters' pattern in Rails, which is outlined here: https://api.rubyonrails.org/classes/ActionController/StrongParameters.html | +| WeakParams.rb:10:28:10:57 | ...[...] | WeakParams.rb:10:28:10:51 | call to query_parameters | WeakParams.rb:10:28:10:57 | ...[...] | By exposing all keys in request parameters or by blindy accessing them, unintended parameters could be used and lead to mass-assignment or have other unexpected side-effects. It is safer to follow the 'strong parameters' pattern in Rails, which is outlined here: https://api.rubyonrails.org/classes/ActionController/StrongParameters.html | +| WeakParams.rb:15:28:15:45 | ...[...] | WeakParams.rb:15:28:15:39 | call to POST | WeakParams.rb:15:28:15:45 | ...[...] | By exposing all keys in request parameters or by blindy accessing them, unintended parameters could be used and lead to mass-assignment or have other unexpected side-effects. It is safer to follow the 'strong parameters' pattern in Rails, which is outlined here: https://api.rubyonrails.org/classes/ActionController/StrongParameters.html | +| WeakParams.rb:20:28:20:44 | ...[...] | WeakParams.rb:20:28:20:38 | call to GET | WeakParams.rb:20:28:20:44 | ...[...] | By exposing all keys in request parameters or by blindy accessing them, unintended parameters could be used and lead to mass-assignment or have other unexpected side-effects. It is safer to follow the 'strong parameters' pattern in Rails, which is outlined here: https://api.rubyonrails.org/classes/ActionController/StrongParameters.html | diff --git a/ruby/ql/test/query-tests/security/cwe-020/MissingFullAnchor/MissingFullAnchor.expected b/ruby/ql/test/query-tests/security/cwe-020/MissingFullAnchor/MissingFullAnchor.expected index d5875faee59..f9b1241ea06 100644 --- a/ruby/ql/test/query-tests/security/cwe-020/MissingFullAnchor/MissingFullAnchor.expected +++ b/ruby/ql/test/query-tests/security/cwe-020/MissingFullAnchor/MissingFullAnchor.expected @@ -1,16 +1,16 @@ edges -| impl/miss-anchor.rb:2:12:2:15 | name : | impl/miss-anchor.rb:3:39:3:42 | name | -| impl/miss-anchor.rb:6:12:6:15 | name : | impl/miss-anchor.rb:7:43:7:46 | name | -| impl/miss-anchor.rb:14:12:14:15 | name : | impl/miss-anchor.rb:15:47:15:50 | name | +| impl/miss-anchor.rb:2:12:2:15 | name | impl/miss-anchor.rb:3:39:3:42 | name | +| impl/miss-anchor.rb:6:12:6:15 | name | impl/miss-anchor.rb:7:43:7:46 | name | +| impl/miss-anchor.rb:14:12:14:15 | name | impl/miss-anchor.rb:15:47:15:50 | name | nodes -| impl/miss-anchor.rb:2:12:2:15 | name : | semmle.label | name : | +| impl/miss-anchor.rb:2:12:2:15 | name | semmle.label | name | | impl/miss-anchor.rb:3:39:3:42 | name | semmle.label | name | -| impl/miss-anchor.rb:6:12:6:15 | name : | semmle.label | name : | +| impl/miss-anchor.rb:6:12:6:15 | name | semmle.label | name | | impl/miss-anchor.rb:7:43:7:46 | name | semmle.label | name | -| impl/miss-anchor.rb:14:12:14:15 | name : | semmle.label | name : | +| impl/miss-anchor.rb:14:12:14:15 | name | semmle.label | name | | impl/miss-anchor.rb:15:47:15:50 | name | semmle.label | name | subpaths #select -| impl/miss-anchor.rb:3:39:3:42 | name | impl/miss-anchor.rb:2:12:2:15 | name : | impl/miss-anchor.rb:3:39:3:42 | name | This value depends on $@, and is $@ against a $@. | impl/miss-anchor.rb:2:12:2:15 | name | library input | impl/miss-anchor.rb:3:39:3:89 | ... !~ ... | checked | impl/miss-anchor.rb:3:48:3:88 | ^[A-Za-z0-9\\+\\-_]+(\\/[A-Za-z0-9\\+\\-_]+)*$ | badly anchored regular expression | -| impl/miss-anchor.rb:7:43:7:46 | name | impl/miss-anchor.rb:6:12:6:15 | name : | impl/miss-anchor.rb:7:43:7:46 | name | This value depends on $@, and is $@ against a $@. | impl/miss-anchor.rb:6:12:6:15 | name | library input | impl/miss-anchor.rb:7:43:7:93 | ... !~ ... | checked | impl/miss-anchor.rb:7:52:7:92 | ^[A-Za-z0-9\\+\\-_]+(\\/[A-Za-z0-9\\+\\-_]+)*$ | badly anchored regular expression | -| impl/miss-anchor.rb:15:47:15:50 | name | impl/miss-anchor.rb:14:12:14:15 | name : | impl/miss-anchor.rb:15:47:15:50 | name | This value depends on $@, and is $@ against a $@. | impl/miss-anchor.rb:14:12:14:15 | name | library input | impl/miss-anchor.rb:15:47:15:97 | ... !~ ... | checked | impl/miss-anchor.rb:15:56:15:96 | ^[A-Za-z0-9\\+\\-_]+(\\/[A-Za-z0-9\\+\\-_]+)*$ | badly anchored regular expression | +| impl/miss-anchor.rb:3:39:3:42 | name | impl/miss-anchor.rb:2:12:2:15 | name | impl/miss-anchor.rb:3:39:3:42 | name | This value depends on $@, and is $@ against a $@. | impl/miss-anchor.rb:2:12:2:15 | name | library input | impl/miss-anchor.rb:3:39:3:89 | ... !~ ... | checked | impl/miss-anchor.rb:3:48:3:88 | ^[A-Za-z0-9\\+\\-_]+(\\/[A-Za-z0-9\\+\\-_]+)*$ | badly anchored regular expression | +| impl/miss-anchor.rb:7:43:7:46 | name | impl/miss-anchor.rb:6:12:6:15 | name | impl/miss-anchor.rb:7:43:7:46 | name | This value depends on $@, and is $@ against a $@. | impl/miss-anchor.rb:6:12:6:15 | name | library input | impl/miss-anchor.rb:7:43:7:93 | ... !~ ... | checked | impl/miss-anchor.rb:7:52:7:92 | ^[A-Za-z0-9\\+\\-_]+(\\/[A-Za-z0-9\\+\\-_]+)*$ | badly anchored regular expression | +| impl/miss-anchor.rb:15:47:15:50 | name | impl/miss-anchor.rb:14:12:14:15 | name | impl/miss-anchor.rb:15:47:15:50 | name | This value depends on $@, and is $@ against a $@. | impl/miss-anchor.rb:14:12:14:15 | name | library input | impl/miss-anchor.rb:15:47:15:97 | ... !~ ... | checked | impl/miss-anchor.rb:15:56:15:96 | ^[A-Za-z0-9\\+\\-_]+(\\/[A-Za-z0-9\\+\\-_]+)*$ | badly anchored regular expression | diff --git a/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected b/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected index 7d5598d1d49..7ee24c4112f 100644 --- a/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected @@ -1,168 +1,168 @@ edges -| ArchiveApiPathTraversal.rb:5:26:5:31 | call to params : | ArchiveApiPathTraversal.rb:5:26:5:42 | ...[...] : | -| ArchiveApiPathTraversal.rb:5:26:5:42 | ...[...] : | ArchiveApiPathTraversal.rb:49:17:49:27 | destination : | -| ArchiveApiPathTraversal.rb:10:11:10:16 | call to params : | ArchiveApiPathTraversal.rb:10:11:10:23 | ...[...] : | -| ArchiveApiPathTraversal.rb:10:11:10:23 | ...[...] : | ArchiveApiPathTraversal.rb:67:13:67:16 | file : | -| ArchiveApiPathTraversal.rb:15:9:15:14 | call to params : | ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] : | -| ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] : | ArchiveApiPathTraversal.rb:75:11:75:18 | filename : | -| ArchiveApiPathTraversal.rb:49:17:49:27 | destination : | ArchiveApiPathTraversal.rb:52:38:52:48 | destination : | -| ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file : | ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | -| ArchiveApiPathTraversal.rb:52:28:52:67 | call to join : | ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file : | -| ArchiveApiPathTraversal.rb:52:38:52:48 | destination : | ArchiveApiPathTraversal.rb:52:28:52:67 | call to join : | -| ArchiveApiPathTraversal.rb:67:13:67:16 | file : | ArchiveApiPathTraversal.rb:68:20:68:23 | file | -| ArchiveApiPathTraversal.rb:75:11:75:18 | filename : | ArchiveApiPathTraversal.rb:76:19:76:26 | filename | -| tainted_path.rb:4:5:4:8 | path : | tainted_path.rb:5:26:5:29 | path | -| tainted_path.rb:4:12:4:17 | call to params : | tainted_path.rb:4:12:4:24 | ...[...] : | -| tainted_path.rb:4:12:4:24 | ...[...] : | tainted_path.rb:4:5:4:8 | path : | -| tainted_path.rb:10:5:10:8 | path : | tainted_path.rb:11:26:11:29 | path | -| tainted_path.rb:10:12:10:43 | call to absolute_path : | tainted_path.rb:10:5:10:8 | path : | -| tainted_path.rb:10:31:10:36 | call to params : | tainted_path.rb:10:31:10:43 | ...[...] : | -| tainted_path.rb:10:31:10:43 | ...[...] : | tainted_path.rb:10:12:10:43 | call to absolute_path : | -| tainted_path.rb:16:5:16:8 | path : | tainted_path.rb:17:26:17:29 | path | -| tainted_path.rb:16:15:16:41 | call to dirname : | tainted_path.rb:16:5:16:8 | path : | -| tainted_path.rb:16:28:16:33 | call to params : | tainted_path.rb:16:28:16:40 | ...[...] : | -| tainted_path.rb:16:28:16:40 | ...[...] : | tainted_path.rb:16:15:16:41 | call to dirname : | -| tainted_path.rb:22:5:22:8 | path : | tainted_path.rb:23:26:23:29 | path | -| tainted_path.rb:22:12:22:41 | call to expand_path : | tainted_path.rb:22:5:22:8 | path : | -| tainted_path.rb:22:29:22:34 | call to params : | tainted_path.rb:22:29:22:41 | ...[...] : | -| tainted_path.rb:22:29:22:41 | ...[...] : | tainted_path.rb:22:12:22:41 | call to expand_path : | -| tainted_path.rb:28:5:28:8 | path : | tainted_path.rb:29:26:29:29 | path | -| tainted_path.rb:28:12:28:34 | call to path : | tainted_path.rb:28:5:28:8 | path : | -| tainted_path.rb:28:22:28:27 | call to params : | tainted_path.rb:28:22:28:34 | ...[...] : | -| tainted_path.rb:28:22:28:34 | ...[...] : | tainted_path.rb:28:12:28:34 | call to path : | -| tainted_path.rb:34:5:34:8 | path : | tainted_path.rb:35:26:35:29 | path | -| tainted_path.rb:34:12:34:41 | call to realdirpath : | tainted_path.rb:34:5:34:8 | path : | -| tainted_path.rb:34:29:34:34 | call to params : | tainted_path.rb:34:29:34:41 | ...[...] : | -| tainted_path.rb:34:29:34:41 | ...[...] : | tainted_path.rb:34:12:34:41 | call to realdirpath : | -| tainted_path.rb:40:5:40:8 | path : | tainted_path.rb:41:26:41:29 | path | -| tainted_path.rb:40:12:40:38 | call to realpath : | tainted_path.rb:40:5:40:8 | path : | -| tainted_path.rb:40:26:40:31 | call to params : | tainted_path.rb:40:26:40:38 | ...[...] : | -| tainted_path.rb:40:26:40:38 | ...[...] : | tainted_path.rb:40:12:40:38 | call to realpath : | -| tainted_path.rb:47:5:47:8 | path : | tainted_path.rb:48:26:48:29 | path | -| tainted_path.rb:47:12:47:63 | call to join : | tainted_path.rb:47:5:47:8 | path : | -| tainted_path.rb:47:43:47:48 | call to params : | tainted_path.rb:47:43:47:55 | ...[...] : | -| tainted_path.rb:47:43:47:55 | ...[...] : | tainted_path.rb:47:12:47:63 | call to join : | -| tainted_path.rb:59:5:59:8 | path : | tainted_path.rb:60:26:60:29 | path | -| tainted_path.rb:59:12:59:53 | call to new : | tainted_path.rb:59:5:59:8 | path : | -| tainted_path.rb:59:40:59:45 | call to params : | tainted_path.rb:59:40:59:52 | ...[...] : | -| tainted_path.rb:59:40:59:52 | ...[...] : | tainted_path.rb:59:12:59:53 | call to new : | -| tainted_path.rb:71:5:71:8 | path : | tainted_path.rb:72:15:72:18 | path | -| tainted_path.rb:71:12:71:53 | call to new : | tainted_path.rb:71:5:71:8 | path : | -| tainted_path.rb:71:40:71:45 | call to params : | tainted_path.rb:71:40:71:52 | ...[...] : | -| tainted_path.rb:71:40:71:52 | ...[...] : | tainted_path.rb:71:12:71:53 | call to new : | -| tainted_path.rb:77:5:77:8 | path : | tainted_path.rb:78:19:78:22 | path | -| tainted_path.rb:77:5:77:8 | path : | tainted_path.rb:79:14:79:17 | path | -| tainted_path.rb:77:12:77:53 | call to new : | tainted_path.rb:77:5:77:8 | path : | -| tainted_path.rb:77:40:77:45 | call to params : | tainted_path.rb:77:40:77:52 | ...[...] : | -| tainted_path.rb:77:40:77:52 | ...[...] : | tainted_path.rb:77:12:77:53 | call to new : | -| tainted_path.rb:84:5:84:8 | path : | tainted_path.rb:85:10:85:13 | path | -| tainted_path.rb:84:5:84:8 | path : | tainted_path.rb:86:25:86:28 | path | -| tainted_path.rb:84:12:84:53 | call to new : | tainted_path.rb:84:5:84:8 | path : | -| tainted_path.rb:84:40:84:45 | call to params : | tainted_path.rb:84:40:84:52 | ...[...] : | -| tainted_path.rb:84:40:84:52 | ...[...] : | tainted_path.rb:84:12:84:53 | call to new : | -| tainted_path.rb:90:5:90:8 | path : | tainted_path.rb:92:11:92:14 | path | -| tainted_path.rb:90:12:90:53 | call to new : | tainted_path.rb:90:5:90:8 | path : | -| tainted_path.rb:90:40:90:45 | call to params : | tainted_path.rb:90:40:90:52 | ...[...] : | -| tainted_path.rb:90:40:90:52 | ...[...] : | tainted_path.rb:90:12:90:53 | call to new : | +| ArchiveApiPathTraversal.rb:5:26:5:31 | call to params | ArchiveApiPathTraversal.rb:5:26:5:42 | ...[...] | +| ArchiveApiPathTraversal.rb:5:26:5:42 | ...[...] | ArchiveApiPathTraversal.rb:49:17:49:27 | destination | +| ArchiveApiPathTraversal.rb:10:11:10:16 | call to params | ArchiveApiPathTraversal.rb:10:11:10:23 | ...[...] | +| ArchiveApiPathTraversal.rb:10:11:10:23 | ...[...] | ArchiveApiPathTraversal.rb:67:13:67:16 | file | +| ArchiveApiPathTraversal.rb:15:9:15:14 | call to params | ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] | +| ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] | ArchiveApiPathTraversal.rb:75:11:75:18 | filename | +| ArchiveApiPathTraversal.rb:49:17:49:27 | destination | ArchiveApiPathTraversal.rb:52:38:52:48 | destination | +| ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file | ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | +| ArchiveApiPathTraversal.rb:52:28:52:67 | call to join | ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file | +| ArchiveApiPathTraversal.rb:52:38:52:48 | destination | ArchiveApiPathTraversal.rb:52:28:52:67 | call to join | +| ArchiveApiPathTraversal.rb:67:13:67:16 | file | ArchiveApiPathTraversal.rb:68:20:68:23 | file | +| ArchiveApiPathTraversal.rb:75:11:75:18 | filename | ArchiveApiPathTraversal.rb:76:19:76:26 | filename | +| tainted_path.rb:4:5:4:8 | path | tainted_path.rb:5:26:5:29 | path | +| tainted_path.rb:4:12:4:17 | call to params | tainted_path.rb:4:12:4:24 | ...[...] | +| tainted_path.rb:4:12:4:24 | ...[...] | tainted_path.rb:4:5:4:8 | path | +| tainted_path.rb:10:5:10:8 | path | tainted_path.rb:11:26:11:29 | path | +| tainted_path.rb:10:12:10:43 | call to absolute_path | tainted_path.rb:10:5:10:8 | path | +| tainted_path.rb:10:31:10:36 | call to params | tainted_path.rb:10:31:10:43 | ...[...] | +| tainted_path.rb:10:31:10:43 | ...[...] | tainted_path.rb:10:12:10:43 | call to absolute_path | +| tainted_path.rb:16:5:16:8 | path | tainted_path.rb:17:26:17:29 | path | +| tainted_path.rb:16:15:16:41 | call to dirname | tainted_path.rb:16:5:16:8 | path | +| tainted_path.rb:16:28:16:33 | call to params | tainted_path.rb:16:28:16:40 | ...[...] | +| tainted_path.rb:16:28:16:40 | ...[...] | tainted_path.rb:16:15:16:41 | call to dirname | +| tainted_path.rb:22:5:22:8 | path | tainted_path.rb:23:26:23:29 | path | +| tainted_path.rb:22:12:22:41 | call to expand_path | tainted_path.rb:22:5:22:8 | path | +| tainted_path.rb:22:29:22:34 | call to params | tainted_path.rb:22:29:22:41 | ...[...] | +| tainted_path.rb:22:29:22:41 | ...[...] | tainted_path.rb:22:12:22:41 | call to expand_path | +| tainted_path.rb:28:5:28:8 | path | tainted_path.rb:29:26:29:29 | path | +| tainted_path.rb:28:12:28:34 | call to path | tainted_path.rb:28:5:28:8 | path | +| tainted_path.rb:28:22:28:27 | call to params | tainted_path.rb:28:22:28:34 | ...[...] | +| tainted_path.rb:28:22:28:34 | ...[...] | tainted_path.rb:28:12:28:34 | call to path | +| tainted_path.rb:34:5:34:8 | path | tainted_path.rb:35:26:35:29 | path | +| tainted_path.rb:34:12:34:41 | call to realdirpath | tainted_path.rb:34:5:34:8 | path | +| tainted_path.rb:34:29:34:34 | call to params | tainted_path.rb:34:29:34:41 | ...[...] | +| tainted_path.rb:34:29:34:41 | ...[...] | tainted_path.rb:34:12:34:41 | call to realdirpath | +| tainted_path.rb:40:5:40:8 | path | tainted_path.rb:41:26:41:29 | path | +| tainted_path.rb:40:12:40:38 | call to realpath | tainted_path.rb:40:5:40:8 | path | +| tainted_path.rb:40:26:40:31 | call to params | tainted_path.rb:40:26:40:38 | ...[...] | +| tainted_path.rb:40:26:40:38 | ...[...] | tainted_path.rb:40:12:40:38 | call to realpath | +| tainted_path.rb:47:5:47:8 | path | tainted_path.rb:48:26:48:29 | path | +| tainted_path.rb:47:12:47:63 | call to join | tainted_path.rb:47:5:47:8 | path | +| tainted_path.rb:47:43:47:48 | call to params | tainted_path.rb:47:43:47:55 | ...[...] | +| tainted_path.rb:47:43:47:55 | ...[...] | tainted_path.rb:47:12:47:63 | call to join | +| tainted_path.rb:59:5:59:8 | path | tainted_path.rb:60:26:60:29 | path | +| tainted_path.rb:59:12:59:53 | call to new | tainted_path.rb:59:5:59:8 | path | +| tainted_path.rb:59:40:59:45 | call to params | tainted_path.rb:59:40:59:52 | ...[...] | +| tainted_path.rb:59:40:59:52 | ...[...] | tainted_path.rb:59:12:59:53 | call to new | +| tainted_path.rb:71:5:71:8 | path | tainted_path.rb:72:15:72:18 | path | +| tainted_path.rb:71:12:71:53 | call to new | tainted_path.rb:71:5:71:8 | path | +| tainted_path.rb:71:40:71:45 | call to params | tainted_path.rb:71:40:71:52 | ...[...] | +| tainted_path.rb:71:40:71:52 | ...[...] | tainted_path.rb:71:12:71:53 | call to new | +| tainted_path.rb:77:5:77:8 | path | tainted_path.rb:78:19:78:22 | path | +| tainted_path.rb:77:5:77:8 | path | tainted_path.rb:79:14:79:17 | path | +| tainted_path.rb:77:12:77:53 | call to new | tainted_path.rb:77:5:77:8 | path | +| tainted_path.rb:77:40:77:45 | call to params | tainted_path.rb:77:40:77:52 | ...[...] | +| tainted_path.rb:77:40:77:52 | ...[...] | tainted_path.rb:77:12:77:53 | call to new | +| tainted_path.rb:84:5:84:8 | path | tainted_path.rb:85:10:85:13 | path | +| tainted_path.rb:84:5:84:8 | path | tainted_path.rb:86:25:86:28 | path | +| tainted_path.rb:84:12:84:53 | call to new | tainted_path.rb:84:5:84:8 | path | +| tainted_path.rb:84:40:84:45 | call to params | tainted_path.rb:84:40:84:52 | ...[...] | +| tainted_path.rb:84:40:84:52 | ...[...] | tainted_path.rb:84:12:84:53 | call to new | +| tainted_path.rb:90:5:90:8 | path | tainted_path.rb:92:11:92:14 | path | +| tainted_path.rb:90:12:90:53 | call to new | tainted_path.rb:90:5:90:8 | path | +| tainted_path.rb:90:40:90:45 | call to params | tainted_path.rb:90:40:90:52 | ...[...] | +| tainted_path.rb:90:40:90:52 | ...[...] | tainted_path.rb:90:12:90:53 | call to new | nodes -| ArchiveApiPathTraversal.rb:5:26:5:31 | call to params : | semmle.label | call to params : | -| ArchiveApiPathTraversal.rb:5:26:5:42 | ...[...] : | semmle.label | ...[...] : | -| ArchiveApiPathTraversal.rb:10:11:10:16 | call to params : | semmle.label | call to params : | -| ArchiveApiPathTraversal.rb:10:11:10:23 | ...[...] : | semmle.label | ...[...] : | -| ArchiveApiPathTraversal.rb:15:9:15:14 | call to params : | semmle.label | call to params : | -| ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] : | semmle.label | ...[...] : | -| ArchiveApiPathTraversal.rb:49:17:49:27 | destination : | semmle.label | destination : | -| ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file : | semmle.label | destination_file : | -| ArchiveApiPathTraversal.rb:52:28:52:67 | call to join : | semmle.label | call to join : | -| ArchiveApiPathTraversal.rb:52:38:52:48 | destination : | semmle.label | destination : | +| ArchiveApiPathTraversal.rb:5:26:5:31 | call to params | semmle.label | call to params | +| ArchiveApiPathTraversal.rb:5:26:5:42 | ...[...] | semmle.label | ...[...] | +| ArchiveApiPathTraversal.rb:10:11:10:16 | call to params | semmle.label | call to params | +| ArchiveApiPathTraversal.rb:10:11:10:23 | ...[...] | semmle.label | ...[...] | +| ArchiveApiPathTraversal.rb:15:9:15:14 | call to params | semmle.label | call to params | +| ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] | semmle.label | ...[...] | +| ArchiveApiPathTraversal.rb:49:17:49:27 | destination | semmle.label | destination | +| ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file | semmle.label | destination_file | +| ArchiveApiPathTraversal.rb:52:28:52:67 | call to join | semmle.label | call to join | +| ArchiveApiPathTraversal.rb:52:38:52:48 | destination | semmle.label | destination | | ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | semmle.label | destination_file | -| ArchiveApiPathTraversal.rb:67:13:67:16 | file : | semmle.label | file : | +| ArchiveApiPathTraversal.rb:67:13:67:16 | file | semmle.label | file | | ArchiveApiPathTraversal.rb:68:20:68:23 | file | semmle.label | file | -| ArchiveApiPathTraversal.rb:75:11:75:18 | filename : | semmle.label | filename : | +| ArchiveApiPathTraversal.rb:75:11:75:18 | filename | semmle.label | filename | | ArchiveApiPathTraversal.rb:76:19:76:26 | filename | semmle.label | filename | -| tainted_path.rb:4:5:4:8 | path : | semmle.label | path : | -| tainted_path.rb:4:12:4:17 | call to params : | semmle.label | call to params : | -| tainted_path.rb:4:12:4:24 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:4:5:4:8 | path | semmle.label | path | +| tainted_path.rb:4:12:4:17 | call to params | semmle.label | call to params | +| tainted_path.rb:4:12:4:24 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:5:26:5:29 | path | semmle.label | path | -| tainted_path.rb:10:5:10:8 | path : | semmle.label | path : | -| tainted_path.rb:10:12:10:43 | call to absolute_path : | semmle.label | call to absolute_path : | -| tainted_path.rb:10:31:10:36 | call to params : | semmle.label | call to params : | -| tainted_path.rb:10:31:10:43 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:10:5:10:8 | path | semmle.label | path | +| tainted_path.rb:10:12:10:43 | call to absolute_path | semmle.label | call to absolute_path | +| tainted_path.rb:10:31:10:36 | call to params | semmle.label | call to params | +| tainted_path.rb:10:31:10:43 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:11:26:11:29 | path | semmle.label | path | -| tainted_path.rb:16:5:16:8 | path : | semmle.label | path : | -| tainted_path.rb:16:15:16:41 | call to dirname : | semmle.label | call to dirname : | -| tainted_path.rb:16:28:16:33 | call to params : | semmle.label | call to params : | -| tainted_path.rb:16:28:16:40 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:16:5:16:8 | path | semmle.label | path | +| tainted_path.rb:16:15:16:41 | call to dirname | semmle.label | call to dirname | +| tainted_path.rb:16:28:16:33 | call to params | semmle.label | call to params | +| tainted_path.rb:16:28:16:40 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:17:26:17:29 | path | semmle.label | path | -| tainted_path.rb:22:5:22:8 | path : | semmle.label | path : | -| tainted_path.rb:22:12:22:41 | call to expand_path : | semmle.label | call to expand_path : | -| tainted_path.rb:22:29:22:34 | call to params : | semmle.label | call to params : | -| tainted_path.rb:22:29:22:41 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:22:5:22:8 | path | semmle.label | path | +| tainted_path.rb:22:12:22:41 | call to expand_path | semmle.label | call to expand_path | +| tainted_path.rb:22:29:22:34 | call to params | semmle.label | call to params | +| tainted_path.rb:22:29:22:41 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:23:26:23:29 | path | semmle.label | path | -| tainted_path.rb:28:5:28:8 | path : | semmle.label | path : | -| tainted_path.rb:28:12:28:34 | call to path : | semmle.label | call to path : | -| tainted_path.rb:28:22:28:27 | call to params : | semmle.label | call to params : | -| tainted_path.rb:28:22:28:34 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:28:5:28:8 | path | semmle.label | path | +| tainted_path.rb:28:12:28:34 | call to path | semmle.label | call to path | +| tainted_path.rb:28:22:28:27 | call to params | semmle.label | call to params | +| tainted_path.rb:28:22:28:34 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:29:26:29:29 | path | semmle.label | path | -| tainted_path.rb:34:5:34:8 | path : | semmle.label | path : | -| tainted_path.rb:34:12:34:41 | call to realdirpath : | semmle.label | call to realdirpath : | -| tainted_path.rb:34:29:34:34 | call to params : | semmle.label | call to params : | -| tainted_path.rb:34:29:34:41 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:34:5:34:8 | path | semmle.label | path | +| tainted_path.rb:34:12:34:41 | call to realdirpath | semmle.label | call to realdirpath | +| tainted_path.rb:34:29:34:34 | call to params | semmle.label | call to params | +| tainted_path.rb:34:29:34:41 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:35:26:35:29 | path | semmle.label | path | -| tainted_path.rb:40:5:40:8 | path : | semmle.label | path : | -| tainted_path.rb:40:12:40:38 | call to realpath : | semmle.label | call to realpath : | -| tainted_path.rb:40:26:40:31 | call to params : | semmle.label | call to params : | -| tainted_path.rb:40:26:40:38 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:40:5:40:8 | path | semmle.label | path | +| tainted_path.rb:40:12:40:38 | call to realpath | semmle.label | call to realpath | +| tainted_path.rb:40:26:40:31 | call to params | semmle.label | call to params | +| tainted_path.rb:40:26:40:38 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:41:26:41:29 | path | semmle.label | path | -| tainted_path.rb:47:5:47:8 | path : | semmle.label | path : | -| tainted_path.rb:47:12:47:63 | call to join : | semmle.label | call to join : | -| tainted_path.rb:47:43:47:48 | call to params : | semmle.label | call to params : | -| tainted_path.rb:47:43:47:55 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:47:5:47:8 | path | semmle.label | path | +| tainted_path.rb:47:12:47:63 | call to join | semmle.label | call to join | +| tainted_path.rb:47:43:47:48 | call to params | semmle.label | call to params | +| tainted_path.rb:47:43:47:55 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:48:26:48:29 | path | semmle.label | path | -| tainted_path.rb:59:5:59:8 | path : | semmle.label | path : | -| tainted_path.rb:59:12:59:53 | call to new : | semmle.label | call to new : | -| tainted_path.rb:59:40:59:45 | call to params : | semmle.label | call to params : | -| tainted_path.rb:59:40:59:52 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:59:5:59:8 | path | semmle.label | path | +| tainted_path.rb:59:12:59:53 | call to new | semmle.label | call to new | +| tainted_path.rb:59:40:59:45 | call to params | semmle.label | call to params | +| tainted_path.rb:59:40:59:52 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:60:26:60:29 | path | semmle.label | path | -| tainted_path.rb:71:5:71:8 | path : | semmle.label | path : | -| tainted_path.rb:71:12:71:53 | call to new : | semmle.label | call to new : | -| tainted_path.rb:71:40:71:45 | call to params : | semmle.label | call to params : | -| tainted_path.rb:71:40:71:52 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:71:5:71:8 | path | semmle.label | path | +| tainted_path.rb:71:12:71:53 | call to new | semmle.label | call to new | +| tainted_path.rb:71:40:71:45 | call to params | semmle.label | call to params | +| tainted_path.rb:71:40:71:52 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:72:15:72:18 | path | semmle.label | path | -| tainted_path.rb:77:5:77:8 | path : | semmle.label | path : | -| tainted_path.rb:77:12:77:53 | call to new : | semmle.label | call to new : | -| tainted_path.rb:77:40:77:45 | call to params : | semmle.label | call to params : | -| tainted_path.rb:77:40:77:52 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:77:5:77:8 | path | semmle.label | path | +| tainted_path.rb:77:12:77:53 | call to new | semmle.label | call to new | +| tainted_path.rb:77:40:77:45 | call to params | semmle.label | call to params | +| tainted_path.rb:77:40:77:52 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:78:19:78:22 | path | semmle.label | path | | tainted_path.rb:79:14:79:17 | path | semmle.label | path | -| tainted_path.rb:84:5:84:8 | path : | semmle.label | path : | -| tainted_path.rb:84:12:84:53 | call to new : | semmle.label | call to new : | -| tainted_path.rb:84:40:84:45 | call to params : | semmle.label | call to params : | -| tainted_path.rb:84:40:84:52 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:84:5:84:8 | path | semmle.label | path | +| tainted_path.rb:84:12:84:53 | call to new | semmle.label | call to new | +| tainted_path.rb:84:40:84:45 | call to params | semmle.label | call to params | +| tainted_path.rb:84:40:84:52 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:85:10:85:13 | path | semmle.label | path | | tainted_path.rb:86:25:86:28 | path | semmle.label | path | -| tainted_path.rb:90:5:90:8 | path : | semmle.label | path : | -| tainted_path.rb:90:12:90:53 | call to new : | semmle.label | call to new : | -| tainted_path.rb:90:40:90:45 | call to params : | semmle.label | call to params : | -| tainted_path.rb:90:40:90:52 | ...[...] : | semmle.label | ...[...] : | +| tainted_path.rb:90:5:90:8 | path | semmle.label | path | +| tainted_path.rb:90:12:90:53 | call to new | semmle.label | call to new | +| tainted_path.rb:90:40:90:45 | call to params | semmle.label | call to params | +| tainted_path.rb:90:40:90:52 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:92:11:92:14 | path | semmle.label | path | subpaths #select -| ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | ArchiveApiPathTraversal.rb:5:26:5:31 | call to params : | ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | This path depends on a $@. | ArchiveApiPathTraversal.rb:5:26:5:31 | call to params | user-provided value | -| ArchiveApiPathTraversal.rb:68:20:68:23 | file | ArchiveApiPathTraversal.rb:10:11:10:16 | call to params : | ArchiveApiPathTraversal.rb:68:20:68:23 | file | This path depends on a $@. | ArchiveApiPathTraversal.rb:10:11:10:16 | call to params | user-provided value | -| ArchiveApiPathTraversal.rb:76:19:76:26 | filename | ArchiveApiPathTraversal.rb:15:9:15:14 | call to params : | ArchiveApiPathTraversal.rb:76:19:76:26 | filename | This path depends on a $@. | ArchiveApiPathTraversal.rb:15:9:15:14 | call to params | user-provided value | -| tainted_path.rb:5:26:5:29 | path | tainted_path.rb:4:12:4:17 | call to params : | tainted_path.rb:5:26:5:29 | path | This path depends on a $@. | tainted_path.rb:4:12:4:17 | call to params | user-provided value | -| tainted_path.rb:11:26:11:29 | path | tainted_path.rb:10:31:10:36 | call to params : | tainted_path.rb:11:26:11:29 | path | This path depends on a $@. | tainted_path.rb:10:31:10:36 | call to params | user-provided value | -| tainted_path.rb:17:26:17:29 | path | tainted_path.rb:16:28:16:33 | call to params : | tainted_path.rb:17:26:17:29 | path | This path depends on a $@. | tainted_path.rb:16:28:16:33 | call to params | user-provided value | -| tainted_path.rb:23:26:23:29 | path | tainted_path.rb:22:29:22:34 | call to params : | tainted_path.rb:23:26:23:29 | path | This path depends on a $@. | tainted_path.rb:22:29:22:34 | call to params | user-provided value | -| tainted_path.rb:29:26:29:29 | path | tainted_path.rb:28:22:28:27 | call to params : | tainted_path.rb:29:26:29:29 | path | This path depends on a $@. | tainted_path.rb:28:22:28:27 | call to params | user-provided value | -| tainted_path.rb:35:26:35:29 | path | tainted_path.rb:34:29:34:34 | call to params : | tainted_path.rb:35:26:35:29 | path | This path depends on a $@. | tainted_path.rb:34:29:34:34 | call to params | user-provided value | -| tainted_path.rb:41:26:41:29 | path | tainted_path.rb:40:26:40:31 | call to params : | tainted_path.rb:41:26:41:29 | path | This path depends on a $@. | tainted_path.rb:40:26:40:31 | call to params | user-provided value | -| tainted_path.rb:48:26:48:29 | path | tainted_path.rb:47:43:47:48 | call to params : | tainted_path.rb:48:26:48:29 | path | This path depends on a $@. | tainted_path.rb:47:43:47:48 | call to params | user-provided value | -| tainted_path.rb:60:26:60:29 | path | tainted_path.rb:59:40:59:45 | call to params : | tainted_path.rb:60:26:60:29 | path | This path depends on a $@. | tainted_path.rb:59:40:59:45 | call to params | user-provided value | -| tainted_path.rb:72:15:72:18 | path | tainted_path.rb:71:40:71:45 | call to params : | tainted_path.rb:72:15:72:18 | path | This path depends on a $@. | tainted_path.rb:71:40:71:45 | call to params | user-provided value | -| tainted_path.rb:78:19:78:22 | path | tainted_path.rb:77:40:77:45 | call to params : | tainted_path.rb:78:19:78:22 | path | This path depends on a $@. | tainted_path.rb:77:40:77:45 | call to params | user-provided value | -| tainted_path.rb:79:14:79:17 | path | tainted_path.rb:77:40:77:45 | call to params : | tainted_path.rb:79:14:79:17 | path | This path depends on a $@. | tainted_path.rb:77:40:77:45 | call to params | user-provided value | -| tainted_path.rb:85:10:85:13 | path | tainted_path.rb:84:40:84:45 | call to params : | tainted_path.rb:85:10:85:13 | path | This path depends on a $@. | tainted_path.rb:84:40:84:45 | call to params | user-provided value | -| tainted_path.rb:86:25:86:28 | path | tainted_path.rb:84:40:84:45 | call to params : | tainted_path.rb:86:25:86:28 | path | This path depends on a $@. | tainted_path.rb:84:40:84:45 | call to params | user-provided value | -| tainted_path.rb:92:11:92:14 | path | tainted_path.rb:90:40:90:45 | call to params : | tainted_path.rb:92:11:92:14 | path | This path depends on a $@. | tainted_path.rb:90:40:90:45 | call to params | user-provided value | +| ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | ArchiveApiPathTraversal.rb:5:26:5:31 | call to params | ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | This path depends on a $@. | ArchiveApiPathTraversal.rb:5:26:5:31 | call to params | user-provided value | +| ArchiveApiPathTraversal.rb:68:20:68:23 | file | ArchiveApiPathTraversal.rb:10:11:10:16 | call to params | ArchiveApiPathTraversal.rb:68:20:68:23 | file | This path depends on a $@. | ArchiveApiPathTraversal.rb:10:11:10:16 | call to params | user-provided value | +| ArchiveApiPathTraversal.rb:76:19:76:26 | filename | ArchiveApiPathTraversal.rb:15:9:15:14 | call to params | ArchiveApiPathTraversal.rb:76:19:76:26 | filename | This path depends on a $@. | ArchiveApiPathTraversal.rb:15:9:15:14 | call to params | user-provided value | +| tainted_path.rb:5:26:5:29 | path | tainted_path.rb:4:12:4:17 | call to params | tainted_path.rb:5:26:5:29 | path | This path depends on a $@. | tainted_path.rb:4:12:4:17 | call to params | user-provided value | +| tainted_path.rb:11:26:11:29 | path | tainted_path.rb:10:31:10:36 | call to params | tainted_path.rb:11:26:11:29 | path | This path depends on a $@. | tainted_path.rb:10:31:10:36 | call to params | user-provided value | +| tainted_path.rb:17:26:17:29 | path | tainted_path.rb:16:28:16:33 | call to params | tainted_path.rb:17:26:17:29 | path | This path depends on a $@. | tainted_path.rb:16:28:16:33 | call to params | user-provided value | +| tainted_path.rb:23:26:23:29 | path | tainted_path.rb:22:29:22:34 | call to params | tainted_path.rb:23:26:23:29 | path | This path depends on a $@. | tainted_path.rb:22:29:22:34 | call to params | user-provided value | +| tainted_path.rb:29:26:29:29 | path | tainted_path.rb:28:22:28:27 | call to params | tainted_path.rb:29:26:29:29 | path | This path depends on a $@. | tainted_path.rb:28:22:28:27 | call to params | user-provided value | +| tainted_path.rb:35:26:35:29 | path | tainted_path.rb:34:29:34:34 | call to params | tainted_path.rb:35:26:35:29 | path | This path depends on a $@. | tainted_path.rb:34:29:34:34 | call to params | user-provided value | +| tainted_path.rb:41:26:41:29 | path | tainted_path.rb:40:26:40:31 | call to params | tainted_path.rb:41:26:41:29 | path | This path depends on a $@. | tainted_path.rb:40:26:40:31 | call to params | user-provided value | +| tainted_path.rb:48:26:48:29 | path | tainted_path.rb:47:43:47:48 | call to params | tainted_path.rb:48:26:48:29 | path | This path depends on a $@. | tainted_path.rb:47:43:47:48 | call to params | user-provided value | +| tainted_path.rb:60:26:60:29 | path | tainted_path.rb:59:40:59:45 | call to params | tainted_path.rb:60:26:60:29 | path | This path depends on a $@. | tainted_path.rb:59:40:59:45 | call to params | user-provided value | +| tainted_path.rb:72:15:72:18 | path | tainted_path.rb:71:40:71:45 | call to params | tainted_path.rb:72:15:72:18 | path | This path depends on a $@. | tainted_path.rb:71:40:71:45 | call to params | user-provided value | +| tainted_path.rb:78:19:78:22 | path | tainted_path.rb:77:40:77:45 | call to params | tainted_path.rb:78:19:78:22 | path | This path depends on a $@. | tainted_path.rb:77:40:77:45 | call to params | user-provided value | +| tainted_path.rb:79:14:79:17 | path | tainted_path.rb:77:40:77:45 | call to params | tainted_path.rb:79:14:79:17 | path | This path depends on a $@. | tainted_path.rb:77:40:77:45 | call to params | user-provided value | +| tainted_path.rb:85:10:85:13 | path | tainted_path.rb:84:40:84:45 | call to params | tainted_path.rb:85:10:85:13 | path | This path depends on a $@. | tainted_path.rb:84:40:84:45 | call to params | user-provided value | +| tainted_path.rb:86:25:86:28 | path | tainted_path.rb:84:40:84:45 | call to params | tainted_path.rb:86:25:86:28 | path | This path depends on a $@. | tainted_path.rb:84:40:84:45 | call to params | user-provided value | +| tainted_path.rb:92:11:92:14 | path | tainted_path.rb:90:40:90:45 | call to params | tainted_path.rb:92:11:92:14 | path | This path depends on a $@. | tainted_path.rb:90:40:90:45 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-078/CommandInjection/CommandInjection.expected b/ruby/ql/test/query-tests/security/cwe-078/CommandInjection/CommandInjection.expected index de8b527312e..ba0fef88b62 100644 --- a/ruby/ql/test/query-tests/security/cwe-078/CommandInjection/CommandInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-078/CommandInjection/CommandInjection.expected @@ -1,32 +1,32 @@ edges -| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:7:10:7:15 | #{...} | -| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:8:16:8:18 | cmd | -| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:10:14:10:16 | cmd | -| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:11:17:11:22 | #{...} | -| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:13:9:13:14 | #{...} | -| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:29:19:29:24 | #{...} | -| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:33:24:33:36 | "echo #{...}" | -| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:34:39:34:51 | "grep #{...}" | -| CommandInjection.rb:6:15:6:20 | call to params : | CommandInjection.rb:6:15:6:26 | ...[...] : | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:6:9:6:11 | cmd : | -| CommandInjection.rb:46:9:46:11 | cmd : | CommandInjection.rb:50:24:50:36 | "echo #{...}" | -| CommandInjection.rb:46:15:46:20 | call to params : | CommandInjection.rb:46:15:46:26 | ...[...] : | -| CommandInjection.rb:46:15:46:26 | ...[...] : | CommandInjection.rb:46:9:46:11 | cmd : | -| CommandInjection.rb:54:7:54:9 | cmd : | CommandInjection.rb:59:14:59:16 | cmd | -| CommandInjection.rb:54:13:54:18 | call to params : | CommandInjection.rb:54:13:54:24 | ...[...] : | -| CommandInjection.rb:54:13:54:24 | ...[...] : | CommandInjection.rb:54:7:54:9 | cmd : | -| CommandInjection.rb:73:18:73:23 | number : | CommandInjection.rb:74:14:74:29 | "echo #{...}" | -| CommandInjection.rb:81:23:81:33 | blah_number : | CommandInjection.rb:82:14:82:34 | "echo #{...}" | -| CommandInjection.rb:90:20:90:25 | **args : | CommandInjection.rb:91:22:91:25 | args : | -| CommandInjection.rb:91:22:91:25 | args : | CommandInjection.rb:91:22:91:37 | ...[...] : | -| CommandInjection.rb:91:22:91:37 | ...[...] : | CommandInjection.rb:91:14:91:39 | "echo #{...}" | -| CommandInjection.rb:103:9:103:12 | file : | CommandInjection.rb:104:16:104:28 | "cat #{...}" | -| CommandInjection.rb:103:16:103:21 | call to params : | CommandInjection.rb:103:16:103:28 | ...[...] : | -| CommandInjection.rb:103:16:103:28 | ...[...] : | CommandInjection.rb:103:9:103:12 | file : | +| CommandInjection.rb:6:9:6:11 | cmd | CommandInjection.rb:7:10:7:15 | #{...} | +| CommandInjection.rb:6:9:6:11 | cmd | CommandInjection.rb:8:16:8:18 | cmd | +| CommandInjection.rb:6:9:6:11 | cmd | CommandInjection.rb:10:14:10:16 | cmd | +| CommandInjection.rb:6:9:6:11 | cmd | CommandInjection.rb:11:17:11:22 | #{...} | +| CommandInjection.rb:6:9:6:11 | cmd | CommandInjection.rb:13:9:13:14 | #{...} | +| CommandInjection.rb:6:9:6:11 | cmd | CommandInjection.rb:29:19:29:24 | #{...} | +| CommandInjection.rb:6:9:6:11 | cmd | CommandInjection.rb:33:24:33:36 | "echo #{...}" | +| CommandInjection.rb:6:9:6:11 | cmd | CommandInjection.rb:34:39:34:51 | "grep #{...}" | +| CommandInjection.rb:6:15:6:20 | call to params | CommandInjection.rb:6:15:6:26 | ...[...] | +| CommandInjection.rb:6:15:6:26 | ...[...] | CommandInjection.rb:6:9:6:11 | cmd | +| CommandInjection.rb:46:9:46:11 | cmd | CommandInjection.rb:50:24:50:36 | "echo #{...}" | +| CommandInjection.rb:46:15:46:20 | call to params | CommandInjection.rb:46:15:46:26 | ...[...] | +| CommandInjection.rb:46:15:46:26 | ...[...] | CommandInjection.rb:46:9:46:11 | cmd | +| CommandInjection.rb:54:7:54:9 | cmd | CommandInjection.rb:59:14:59:16 | cmd | +| CommandInjection.rb:54:13:54:18 | call to params | CommandInjection.rb:54:13:54:24 | ...[...] | +| CommandInjection.rb:54:13:54:24 | ...[...] | CommandInjection.rb:54:7:54:9 | cmd | +| CommandInjection.rb:73:18:73:23 | number | CommandInjection.rb:74:14:74:29 | "echo #{...}" | +| CommandInjection.rb:81:23:81:33 | blah_number | CommandInjection.rb:82:14:82:34 | "echo #{...}" | +| CommandInjection.rb:90:20:90:25 | **args | CommandInjection.rb:91:22:91:25 | args | +| CommandInjection.rb:91:22:91:25 | args | CommandInjection.rb:91:22:91:37 | ...[...] | +| CommandInjection.rb:91:22:91:37 | ...[...] | CommandInjection.rb:91:14:91:39 | "echo #{...}" | +| CommandInjection.rb:103:9:103:12 | file | CommandInjection.rb:104:16:104:28 | "cat #{...}" | +| CommandInjection.rb:103:16:103:21 | call to params | CommandInjection.rb:103:16:103:28 | ...[...] | +| CommandInjection.rb:103:16:103:28 | ...[...] | CommandInjection.rb:103:9:103:12 | file | nodes -| CommandInjection.rb:6:9:6:11 | cmd : | semmle.label | cmd : | -| CommandInjection.rb:6:15:6:20 | call to params : | semmle.label | call to params : | -| CommandInjection.rb:6:15:6:26 | ...[...] : | semmle.label | ...[...] : | +| CommandInjection.rb:6:9:6:11 | cmd | semmle.label | cmd | +| CommandInjection.rb:6:15:6:20 | call to params | semmle.label | call to params | +| CommandInjection.rb:6:15:6:26 | ...[...] | semmle.label | ...[...] | | CommandInjection.rb:7:10:7:15 | #{...} | semmle.label | #{...} | | CommandInjection.rb:8:16:8:18 | cmd | semmle.label | cmd | | CommandInjection.rb:10:14:10:16 | cmd | semmle.label | cmd | @@ -35,39 +35,39 @@ nodes | CommandInjection.rb:29:19:29:24 | #{...} | semmle.label | #{...} | | CommandInjection.rb:33:24:33:36 | "echo #{...}" | semmle.label | "echo #{...}" | | CommandInjection.rb:34:39:34:51 | "grep #{...}" | semmle.label | "grep #{...}" | -| CommandInjection.rb:46:9:46:11 | cmd : | semmle.label | cmd : | -| CommandInjection.rb:46:15:46:20 | call to params : | semmle.label | call to params : | -| CommandInjection.rb:46:15:46:26 | ...[...] : | semmle.label | ...[...] : | +| CommandInjection.rb:46:9:46:11 | cmd | semmle.label | cmd | +| CommandInjection.rb:46:15:46:20 | call to params | semmle.label | call to params | +| CommandInjection.rb:46:15:46:26 | ...[...] | semmle.label | ...[...] | | CommandInjection.rb:50:24:50:36 | "echo #{...}" | semmle.label | "echo #{...}" | -| CommandInjection.rb:54:7:54:9 | cmd : | semmle.label | cmd : | -| CommandInjection.rb:54:13:54:18 | call to params : | semmle.label | call to params : | -| CommandInjection.rb:54:13:54:24 | ...[...] : | semmle.label | ...[...] : | +| CommandInjection.rb:54:7:54:9 | cmd | semmle.label | cmd | +| CommandInjection.rb:54:13:54:18 | call to params | semmle.label | call to params | +| CommandInjection.rb:54:13:54:24 | ...[...] | semmle.label | ...[...] | | CommandInjection.rb:59:14:59:16 | cmd | semmle.label | cmd | -| CommandInjection.rb:73:18:73:23 | number : | semmle.label | number : | +| CommandInjection.rb:73:18:73:23 | number | semmle.label | number | | CommandInjection.rb:74:14:74:29 | "echo #{...}" | semmle.label | "echo #{...}" | -| CommandInjection.rb:81:23:81:33 | blah_number : | semmle.label | blah_number : | +| CommandInjection.rb:81:23:81:33 | blah_number | semmle.label | blah_number | | CommandInjection.rb:82:14:82:34 | "echo #{...}" | semmle.label | "echo #{...}" | -| CommandInjection.rb:90:20:90:25 | **args : | semmle.label | **args : | +| CommandInjection.rb:90:20:90:25 | **args | semmle.label | **args | | CommandInjection.rb:91:14:91:39 | "echo #{...}" | semmle.label | "echo #{...}" | -| CommandInjection.rb:91:22:91:25 | args : | semmle.label | args : | -| CommandInjection.rb:91:22:91:37 | ...[...] : | semmle.label | ...[...] : | -| CommandInjection.rb:103:9:103:12 | file : | semmle.label | file : | -| CommandInjection.rb:103:16:103:21 | call to params : | semmle.label | call to params : | -| CommandInjection.rb:103:16:103:28 | ...[...] : | semmle.label | ...[...] : | +| CommandInjection.rb:91:22:91:25 | args | semmle.label | args | +| CommandInjection.rb:91:22:91:37 | ...[...] | semmle.label | ...[...] | +| CommandInjection.rb:103:9:103:12 | file | semmle.label | file | +| CommandInjection.rb:103:16:103:21 | call to params | semmle.label | call to params | +| CommandInjection.rb:103:16:103:28 | ...[...] | semmle.label | ...[...] | | CommandInjection.rb:104:16:104:28 | "cat #{...}" | semmle.label | "cat #{...}" | subpaths #select -| CommandInjection.rb:7:10:7:15 | #{...} | CommandInjection.rb:6:15:6:20 | call to params : | CommandInjection.rb:7:10:7:15 | #{...} | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | -| CommandInjection.rb:8:16:8:18 | cmd | CommandInjection.rb:6:15:6:20 | call to params : | CommandInjection.rb:8:16:8:18 | cmd | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | -| CommandInjection.rb:10:14:10:16 | cmd | CommandInjection.rb:6:15:6:20 | call to params : | CommandInjection.rb:10:14:10:16 | cmd | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | -| CommandInjection.rb:11:17:11:22 | #{...} | CommandInjection.rb:6:15:6:20 | call to params : | CommandInjection.rb:11:17:11:22 | #{...} | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | -| CommandInjection.rb:13:9:13:14 | #{...} | CommandInjection.rb:6:15:6:20 | call to params : | CommandInjection.rb:13:9:13:14 | #{...} | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | -| CommandInjection.rb:29:19:29:24 | #{...} | CommandInjection.rb:6:15:6:20 | call to params : | CommandInjection.rb:29:19:29:24 | #{...} | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | -| CommandInjection.rb:33:24:33:36 | "echo #{...}" | CommandInjection.rb:6:15:6:20 | call to params : | CommandInjection.rb:33:24:33:36 | "echo #{...}" | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | -| CommandInjection.rb:34:39:34:51 | "grep #{...}" | CommandInjection.rb:6:15:6:20 | call to params : | CommandInjection.rb:34:39:34:51 | "grep #{...}" | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | -| CommandInjection.rb:50:24:50:36 | "echo #{...}" | CommandInjection.rb:46:15:46:20 | call to params : | CommandInjection.rb:50:24:50:36 | "echo #{...}" | This command depends on a $@. | CommandInjection.rb:46:15:46:20 | call to params | user-provided value | -| CommandInjection.rb:59:14:59:16 | cmd | CommandInjection.rb:54:13:54:18 | call to params : | CommandInjection.rb:59:14:59:16 | cmd | This command depends on a $@. | CommandInjection.rb:54:13:54:18 | call to params | user-provided value | -| CommandInjection.rb:74:14:74:29 | "echo #{...}" | CommandInjection.rb:73:18:73:23 | number : | CommandInjection.rb:74:14:74:29 | "echo #{...}" | This command depends on a $@. | CommandInjection.rb:73:18:73:23 | number | user-provided value | -| CommandInjection.rb:82:14:82:34 | "echo #{...}" | CommandInjection.rb:81:23:81:33 | blah_number : | CommandInjection.rb:82:14:82:34 | "echo #{...}" | This command depends on a $@. | CommandInjection.rb:81:23:81:33 | blah_number | user-provided value | -| CommandInjection.rb:91:14:91:39 | "echo #{...}" | CommandInjection.rb:90:20:90:25 | **args : | CommandInjection.rb:91:14:91:39 | "echo #{...}" | This command depends on a $@. | CommandInjection.rb:90:20:90:25 | **args | user-provided value | -| CommandInjection.rb:104:16:104:28 | "cat #{...}" | CommandInjection.rb:103:16:103:21 | call to params : | CommandInjection.rb:104:16:104:28 | "cat #{...}" | This command depends on a $@. | CommandInjection.rb:103:16:103:21 | call to params | user-provided value | +| CommandInjection.rb:7:10:7:15 | #{...} | CommandInjection.rb:6:15:6:20 | call to params | CommandInjection.rb:7:10:7:15 | #{...} | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | +| CommandInjection.rb:8:16:8:18 | cmd | CommandInjection.rb:6:15:6:20 | call to params | CommandInjection.rb:8:16:8:18 | cmd | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | +| CommandInjection.rb:10:14:10:16 | cmd | CommandInjection.rb:6:15:6:20 | call to params | CommandInjection.rb:10:14:10:16 | cmd | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | +| CommandInjection.rb:11:17:11:22 | #{...} | CommandInjection.rb:6:15:6:20 | call to params | CommandInjection.rb:11:17:11:22 | #{...} | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | +| CommandInjection.rb:13:9:13:14 | #{...} | CommandInjection.rb:6:15:6:20 | call to params | CommandInjection.rb:13:9:13:14 | #{...} | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | +| CommandInjection.rb:29:19:29:24 | #{...} | CommandInjection.rb:6:15:6:20 | call to params | CommandInjection.rb:29:19:29:24 | #{...} | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | +| CommandInjection.rb:33:24:33:36 | "echo #{...}" | CommandInjection.rb:6:15:6:20 | call to params | CommandInjection.rb:33:24:33:36 | "echo #{...}" | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | +| CommandInjection.rb:34:39:34:51 | "grep #{...}" | CommandInjection.rb:6:15:6:20 | call to params | CommandInjection.rb:34:39:34:51 | "grep #{...}" | This command depends on a $@. | CommandInjection.rb:6:15:6:20 | call to params | user-provided value | +| CommandInjection.rb:50:24:50:36 | "echo #{...}" | CommandInjection.rb:46:15:46:20 | call to params | CommandInjection.rb:50:24:50:36 | "echo #{...}" | This command depends on a $@. | CommandInjection.rb:46:15:46:20 | call to params | user-provided value | +| CommandInjection.rb:59:14:59:16 | cmd | CommandInjection.rb:54:13:54:18 | call to params | CommandInjection.rb:59:14:59:16 | cmd | This command depends on a $@. | CommandInjection.rb:54:13:54:18 | call to params | user-provided value | +| CommandInjection.rb:74:14:74:29 | "echo #{...}" | CommandInjection.rb:73:18:73:23 | number | CommandInjection.rb:74:14:74:29 | "echo #{...}" | This command depends on a $@. | CommandInjection.rb:73:18:73:23 | number | user-provided value | +| CommandInjection.rb:82:14:82:34 | "echo #{...}" | CommandInjection.rb:81:23:81:33 | blah_number | CommandInjection.rb:82:14:82:34 | "echo #{...}" | This command depends on a $@. | CommandInjection.rb:81:23:81:33 | blah_number | user-provided value | +| CommandInjection.rb:91:14:91:39 | "echo #{...}" | CommandInjection.rb:90:20:90:25 | **args | CommandInjection.rb:91:14:91:39 | "echo #{...}" | This command depends on a $@. | CommandInjection.rb:90:20:90:25 | **args | user-provided value | +| CommandInjection.rb:104:16:104:28 | "cat #{...}" | CommandInjection.rb:103:16:103:21 | call to params | CommandInjection.rb:104:16:104:28 | "cat #{...}" | This command depends on a $@. | CommandInjection.rb:103:16:103:21 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-078/KernelOpen/KernelOpen.expected b/ruby/ql/test/query-tests/security/cwe-078/KernelOpen/KernelOpen.expected index b64fd8c416f..506ea30d53c 100644 --- a/ruby/ql/test/query-tests/security/cwe-078/KernelOpen/KernelOpen.expected +++ b/ruby/ql/test/query-tests/security/cwe-078/KernelOpen/KernelOpen.expected @@ -1,21 +1,21 @@ edges -| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:4:10:4:13 | file | -| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:5:13:5:16 | file | -| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:6:14:6:17 | file | -| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:7:16:7:19 | file | -| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:8:17:8:20 | file | -| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:9:16:9:19 | file | -| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:10:18:10:21 | file | -| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:11:14:11:17 | file | -| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:13:23:13:26 | file : | -| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:26:10:26:13 | file | -| KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:3:12:3:24 | ...[...] : | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:3:5:3:8 | file : | -| KernelOpen.rb:13:23:13:26 | file : | KernelOpen.rb:13:13:13:31 | call to join | +| KernelOpen.rb:3:5:3:8 | file | KernelOpen.rb:4:10:4:13 | file | +| KernelOpen.rb:3:5:3:8 | file | KernelOpen.rb:5:13:5:16 | file | +| KernelOpen.rb:3:5:3:8 | file | KernelOpen.rb:6:14:6:17 | file | +| KernelOpen.rb:3:5:3:8 | file | KernelOpen.rb:7:16:7:19 | file | +| KernelOpen.rb:3:5:3:8 | file | KernelOpen.rb:8:17:8:20 | file | +| KernelOpen.rb:3:5:3:8 | file | KernelOpen.rb:9:16:9:19 | file | +| KernelOpen.rb:3:5:3:8 | file | KernelOpen.rb:10:18:10:21 | file | +| KernelOpen.rb:3:5:3:8 | file | KernelOpen.rb:11:14:11:17 | file | +| KernelOpen.rb:3:5:3:8 | file | KernelOpen.rb:13:23:13:26 | file | +| KernelOpen.rb:3:5:3:8 | file | KernelOpen.rb:26:10:26:13 | file | +| KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:3:12:3:24 | ...[...] | +| KernelOpen.rb:3:12:3:24 | ...[...] | KernelOpen.rb:3:5:3:8 | file | +| KernelOpen.rb:13:23:13:26 | file | KernelOpen.rb:13:13:13:31 | call to join | nodes -| KernelOpen.rb:3:5:3:8 | file : | semmle.label | file : | -| KernelOpen.rb:3:12:3:17 | call to params : | semmle.label | call to params : | -| KernelOpen.rb:3:12:3:24 | ...[...] : | semmle.label | ...[...] : | +| KernelOpen.rb:3:5:3:8 | file | semmle.label | file | +| KernelOpen.rb:3:12:3:17 | call to params | semmle.label | call to params | +| KernelOpen.rb:3:12:3:24 | ...[...] | semmle.label | ...[...] | | KernelOpen.rb:4:10:4:13 | file | semmle.label | file | | KernelOpen.rb:5:13:5:16 | file | semmle.label | file | | KernelOpen.rb:6:14:6:17 | file | semmle.label | file | @@ -25,17 +25,17 @@ nodes | KernelOpen.rb:10:18:10:21 | file | semmle.label | file | | KernelOpen.rb:11:14:11:17 | file | semmle.label | file | | KernelOpen.rb:13:13:13:31 | call to join | semmle.label | call to join | -| KernelOpen.rb:13:23:13:26 | file : | semmle.label | file : | +| KernelOpen.rb:13:23:13:26 | file | semmle.label | file | | KernelOpen.rb:26:10:26:13 | file | semmle.label | file | subpaths #select -| KernelOpen.rb:4:10:4:13 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:4:10:4:13 | file | This call to Kernel.open depends on a $@. Consider replacing it with File.open. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | -| KernelOpen.rb:5:13:5:16 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:5:13:5:16 | file | This call to IO.read depends on a $@. Consider replacing it with File.read. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | -| KernelOpen.rb:6:14:6:17 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:6:14:6:17 | file | This call to IO.write depends on a $@. Consider replacing it with File.write. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | -| KernelOpen.rb:7:16:7:19 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:7:16:7:19 | file | This call to IO.binread depends on a $@. Consider replacing it with File.binread. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | -| KernelOpen.rb:8:17:8:20 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:8:17:8:20 | file | This call to IO.binwrite depends on a $@. Consider replacing it with File.binwrite. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | -| KernelOpen.rb:9:16:9:19 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:9:16:9:19 | file | This call to IO.foreach depends on a $@. Consider replacing it with File.foreach. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | -| KernelOpen.rb:10:18:10:21 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:10:18:10:21 | file | This call to IO.readlines depends on a $@. Consider replacing it with File.readlines. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | -| KernelOpen.rb:11:14:11:17 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:11:14:11:17 | file | This call to URI.open depends on a $@. Consider replacing it with URI().open. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | -| KernelOpen.rb:13:13:13:31 | call to join | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:13:13:13:31 | call to join | This call to IO.read depends on a $@. Consider replacing it with File.read. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | -| KernelOpen.rb:26:10:26:13 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:26:10:26:13 | file | This call to Kernel.open depends on a $@. Consider replacing it with File.open. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | +| KernelOpen.rb:4:10:4:13 | file | KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:4:10:4:13 | file | This call to Kernel.open depends on a $@. Consider replacing it with File.open. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | +| KernelOpen.rb:5:13:5:16 | file | KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:5:13:5:16 | file | This call to IO.read depends on a $@. Consider replacing it with File.read. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | +| KernelOpen.rb:6:14:6:17 | file | KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:6:14:6:17 | file | This call to IO.write depends on a $@. Consider replacing it with File.write. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | +| KernelOpen.rb:7:16:7:19 | file | KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:7:16:7:19 | file | This call to IO.binread depends on a $@. Consider replacing it with File.binread. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | +| KernelOpen.rb:8:17:8:20 | file | KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:8:17:8:20 | file | This call to IO.binwrite depends on a $@. Consider replacing it with File.binwrite. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | +| KernelOpen.rb:9:16:9:19 | file | KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:9:16:9:19 | file | This call to IO.foreach depends on a $@. Consider replacing it with File.foreach. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | +| KernelOpen.rb:10:18:10:21 | file | KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:10:18:10:21 | file | This call to IO.readlines depends on a $@. Consider replacing it with File.readlines. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | +| KernelOpen.rb:11:14:11:17 | file | KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:11:14:11:17 | file | This call to URI.open depends on a $@. Consider replacing it with URI().open. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | +| KernelOpen.rb:13:13:13:31 | call to join | KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:13:13:13:31 | call to join | This call to IO.read depends on a $@. Consider replacing it with File.read. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | +| KernelOpen.rb:26:10:26:13 | file | KernelOpen.rb:3:12:3:17 | call to params | KernelOpen.rb:26:10:26:13 | file | This call to Kernel.open depends on a $@. Consider replacing it with File.open. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-078/NonConstantKernelOpen/NonConstantKernelOpen.expected b/ruby/ql/test/query-tests/security/cwe-078/NonConstantKernelOpen/NonConstantKernelOpen.expected index dc299353e42..c961e2695af 100644 --- a/ruby/ql/test/query-tests/security/cwe-078/NonConstantKernelOpen/NonConstantKernelOpen.expected +++ b/ruby/ql/test/query-tests/security/cwe-078/NonConstantKernelOpen/NonConstantKernelOpen.expected @@ -1,11 +1,11 @@ -| NonConstantKernelOpen.rb:4:5:4:14 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. | -| NonConstantKernelOpen.rb:5:5:5:17 | call to read | Call to IO.read with a non-constant value. Consider replacing it with File.read. | -| NonConstantKernelOpen.rb:6:5:6:18 | call to write | Call to IO.write with a non-constant value. Consider replacing it with File.write. | -| NonConstantKernelOpen.rb:7:5:7:20 | call to binread | Call to IO.binread with a non-constant value. Consider replacing it with File.binread. | -| NonConstantKernelOpen.rb:8:5:8:21 | call to binwrite | Call to IO.binwrite with a non-constant value. Consider replacing it with File.binwrite. | -| NonConstantKernelOpen.rb:9:5:9:20 | call to foreach | Call to IO.foreach with a non-constant value. Consider replacing it with File.foreach. | -| NonConstantKernelOpen.rb:10:5:10:22 | call to readlines | Call to IO.readlines with a non-constant value. Consider replacing it with File.readlines. | -| NonConstantKernelOpen.rb:11:5:11:18 | call to open | Call to URI.open with a non-constant value. Consider replacing it with URI().open. | -| NonConstantKernelOpen.rb:15:5:15:21 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. | -| NonConstantKernelOpen.rb:25:5:25:33 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. | -| NonConstantKernelOpen.rb:33:5:33:14 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. | +| NonConstantKernelOpen.rb:7:5:7:14 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. | +| NonConstantKernelOpen.rb:8:5:8:17 | call to read | Call to IO.read with a non-constant value. Consider replacing it with File.read. | +| NonConstantKernelOpen.rb:9:5:9:18 | call to write | Call to IO.write with a non-constant value. Consider replacing it with File.write. | +| NonConstantKernelOpen.rb:10:5:10:20 | call to binread | Call to IO.binread with a non-constant value. Consider replacing it with File.binread. | +| NonConstantKernelOpen.rb:11:5:11:21 | call to binwrite | Call to IO.binwrite with a non-constant value. Consider replacing it with File.binwrite. | +| NonConstantKernelOpen.rb:12:5:12:20 | call to foreach | Call to IO.foreach with a non-constant value. Consider replacing it with File.foreach. | +| NonConstantKernelOpen.rb:13:5:13:22 | call to readlines | Call to IO.readlines with a non-constant value. Consider replacing it with File.readlines. | +| NonConstantKernelOpen.rb:14:5:14:18 | call to open | Call to URI.open with a non-constant value. Consider replacing it with URI().open. | +| NonConstantKernelOpen.rb:18:5:18:21 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. | +| NonConstantKernelOpen.rb:28:5:28:33 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. | +| NonConstantKernelOpen.rb:46:5:46:14 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. | diff --git a/ruby/ql/test/query-tests/security/cwe-078/NonConstantKernelOpen/NonConstantKernelOpen.rb b/ruby/ql/test/query-tests/security/cwe-078/NonConstantKernelOpen/NonConstantKernelOpen.rb index 9cd6ccf689f..6b8294fa111 100644 --- a/ruby/ql/test/query-tests/security/cwe-078/NonConstantKernelOpen/NonConstantKernelOpen.rb +++ b/ruby/ql/test/query-tests/security/cwe-078/NonConstantKernelOpen/NonConstantKernelOpen.rb @@ -1,4 +1,7 @@ class UsersController < ActionController::Base + CONSTANT = "constant" + CONSTANT_WITH_FREEZE = "constant-with-freeze".freeze + def create file = params[:file] open(file) # BAD @@ -30,6 +33,16 @@ class UsersController < ActionController::Base IO.write(File.join("foo", "bar.txt"), "bar") # GOOD + IO.read(CONSTANT) # GOOD + + IO.read(CONSTANT + file) # GOOD + + IO.read(CONSTANT_WITH_FREEZE) # GOOD + + IO.read(CONSTANT_WITH_FREEZE + file) # GOOD + + open.where(external: false) # GOOD - an open method is called withoout arguments + open(file) # BAD - sanity check to verify that file was not mistakenly marked as sanitized end end diff --git a/ruby/ql/test/query-tests/security/cwe-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected b/ruby/ql/test/query-tests/security/cwe-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected index ac3025e9a9e..a8ded2881ed 100644 --- a/ruby/ql/test/query-tests/security/cwe-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected +++ b/ruby/ql/test/query-tests/security/cwe-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected @@ -1,66 +1,66 @@ edges -| impl/sub/notImported.rb:2:12:2:17 | target : | impl/sub/notImported.rb:3:19:3:27 | #{...} | -| impl/sub/other2.rb:2:12:2:17 | target : | impl/sub/other2.rb:3:19:3:27 | #{...} | -| impl/sub/other.rb:2:12:2:17 | target : | impl/sub/other.rb:3:19:3:27 | #{...} | -| impl/unsafeShell.rb:2:12:2:17 | target : | impl/unsafeShell.rb:3:19:3:27 | #{...} | -| impl/unsafeShell.rb:6:12:6:12 | x : | impl/unsafeShell.rb:7:32:7:32 | x | -| impl/unsafeShell.rb:15:47:15:64 | innocent_file_path : | impl/unsafeShell.rb:20:21:20:41 | #{...} | -| impl/unsafeShell.rb:23:15:23:23 | file_path : | impl/unsafeShell.rb:26:19:26:30 | #{...} | -| impl/unsafeShell.rb:33:12:33:17 | target : | impl/unsafeShell.rb:34:19:34:27 | #{...} | -| impl/unsafeShell.rb:37:10:37:10 | x : | impl/unsafeShell.rb:38:19:38:22 | #{...} | -| impl/unsafeShell.rb:47:16:47:21 | target : | impl/unsafeShell.rb:48:19:48:27 | #{...} | -| impl/unsafeShell.rb:51:17:51:17 | x : | impl/unsafeShell.rb:52:14:52:14 | x | -| impl/unsafeShell.rb:51:17:51:17 | x : | impl/unsafeShell.rb:54:29:54:29 | x | -| impl/unsafeShell.rb:57:21:57:21 | x : | impl/unsafeShell.rb:58:23:58:23 | x | -| impl/unsafeShell.rb:61:20:61:20 | x : | impl/unsafeShell.rb:63:14:63:14 | x : | -| impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] : | impl/unsafeShell.rb:64:14:64:16 | arr | -| impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] : | impl/unsafeShell.rb:68:14:68:16 | arr | -| impl/unsafeShell.rb:63:14:63:14 | x : | impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] : | +| impl/sub/notImported.rb:2:12:2:17 | target | impl/sub/notImported.rb:3:19:3:27 | #{...} | +| impl/sub/other2.rb:2:12:2:17 | target | impl/sub/other2.rb:3:19:3:27 | #{...} | +| impl/sub/other.rb:2:12:2:17 | target | impl/sub/other.rb:3:19:3:27 | #{...} | +| impl/unsafeShell.rb:2:12:2:17 | target | impl/unsafeShell.rb:3:19:3:27 | #{...} | +| impl/unsafeShell.rb:6:12:6:12 | x | impl/unsafeShell.rb:7:32:7:32 | x | +| impl/unsafeShell.rb:15:47:15:64 | innocent_file_path | impl/unsafeShell.rb:20:21:20:41 | #{...} | +| impl/unsafeShell.rb:23:15:23:23 | file_path | impl/unsafeShell.rb:26:19:26:30 | #{...} | +| impl/unsafeShell.rb:33:12:33:17 | target | impl/unsafeShell.rb:34:19:34:27 | #{...} | +| impl/unsafeShell.rb:37:10:37:10 | x | impl/unsafeShell.rb:38:19:38:22 | #{...} | +| impl/unsafeShell.rb:47:16:47:21 | target | impl/unsafeShell.rb:48:19:48:27 | #{...} | +| impl/unsafeShell.rb:51:17:51:17 | x | impl/unsafeShell.rb:52:14:52:14 | x | +| impl/unsafeShell.rb:51:17:51:17 | x | impl/unsafeShell.rb:54:29:54:29 | x | +| impl/unsafeShell.rb:57:21:57:21 | x | impl/unsafeShell.rb:58:23:58:23 | x | +| impl/unsafeShell.rb:61:20:61:20 | x | impl/unsafeShell.rb:63:14:63:14 | x | +| impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] | impl/unsafeShell.rb:64:14:64:16 | arr | +| impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] | impl/unsafeShell.rb:68:14:68:16 | arr | +| impl/unsafeShell.rb:63:14:63:14 | x | impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] | nodes -| impl/sub/notImported.rb:2:12:2:17 | target : | semmle.label | target : | +| impl/sub/notImported.rb:2:12:2:17 | target | semmle.label | target | | impl/sub/notImported.rb:3:19:3:27 | #{...} | semmle.label | #{...} | -| impl/sub/other2.rb:2:12:2:17 | target : | semmle.label | target : | +| impl/sub/other2.rb:2:12:2:17 | target | semmle.label | target | | impl/sub/other2.rb:3:19:3:27 | #{...} | semmle.label | #{...} | -| impl/sub/other.rb:2:12:2:17 | target : | semmle.label | target : | +| impl/sub/other.rb:2:12:2:17 | target | semmle.label | target | | impl/sub/other.rb:3:19:3:27 | #{...} | semmle.label | #{...} | -| impl/unsafeShell.rb:2:12:2:17 | target : | semmle.label | target : | +| impl/unsafeShell.rb:2:12:2:17 | target | semmle.label | target | | impl/unsafeShell.rb:3:19:3:27 | #{...} | semmle.label | #{...} | -| impl/unsafeShell.rb:6:12:6:12 | x : | semmle.label | x : | +| impl/unsafeShell.rb:6:12:6:12 | x | semmle.label | x | | impl/unsafeShell.rb:7:32:7:32 | x | semmle.label | x | -| impl/unsafeShell.rb:15:47:15:64 | innocent_file_path : | semmle.label | innocent_file_path : | +| impl/unsafeShell.rb:15:47:15:64 | innocent_file_path | semmle.label | innocent_file_path | | impl/unsafeShell.rb:20:21:20:41 | #{...} | semmle.label | #{...} | -| impl/unsafeShell.rb:23:15:23:23 | file_path : | semmle.label | file_path : | +| impl/unsafeShell.rb:23:15:23:23 | file_path | semmle.label | file_path | | impl/unsafeShell.rb:26:19:26:30 | #{...} | semmle.label | #{...} | -| impl/unsafeShell.rb:33:12:33:17 | target : | semmle.label | target : | +| impl/unsafeShell.rb:33:12:33:17 | target | semmle.label | target | | impl/unsafeShell.rb:34:19:34:27 | #{...} | semmle.label | #{...} | -| impl/unsafeShell.rb:37:10:37:10 | x : | semmle.label | x : | +| impl/unsafeShell.rb:37:10:37:10 | x | semmle.label | x | | impl/unsafeShell.rb:38:19:38:22 | #{...} | semmle.label | #{...} | -| impl/unsafeShell.rb:47:16:47:21 | target : | semmle.label | target : | +| impl/unsafeShell.rb:47:16:47:21 | target | semmle.label | target | | impl/unsafeShell.rb:48:19:48:27 | #{...} | semmle.label | #{...} | -| impl/unsafeShell.rb:51:17:51:17 | x : | semmle.label | x : | +| impl/unsafeShell.rb:51:17:51:17 | x | semmle.label | x | | impl/unsafeShell.rb:52:14:52:14 | x | semmle.label | x | | impl/unsafeShell.rb:54:29:54:29 | x | semmle.label | x | -| impl/unsafeShell.rb:57:21:57:21 | x : | semmle.label | x : | +| impl/unsafeShell.rb:57:21:57:21 | x | semmle.label | x | | impl/unsafeShell.rb:58:23:58:23 | x | semmle.label | x | -| impl/unsafeShell.rb:61:20:61:20 | x : | semmle.label | x : | -| impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] : | semmle.label | [post] arr [element] : | -| impl/unsafeShell.rb:63:14:63:14 | x : | semmle.label | x : | +| impl/unsafeShell.rb:61:20:61:20 | x | semmle.label | x | +| impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] | semmle.label | [post] arr [element] | +| impl/unsafeShell.rb:63:14:63:14 | x | semmle.label | x | | impl/unsafeShell.rb:64:14:64:16 | arr | semmle.label | arr | | impl/unsafeShell.rb:68:14:68:16 | arr | semmle.label | arr | subpaths #select -| impl/sub/notImported.rb:3:14:3:28 | "cat #{...}" | impl/sub/notImported.rb:2:12:2:17 | target : | impl/sub/notImported.rb:3:19:3:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/sub/notImported.rb:2:12:2:17 | target | library input | impl/sub/notImported.rb:3:5:3:34 | call to popen | shell command | -| impl/sub/other2.rb:3:14:3:28 | "cat #{...}" | impl/sub/other2.rb:2:12:2:17 | target : | impl/sub/other2.rb:3:19:3:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/sub/other2.rb:2:12:2:17 | target | library input | impl/sub/other2.rb:3:5:3:34 | call to popen | shell command | -| impl/sub/other.rb:3:14:3:28 | "cat #{...}" | impl/sub/other.rb:2:12:2:17 | target : | impl/sub/other.rb:3:19:3:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/sub/other.rb:2:12:2:17 | target | library input | impl/sub/other.rb:3:5:3:34 | call to popen | shell command | -| impl/unsafeShell.rb:3:14:3:28 | "cat #{...}" | impl/unsafeShell.rb:2:12:2:17 | target : | impl/unsafeShell.rb:3:19:3:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:2:12:2:17 | target | library input | impl/unsafeShell.rb:3:5:3:34 | call to popen | shell command | -| impl/unsafeShell.rb:7:14:7:33 | call to sprintf | impl/unsafeShell.rb:6:12:6:12 | x : | impl/unsafeShell.rb:7:32:7:32 | x | This formatted string which depends on $@ is later used in a $@. | impl/unsafeShell.rb:6:12:6:12 | x | library input | impl/unsafeShell.rb:8:5:8:25 | call to popen | shell command | -| impl/unsafeShell.rb:20:14:20:42 | "which #{...}" | impl/unsafeShell.rb:15:47:15:64 | innocent_file_path : | impl/unsafeShell.rb:20:21:20:41 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:15:47:15:64 | innocent_file_path | library input | impl/unsafeShell.rb:20:5:20:48 | call to popen | shell command | -| impl/unsafeShell.rb:26:14:26:31 | "cat #{...}" | impl/unsafeShell.rb:23:15:23:23 | file_path : | impl/unsafeShell.rb:26:19:26:30 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:23:15:23:23 | file_path | library input | impl/unsafeShell.rb:26:5:26:37 | call to popen | shell command | -| impl/unsafeShell.rb:34:14:34:28 | "cat #{...}" | impl/unsafeShell.rb:33:12:33:17 | target : | impl/unsafeShell.rb:34:19:34:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:33:12:33:17 | target | library input | impl/unsafeShell.rb:34:5:34:34 | call to popen | shell command | -| impl/unsafeShell.rb:38:14:38:23 | "cat #{...}" | impl/unsafeShell.rb:37:10:37:10 | x : | impl/unsafeShell.rb:38:19:38:22 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:37:10:37:10 | x | library input | impl/unsafeShell.rb:38:5:38:29 | call to popen | shell command | -| impl/unsafeShell.rb:48:14:48:28 | "cat #{...}" | impl/unsafeShell.rb:47:16:47:21 | target : | impl/unsafeShell.rb:48:19:48:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:47:16:47:21 | target | library input | impl/unsafeShell.rb:48:5:48:34 | call to popen | shell command | -| impl/unsafeShell.rb:52:14:52:24 | call to join | impl/unsafeShell.rb:51:17:51:17 | x : | impl/unsafeShell.rb:52:14:52:14 | x | This array which depends on $@ is later used in a $@. | impl/unsafeShell.rb:51:17:51:17 | x | library input | impl/unsafeShell.rb:52:5:52:30 | call to popen | shell command | -| impl/unsafeShell.rb:54:14:54:40 | call to join | impl/unsafeShell.rb:51:17:51:17 | x : | impl/unsafeShell.rb:54:29:54:29 | x | This array which depends on $@ is later used in a $@. | impl/unsafeShell.rb:51:17:51:17 | x | library input | impl/unsafeShell.rb:54:5:54:46 | call to popen | shell command | -| impl/unsafeShell.rb:58:14:58:23 | ... + ... | impl/unsafeShell.rb:57:21:57:21 | x : | impl/unsafeShell.rb:58:23:58:23 | x | This string concatenation which depends on $@ is later used in a $@. | impl/unsafeShell.rb:57:21:57:21 | x | library input | impl/unsafeShell.rb:58:5:58:29 | call to popen | shell command | -| impl/unsafeShell.rb:64:14:64:26 | call to join | impl/unsafeShell.rb:61:20:61:20 | x : | impl/unsafeShell.rb:64:14:64:16 | arr | This array which depends on $@ is later used in a $@. | impl/unsafeShell.rb:61:20:61:20 | x | library input | impl/unsafeShell.rb:64:5:64:32 | call to popen | shell command | -| impl/unsafeShell.rb:68:14:68:26 | call to join | impl/unsafeShell.rb:61:20:61:20 | x : | impl/unsafeShell.rb:68:14:68:16 | arr | This array which depends on $@ is later used in a $@. | impl/unsafeShell.rb:61:20:61:20 | x | library input | impl/unsafeShell.rb:68:5:68:32 | call to popen | shell command | +| impl/sub/notImported.rb:3:14:3:28 | "cat #{...}" | impl/sub/notImported.rb:2:12:2:17 | target | impl/sub/notImported.rb:3:19:3:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/sub/notImported.rb:2:12:2:17 | target | library input | impl/sub/notImported.rb:3:5:3:34 | call to popen | shell command | +| impl/sub/other2.rb:3:14:3:28 | "cat #{...}" | impl/sub/other2.rb:2:12:2:17 | target | impl/sub/other2.rb:3:19:3:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/sub/other2.rb:2:12:2:17 | target | library input | impl/sub/other2.rb:3:5:3:34 | call to popen | shell command | +| impl/sub/other.rb:3:14:3:28 | "cat #{...}" | impl/sub/other.rb:2:12:2:17 | target | impl/sub/other.rb:3:19:3:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/sub/other.rb:2:12:2:17 | target | library input | impl/sub/other.rb:3:5:3:34 | call to popen | shell command | +| impl/unsafeShell.rb:3:14:3:28 | "cat #{...}" | impl/unsafeShell.rb:2:12:2:17 | target | impl/unsafeShell.rb:3:19:3:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:2:12:2:17 | target | library input | impl/unsafeShell.rb:3:5:3:34 | call to popen | shell command | +| impl/unsafeShell.rb:7:14:7:33 | call to sprintf | impl/unsafeShell.rb:6:12:6:12 | x | impl/unsafeShell.rb:7:32:7:32 | x | This formatted string which depends on $@ is later used in a $@. | impl/unsafeShell.rb:6:12:6:12 | x | library input | impl/unsafeShell.rb:8:5:8:25 | call to popen | shell command | +| impl/unsafeShell.rb:20:14:20:42 | "which #{...}" | impl/unsafeShell.rb:15:47:15:64 | innocent_file_path | impl/unsafeShell.rb:20:21:20:41 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:15:47:15:64 | innocent_file_path | library input | impl/unsafeShell.rb:20:5:20:48 | call to popen | shell command | +| impl/unsafeShell.rb:26:14:26:31 | "cat #{...}" | impl/unsafeShell.rb:23:15:23:23 | file_path | impl/unsafeShell.rb:26:19:26:30 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:23:15:23:23 | file_path | library input | impl/unsafeShell.rb:26:5:26:37 | call to popen | shell command | +| impl/unsafeShell.rb:34:14:34:28 | "cat #{...}" | impl/unsafeShell.rb:33:12:33:17 | target | impl/unsafeShell.rb:34:19:34:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:33:12:33:17 | target | library input | impl/unsafeShell.rb:34:5:34:34 | call to popen | shell command | +| impl/unsafeShell.rb:38:14:38:23 | "cat #{...}" | impl/unsafeShell.rb:37:10:37:10 | x | impl/unsafeShell.rb:38:19:38:22 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:37:10:37:10 | x | library input | impl/unsafeShell.rb:38:5:38:29 | call to popen | shell command | +| impl/unsafeShell.rb:48:14:48:28 | "cat #{...}" | impl/unsafeShell.rb:47:16:47:21 | target | impl/unsafeShell.rb:48:19:48:27 | #{...} | This string construction which depends on $@ is later used in a $@. | impl/unsafeShell.rb:47:16:47:21 | target | library input | impl/unsafeShell.rb:48:5:48:34 | call to popen | shell command | +| impl/unsafeShell.rb:52:14:52:24 | call to join | impl/unsafeShell.rb:51:17:51:17 | x | impl/unsafeShell.rb:52:14:52:14 | x | This array which depends on $@ is later used in a $@. | impl/unsafeShell.rb:51:17:51:17 | x | library input | impl/unsafeShell.rb:52:5:52:30 | call to popen | shell command | +| impl/unsafeShell.rb:54:14:54:40 | call to join | impl/unsafeShell.rb:51:17:51:17 | x | impl/unsafeShell.rb:54:29:54:29 | x | This array which depends on $@ is later used in a $@. | impl/unsafeShell.rb:51:17:51:17 | x | library input | impl/unsafeShell.rb:54:5:54:46 | call to popen | shell command | +| impl/unsafeShell.rb:58:14:58:23 | ... + ... | impl/unsafeShell.rb:57:21:57:21 | x | impl/unsafeShell.rb:58:23:58:23 | x | This string concatenation which depends on $@ is later used in a $@. | impl/unsafeShell.rb:57:21:57:21 | x | library input | impl/unsafeShell.rb:58:5:58:29 | call to popen | shell command | +| impl/unsafeShell.rb:64:14:64:26 | call to join | impl/unsafeShell.rb:61:20:61:20 | x | impl/unsafeShell.rb:64:14:64:16 | arr | This array which depends on $@ is later used in a $@. | impl/unsafeShell.rb:61:20:61:20 | x | library input | impl/unsafeShell.rb:64:5:64:32 | call to popen | shell command | +| impl/unsafeShell.rb:68:14:68:26 | call to join | impl/unsafeShell.rb:61:20:61:20 | x | impl/unsafeShell.rb:68:14:68:16 | arr | This array which depends on $@ is later used in a $@. | impl/unsafeShell.rb:61:20:61:20 | x | library input | impl/unsafeShell.rb:68:5:68:32 | call to popen | shell command | diff --git a/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected b/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected index 40062a572a1..91c5c442a5e 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected @@ -1,101 +1,101 @@ edges -| app/controllers/foo/bars_controller.rb:9:12:9:17 | call to params : | app/controllers/foo/bars_controller.rb:9:12:9:29 | ...[...] : | -| app/controllers/foo/bars_controller.rb:9:12:9:29 | ...[...] : | app/views/foo/bars/show.html.erb:46:5:46:13 | call to user_name | -| app/controllers/foo/bars_controller.rb:13:5:13:14 | [post] self [@user_name] : | app/controllers/foo/bars_controller.rb:13:5:13:14 | [post] self [@user_name] : | -| app/controllers/foo/bars_controller.rb:13:5:13:14 | [post] self [@user_name] : | app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | -| app/controllers/foo/bars_controller.rb:13:20:13:25 | call to params : | app/controllers/foo/bars_controller.rb:13:20:13:37 | ...[...] : | -| app/controllers/foo/bars_controller.rb:13:20:13:37 | ...[...] : | app/controllers/foo/bars_controller.rb:13:5:13:14 | [post] self [@user_name] : | -| app/controllers/foo/bars_controller.rb:13:20:13:37 | ...[...] : | app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | -| app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params : | app/controllers/foo/bars_controller.rb:17:21:17:36 | ...[...] : | -| app/controllers/foo/bars_controller.rb:17:21:17:36 | ...[...] : | app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | -| app/controllers/foo/bars_controller.rb:18:5:18:6 | dt : | app/controllers/foo/bars_controller.rb:19:22:19:23 | dt : | -| app/controllers/foo/bars_controller.rb:18:5:18:6 | dt : | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | -| app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] : | -| app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] : | app/controllers/foo/bars_controller.rb:18:5:18:6 | dt : | -| app/controllers/foo/bars_controller.rb:19:22:19:23 | dt : | app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | -| app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params : | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] : | -| app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] : | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] : | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] : | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text : | -| app/controllers/foo/bars_controller.rb:30:5:30:7 | str : | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | -| app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params : | app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] : | -| app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] : | app/controllers/foo/bars_controller.rb:30:5:30:7 | str : | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | -| app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | -| app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] : | app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | -| app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] : | app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | -| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... : | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | -| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... : | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | -| app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text : | app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... : | -| app/views/foo/bars/show.html.erb:53:29:53:34 | call to params : | app/views/foo/bars/show.html.erb:53:29:53:44 | ...[...] | -| app/views/foo/bars/show.html.erb:56:13:56:18 | call to params : | app/views/foo/bars/show.html.erb:56:13:56:28 | ...[...] | -| app/views/foo/bars/show.html.erb:73:19:73:24 | call to params : | app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | -| app/views/foo/bars/show.html.erb:76:28:76:33 | call to params : | app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | +| app/controllers/foo/bars_controller.rb:9:12:9:17 | call to params | app/controllers/foo/bars_controller.rb:9:12:9:29 | ...[...] | +| app/controllers/foo/bars_controller.rb:9:12:9:29 | ...[...] | app/views/foo/bars/show.html.erb:46:5:46:13 | call to user_name | +| app/controllers/foo/bars_controller.rb:13:5:13:14 | [post] self [@user_name] | app/controllers/foo/bars_controller.rb:13:5:13:14 | [post] self [@user_name] | +| app/controllers/foo/bars_controller.rb:13:5:13:14 | [post] self [@user_name] | app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | +| app/controllers/foo/bars_controller.rb:13:20:13:25 | call to params | app/controllers/foo/bars_controller.rb:13:20:13:37 | ...[...] | +| app/controllers/foo/bars_controller.rb:13:20:13:37 | ...[...] | app/controllers/foo/bars_controller.rb:13:5:13:14 | [post] self [@user_name] | +| app/controllers/foo/bars_controller.rb:13:20:13:37 | ...[...] | app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | +| app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params | app/controllers/foo/bars_controller.rb:17:21:17:36 | ...[...] | +| app/controllers/foo/bars_controller.rb:17:21:17:36 | ...[...] | app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | +| app/controllers/foo/bars_controller.rb:18:5:18:6 | dt | app/controllers/foo/bars_controller.rb:19:22:19:23 | dt | +| app/controllers/foo/bars_controller.rb:18:5:18:6 | dt | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | +| app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] | +| app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] | app/controllers/foo/bars_controller.rb:18:5:18:6 | dt | +| app/controllers/foo/bars_controller.rb:19:22:19:23 | dt | app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | +| app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] | +| app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | +| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | +| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | +| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] | +| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] | +| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | +| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | +| app/controllers/foo/bars_controller.rb:30:5:30:7 | str | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | +| app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] | +| app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] | app/controllers/foo/bars_controller.rb:30:5:30:7 | str | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | +| app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | +| app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] | app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | +| app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] | app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | +| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | +| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | +| app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | +| app/views/foo/bars/show.html.erb:53:29:53:34 | call to params | app/views/foo/bars/show.html.erb:53:29:53:44 | ...[...] | +| app/views/foo/bars/show.html.erb:56:13:56:18 | call to params | app/views/foo/bars/show.html.erb:56:13:56:28 | ...[...] | +| app/views/foo/bars/show.html.erb:73:19:73:24 | call to params | app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | +| app/views/foo/bars/show.html.erb:76:28:76:33 | call to params | app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | nodes -| app/controllers/foo/bars_controller.rb:9:12:9:17 | call to params : | semmle.label | call to params : | -| app/controllers/foo/bars_controller.rb:9:12:9:29 | ...[...] : | semmle.label | ...[...] : | -| app/controllers/foo/bars_controller.rb:13:5:13:14 | [post] self [@user_name] : | semmle.label | [post] self [@user_name] : | -| app/controllers/foo/bars_controller.rb:13:20:13:25 | call to params : | semmle.label | call to params : | -| app/controllers/foo/bars_controller.rb:13:20:13:37 | ...[...] : | semmle.label | ...[...] : | -| app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params : | semmle.label | call to params : | -| app/controllers/foo/bars_controller.rb:17:21:17:36 | ...[...] : | semmle.label | ...[...] : | -| app/controllers/foo/bars_controller.rb:18:5:18:6 | dt : | semmle.label | dt : | -| app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | semmle.label | call to params : | -| app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] : | semmle.label | ...[...] : | -| app/controllers/foo/bars_controller.rb:19:22:19:23 | dt : | semmle.label | dt : | -| app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params : | semmle.label | call to params : | +| app/controllers/foo/bars_controller.rb:9:12:9:17 | call to params | semmle.label | call to params | +| app/controllers/foo/bars_controller.rb:9:12:9:29 | ...[...] | semmle.label | ...[...] | +| app/controllers/foo/bars_controller.rb:13:5:13:14 | [post] self [@user_name] | semmle.label | [post] self [@user_name] | +| app/controllers/foo/bars_controller.rb:13:20:13:25 | call to params | semmle.label | call to params | +| app/controllers/foo/bars_controller.rb:13:20:13:37 | ...[...] | semmle.label | ...[...] | +| app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params | semmle.label | call to params | +| app/controllers/foo/bars_controller.rb:17:21:17:36 | ...[...] | semmle.label | ...[...] | +| app/controllers/foo/bars_controller.rb:18:5:18:6 | dt | semmle.label | dt | +| app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | semmle.label | call to params | +| app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] | semmle.label | ...[...] | +| app/controllers/foo/bars_controller.rb:19:22:19:23 | dt | semmle.label | dt | +| app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | semmle.label | call to params | | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | semmle.label | ... = ... | -| app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] : | semmle.label | ...[...] : | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | semmle.label | dt : | -| app/controllers/foo/bars_controller.rb:30:5:30:7 | str : | semmle.label | str : | -| app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params : | semmle.label | call to params : | -| app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] : | semmle.label | ...[...] : | +| app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] | semmle.label | ...[...] | +| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | semmle.label | dt | +| app/controllers/foo/bars_controller.rb:30:5:30:7 | str | semmle.label | str | +| app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | semmle.label | call to params | +| app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] | semmle.label | ...[...] | | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | semmle.label | str | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | semmle.label | call to display_text | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | semmle.label | call to local_assigns [element :display_text] : | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | semmle.label | ...[...] | | app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | semmle.label | @user_website | | app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | semmle.label | call to display_text | -| app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | semmle.label | call to local_assigns [element :display_text] : | +| app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | | app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | semmle.label | ...[...] | -| app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] : | semmle.label | call to local_assigns [element :display_text] : | +| app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | | app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | semmle.label | ...[...] | -| app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] : | semmle.label | call to local_assigns [element :display_text] : | +| app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | | app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | semmle.label | ...[...] | | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | semmle.label | call to display_text | | app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | semmle.label | @instance_text | -| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... : | semmle.label | ... + ... : | -| app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text : | semmle.label | call to display_text : | +| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | semmle.label | ... + ... | +| app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | semmle.label | call to display_text | | app/views/foo/bars/show.html.erb:46:5:46:13 | call to user_name | semmle.label | call to user_name | | app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | semmle.label | call to user_name_memo | -| app/views/foo/bars/show.html.erb:53:29:53:34 | call to params : | semmle.label | call to params : | +| app/views/foo/bars/show.html.erb:53:29:53:34 | call to params | semmle.label | call to params | | app/views/foo/bars/show.html.erb:53:29:53:44 | ...[...] | semmle.label | ...[...] | -| app/views/foo/bars/show.html.erb:56:13:56:18 | call to params : | semmle.label | call to params : | +| app/views/foo/bars/show.html.erb:56:13:56:18 | call to params | semmle.label | call to params | | app/views/foo/bars/show.html.erb:56:13:56:28 | ...[...] | semmle.label | ...[...] | -| app/views/foo/bars/show.html.erb:73:19:73:24 | call to params : | semmle.label | call to params : | +| app/views/foo/bars/show.html.erb:73:19:73:24 | call to params | semmle.label | call to params | | app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | semmle.label | ...[...] | -| app/views/foo/bars/show.html.erb:76:28:76:33 | call to params : | semmle.label | call to params : | +| app/views/foo/bars/show.html.erb:76:28:76:33 | call to params | semmle.label | call to params | | app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | semmle.label | ...[...] | subpaths #select -| app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params : | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | user-provided value | -| app/controllers/foo/bars_controller.rb:31:5:31:7 | str | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params : | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | user-provided value | -| app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | -| app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params : | app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:46:5:46:13 | call to user_name | app/controllers/foo/bars_controller.rb:9:12:9:17 | call to params : | app/views/foo/bars/show.html.erb:46:5:46:13 | call to user_name | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:9:12:9:17 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | app/controllers/foo/bars_controller.rb:13:20:13:25 | call to params : | app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:13:20:13:25 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:53:29:53:44 | ...[...] | app/views/foo/bars/show.html.erb:53:29:53:34 | call to params : | app/views/foo/bars/show.html.erb:53:29:53:44 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/views/foo/bars/show.html.erb:53:29:53:34 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:56:13:56:28 | ...[...] | app/views/foo/bars/show.html.erb:56:13:56:18 | call to params : | app/views/foo/bars/show.html.erb:56:13:56:28 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/views/foo/bars/show.html.erb:56:13:56:18 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | app/views/foo/bars/show.html.erb:73:19:73:24 | call to params : | app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/views/foo/bars/show.html.erb:73:19:73:24 | call to params | user-provided value | -| app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | app/views/foo/bars/show.html.erb:76:28:76:33 | call to params : | app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/views/foo/bars/show.html.erb:76:28:76:33 | call to params | user-provided value | +| app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | user-provided value | +| app/controllers/foo/bars_controller.rb:31:5:31:7 | str | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | user-provided value | +| app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | +| app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params | app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:46:5:46:13 | call to user_name | app/controllers/foo/bars_controller.rb:9:12:9:17 | call to params | app/views/foo/bars/show.html.erb:46:5:46:13 | call to user_name | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:9:12:9:17 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | app/controllers/foo/bars_controller.rb:13:20:13:25 | call to params | app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:13:20:13:25 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:53:29:53:44 | ...[...] | app/views/foo/bars/show.html.erb:53:29:53:34 | call to params | app/views/foo/bars/show.html.erb:53:29:53:44 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/views/foo/bars/show.html.erb:53:29:53:34 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:56:13:56:28 | ...[...] | app/views/foo/bars/show.html.erb:56:13:56:18 | call to params | app/views/foo/bars/show.html.erb:56:13:56:28 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/views/foo/bars/show.html.erb:56:13:56:18 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | app/views/foo/bars/show.html.erb:73:19:73:24 | call to params | app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/views/foo/bars/show.html.erb:73:19:73:24 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | app/views/foo/bars/show.html.erb:76:28:76:33 | call to params | app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/views/foo/bars/show.html.erb:76:28:76:33 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected b/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected index 01a48d43371..0eaf24029ef 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected @@ -1,43 +1,43 @@ edges -| app/controllers/foo/stores_controller.rb:8:5:8:6 | dt : | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt : | -| app/controllers/foo/stores_controller.rb:8:5:8:6 | dt : | app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | -| app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/controllers/foo/stores_controller.rb:8:5:8:6 | dt : | -| app/controllers/foo/stores_controller.rb:9:22:9:23 | dt : | app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | -| app/controllers/foo/stores_controller.rb:12:28:12:48 | call to raw_name : | app/views/foo/stores/show.html.erb:82:5:82:24 | @other_user_raw_name | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] : | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] : | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] : | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text : | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | -| app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] : | app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | -| app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] : | app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | -| app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] : | app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | -| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... : | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | -| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... : | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | -| app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text : | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... : | -| app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle : | app/views/foo/stores/show.html.erb:86:3:86:29 | call to sprintf | +| app/controllers/foo/stores_controller.rb:8:5:8:6 | dt | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt | +| app/controllers/foo/stores_controller.rb:8:5:8:6 | dt | app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | +| app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/controllers/foo/stores_controller.rb:8:5:8:6 | dt | +| app/controllers/foo/stores_controller.rb:9:22:9:23 | dt | app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | +| app/controllers/foo/stores_controller.rb:12:28:12:48 | call to raw_name | app/views/foo/stores/show.html.erb:82:5:82:24 | @other_user_raw_name | +| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | +| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] | +| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] | +| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] | +| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | +| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | +| app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] | app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | +| app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] | app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | +| app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] | app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | +| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | +| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | +| app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | +| app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle | app/views/foo/stores/show.html.erb:86:3:86:29 | call to sprintf | nodes -| app/controllers/foo/stores_controller.rb:8:5:8:6 | dt : | semmle.label | dt : | -| app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | semmle.label | call to read : | -| app/controllers/foo/stores_controller.rb:9:22:9:23 | dt : | semmle.label | dt : | -| app/controllers/foo/stores_controller.rb:12:28:12:48 | call to raw_name : | semmle.label | call to raw_name : | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | semmle.label | dt : | +| app/controllers/foo/stores_controller.rb:8:5:8:6 | dt | semmle.label | dt | +| app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | semmle.label | call to read | +| app/controllers/foo/stores_controller.rb:9:22:9:23 | dt | semmle.label | dt | +| app/controllers/foo/stores_controller.rb:12:28:12:48 | call to raw_name | semmle.label | call to raw_name | +| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | semmle.label | dt | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | semmle.label | call to display_text | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | semmle.label | call to local_assigns [element :display_text] : | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | semmle.label | ...[...] | | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | semmle.label | call to display_text | -| app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] : | semmle.label | call to local_assigns [element :display_text] : | +| app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | | app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | semmle.label | ...[...] | -| app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] : | semmle.label | call to local_assigns [element :display_text] : | +| app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | | app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | semmle.label | ...[...] | -| app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] : | semmle.label | call to local_assigns [element :display_text] : | +| app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | | app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | semmle.label | ...[...] | | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | semmle.label | call to display_text | | app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | semmle.label | @instance_text | -| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... : | semmle.label | ... + ... : | -| app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text : | semmle.label | call to display_text : | +| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | semmle.label | ... + ... | +| app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | semmle.label | call to display_text | | app/views/foo/stores/show.html.erb:46:5:46:16 | call to handle | semmle.label | call to handle | | app/views/foo/stores/show.html.erb:49:5:49:18 | call to raw_name | semmle.label | call to raw_name | | app/views/foo/stores/show.html.erb:63:3:63:18 | call to handle | semmle.label | call to handle | @@ -45,21 +45,21 @@ nodes | app/views/foo/stores/show.html.erb:79:5:79:22 | call to display_name | semmle.label | call to display_name | | app/views/foo/stores/show.html.erb:82:5:82:24 | @other_user_raw_name | semmle.label | @other_user_raw_name | | app/views/foo/stores/show.html.erb:86:3:86:29 | call to sprintf | semmle.label | call to sprintf | -| app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle : | semmle.label | call to handle : | +| app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle | semmle.label | call to handle | subpaths #select -| app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | -| app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | -| app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | -| app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | -| app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | -| app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | -| app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | -| app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | +| app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | +| app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | +| app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | +| app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | +| app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | +| app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | +| app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | +| app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | stored value | | app/views/foo/stores/show.html.erb:46:5:46:16 | call to handle | app/views/foo/stores/show.html.erb:46:5:46:16 | call to handle | app/views/foo/stores/show.html.erb:46:5:46:16 | call to handle | Stored cross-site scripting vulnerability due to $@. | app/views/foo/stores/show.html.erb:46:5:46:16 | call to handle | stored value | | app/views/foo/stores/show.html.erb:49:5:49:18 | call to raw_name | app/views/foo/stores/show.html.erb:49:5:49:18 | call to raw_name | app/views/foo/stores/show.html.erb:49:5:49:18 | call to raw_name | Stored cross-site scripting vulnerability due to $@. | app/views/foo/stores/show.html.erb:49:5:49:18 | call to raw_name | stored value | | app/views/foo/stores/show.html.erb:63:3:63:18 | call to handle | app/views/foo/stores/show.html.erb:63:3:63:18 | call to handle | app/views/foo/stores/show.html.erb:63:3:63:18 | call to handle | Stored cross-site scripting vulnerability due to $@. | app/views/foo/stores/show.html.erb:63:3:63:18 | call to handle | stored value | | app/views/foo/stores/show.html.erb:69:3:69:20 | call to raw_name | app/views/foo/stores/show.html.erb:69:3:69:20 | call to raw_name | app/views/foo/stores/show.html.erb:69:3:69:20 | call to raw_name | Stored cross-site scripting vulnerability due to $@. | app/views/foo/stores/show.html.erb:69:3:69:20 | call to raw_name | stored value | | app/views/foo/stores/show.html.erb:79:5:79:22 | call to display_name | app/views/foo/stores/show.html.erb:79:5:79:22 | call to display_name | app/views/foo/stores/show.html.erb:79:5:79:22 | call to display_name | Stored cross-site scripting vulnerability due to $@. | app/views/foo/stores/show.html.erb:79:5:79:22 | call to display_name | stored value | -| app/views/foo/stores/show.html.erb:82:5:82:24 | @other_user_raw_name | app/controllers/foo/stores_controller.rb:12:28:12:48 | call to raw_name : | app/views/foo/stores/show.html.erb:82:5:82:24 | @other_user_raw_name | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:12:28:12:48 | call to raw_name | stored value | -| app/views/foo/stores/show.html.erb:86:3:86:29 | call to sprintf | app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle : | app/views/foo/stores/show.html.erb:86:3:86:29 | call to sprintf | Stored cross-site scripting vulnerability due to $@. | app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle | stored value | +| app/views/foo/stores/show.html.erb:82:5:82:24 | @other_user_raw_name | app/controllers/foo/stores_controller.rb:12:28:12:48 | call to raw_name | app/views/foo/stores/show.html.erb:82:5:82:24 | @other_user_raw_name | Stored cross-site scripting vulnerability due to $@. | app/controllers/foo/stores_controller.rb:12:28:12:48 | call to raw_name | stored value | +| app/views/foo/stores/show.html.erb:86:3:86:29 | call to sprintf | app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle | app/views/foo/stores/show.html.erb:86:3:86:29 | call to sprintf | Stored cross-site scripting vulnerability due to $@. | app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle | stored value | diff --git a/ruby/ql/test/query-tests/security/cwe-079/UnsafeHtmlConstruction.expected b/ruby/ql/test/query-tests/security/cwe-079/UnsafeHtmlConstruction.expected index 4fa3eab5a71..064d5a2e1dc 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/UnsafeHtmlConstruction.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/UnsafeHtmlConstruction.expected @@ -1,16 +1,16 @@ edges -| lib/unsafeHtml.rb:2:31:2:34 | name : | lib/unsafeHtml.rb:3:10:3:16 | #{...} | -| lib/unsafeHtml.rb:9:27:9:30 | name : | lib/unsafeHtml.rb:11:13:11:19 | #{...} | -| lib/unsafeHtml.rb:16:19:16:22 | name : | lib/unsafeHtml.rb:17:28:17:31 | name | +| lib/unsafeHtml.rb:2:31:2:34 | name | lib/unsafeHtml.rb:3:10:3:16 | #{...} | +| lib/unsafeHtml.rb:9:27:9:30 | name | lib/unsafeHtml.rb:11:13:11:19 | #{...} | +| lib/unsafeHtml.rb:16:19:16:22 | name | lib/unsafeHtml.rb:17:28:17:31 | name | nodes -| lib/unsafeHtml.rb:2:31:2:34 | name : | semmle.label | name : | +| lib/unsafeHtml.rb:2:31:2:34 | name | semmle.label | name | | lib/unsafeHtml.rb:3:10:3:16 | #{...} | semmle.label | #{...} | -| lib/unsafeHtml.rb:9:27:9:30 | name : | semmle.label | name : | +| lib/unsafeHtml.rb:9:27:9:30 | name | semmle.label | name | | lib/unsafeHtml.rb:11:13:11:19 | #{...} | semmle.label | #{...} | -| lib/unsafeHtml.rb:16:19:16:22 | name : | semmle.label | name : | +| lib/unsafeHtml.rb:16:19:16:22 | name | semmle.label | name | | lib/unsafeHtml.rb:17:28:17:31 | name | semmle.label | name | subpaths #select -| lib/unsafeHtml.rb:3:10:3:16 | #{...} | lib/unsafeHtml.rb:2:31:2:34 | name : | lib/unsafeHtml.rb:3:10:3:16 | #{...} | This string interpolation which depends on $@ might later allow $@. | lib/unsafeHtml.rb:2:31:2:34 | name | library input | lib/unsafeHtml.rb:3:5:3:22 | "

    #{...}

    " | cross-site scripting | -| lib/unsafeHtml.rb:11:13:11:19 | #{...} | lib/unsafeHtml.rb:9:27:9:30 | name : | lib/unsafeHtml.rb:11:13:11:19 | #{...} | This string interpolation which depends on $@ might later allow $@. | lib/unsafeHtml.rb:9:27:9:30 | name | library input | lib/unsafeHtml.rb:13:5:13:5 | h | cross-site scripting | -| lib/unsafeHtml.rb:17:28:17:31 | name | lib/unsafeHtml.rb:16:19:16:22 | name : | lib/unsafeHtml.rb:17:28:17:31 | name | This string format which depends on $@ might later allow $@. | lib/unsafeHtml.rb:16:19:16:22 | name | library input | lib/unsafeHtml.rb:17:5:17:32 | call to sprintf | cross-site scripting | +| lib/unsafeHtml.rb:3:10:3:16 | #{...} | lib/unsafeHtml.rb:2:31:2:34 | name | lib/unsafeHtml.rb:3:10:3:16 | #{...} | This string interpolation which depends on $@ might later allow $@. | lib/unsafeHtml.rb:2:31:2:34 | name | library input | lib/unsafeHtml.rb:3:5:3:22 | "

    #{...}

    " | cross-site scripting | +| lib/unsafeHtml.rb:11:13:11:19 | #{...} | lib/unsafeHtml.rb:9:27:9:30 | name | lib/unsafeHtml.rb:11:13:11:19 | #{...} | This string interpolation which depends on $@ might later allow $@. | lib/unsafeHtml.rb:9:27:9:30 | name | library input | lib/unsafeHtml.rb:13:5:13:5 | h | cross-site scripting | +| lib/unsafeHtml.rb:17:28:17:31 | name | lib/unsafeHtml.rb:16:19:16:22 | name | lib/unsafeHtml.rb:17:28:17:31 | name | This string format which depends on $@ might later allow $@. | lib/unsafeHtml.rb:16:19:16:22 | name | library input | lib/unsafeHtml.rb:17:5:17:32 | call to sprintf | cross-site scripting | diff --git a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected index a41722107d6..087063a6ac4 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected @@ -1,161 +1,161 @@ edges -| ActiveRecordInjection.rb:8:25:8:28 | name : | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | -| ActiveRecordInjection.rb:8:31:8:34 | pass : | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | -| ActiveRecordInjection.rb:20:22:20:30 | condition : | ActiveRecordInjection.rb:23:16:23:24 | condition | -| ActiveRecordInjection.rb:35:30:35:35 | call to params : | ActiveRecordInjection.rb:35:30:35:44 | ...[...] | -| ActiveRecordInjection.rb:39:18:39:23 | call to params : | ActiveRecordInjection.rb:39:18:39:32 | ...[...] | -| ActiveRecordInjection.rb:43:29:43:34 | call to params : | ActiveRecordInjection.rb:43:29:43:39 | ...[...] : | -| ActiveRecordInjection.rb:43:29:43:39 | ...[...] : | ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | -| ActiveRecordInjection.rb:48:30:48:35 | call to params : | ActiveRecordInjection.rb:48:30:48:40 | ...[...] : | -| ActiveRecordInjection.rb:48:30:48:40 | ...[...] : | ActiveRecordInjection.rb:48:21:48:43 | "id = '#{...}'" | -| ActiveRecordInjection.rb:52:31:52:36 | call to params : | ActiveRecordInjection.rb:52:31:52:41 | ...[...] : | -| ActiveRecordInjection.rb:52:31:52:41 | ...[...] : | ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | -| ActiveRecordInjection.rb:57:32:57:37 | call to params : | ActiveRecordInjection.rb:57:32:57:42 | ...[...] : | -| ActiveRecordInjection.rb:57:32:57:42 | ...[...] : | ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | -| ActiveRecordInjection.rb:62:21:62:26 | call to params : | ActiveRecordInjection.rb:62:21:62:35 | ...[...] : | -| ActiveRecordInjection.rb:62:21:62:35 | ...[...] : | ActiveRecordInjection.rb:61:16:61:21 | <<-SQL | -| ActiveRecordInjection.rb:68:34:68:39 | call to params : | ActiveRecordInjection.rb:68:34:68:44 | ...[...] : | -| ActiveRecordInjection.rb:68:34:68:44 | ...[...] : | ActiveRecordInjection.rb:68:20:68:47 | "user.id = '#{...}'" | -| ActiveRecordInjection.rb:70:23:70:28 | call to params : | ActiveRecordInjection.rb:70:23:70:35 | ...[...] : | -| ActiveRecordInjection.rb:70:23:70:35 | ...[...] : | ActiveRecordInjection.rb:8:25:8:28 | name : | -| ActiveRecordInjection.rb:70:38:70:43 | call to params : | ActiveRecordInjection.rb:70:38:70:50 | ...[...] : | -| ActiveRecordInjection.rb:70:38:70:50 | ...[...] : | ActiveRecordInjection.rb:8:31:8:34 | pass : | -| ActiveRecordInjection.rb:74:41:74:46 | call to params : | ActiveRecordInjection.rb:74:41:74:51 | ...[...] : | -| ActiveRecordInjection.rb:74:41:74:51 | ...[...] : | ActiveRecordInjection.rb:74:32:74:54 | "id = '#{...}'" | -| ActiveRecordInjection.rb:83:17:83:22 | call to params : | ActiveRecordInjection.rb:83:17:83:31 | ...[...] | -| ActiveRecordInjection.rb:84:19:84:24 | call to params : | ActiveRecordInjection.rb:84:19:84:33 | ...[...] | -| ActiveRecordInjection.rb:88:18:88:23 | call to params : | ActiveRecordInjection.rb:88:18:88:35 | ...[...] | -| ActiveRecordInjection.rb:92:21:92:26 | call to params : | ActiveRecordInjection.rb:92:21:92:35 | ...[...] | -| ActiveRecordInjection.rb:94:18:94:23 | call to params : | ActiveRecordInjection.rb:94:18:94:35 | ...[...] | -| ActiveRecordInjection.rb:96:23:96:28 | call to params : | ActiveRecordInjection.rb:96:23:96:47 | ...[...] | -| ActiveRecordInjection.rb:102:5:102:6 | ps : | ActiveRecordInjection.rb:103:11:103:12 | ps : | -| ActiveRecordInjection.rb:102:10:102:15 | call to params : | ActiveRecordInjection.rb:102:5:102:6 | ps : | -| ActiveRecordInjection.rb:103:5:103:7 | uid : | ActiveRecordInjection.rb:104:5:104:9 | uidEq : | -| ActiveRecordInjection.rb:103:11:103:12 | ps : | ActiveRecordInjection.rb:103:11:103:17 | ...[...] : | -| ActiveRecordInjection.rb:103:11:103:17 | ...[...] : | ActiveRecordInjection.rb:103:5:103:7 | uid : | -| ActiveRecordInjection.rb:104:5:104:9 | uidEq : | ActiveRecordInjection.rb:108:20:108:32 | ... + ... | -| ActiveRecordInjection.rb:141:21:141:26 | call to params : | ActiveRecordInjection.rb:141:21:141:44 | ...[...] : | -| ActiveRecordInjection.rb:141:21:141:44 | ...[...] : | ActiveRecordInjection.rb:20:22:20:30 | condition : | -| ActiveRecordInjection.rb:155:59:155:64 | call to params : | ActiveRecordInjection.rb:155:59:155:74 | ...[...] : | -| ActiveRecordInjection.rb:155:59:155:74 | ...[...] : | ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | -| ActiveRecordInjection.rb:166:5:166:13 | my_params : | ActiveRecordInjection.rb:167:47:167:55 | my_params : | -| ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params : | ActiveRecordInjection.rb:166:5:166:13 | my_params : | -| ActiveRecordInjection.rb:167:5:167:9 | query : | ActiveRecordInjection.rb:168:37:168:41 | query | -| ActiveRecordInjection.rb:167:47:167:55 | my_params : | ActiveRecordInjection.rb:167:47:167:65 | ...[...] : | -| ActiveRecordInjection.rb:167:47:167:65 | ...[...] : | ActiveRecordInjection.rb:167:5:167:9 | query : | -| ActiveRecordInjection.rb:173:5:173:10 | call to params : | ActiveRecordInjection.rb:173:5:173:27 | call to require : | -| ActiveRecordInjection.rb:173:5:173:27 | call to require : | ActiveRecordInjection.rb:173:5:173:59 | call to permit : | -| ActiveRecordInjection.rb:173:5:173:59 | call to permit : | ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params : | -| ActiveRecordInjection.rb:173:5:173:59 | call to permit : | ActiveRecordInjection.rb:177:77:177:92 | call to permitted_params : | -| ActiveRecordInjection.rb:173:5:173:59 | call to permit : | ActiveRecordInjection.rb:178:69:178:84 | call to permitted_params : | -| ActiveRecordInjection.rb:177:77:177:92 | call to permitted_params : | ActiveRecordInjection.rb:177:77:177:102 | ...[...] : | -| ActiveRecordInjection.rb:177:77:177:102 | ...[...] : | ActiveRecordInjection.rb:177:43:177:104 | "SELECT * FROM users WHERE id ..." | -| ActiveRecordInjection.rb:178:69:178:84 | call to permitted_params : | ActiveRecordInjection.rb:178:69:178:94 | ...[...] : | -| ActiveRecordInjection.rb:178:69:178:94 | ...[...] : | ActiveRecordInjection.rb:178:35:178:96 | "SELECT * FROM users WHERE id ..." | -| ArelInjection.rb:4:5:4:8 | name : | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | -| ArelInjection.rb:4:12:4:17 | call to params : | ArelInjection.rb:4:12:4:29 | ...[...] : | -| ArelInjection.rb:4:12:4:29 | ...[...] : | ArelInjection.rb:4:5:4:8 | name : | +| ActiveRecordInjection.rb:8:25:8:28 | name | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | +| ActiveRecordInjection.rb:8:31:8:34 | pass | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | +| ActiveRecordInjection.rb:20:22:20:30 | condition | ActiveRecordInjection.rb:23:16:23:24 | condition | +| ActiveRecordInjection.rb:35:30:35:35 | call to params | ActiveRecordInjection.rb:35:30:35:44 | ...[...] | +| ActiveRecordInjection.rb:39:18:39:23 | call to params | ActiveRecordInjection.rb:39:18:39:32 | ...[...] | +| ActiveRecordInjection.rb:43:29:43:34 | call to params | ActiveRecordInjection.rb:43:29:43:39 | ...[...] | +| ActiveRecordInjection.rb:43:29:43:39 | ...[...] | ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | +| ActiveRecordInjection.rb:48:30:48:35 | call to params | ActiveRecordInjection.rb:48:30:48:40 | ...[...] | +| ActiveRecordInjection.rb:48:30:48:40 | ...[...] | ActiveRecordInjection.rb:48:21:48:43 | "id = '#{...}'" | +| ActiveRecordInjection.rb:52:31:52:36 | call to params | ActiveRecordInjection.rb:52:31:52:41 | ...[...] | +| ActiveRecordInjection.rb:52:31:52:41 | ...[...] | ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | +| ActiveRecordInjection.rb:57:32:57:37 | call to params | ActiveRecordInjection.rb:57:32:57:42 | ...[...] | +| ActiveRecordInjection.rb:57:32:57:42 | ...[...] | ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | +| ActiveRecordInjection.rb:62:21:62:26 | call to params | ActiveRecordInjection.rb:62:21:62:35 | ...[...] | +| ActiveRecordInjection.rb:62:21:62:35 | ...[...] | ActiveRecordInjection.rb:61:16:61:21 | <<-SQL | +| ActiveRecordInjection.rb:68:34:68:39 | call to params | ActiveRecordInjection.rb:68:34:68:44 | ...[...] | +| ActiveRecordInjection.rb:68:34:68:44 | ...[...] | ActiveRecordInjection.rb:68:20:68:47 | "user.id = '#{...}'" | +| ActiveRecordInjection.rb:70:23:70:28 | call to params | ActiveRecordInjection.rb:70:23:70:35 | ...[...] | +| ActiveRecordInjection.rb:70:23:70:35 | ...[...] | ActiveRecordInjection.rb:8:25:8:28 | name | +| ActiveRecordInjection.rb:70:38:70:43 | call to params | ActiveRecordInjection.rb:70:38:70:50 | ...[...] | +| ActiveRecordInjection.rb:70:38:70:50 | ...[...] | ActiveRecordInjection.rb:8:31:8:34 | pass | +| ActiveRecordInjection.rb:74:41:74:46 | call to params | ActiveRecordInjection.rb:74:41:74:51 | ...[...] | +| ActiveRecordInjection.rb:74:41:74:51 | ...[...] | ActiveRecordInjection.rb:74:32:74:54 | "id = '#{...}'" | +| ActiveRecordInjection.rb:83:17:83:22 | call to params | ActiveRecordInjection.rb:83:17:83:31 | ...[...] | +| ActiveRecordInjection.rb:84:19:84:24 | call to params | ActiveRecordInjection.rb:84:19:84:33 | ...[...] | +| ActiveRecordInjection.rb:88:18:88:23 | call to params | ActiveRecordInjection.rb:88:18:88:35 | ...[...] | +| ActiveRecordInjection.rb:92:21:92:26 | call to params | ActiveRecordInjection.rb:92:21:92:35 | ...[...] | +| ActiveRecordInjection.rb:94:18:94:23 | call to params | ActiveRecordInjection.rb:94:18:94:35 | ...[...] | +| ActiveRecordInjection.rb:96:23:96:28 | call to params | ActiveRecordInjection.rb:96:23:96:47 | ...[...] | +| ActiveRecordInjection.rb:102:5:102:6 | ps | ActiveRecordInjection.rb:103:11:103:12 | ps | +| ActiveRecordInjection.rb:102:10:102:15 | call to params | ActiveRecordInjection.rb:102:5:102:6 | ps | +| ActiveRecordInjection.rb:103:5:103:7 | uid | ActiveRecordInjection.rb:104:5:104:9 | uidEq | +| ActiveRecordInjection.rb:103:11:103:12 | ps | ActiveRecordInjection.rb:103:11:103:17 | ...[...] | +| ActiveRecordInjection.rb:103:11:103:17 | ...[...] | ActiveRecordInjection.rb:103:5:103:7 | uid | +| ActiveRecordInjection.rb:104:5:104:9 | uidEq | ActiveRecordInjection.rb:108:20:108:32 | ... + ... | +| ActiveRecordInjection.rb:141:21:141:26 | call to params | ActiveRecordInjection.rb:141:21:141:44 | ...[...] | +| ActiveRecordInjection.rb:141:21:141:44 | ...[...] | ActiveRecordInjection.rb:20:22:20:30 | condition | +| ActiveRecordInjection.rb:155:59:155:64 | call to params | ActiveRecordInjection.rb:155:59:155:74 | ...[...] | +| ActiveRecordInjection.rb:155:59:155:74 | ...[...] | ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | +| ActiveRecordInjection.rb:166:5:166:13 | my_params | ActiveRecordInjection.rb:167:47:167:55 | my_params | +| ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params | ActiveRecordInjection.rb:166:5:166:13 | my_params | +| ActiveRecordInjection.rb:167:5:167:9 | query | ActiveRecordInjection.rb:168:37:168:41 | query | +| ActiveRecordInjection.rb:167:47:167:55 | my_params | ActiveRecordInjection.rb:167:47:167:65 | ...[...] | +| ActiveRecordInjection.rb:167:47:167:65 | ...[...] | ActiveRecordInjection.rb:167:5:167:9 | query | +| ActiveRecordInjection.rb:173:5:173:10 | call to params | ActiveRecordInjection.rb:173:5:173:27 | call to require | +| ActiveRecordInjection.rb:173:5:173:27 | call to require | ActiveRecordInjection.rb:173:5:173:59 | call to permit | +| ActiveRecordInjection.rb:173:5:173:59 | call to permit | ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params | +| ActiveRecordInjection.rb:173:5:173:59 | call to permit | ActiveRecordInjection.rb:177:77:177:92 | call to permitted_params | +| ActiveRecordInjection.rb:173:5:173:59 | call to permit | ActiveRecordInjection.rb:178:69:178:84 | call to permitted_params | +| ActiveRecordInjection.rb:177:77:177:92 | call to permitted_params | ActiveRecordInjection.rb:177:77:177:102 | ...[...] | +| ActiveRecordInjection.rb:177:77:177:102 | ...[...] | ActiveRecordInjection.rb:177:43:177:104 | "SELECT * FROM users WHERE id ..." | +| ActiveRecordInjection.rb:178:69:178:84 | call to permitted_params | ActiveRecordInjection.rb:178:69:178:94 | ...[...] | +| ActiveRecordInjection.rb:178:69:178:94 | ...[...] | ActiveRecordInjection.rb:178:35:178:96 | "SELECT * FROM users WHERE id ..." | +| ArelInjection.rb:4:5:4:8 | name | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | +| ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:4:12:4:29 | ...[...] | +| ArelInjection.rb:4:12:4:29 | ...[...] | ArelInjection.rb:4:5:4:8 | name | nodes -| ActiveRecordInjection.rb:8:25:8:28 | name : | semmle.label | name : | -| ActiveRecordInjection.rb:8:31:8:34 | pass : | semmle.label | pass : | +| ActiveRecordInjection.rb:8:25:8:28 | name | semmle.label | name | +| ActiveRecordInjection.rb:8:31:8:34 | pass | semmle.label | pass | | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | semmle.label | "name='#{...}' and pass='#{...}'" | -| ActiveRecordInjection.rb:20:22:20:30 | condition : | semmle.label | condition : | +| ActiveRecordInjection.rb:20:22:20:30 | condition | semmle.label | condition | | ActiveRecordInjection.rb:23:16:23:24 | condition | semmle.label | condition | -| ActiveRecordInjection.rb:35:30:35:35 | call to params : | semmle.label | call to params : | +| ActiveRecordInjection.rb:35:30:35:35 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:35:30:35:44 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:39:18:39:23 | call to params : | semmle.label | call to params : | +| ActiveRecordInjection.rb:39:18:39:23 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:39:18:39:32 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | semmle.label | "id = '#{...}'" | -| ActiveRecordInjection.rb:43:29:43:34 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:43:29:43:39 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:43:29:43:34 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:43:29:43:39 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:48:21:48:43 | "id = '#{...}'" | semmle.label | "id = '#{...}'" | -| ActiveRecordInjection.rb:48:30:48:35 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:48:30:48:40 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:48:30:48:35 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:48:30:48:40 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | semmle.label | "id = '#{...}'" | -| ActiveRecordInjection.rb:52:31:52:36 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:52:31:52:41 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:52:31:52:36 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:52:31:52:41 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | semmle.label | "id = '#{...}'" | -| ActiveRecordInjection.rb:57:32:57:37 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:57:32:57:42 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:57:32:57:37 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:57:32:57:42 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:61:16:61:21 | <<-SQL | semmle.label | <<-SQL | -| ActiveRecordInjection.rb:62:21:62:26 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:62:21:62:35 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:62:21:62:26 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:62:21:62:35 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:68:20:68:47 | "user.id = '#{...}'" | semmle.label | "user.id = '#{...}'" | -| ActiveRecordInjection.rb:68:34:68:39 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:68:34:68:44 | ...[...] : | semmle.label | ...[...] : | -| ActiveRecordInjection.rb:70:23:70:28 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:70:23:70:35 | ...[...] : | semmle.label | ...[...] : | -| ActiveRecordInjection.rb:70:38:70:43 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:70:38:70:50 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:68:34:68:39 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:68:34:68:44 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:70:23:70:28 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:70:23:70:35 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:70:38:70:43 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:70:38:70:50 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:74:32:74:54 | "id = '#{...}'" | semmle.label | "id = '#{...}'" | -| ActiveRecordInjection.rb:74:41:74:46 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:74:41:74:51 | ...[...] : | semmle.label | ...[...] : | -| ActiveRecordInjection.rb:83:17:83:22 | call to params : | semmle.label | call to params : | +| ActiveRecordInjection.rb:74:41:74:46 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:74:41:74:51 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:83:17:83:22 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:83:17:83:31 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:84:19:84:24 | call to params : | semmle.label | call to params : | +| ActiveRecordInjection.rb:84:19:84:24 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:84:19:84:33 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:88:18:88:23 | call to params : | semmle.label | call to params : | +| ActiveRecordInjection.rb:88:18:88:23 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:88:18:88:35 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:92:21:92:26 | call to params : | semmle.label | call to params : | +| ActiveRecordInjection.rb:92:21:92:26 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:92:21:92:35 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:94:18:94:23 | call to params : | semmle.label | call to params : | +| ActiveRecordInjection.rb:94:18:94:23 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:94:18:94:35 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:96:23:96:28 | call to params : | semmle.label | call to params : | +| ActiveRecordInjection.rb:96:23:96:28 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:96:23:96:47 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:102:5:102:6 | ps : | semmle.label | ps : | -| ActiveRecordInjection.rb:102:10:102:15 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:103:5:103:7 | uid : | semmle.label | uid : | -| ActiveRecordInjection.rb:103:11:103:12 | ps : | semmle.label | ps : | -| ActiveRecordInjection.rb:103:11:103:17 | ...[...] : | semmle.label | ...[...] : | -| ActiveRecordInjection.rb:104:5:104:9 | uidEq : | semmle.label | uidEq : | +| ActiveRecordInjection.rb:102:5:102:6 | ps | semmle.label | ps | +| ActiveRecordInjection.rb:102:10:102:15 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:103:5:103:7 | uid | semmle.label | uid | +| ActiveRecordInjection.rb:103:11:103:12 | ps | semmle.label | ps | +| ActiveRecordInjection.rb:103:11:103:17 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:104:5:104:9 | uidEq | semmle.label | uidEq | | ActiveRecordInjection.rb:108:20:108:32 | ... + ... | semmle.label | ... + ... | -| ActiveRecordInjection.rb:141:21:141:26 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:141:21:141:44 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:141:21:141:26 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:141:21:141:44 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | semmle.label | "this is an unsafe annotation:..." | -| ActiveRecordInjection.rb:155:59:155:64 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:155:59:155:74 | ...[...] : | semmle.label | ...[...] : | -| ActiveRecordInjection.rb:166:5:166:13 | my_params : | semmle.label | my_params : | -| ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params : | semmle.label | call to permitted_params : | -| ActiveRecordInjection.rb:167:5:167:9 | query : | semmle.label | query : | -| ActiveRecordInjection.rb:167:47:167:55 | my_params : | semmle.label | my_params : | -| ActiveRecordInjection.rb:167:47:167:65 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:155:59:155:64 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:155:59:155:74 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:166:5:166:13 | my_params | semmle.label | my_params | +| ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params | semmle.label | call to permitted_params | +| ActiveRecordInjection.rb:167:5:167:9 | query | semmle.label | query | +| ActiveRecordInjection.rb:167:47:167:55 | my_params | semmle.label | my_params | +| ActiveRecordInjection.rb:167:47:167:65 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:168:37:168:41 | query | semmle.label | query | -| ActiveRecordInjection.rb:173:5:173:10 | call to params : | semmle.label | call to params : | -| ActiveRecordInjection.rb:173:5:173:27 | call to require : | semmle.label | call to require : | -| ActiveRecordInjection.rb:173:5:173:59 | call to permit : | semmle.label | call to permit : | +| ActiveRecordInjection.rb:173:5:173:10 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:173:5:173:27 | call to require | semmle.label | call to require | +| ActiveRecordInjection.rb:173:5:173:59 | call to permit | semmle.label | call to permit | | ActiveRecordInjection.rb:177:43:177:104 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | -| ActiveRecordInjection.rb:177:77:177:92 | call to permitted_params : | semmle.label | call to permitted_params : | -| ActiveRecordInjection.rb:177:77:177:102 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:177:77:177:92 | call to permitted_params | semmle.label | call to permitted_params | +| ActiveRecordInjection.rb:177:77:177:102 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:178:35:178:96 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | -| ActiveRecordInjection.rb:178:69:178:84 | call to permitted_params : | semmle.label | call to permitted_params : | -| ActiveRecordInjection.rb:178:69:178:94 | ...[...] : | semmle.label | ...[...] : | -| ArelInjection.rb:4:5:4:8 | name : | semmle.label | name : | -| ArelInjection.rb:4:12:4:17 | call to params : | semmle.label | call to params : | -| ArelInjection.rb:4:12:4:29 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:178:69:178:84 | call to permitted_params | semmle.label | call to permitted_params | +| ActiveRecordInjection.rb:178:69:178:94 | ...[...] | semmle.label | ...[...] | +| ArelInjection.rb:4:5:4:8 | name | semmle.label | name | +| ArelInjection.rb:4:12:4:17 | call to params | semmle.label | call to params | +| ArelInjection.rb:4:12:4:29 | ...[...] | semmle.label | ...[...] | | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." | subpaths #select -| ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | ActiveRecordInjection.rb:70:23:70:28 | call to params : | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:70:23:70:28 | call to params | user-provided value | -| ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | ActiveRecordInjection.rb:70:38:70:43 | call to params : | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:70:38:70:43 | call to params | user-provided value | -| ActiveRecordInjection.rb:23:16:23:24 | condition | ActiveRecordInjection.rb:141:21:141:26 | call to params : | ActiveRecordInjection.rb:23:16:23:24 | condition | This SQL query depends on a $@. | ActiveRecordInjection.rb:141:21:141:26 | call to params | user-provided value | -| ActiveRecordInjection.rb:35:30:35:44 | ...[...] | ActiveRecordInjection.rb:35:30:35:35 | call to params : | ActiveRecordInjection.rb:35:30:35:44 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:35:30:35:35 | call to params | user-provided value | -| ActiveRecordInjection.rb:39:18:39:32 | ...[...] | ActiveRecordInjection.rb:39:18:39:23 | call to params : | ActiveRecordInjection.rb:39:18:39:32 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:39:18:39:23 | call to params | user-provided value | -| ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | ActiveRecordInjection.rb:43:29:43:34 | call to params : | ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:43:29:43:34 | call to params | user-provided value | -| ActiveRecordInjection.rb:48:21:48:43 | "id = '#{...}'" | ActiveRecordInjection.rb:48:30:48:35 | call to params : | ActiveRecordInjection.rb:48:21:48:43 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:48:30:48:35 | call to params | user-provided value | -| ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | ActiveRecordInjection.rb:52:31:52:36 | call to params : | ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:52:31:52:36 | call to params | user-provided value | -| ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | ActiveRecordInjection.rb:57:32:57:37 | call to params : | ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:57:32:57:37 | call to params | user-provided value | -| ActiveRecordInjection.rb:61:16:61:21 | <<-SQL | ActiveRecordInjection.rb:62:21:62:26 | call to params : | ActiveRecordInjection.rb:61:16:61:21 | <<-SQL | This SQL query depends on a $@. | ActiveRecordInjection.rb:62:21:62:26 | call to params | user-provided value | -| ActiveRecordInjection.rb:68:20:68:47 | "user.id = '#{...}'" | ActiveRecordInjection.rb:68:34:68:39 | call to params : | ActiveRecordInjection.rb:68:20:68:47 | "user.id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:68:34:68:39 | call to params | user-provided value | -| ActiveRecordInjection.rb:74:32:74:54 | "id = '#{...}'" | ActiveRecordInjection.rb:74:41:74:46 | call to params : | ActiveRecordInjection.rb:74:32:74:54 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:74:41:74:46 | call to params | user-provided value | -| ActiveRecordInjection.rb:83:17:83:31 | ...[...] | ActiveRecordInjection.rb:83:17:83:22 | call to params : | ActiveRecordInjection.rb:83:17:83:31 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:83:17:83:22 | call to params | user-provided value | -| ActiveRecordInjection.rb:84:19:84:33 | ...[...] | ActiveRecordInjection.rb:84:19:84:24 | call to params : | ActiveRecordInjection.rb:84:19:84:33 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:84:19:84:24 | call to params | user-provided value | -| ActiveRecordInjection.rb:88:18:88:35 | ...[...] | ActiveRecordInjection.rb:88:18:88:23 | call to params : | ActiveRecordInjection.rb:88:18:88:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:88:18:88:23 | call to params | user-provided value | -| ActiveRecordInjection.rb:92:21:92:35 | ...[...] | ActiveRecordInjection.rb:92:21:92:26 | call to params : | ActiveRecordInjection.rb:92:21:92:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:92:21:92:26 | call to params | user-provided value | -| ActiveRecordInjection.rb:94:18:94:35 | ...[...] | ActiveRecordInjection.rb:94:18:94:23 | call to params : | ActiveRecordInjection.rb:94:18:94:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:94:18:94:23 | call to params | user-provided value | -| ActiveRecordInjection.rb:96:23:96:47 | ...[...] | ActiveRecordInjection.rb:96:23:96:28 | call to params : | ActiveRecordInjection.rb:96:23:96:47 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:96:23:96:28 | call to params | user-provided value | -| ActiveRecordInjection.rb:108:20:108:32 | ... + ... | ActiveRecordInjection.rb:102:10:102:15 | call to params : | ActiveRecordInjection.rb:108:20:108:32 | ... + ... | This SQL query depends on a $@. | ActiveRecordInjection.rb:102:10:102:15 | call to params | user-provided value | -| ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | ActiveRecordInjection.rb:155:59:155:64 | call to params : | ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:155:59:155:64 | call to params | user-provided value | -| ActiveRecordInjection.rb:168:37:168:41 | query | ActiveRecordInjection.rb:173:5:173:10 | call to params : | ActiveRecordInjection.rb:168:37:168:41 | query | This SQL query depends on a $@. | ActiveRecordInjection.rb:173:5:173:10 | call to params | user-provided value | -| ActiveRecordInjection.rb:177:43:177:104 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:173:5:173:10 | call to params : | ActiveRecordInjection.rb:177:43:177:104 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:173:5:173:10 | call to params | user-provided value | -| ActiveRecordInjection.rb:178:35:178:96 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:173:5:173:10 | call to params : | ActiveRecordInjection.rb:178:35:178:96 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:173:5:173:10 | call to params | user-provided value | -| ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:4:12:4:17 | call to params : | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:4:12:4:17 | call to params | user-provided value | +| ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | ActiveRecordInjection.rb:70:23:70:28 | call to params | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:70:23:70:28 | call to params | user-provided value | +| ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | ActiveRecordInjection.rb:70:38:70:43 | call to params | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:70:38:70:43 | call to params | user-provided value | +| ActiveRecordInjection.rb:23:16:23:24 | condition | ActiveRecordInjection.rb:141:21:141:26 | call to params | ActiveRecordInjection.rb:23:16:23:24 | condition | This SQL query depends on a $@. | ActiveRecordInjection.rb:141:21:141:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:35:30:35:44 | ...[...] | ActiveRecordInjection.rb:35:30:35:35 | call to params | ActiveRecordInjection.rb:35:30:35:44 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:35:30:35:35 | call to params | user-provided value | +| ActiveRecordInjection.rb:39:18:39:32 | ...[...] | ActiveRecordInjection.rb:39:18:39:23 | call to params | ActiveRecordInjection.rb:39:18:39:32 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:39:18:39:23 | call to params | user-provided value | +| ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | ActiveRecordInjection.rb:43:29:43:34 | call to params | ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:43:29:43:34 | call to params | user-provided value | +| ActiveRecordInjection.rb:48:21:48:43 | "id = '#{...}'" | ActiveRecordInjection.rb:48:30:48:35 | call to params | ActiveRecordInjection.rb:48:21:48:43 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:48:30:48:35 | call to params | user-provided value | +| ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | ActiveRecordInjection.rb:52:31:52:36 | call to params | ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:52:31:52:36 | call to params | user-provided value | +| ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | ActiveRecordInjection.rb:57:32:57:37 | call to params | ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:57:32:57:37 | call to params | user-provided value | +| ActiveRecordInjection.rb:61:16:61:21 | <<-SQL | ActiveRecordInjection.rb:62:21:62:26 | call to params | ActiveRecordInjection.rb:61:16:61:21 | <<-SQL | This SQL query depends on a $@. | ActiveRecordInjection.rb:62:21:62:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:68:20:68:47 | "user.id = '#{...}'" | ActiveRecordInjection.rb:68:34:68:39 | call to params | ActiveRecordInjection.rb:68:20:68:47 | "user.id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:68:34:68:39 | call to params | user-provided value | +| ActiveRecordInjection.rb:74:32:74:54 | "id = '#{...}'" | ActiveRecordInjection.rb:74:41:74:46 | call to params | ActiveRecordInjection.rb:74:32:74:54 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:74:41:74:46 | call to params | user-provided value | +| ActiveRecordInjection.rb:83:17:83:31 | ...[...] | ActiveRecordInjection.rb:83:17:83:22 | call to params | ActiveRecordInjection.rb:83:17:83:31 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:83:17:83:22 | call to params | user-provided value | +| ActiveRecordInjection.rb:84:19:84:33 | ...[...] | ActiveRecordInjection.rb:84:19:84:24 | call to params | ActiveRecordInjection.rb:84:19:84:33 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:84:19:84:24 | call to params | user-provided value | +| ActiveRecordInjection.rb:88:18:88:35 | ...[...] | ActiveRecordInjection.rb:88:18:88:23 | call to params | ActiveRecordInjection.rb:88:18:88:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:88:18:88:23 | call to params | user-provided value | +| ActiveRecordInjection.rb:92:21:92:35 | ...[...] | ActiveRecordInjection.rb:92:21:92:26 | call to params | ActiveRecordInjection.rb:92:21:92:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:92:21:92:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:94:18:94:35 | ...[...] | ActiveRecordInjection.rb:94:18:94:23 | call to params | ActiveRecordInjection.rb:94:18:94:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:94:18:94:23 | call to params | user-provided value | +| ActiveRecordInjection.rb:96:23:96:47 | ...[...] | ActiveRecordInjection.rb:96:23:96:28 | call to params | ActiveRecordInjection.rb:96:23:96:47 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:96:23:96:28 | call to params | user-provided value | +| ActiveRecordInjection.rb:108:20:108:32 | ... + ... | ActiveRecordInjection.rb:102:10:102:15 | call to params | ActiveRecordInjection.rb:108:20:108:32 | ... + ... | This SQL query depends on a $@. | ActiveRecordInjection.rb:102:10:102:15 | call to params | user-provided value | +| ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | ActiveRecordInjection.rb:155:59:155:64 | call to params | ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:155:59:155:64 | call to params | user-provided value | +| ActiveRecordInjection.rb:168:37:168:41 | query | ActiveRecordInjection.rb:173:5:173:10 | call to params | ActiveRecordInjection.rb:168:37:168:41 | query | This SQL query depends on a $@. | ActiveRecordInjection.rb:173:5:173:10 | call to params | user-provided value | +| ActiveRecordInjection.rb:177:43:177:104 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:173:5:173:10 | call to params | ActiveRecordInjection.rb:177:43:177:104 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:173:5:173:10 | call to params | user-provided value | +| ActiveRecordInjection.rb:178:35:178:96 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:173:5:173:10 | call to params | ActiveRecordInjection.rb:178:35:178:96 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:173:5:173:10 | call to params | user-provided value | +| ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:4:12:4:17 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected b/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected index 0c7a63915ed..5212480064f 100644 --- a/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected @@ -1,51 +1,51 @@ edges -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:8:10:8:13 | code | -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:8:10:8:13 | code | -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:20:20:20:23 | code | -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:20:20:20:23 | code | -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:23:21:23:24 | code | -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:23:21:23:24 | code | -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:29:15:29:18 | code | -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:32:19:32:22 | code | -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:38:24:38:27 | code : | -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:38:24:38:27 | code : | -| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:41:40:41:43 | code | -| CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:5:12:5:24 | ...[...] : | -| CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:5:12:5:24 | ...[...] : | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:5:5:5:8 | code : | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:5:5:5:8 | code : | -| CodeInjection.rb:38:24:38:27 | code : | CodeInjection.rb:38:10:38:28 | call to escape | -| CodeInjection.rb:38:24:38:27 | code : | CodeInjection.rb:38:10:38:28 | call to escape | -| CodeInjection.rb:78:5:78:8 | code : | CodeInjection.rb:80:16:80:19 | code | -| CodeInjection.rb:78:5:78:8 | code : | CodeInjection.rb:86:10:86:37 | ... + ... | -| CodeInjection.rb:78:5:78:8 | code : | CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | -| CodeInjection.rb:78:5:78:8 | code : | CodeInjection.rb:90:10:90:13 | code | -| CodeInjection.rb:78:5:78:8 | code : | CodeInjection.rb:90:10:90:13 | code | -| CodeInjection.rb:78:12:78:17 | call to params : | CodeInjection.rb:78:12:78:24 | ...[...] : | -| CodeInjection.rb:78:12:78:17 | call to params : | CodeInjection.rb:78:12:78:24 | ...[...] : | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:78:5:78:8 | code : | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:78:5:78:8 | code : | -| CodeInjection.rb:101:3:102:5 | self in index [@foo] : | CodeInjection.rb:111:3:113:5 | self in baz [@foo] : | -| CodeInjection.rb:101:3:102:5 | self in index [@foo] : | CodeInjection.rb:111:3:113:5 | self in baz [@foo] : | -| CodeInjection.rb:105:5:105:8 | [post] self [@foo] : | CodeInjection.rb:108:3:109:5 | self in bar [@foo] : | -| CodeInjection.rb:105:5:105:8 | [post] self [@foo] : | CodeInjection.rb:108:3:109:5 | self in bar [@foo] : | -| CodeInjection.rb:105:12:105:17 | call to params : | CodeInjection.rb:105:12:105:23 | ...[...] : | -| CodeInjection.rb:105:12:105:17 | call to params : | CodeInjection.rb:105:12:105:23 | ...[...] : | -| CodeInjection.rb:105:12:105:23 | ...[...] : | CodeInjection.rb:105:5:105:8 | [post] self [@foo] : | -| CodeInjection.rb:105:12:105:23 | ...[...] : | CodeInjection.rb:105:5:105:8 | [post] self [@foo] : | -| CodeInjection.rb:108:3:109:5 | self in bar [@foo] : | CodeInjection.rb:101:3:102:5 | self in index [@foo] : | -| CodeInjection.rb:108:3:109:5 | self in bar [@foo] : | CodeInjection.rb:101:3:102:5 | self in index [@foo] : | -| CodeInjection.rb:111:3:113:5 | self in baz [@foo] : | CodeInjection.rb:112:10:112:13 | self [@foo] : | -| CodeInjection.rb:111:3:113:5 | self in baz [@foo] : | CodeInjection.rb:112:10:112:13 | self [@foo] : | -| CodeInjection.rb:112:10:112:13 | self [@foo] : | CodeInjection.rb:112:10:112:13 | @foo | -| CodeInjection.rb:112:10:112:13 | self [@foo] : | CodeInjection.rb:112:10:112:13 | @foo | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:8:10:8:13 | code | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:8:10:8:13 | code | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:20:20:20:23 | code | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:20:20:20:23 | code | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:23:21:23:24 | code | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:23:21:23:24 | code | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:29:15:29:18 | code | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:32:19:32:22 | code | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:38:24:38:27 | code | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:38:24:38:27 | code | +| CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:41:40:41:43 | code | +| CodeInjection.rb:5:12:5:17 | call to params | CodeInjection.rb:5:12:5:24 | ...[...] | +| CodeInjection.rb:5:12:5:17 | call to params | CodeInjection.rb:5:12:5:24 | ...[...] | +| CodeInjection.rb:5:12:5:24 | ...[...] | CodeInjection.rb:5:5:5:8 | code | +| CodeInjection.rb:5:12:5:24 | ...[...] | CodeInjection.rb:5:5:5:8 | code | +| CodeInjection.rb:38:24:38:27 | code | CodeInjection.rb:38:10:38:28 | call to escape | +| CodeInjection.rb:38:24:38:27 | code | CodeInjection.rb:38:10:38:28 | call to escape | +| CodeInjection.rb:78:5:78:8 | code | CodeInjection.rb:80:16:80:19 | code | +| CodeInjection.rb:78:5:78:8 | code | CodeInjection.rb:86:10:86:37 | ... + ... | +| CodeInjection.rb:78:5:78:8 | code | CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | +| CodeInjection.rb:78:5:78:8 | code | CodeInjection.rb:90:10:90:13 | code | +| CodeInjection.rb:78:5:78:8 | code | CodeInjection.rb:90:10:90:13 | code | +| CodeInjection.rb:78:12:78:17 | call to params | CodeInjection.rb:78:12:78:24 | ...[...] | +| CodeInjection.rb:78:12:78:17 | call to params | CodeInjection.rb:78:12:78:24 | ...[...] | +| CodeInjection.rb:78:12:78:24 | ...[...] | CodeInjection.rb:78:5:78:8 | code | +| CodeInjection.rb:78:12:78:24 | ...[...] | CodeInjection.rb:78:5:78:8 | code | +| CodeInjection.rb:101:3:102:5 | self in index [@foo] | CodeInjection.rb:111:3:113:5 | self in baz [@foo] | +| CodeInjection.rb:101:3:102:5 | self in index [@foo] | CodeInjection.rb:111:3:113:5 | self in baz [@foo] | +| CodeInjection.rb:105:5:105:8 | [post] self [@foo] | CodeInjection.rb:108:3:109:5 | self in bar [@foo] | +| CodeInjection.rb:105:5:105:8 | [post] self [@foo] | CodeInjection.rb:108:3:109:5 | self in bar [@foo] | +| CodeInjection.rb:105:12:105:17 | call to params | CodeInjection.rb:105:12:105:23 | ...[...] | +| CodeInjection.rb:105:12:105:17 | call to params | CodeInjection.rb:105:12:105:23 | ...[...] | +| CodeInjection.rb:105:12:105:23 | ...[...] | CodeInjection.rb:105:5:105:8 | [post] self [@foo] | +| CodeInjection.rb:105:12:105:23 | ...[...] | CodeInjection.rb:105:5:105:8 | [post] self [@foo] | +| CodeInjection.rb:108:3:109:5 | self in bar [@foo] | CodeInjection.rb:101:3:102:5 | self in index [@foo] | +| CodeInjection.rb:108:3:109:5 | self in bar [@foo] | CodeInjection.rb:101:3:102:5 | self in index [@foo] | +| CodeInjection.rb:111:3:113:5 | self in baz [@foo] | CodeInjection.rb:112:10:112:13 | self [@foo] | +| CodeInjection.rb:111:3:113:5 | self in baz [@foo] | CodeInjection.rb:112:10:112:13 | self [@foo] | +| CodeInjection.rb:112:10:112:13 | self [@foo] | CodeInjection.rb:112:10:112:13 | @foo | +| CodeInjection.rb:112:10:112:13 | self [@foo] | CodeInjection.rb:112:10:112:13 | @foo | nodes -| CodeInjection.rb:5:5:5:8 | code : | semmle.label | code : | -| CodeInjection.rb:5:5:5:8 | code : | semmle.label | code : | -| CodeInjection.rb:5:12:5:17 | call to params : | semmle.label | call to params : | -| CodeInjection.rb:5:12:5:17 | call to params : | semmle.label | call to params : | -| CodeInjection.rb:5:12:5:24 | ...[...] : | semmle.label | ...[...] : | -| CodeInjection.rb:5:12:5:24 | ...[...] : | semmle.label | ...[...] : | +| CodeInjection.rb:5:5:5:8 | code | semmle.label | code | +| CodeInjection.rb:5:5:5:8 | code | semmle.label | code | +| CodeInjection.rb:5:12:5:17 | call to params | semmle.label | call to params | +| CodeInjection.rb:5:12:5:17 | call to params | semmle.label | call to params | +| CodeInjection.rb:5:12:5:24 | ...[...] | semmle.label | ...[...] | +| CodeInjection.rb:5:12:5:24 | ...[...] | semmle.label | ...[...] | | CodeInjection.rb:8:10:8:13 | code | semmle.label | code | | CodeInjection.rb:8:10:8:13 | code | semmle.label | code | | CodeInjection.rb:11:10:11:15 | call to params | semmle.label | call to params | @@ -58,48 +58,48 @@ nodes | CodeInjection.rb:32:19:32:22 | code | semmle.label | code | | CodeInjection.rb:38:10:38:28 | call to escape | semmle.label | call to escape | | CodeInjection.rb:38:10:38:28 | call to escape | semmle.label | call to escape | -| CodeInjection.rb:38:24:38:27 | code : | semmle.label | code : | -| CodeInjection.rb:38:24:38:27 | code : | semmle.label | code : | +| CodeInjection.rb:38:24:38:27 | code | semmle.label | code | +| CodeInjection.rb:38:24:38:27 | code | semmle.label | code | | CodeInjection.rb:41:40:41:43 | code | semmle.label | code | -| CodeInjection.rb:78:5:78:8 | code : | semmle.label | code : | -| CodeInjection.rb:78:5:78:8 | code : | semmle.label | code : | -| CodeInjection.rb:78:12:78:17 | call to params : | semmle.label | call to params : | -| CodeInjection.rb:78:12:78:17 | call to params : | semmle.label | call to params : | -| CodeInjection.rb:78:12:78:24 | ...[...] : | semmle.label | ...[...] : | -| CodeInjection.rb:78:12:78:24 | ...[...] : | semmle.label | ...[...] : | +| CodeInjection.rb:78:5:78:8 | code | semmle.label | code | +| CodeInjection.rb:78:5:78:8 | code | semmle.label | code | +| CodeInjection.rb:78:12:78:17 | call to params | semmle.label | call to params | +| CodeInjection.rb:78:12:78:17 | call to params | semmle.label | call to params | +| CodeInjection.rb:78:12:78:24 | ...[...] | semmle.label | ...[...] | +| CodeInjection.rb:78:12:78:24 | ...[...] | semmle.label | ...[...] | | CodeInjection.rb:80:16:80:19 | code | semmle.label | code | | CodeInjection.rb:86:10:86:37 | ... + ... | semmle.label | ... + ... | | CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | semmle.label | "prefix_#{...}_suffix" | | CodeInjection.rb:90:10:90:13 | code | semmle.label | code | | CodeInjection.rb:90:10:90:13 | code | semmle.label | code | -| CodeInjection.rb:101:3:102:5 | self in index [@foo] : | semmle.label | self in index [@foo] : | -| CodeInjection.rb:101:3:102:5 | self in index [@foo] : | semmle.label | self in index [@foo] : | -| CodeInjection.rb:105:5:105:8 | [post] self [@foo] : | semmle.label | [post] self [@foo] : | -| CodeInjection.rb:105:5:105:8 | [post] self [@foo] : | semmle.label | [post] self [@foo] : | -| CodeInjection.rb:105:12:105:17 | call to params : | semmle.label | call to params : | -| CodeInjection.rb:105:12:105:17 | call to params : | semmle.label | call to params : | -| CodeInjection.rb:105:12:105:23 | ...[...] : | semmle.label | ...[...] : | -| CodeInjection.rb:105:12:105:23 | ...[...] : | semmle.label | ...[...] : | -| CodeInjection.rb:108:3:109:5 | self in bar [@foo] : | semmle.label | self in bar [@foo] : | -| CodeInjection.rb:108:3:109:5 | self in bar [@foo] : | semmle.label | self in bar [@foo] : | -| CodeInjection.rb:111:3:113:5 | self in baz [@foo] : | semmle.label | self in baz [@foo] : | -| CodeInjection.rb:111:3:113:5 | self in baz [@foo] : | semmle.label | self in baz [@foo] : | +| CodeInjection.rb:101:3:102:5 | self in index [@foo] | semmle.label | self in index [@foo] | +| CodeInjection.rb:101:3:102:5 | self in index [@foo] | semmle.label | self in index [@foo] | +| CodeInjection.rb:105:5:105:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | +| CodeInjection.rb:105:5:105:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | +| CodeInjection.rb:105:12:105:17 | call to params | semmle.label | call to params | +| CodeInjection.rb:105:12:105:17 | call to params | semmle.label | call to params | +| CodeInjection.rb:105:12:105:23 | ...[...] | semmle.label | ...[...] | +| CodeInjection.rb:105:12:105:23 | ...[...] | semmle.label | ...[...] | +| CodeInjection.rb:108:3:109:5 | self in bar [@foo] | semmle.label | self in bar [@foo] | +| CodeInjection.rb:108:3:109:5 | self in bar [@foo] | semmle.label | self in bar [@foo] | +| CodeInjection.rb:111:3:113:5 | self in baz [@foo] | semmle.label | self in baz [@foo] | +| CodeInjection.rb:111:3:113:5 | self in baz [@foo] | semmle.label | self in baz [@foo] | | CodeInjection.rb:112:10:112:13 | @foo | semmle.label | @foo | | CodeInjection.rb:112:10:112:13 | @foo | semmle.label | @foo | -| CodeInjection.rb:112:10:112:13 | self [@foo] : | semmle.label | self [@foo] : | -| CodeInjection.rb:112:10:112:13 | self [@foo] : | semmle.label | self [@foo] : | +| CodeInjection.rb:112:10:112:13 | self [@foo] | semmle.label | self [@foo] | +| CodeInjection.rb:112:10:112:13 | self [@foo] | semmle.label | self [@foo] | subpaths #select -| CodeInjection.rb:8:10:8:13 | code | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:8:10:8:13 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | +| CodeInjection.rb:8:10:8:13 | code | CodeInjection.rb:5:12:5:17 | call to params | CodeInjection.rb:8:10:8:13 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | | CodeInjection.rb:11:10:11:15 | call to params | CodeInjection.rb:11:10:11:15 | call to params | CodeInjection.rb:11:10:11:15 | call to params | This code execution depends on a $@. | CodeInjection.rb:11:10:11:15 | call to params | user-provided value | -| CodeInjection.rb:20:20:20:23 | code | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:20:20:20:23 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | -| CodeInjection.rb:23:21:23:24 | code | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:23:21:23:24 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | -| CodeInjection.rb:29:15:29:18 | code | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:29:15:29:18 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | -| CodeInjection.rb:32:19:32:22 | code | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:32:19:32:22 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | -| CodeInjection.rb:38:10:38:28 | call to escape | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:38:10:38:28 | call to escape | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | -| CodeInjection.rb:41:40:41:43 | code | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:41:40:41:43 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | -| CodeInjection.rb:80:16:80:19 | code | CodeInjection.rb:78:12:78:17 | call to params : | CodeInjection.rb:80:16:80:19 | code | This code execution depends on a $@. | CodeInjection.rb:78:12:78:17 | call to params | user-provided value | -| CodeInjection.rb:86:10:86:37 | ... + ... | CodeInjection.rb:78:12:78:17 | call to params : | CodeInjection.rb:86:10:86:37 | ... + ... | This code execution depends on a $@. | CodeInjection.rb:78:12:78:17 | call to params | user-provided value | -| CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | CodeInjection.rb:78:12:78:17 | call to params : | CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | This code execution depends on a $@. | CodeInjection.rb:78:12:78:17 | call to params | user-provided value | -| CodeInjection.rb:90:10:90:13 | code | CodeInjection.rb:78:12:78:17 | call to params : | CodeInjection.rb:90:10:90:13 | code | This code execution depends on a $@. | CodeInjection.rb:78:12:78:17 | call to params | user-provided value | -| CodeInjection.rb:112:10:112:13 | @foo | CodeInjection.rb:105:12:105:17 | call to params : | CodeInjection.rb:112:10:112:13 | @foo | This code execution depends on a $@. | CodeInjection.rb:105:12:105:17 | call to params | user-provided value | +| CodeInjection.rb:20:20:20:23 | code | CodeInjection.rb:5:12:5:17 | call to params | CodeInjection.rb:20:20:20:23 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | +| CodeInjection.rb:23:21:23:24 | code | CodeInjection.rb:5:12:5:17 | call to params | CodeInjection.rb:23:21:23:24 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | +| CodeInjection.rb:29:15:29:18 | code | CodeInjection.rb:5:12:5:17 | call to params | CodeInjection.rb:29:15:29:18 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | +| CodeInjection.rb:32:19:32:22 | code | CodeInjection.rb:5:12:5:17 | call to params | CodeInjection.rb:32:19:32:22 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | +| CodeInjection.rb:38:10:38:28 | call to escape | CodeInjection.rb:5:12:5:17 | call to params | CodeInjection.rb:38:10:38:28 | call to escape | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | +| CodeInjection.rb:41:40:41:43 | code | CodeInjection.rb:5:12:5:17 | call to params | CodeInjection.rb:41:40:41:43 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | +| CodeInjection.rb:80:16:80:19 | code | CodeInjection.rb:78:12:78:17 | call to params | CodeInjection.rb:80:16:80:19 | code | This code execution depends on a $@. | CodeInjection.rb:78:12:78:17 | call to params | user-provided value | +| CodeInjection.rb:86:10:86:37 | ... + ... | CodeInjection.rb:78:12:78:17 | call to params | CodeInjection.rb:86:10:86:37 | ... + ... | This code execution depends on a $@. | CodeInjection.rb:78:12:78:17 | call to params | user-provided value | +| CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | CodeInjection.rb:78:12:78:17 | call to params | CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | This code execution depends on a $@. | CodeInjection.rb:78:12:78:17 | call to params | user-provided value | +| CodeInjection.rb:90:10:90:13 | code | CodeInjection.rb:78:12:78:17 | call to params | CodeInjection.rb:90:10:90:13 | code | This code execution depends on a $@. | CodeInjection.rb:78:12:78:17 | call to params | user-provided value | +| CodeInjection.rb:112:10:112:13 | @foo | CodeInjection.rb:105:12:105:17 | call to params | CodeInjection.rb:112:10:112:13 | @foo | This code execution depends on a $@. | CodeInjection.rb:105:12:105:17 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected b/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected index f57dd6a3e88..716cf5591f9 100644 --- a/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected +++ b/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected @@ -1,69 +1,69 @@ edges -| impl/unsafeCode.rb:2:12:2:17 | target : | impl/unsafeCode.rb:3:17:3:25 | #{...} | -| impl/unsafeCode.rb:7:12:7:12 | x : | impl/unsafeCode.rb:8:30:8:30 | x | -| impl/unsafeCode.rb:12:12:12:12 | x : | impl/unsafeCode.rb:13:33:13:33 | x | -| impl/unsafeCode.rb:28:17:28:22 | my_arr : | impl/unsafeCode.rb:29:10:29:15 | my_arr | -| impl/unsafeCode.rb:32:21:32:21 | x : | impl/unsafeCode.rb:33:12:33:12 | x : | -| impl/unsafeCode.rb:33:5:33:7 | arr [element 0] : | impl/unsafeCode.rb:34:10:34:12 | arr | -| impl/unsafeCode.rb:33:12:33:12 | x : | impl/unsafeCode.rb:33:5:33:7 | arr [element 0] : | -| impl/unsafeCode.rb:37:15:37:15 | x : | impl/unsafeCode.rb:39:14:39:14 | x : | -| impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] : | impl/unsafeCode.rb:40:10:40:12 | arr | -| impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] : | impl/unsafeCode.rb:44:10:44:12 | arr | -| impl/unsafeCode.rb:39:14:39:14 | x : | impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] : | -| impl/unsafeCode.rb:47:15:47:15 | x : | impl/unsafeCode.rb:49:9:49:12 | #{...} | -| impl/unsafeCode.rb:54:21:54:21 | x : | impl/unsafeCode.rb:55:22:55:22 | x | -| impl/unsafeCode.rb:59:21:59:21 | x : | impl/unsafeCode.rb:60:17:60:17 | x : | -| impl/unsafeCode.rb:59:24:59:24 | y : | impl/unsafeCode.rb:63:30:63:30 | y : | -| impl/unsafeCode.rb:60:5:60:7 | arr [element 0] : | impl/unsafeCode.rb:61:10:61:12 | arr | -| impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] : | impl/unsafeCode.rb:60:5:60:7 | arr [element 0] : | -| impl/unsafeCode.rb:60:17:60:17 | x : | impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] : | -| impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] : | impl/unsafeCode.rb:64:10:64:13 | arr2 | -| impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] : | impl/unsafeCode.rb:63:13:63:42 | call to join : | -| impl/unsafeCode.rb:63:13:63:42 | call to join : | impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] : | -| impl/unsafeCode.rb:63:30:63:30 | y : | impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] : | +| impl/unsafeCode.rb:2:12:2:17 | target | impl/unsafeCode.rb:3:17:3:25 | #{...} | +| impl/unsafeCode.rb:7:12:7:12 | x | impl/unsafeCode.rb:8:30:8:30 | x | +| impl/unsafeCode.rb:12:12:12:12 | x | impl/unsafeCode.rb:13:33:13:33 | x | +| impl/unsafeCode.rb:28:17:28:22 | my_arr | impl/unsafeCode.rb:29:10:29:15 | my_arr | +| impl/unsafeCode.rb:32:21:32:21 | x | impl/unsafeCode.rb:33:12:33:12 | x | +| impl/unsafeCode.rb:33:5:33:7 | arr [element 0] | impl/unsafeCode.rb:34:10:34:12 | arr | +| impl/unsafeCode.rb:33:12:33:12 | x | impl/unsafeCode.rb:33:5:33:7 | arr [element 0] | +| impl/unsafeCode.rb:37:15:37:15 | x | impl/unsafeCode.rb:39:14:39:14 | x | +| impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] | impl/unsafeCode.rb:40:10:40:12 | arr | +| impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] | impl/unsafeCode.rb:44:10:44:12 | arr | +| impl/unsafeCode.rb:39:14:39:14 | x | impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] | +| impl/unsafeCode.rb:47:15:47:15 | x | impl/unsafeCode.rb:49:9:49:12 | #{...} | +| impl/unsafeCode.rb:54:21:54:21 | x | impl/unsafeCode.rb:55:22:55:22 | x | +| impl/unsafeCode.rb:59:21:59:21 | x | impl/unsafeCode.rb:60:17:60:17 | x | +| impl/unsafeCode.rb:59:24:59:24 | y | impl/unsafeCode.rb:63:30:63:30 | y | +| impl/unsafeCode.rb:60:5:60:7 | arr [element 0] | impl/unsafeCode.rb:61:10:61:12 | arr | +| impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] | impl/unsafeCode.rb:60:5:60:7 | arr [element 0] | +| impl/unsafeCode.rb:60:17:60:17 | x | impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] | +| impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] | impl/unsafeCode.rb:64:10:64:13 | arr2 | +| impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] | impl/unsafeCode.rb:63:13:63:42 | call to join | +| impl/unsafeCode.rb:63:13:63:42 | call to join | impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] | +| impl/unsafeCode.rb:63:30:63:30 | y | impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] | nodes -| impl/unsafeCode.rb:2:12:2:17 | target : | semmle.label | target : | +| impl/unsafeCode.rb:2:12:2:17 | target | semmle.label | target | | impl/unsafeCode.rb:3:17:3:25 | #{...} | semmle.label | #{...} | -| impl/unsafeCode.rb:7:12:7:12 | x : | semmle.label | x : | +| impl/unsafeCode.rb:7:12:7:12 | x | semmle.label | x | | impl/unsafeCode.rb:8:30:8:30 | x | semmle.label | x | -| impl/unsafeCode.rb:12:12:12:12 | x : | semmle.label | x : | +| impl/unsafeCode.rb:12:12:12:12 | x | semmle.label | x | | impl/unsafeCode.rb:13:33:13:33 | x | semmle.label | x | -| impl/unsafeCode.rb:28:17:28:22 | my_arr : | semmle.label | my_arr : | +| impl/unsafeCode.rb:28:17:28:22 | my_arr | semmle.label | my_arr | | impl/unsafeCode.rb:29:10:29:15 | my_arr | semmle.label | my_arr | -| impl/unsafeCode.rb:32:21:32:21 | x : | semmle.label | x : | -| impl/unsafeCode.rb:33:5:33:7 | arr [element 0] : | semmle.label | arr [element 0] : | -| impl/unsafeCode.rb:33:12:33:12 | x : | semmle.label | x : | +| impl/unsafeCode.rb:32:21:32:21 | x | semmle.label | x | +| impl/unsafeCode.rb:33:5:33:7 | arr [element 0] | semmle.label | arr [element 0] | +| impl/unsafeCode.rb:33:12:33:12 | x | semmle.label | x | | impl/unsafeCode.rb:34:10:34:12 | arr | semmle.label | arr | -| impl/unsafeCode.rb:37:15:37:15 | x : | semmle.label | x : | -| impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] : | semmle.label | [post] arr [element] : | -| impl/unsafeCode.rb:39:14:39:14 | x : | semmle.label | x : | +| impl/unsafeCode.rb:37:15:37:15 | x | semmle.label | x | +| impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] | semmle.label | [post] arr [element] | +| impl/unsafeCode.rb:39:14:39:14 | x | semmle.label | x | | impl/unsafeCode.rb:40:10:40:12 | arr | semmle.label | arr | | impl/unsafeCode.rb:44:10:44:12 | arr | semmle.label | arr | -| impl/unsafeCode.rb:47:15:47:15 | x : | semmle.label | x : | +| impl/unsafeCode.rb:47:15:47:15 | x | semmle.label | x | | impl/unsafeCode.rb:49:9:49:12 | #{...} | semmle.label | #{...} | -| impl/unsafeCode.rb:54:21:54:21 | x : | semmle.label | x : | +| impl/unsafeCode.rb:54:21:54:21 | x | semmle.label | x | | impl/unsafeCode.rb:55:22:55:22 | x | semmle.label | x | -| impl/unsafeCode.rb:59:21:59:21 | x : | semmle.label | x : | -| impl/unsafeCode.rb:59:24:59:24 | y : | semmle.label | y : | -| impl/unsafeCode.rb:60:5:60:7 | arr [element 0] : | semmle.label | arr [element 0] : | -| impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] : | semmle.label | call to Array [element 0] : | -| impl/unsafeCode.rb:60:17:60:17 | x : | semmle.label | x : | +| impl/unsafeCode.rb:59:21:59:21 | x | semmle.label | x | +| impl/unsafeCode.rb:59:24:59:24 | y | semmle.label | y | +| impl/unsafeCode.rb:60:5:60:7 | arr [element 0] | semmle.label | arr [element 0] | +| impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] | semmle.label | call to Array [element 0] | +| impl/unsafeCode.rb:60:17:60:17 | x | semmle.label | x | | impl/unsafeCode.rb:61:10:61:12 | arr | semmle.label | arr | -| impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] : | semmle.label | arr2 [element 0] : | -| impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] : | semmle.label | call to Array [element 1] : | -| impl/unsafeCode.rb:63:13:63:42 | call to join : | semmle.label | call to join : | -| impl/unsafeCode.rb:63:30:63:30 | y : | semmle.label | y : | +| impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] | semmle.label | arr2 [element 0] | +| impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] | semmle.label | call to Array [element 1] | +| impl/unsafeCode.rb:63:13:63:42 | call to join | semmle.label | call to join | +| impl/unsafeCode.rb:63:30:63:30 | y | semmle.label | y | | impl/unsafeCode.rb:64:10:64:13 | arr2 | semmle.label | arr2 | subpaths #select -| impl/unsafeCode.rb:3:17:3:25 | #{...} | impl/unsafeCode.rb:2:12:2:17 | target : | impl/unsafeCode.rb:3:17:3:25 | #{...} | This string interpolation which depends on $@ is later $@. | impl/unsafeCode.rb:2:12:2:17 | target | library input | impl/unsafeCode.rb:3:5:3:27 | call to eval | interpreted as code | -| impl/unsafeCode.rb:8:30:8:30 | x | impl/unsafeCode.rb:7:12:7:12 | x : | impl/unsafeCode.rb:8:30:8:30 | x | This string format which depends on $@ is later $@. | impl/unsafeCode.rb:7:12:7:12 | x | library input | impl/unsafeCode.rb:8:5:8:32 | call to eval | interpreted as code | -| impl/unsafeCode.rb:13:33:13:33 | x | impl/unsafeCode.rb:12:12:12:12 | x : | impl/unsafeCode.rb:13:33:13:33 | x | This string format which depends on $@ is later $@. | impl/unsafeCode.rb:12:12:12:12 | x | library input | impl/unsafeCode.rb:13:5:13:35 | call to eval | interpreted as code | -| impl/unsafeCode.rb:29:10:29:15 | my_arr | impl/unsafeCode.rb:28:17:28:22 | my_arr : | impl/unsafeCode.rb:29:10:29:15 | my_arr | This array which depends on $@ is later $@. | impl/unsafeCode.rb:28:17:28:22 | my_arr | library input | impl/unsafeCode.rb:29:5:29:27 | call to eval | interpreted as code | -| impl/unsafeCode.rb:34:10:34:12 | arr | impl/unsafeCode.rb:32:21:32:21 | x : | impl/unsafeCode.rb:34:10:34:12 | arr | This array which depends on $@ is later $@. | impl/unsafeCode.rb:32:21:32:21 | x | library input | impl/unsafeCode.rb:34:5:34:24 | call to eval | interpreted as code | -| impl/unsafeCode.rb:40:10:40:12 | arr | impl/unsafeCode.rb:37:15:37:15 | x : | impl/unsafeCode.rb:40:10:40:12 | arr | This array which depends on $@ is later $@. | impl/unsafeCode.rb:37:15:37:15 | x | library input | impl/unsafeCode.rb:40:5:40:24 | call to eval | interpreted as code | -| impl/unsafeCode.rb:44:10:44:12 | arr | impl/unsafeCode.rb:37:15:37:15 | x : | impl/unsafeCode.rb:44:10:44:12 | arr | This array which depends on $@ is later $@. | impl/unsafeCode.rb:37:15:37:15 | x | library input | impl/unsafeCode.rb:44:5:44:24 | call to eval | interpreted as code | -| impl/unsafeCode.rb:49:9:49:12 | #{...} | impl/unsafeCode.rb:47:15:47:15 | x : | impl/unsafeCode.rb:49:9:49:12 | #{...} | This string interpolation which depends on $@ is later $@. | impl/unsafeCode.rb:47:15:47:15 | x | library input | impl/unsafeCode.rb:51:5:51:13 | call to eval | interpreted as code | -| impl/unsafeCode.rb:55:22:55:22 | x | impl/unsafeCode.rb:54:21:54:21 | x : | impl/unsafeCode.rb:55:22:55:22 | x | This string concatenation which depends on $@ is later $@. | impl/unsafeCode.rb:54:21:54:21 | x | library input | impl/unsafeCode.rb:56:5:56:13 | call to eval | interpreted as code | -| impl/unsafeCode.rb:61:10:61:12 | arr | impl/unsafeCode.rb:59:21:59:21 | x : | impl/unsafeCode.rb:61:10:61:12 | arr | This array which depends on $@ is later $@. | impl/unsafeCode.rb:59:21:59:21 | x | library input | impl/unsafeCode.rb:61:5:61:23 | call to eval | interpreted as code | -| impl/unsafeCode.rb:64:10:64:13 | arr2 | impl/unsafeCode.rb:59:24:59:24 | y : | impl/unsafeCode.rb:64:10:64:13 | arr2 | This array which depends on $@ is later $@. | impl/unsafeCode.rb:59:24:59:24 | y | library input | impl/unsafeCode.rb:64:5:64:25 | call to eval | interpreted as code | +| impl/unsafeCode.rb:3:17:3:25 | #{...} | impl/unsafeCode.rb:2:12:2:17 | target | impl/unsafeCode.rb:3:17:3:25 | #{...} | This string interpolation which depends on $@ is later $@. | impl/unsafeCode.rb:2:12:2:17 | target | library input | impl/unsafeCode.rb:3:5:3:27 | call to eval | interpreted as code | +| impl/unsafeCode.rb:8:30:8:30 | x | impl/unsafeCode.rb:7:12:7:12 | x | impl/unsafeCode.rb:8:30:8:30 | x | This string format which depends on $@ is later $@. | impl/unsafeCode.rb:7:12:7:12 | x | library input | impl/unsafeCode.rb:8:5:8:32 | call to eval | interpreted as code | +| impl/unsafeCode.rb:13:33:13:33 | x | impl/unsafeCode.rb:12:12:12:12 | x | impl/unsafeCode.rb:13:33:13:33 | x | This string format which depends on $@ is later $@. | impl/unsafeCode.rb:12:12:12:12 | x | library input | impl/unsafeCode.rb:13:5:13:35 | call to eval | interpreted as code | +| impl/unsafeCode.rb:29:10:29:15 | my_arr | impl/unsafeCode.rb:28:17:28:22 | my_arr | impl/unsafeCode.rb:29:10:29:15 | my_arr | This array which depends on $@ is later $@. | impl/unsafeCode.rb:28:17:28:22 | my_arr | library input | impl/unsafeCode.rb:29:5:29:27 | call to eval | interpreted as code | +| impl/unsafeCode.rb:34:10:34:12 | arr | impl/unsafeCode.rb:32:21:32:21 | x | impl/unsafeCode.rb:34:10:34:12 | arr | This array which depends on $@ is later $@. | impl/unsafeCode.rb:32:21:32:21 | x | library input | impl/unsafeCode.rb:34:5:34:24 | call to eval | interpreted as code | +| impl/unsafeCode.rb:40:10:40:12 | arr | impl/unsafeCode.rb:37:15:37:15 | x | impl/unsafeCode.rb:40:10:40:12 | arr | This array which depends on $@ is later $@. | impl/unsafeCode.rb:37:15:37:15 | x | library input | impl/unsafeCode.rb:40:5:40:24 | call to eval | interpreted as code | +| impl/unsafeCode.rb:44:10:44:12 | arr | impl/unsafeCode.rb:37:15:37:15 | x | impl/unsafeCode.rb:44:10:44:12 | arr | This array which depends on $@ is later $@. | impl/unsafeCode.rb:37:15:37:15 | x | library input | impl/unsafeCode.rb:44:5:44:24 | call to eval | interpreted as code | +| impl/unsafeCode.rb:49:9:49:12 | #{...} | impl/unsafeCode.rb:47:15:47:15 | x | impl/unsafeCode.rb:49:9:49:12 | #{...} | This string interpolation which depends on $@ is later $@. | impl/unsafeCode.rb:47:15:47:15 | x | library input | impl/unsafeCode.rb:51:5:51:13 | call to eval | interpreted as code | +| impl/unsafeCode.rb:55:22:55:22 | x | impl/unsafeCode.rb:54:21:54:21 | x | impl/unsafeCode.rb:55:22:55:22 | x | This string concatenation which depends on $@ is later $@. | impl/unsafeCode.rb:54:21:54:21 | x | library input | impl/unsafeCode.rb:56:5:56:13 | call to eval | interpreted as code | +| impl/unsafeCode.rb:61:10:61:12 | arr | impl/unsafeCode.rb:59:21:59:21 | x | impl/unsafeCode.rb:61:10:61:12 | arr | This array which depends on $@ is later $@. | impl/unsafeCode.rb:59:21:59:21 | x | library input | impl/unsafeCode.rb:61:5:61:23 | call to eval | interpreted as code | +| impl/unsafeCode.rb:64:10:64:13 | arr2 | impl/unsafeCode.rb:59:24:59:24 | y | impl/unsafeCode.rb:64:10:64:13 | arr2 | This array which depends on $@ is later $@. | impl/unsafeCode.rb:59:24:59:24 | y | library input | impl/unsafeCode.rb:64:5:64:25 | call to eval | interpreted as code | diff --git a/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected b/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected index 7f461d5efe1..bb29e10f3f2 100644 --- a/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected @@ -1,42 +1,42 @@ edges -| app/controllers/users_controller.rb:15:5:15:15 | unsanitized : | app/controllers/users_controller.rb:16:19:16:29 | unsanitized | -| app/controllers/users_controller.rb:15:5:15:15 | unsanitized : | app/controllers/users_controller.rb:17:19:17:41 | ... + ... | -| app/controllers/users_controller.rb:15:5:15:15 | unsanitized : | app/controllers/users_controller.rb:23:20:23:30 | unsanitized : | -| app/controllers/users_controller.rb:15:19:15:24 | call to params : | app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | -| app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | app/controllers/users_controller.rb:15:5:15:15 | unsanitized : | -| app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 : | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | -| app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 : | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | -| app/controllers/users_controller.rb:23:20:23:30 | unsanitized : | app/controllers/users_controller.rb:23:20:23:44 | call to sub : | -| app/controllers/users_controller.rb:23:20:23:44 | call to sub : | app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 : | -| app/controllers/users_controller.rb:33:5:33:15 | unsanitized : | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | -| app/controllers/users_controller.rb:33:5:33:15 | unsanitized : | app/controllers/users_controller.rb:35:33:35:55 | ... + ... | -| app/controllers/users_controller.rb:33:19:33:25 | call to cookies : | app/controllers/users_controller.rb:33:19:33:31 | ...[...] : | -| app/controllers/users_controller.rb:33:19:33:31 | ...[...] : | app/controllers/users_controller.rb:33:5:33:15 | unsanitized : | -| app/controllers/users_controller.rb:49:19:49:24 | call to params : | app/controllers/users_controller.rb:49:19:49:30 | ...[...] | +| app/controllers/users_controller.rb:15:5:15:15 | unsanitized | app/controllers/users_controller.rb:16:19:16:29 | unsanitized | +| app/controllers/users_controller.rb:15:5:15:15 | unsanitized | app/controllers/users_controller.rb:17:19:17:41 | ... + ... | +| app/controllers/users_controller.rb:15:5:15:15 | unsanitized | app/controllers/users_controller.rb:23:20:23:30 | unsanitized | +| app/controllers/users_controller.rb:15:19:15:24 | call to params | app/controllers/users_controller.rb:15:19:15:30 | ...[...] | +| app/controllers/users_controller.rb:15:19:15:30 | ...[...] | app/controllers/users_controller.rb:15:5:15:15 | unsanitized | +| app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | +| app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | +| app/controllers/users_controller.rb:23:20:23:30 | unsanitized | app/controllers/users_controller.rb:23:20:23:44 | call to sub | +| app/controllers/users_controller.rb:23:20:23:44 | call to sub | app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 | +| app/controllers/users_controller.rb:33:5:33:15 | unsanitized | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | +| app/controllers/users_controller.rb:33:5:33:15 | unsanitized | app/controllers/users_controller.rb:35:33:35:55 | ... + ... | +| app/controllers/users_controller.rb:33:19:33:25 | call to cookies | app/controllers/users_controller.rb:33:19:33:31 | ...[...] | +| app/controllers/users_controller.rb:33:19:33:31 | ...[...] | app/controllers/users_controller.rb:33:5:33:15 | unsanitized | +| app/controllers/users_controller.rb:49:19:49:24 | call to params | app/controllers/users_controller.rb:49:19:49:30 | ...[...] | nodes -| app/controllers/users_controller.rb:15:5:15:15 | unsanitized : | semmle.label | unsanitized : | -| app/controllers/users_controller.rb:15:19:15:24 | call to params : | semmle.label | call to params : | -| app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | semmle.label | ...[...] : | +| app/controllers/users_controller.rb:15:5:15:15 | unsanitized | semmle.label | unsanitized | +| app/controllers/users_controller.rb:15:19:15:24 | call to params | semmle.label | call to params | +| app/controllers/users_controller.rb:15:19:15:30 | ...[...] | semmle.label | ...[...] | | app/controllers/users_controller.rb:16:19:16:29 | unsanitized | semmle.label | unsanitized | | app/controllers/users_controller.rb:17:19:17:41 | ... + ... | semmle.label | ... + ... | -| app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 : | semmle.label | unsanitized2 : | -| app/controllers/users_controller.rb:23:20:23:30 | unsanitized : | semmle.label | unsanitized : | -| app/controllers/users_controller.rb:23:20:23:44 | call to sub : | semmle.label | call to sub : | +| app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 | semmle.label | unsanitized2 | +| app/controllers/users_controller.rb:23:20:23:30 | unsanitized | semmle.label | unsanitized | +| app/controllers/users_controller.rb:23:20:23:44 | call to sub | semmle.label | call to sub | | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | semmle.label | unsanitized2 | | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | semmle.label | ... + ... | -| app/controllers/users_controller.rb:33:5:33:15 | unsanitized : | semmle.label | unsanitized : | -| app/controllers/users_controller.rb:33:19:33:25 | call to cookies : | semmle.label | call to cookies : | -| app/controllers/users_controller.rb:33:19:33:31 | ...[...] : | semmle.label | ...[...] : | +| app/controllers/users_controller.rb:33:5:33:15 | unsanitized | semmle.label | unsanitized | +| app/controllers/users_controller.rb:33:19:33:25 | call to cookies | semmle.label | call to cookies | +| app/controllers/users_controller.rb:33:19:33:31 | ...[...] | semmle.label | ...[...] | | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | semmle.label | unsanitized | | app/controllers/users_controller.rb:35:33:35:55 | ... + ... | semmle.label | ... + ... | -| app/controllers/users_controller.rb:49:19:49:24 | call to params : | semmle.label | call to params : | +| app/controllers/users_controller.rb:49:19:49:24 | call to params | semmle.label | call to params | | app/controllers/users_controller.rb:49:19:49:30 | ...[...] | semmle.label | ...[...] | subpaths #select -| app/controllers/users_controller.rb:16:19:16:29 | unsanitized | app/controllers/users_controller.rb:15:19:15:24 | call to params : | app/controllers/users_controller.rb:16:19:16:29 | unsanitized | Log entry depends on a $@. | app/controllers/users_controller.rb:15:19:15:24 | call to params | user-provided value | -| app/controllers/users_controller.rb:17:19:17:41 | ... + ... | app/controllers/users_controller.rb:15:19:15:24 | call to params : | app/controllers/users_controller.rb:17:19:17:41 | ... + ... | Log entry depends on a $@. | app/controllers/users_controller.rb:15:19:15:24 | call to params | user-provided value | -| app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | app/controllers/users_controller.rb:15:19:15:24 | call to params : | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | Log entry depends on a $@. | app/controllers/users_controller.rb:15:19:15:24 | call to params | user-provided value | -| app/controllers/users_controller.rb:27:16:27:39 | ... + ... | app/controllers/users_controller.rb:15:19:15:24 | call to params : | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | Log entry depends on a $@. | app/controllers/users_controller.rb:15:19:15:24 | call to params | user-provided value | -| app/controllers/users_controller.rb:34:33:34:43 | unsanitized | app/controllers/users_controller.rb:33:19:33:25 | call to cookies : | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | Log entry depends on a $@. | app/controllers/users_controller.rb:33:19:33:25 | call to cookies | user-provided value | -| app/controllers/users_controller.rb:35:33:35:55 | ... + ... | app/controllers/users_controller.rb:33:19:33:25 | call to cookies : | app/controllers/users_controller.rb:35:33:35:55 | ... + ... | Log entry depends on a $@. | app/controllers/users_controller.rb:33:19:33:25 | call to cookies | user-provided value | -| app/controllers/users_controller.rb:49:19:49:30 | ...[...] | app/controllers/users_controller.rb:49:19:49:24 | call to params : | app/controllers/users_controller.rb:49:19:49:30 | ...[...] | Log entry depends on a $@. | app/controllers/users_controller.rb:49:19:49:24 | call to params | user-provided value | +| app/controllers/users_controller.rb:16:19:16:29 | unsanitized | app/controllers/users_controller.rb:15:19:15:24 | call to params | app/controllers/users_controller.rb:16:19:16:29 | unsanitized | Log entry depends on a $@. | app/controllers/users_controller.rb:15:19:15:24 | call to params | user-provided value | +| app/controllers/users_controller.rb:17:19:17:41 | ... + ... | app/controllers/users_controller.rb:15:19:15:24 | call to params | app/controllers/users_controller.rb:17:19:17:41 | ... + ... | Log entry depends on a $@. | app/controllers/users_controller.rb:15:19:15:24 | call to params | user-provided value | +| app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | app/controllers/users_controller.rb:15:19:15:24 | call to params | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | Log entry depends on a $@. | app/controllers/users_controller.rb:15:19:15:24 | call to params | user-provided value | +| app/controllers/users_controller.rb:27:16:27:39 | ... + ... | app/controllers/users_controller.rb:15:19:15:24 | call to params | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | Log entry depends on a $@. | app/controllers/users_controller.rb:15:19:15:24 | call to params | user-provided value | +| app/controllers/users_controller.rb:34:33:34:43 | unsanitized | app/controllers/users_controller.rb:33:19:33:25 | call to cookies | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | Log entry depends on a $@. | app/controllers/users_controller.rb:33:19:33:25 | call to cookies | user-provided value | +| app/controllers/users_controller.rb:35:33:35:55 | ... + ... | app/controllers/users_controller.rb:33:19:33:25 | call to cookies | app/controllers/users_controller.rb:35:33:35:55 | ... + ... | Log entry depends on a $@. | app/controllers/users_controller.rb:33:19:33:25 | call to cookies | user-provided value | +| app/controllers/users_controller.rb:49:19:49:30 | ...[...] | app/controllers/users_controller.rb:49:19:49:24 | call to params | app/controllers/users_controller.rb:49:19:49:30 | ...[...] | Log entry depends on a $@. | app/controllers/users_controller.rb:49:19:49:24 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-1333-polynomial-redos/PolynomialReDoS.expected b/ruby/ql/test/query-tests/security/cwe-1333-polynomial-redos/PolynomialReDoS.expected index 1d8170fd428..97de9e92184 100644 --- a/ruby/ql/test/query-tests/security/cwe-1333-polynomial-redos/PolynomialReDoS.expected +++ b/ruby/ql/test/query-tests/security/cwe-1333-polynomial-redos/PolynomialReDoS.expected @@ -1,52 +1,52 @@ edges -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:10:5:10:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:11:5:11:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:12:5:12:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:13:5:13:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:14:5:14:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:15:5:15:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:16:5:16:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:17:5:17:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:18:5:18:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:19:5:19:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:20:5:20:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:21:5:21:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:22:5:22:8 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:23:17:23:20 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:24:18:24:21 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:42:10:42:13 | name | -| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:47:10:47:13 | name | -| PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:4:12:4:24 | ...[...] : | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:4:5:4:8 | name : | -| PolynomialReDoS.rb:27:5:27:5 | a : | PolynomialReDoS.rb:28:5:28:5 | a | -| PolynomialReDoS.rb:27:9:27:14 | call to params : | PolynomialReDoS.rb:27:9:27:18 | ...[...] : | -| PolynomialReDoS.rb:27:9:27:18 | ...[...] : | PolynomialReDoS.rb:27:5:27:5 | a : | -| PolynomialReDoS.rb:29:5:29:5 | b : | PolynomialReDoS.rb:30:5:30:5 | b | -| PolynomialReDoS.rb:29:9:29:14 | call to params : | PolynomialReDoS.rb:29:9:29:18 | ...[...] : | -| PolynomialReDoS.rb:29:9:29:18 | ...[...] : | PolynomialReDoS.rb:29:5:29:5 | b : | -| PolynomialReDoS.rb:31:5:31:5 | c : | PolynomialReDoS.rb:32:5:32:5 | c | -| PolynomialReDoS.rb:31:9:31:14 | call to params : | PolynomialReDoS.rb:31:9:31:18 | ...[...] : | -| PolynomialReDoS.rb:31:9:31:18 | ...[...] : | PolynomialReDoS.rb:31:5:31:5 | c : | -| PolynomialReDoS.rb:54:5:54:8 | name : | PolynomialReDoS.rb:56:38:56:41 | name : | -| PolynomialReDoS.rb:54:5:54:8 | name : | PolynomialReDoS.rb:58:37:58:40 | name : | -| PolynomialReDoS.rb:54:12:54:17 | call to params : | PolynomialReDoS.rb:54:12:54:24 | ...[...] : | -| PolynomialReDoS.rb:54:12:54:24 | ...[...] : | PolynomialReDoS.rb:54:5:54:8 | name : | -| PolynomialReDoS.rb:56:38:56:41 | name : | PolynomialReDoS.rb:61:33:61:37 | input : | -| PolynomialReDoS.rb:58:37:58:40 | name : | PolynomialReDoS.rb:65:42:65:46 | input : | -| PolynomialReDoS.rb:61:33:61:37 | input : | PolynomialReDoS.rb:62:5:62:9 | input | -| PolynomialReDoS.rb:65:42:65:46 | input : | PolynomialReDoS.rb:66:5:66:9 | input | -| PolynomialReDoS.rb:70:5:70:8 | name : | PolynomialReDoS.rb:73:32:73:35 | name : | -| PolynomialReDoS.rb:70:12:70:17 | call to params : | PolynomialReDoS.rb:70:12:70:24 | ...[...] : | -| PolynomialReDoS.rb:70:12:70:24 | ...[...] : | PolynomialReDoS.rb:70:5:70:8 | name : | -| PolynomialReDoS.rb:73:32:73:35 | name : | PolynomialReDoS.rb:76:35:76:39 | input : | -| PolynomialReDoS.rb:76:35:76:39 | input : | PolynomialReDoS.rb:77:5:77:9 | input | -| lib/index.rb:2:11:2:11 | x : | lib/index.rb:4:13:4:13 | x | -| lib/index.rb:8:13:8:13 | x : | lib/index.rb:9:15:9:15 | x | -| lib/index.rb:8:13:8:13 | x : | lib/index.rb:11:16:11:16 | x | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:10:5:10:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:11:5:11:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:12:5:12:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:13:5:13:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:14:5:14:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:15:5:15:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:16:5:16:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:17:5:17:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:18:5:18:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:19:5:19:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:20:5:20:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:21:5:21:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:22:5:22:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:23:17:23:20 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:24:18:24:21 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:42:10:42:13 | name | +| PolynomialReDoS.rb:4:5:4:8 | name | PolynomialReDoS.rb:47:10:47:13 | name | +| PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:4:12:4:24 | ...[...] | +| PolynomialReDoS.rb:4:12:4:24 | ...[...] | PolynomialReDoS.rb:4:5:4:8 | name | +| PolynomialReDoS.rb:27:5:27:5 | a | PolynomialReDoS.rb:28:5:28:5 | a | +| PolynomialReDoS.rb:27:9:27:14 | call to params | PolynomialReDoS.rb:27:9:27:18 | ...[...] | +| PolynomialReDoS.rb:27:9:27:18 | ...[...] | PolynomialReDoS.rb:27:5:27:5 | a | +| PolynomialReDoS.rb:29:5:29:5 | b | PolynomialReDoS.rb:30:5:30:5 | b | +| PolynomialReDoS.rb:29:9:29:14 | call to params | PolynomialReDoS.rb:29:9:29:18 | ...[...] | +| PolynomialReDoS.rb:29:9:29:18 | ...[...] | PolynomialReDoS.rb:29:5:29:5 | b | +| PolynomialReDoS.rb:31:5:31:5 | c | PolynomialReDoS.rb:32:5:32:5 | c | +| PolynomialReDoS.rb:31:9:31:14 | call to params | PolynomialReDoS.rb:31:9:31:18 | ...[...] | +| PolynomialReDoS.rb:31:9:31:18 | ...[...] | PolynomialReDoS.rb:31:5:31:5 | c | +| PolynomialReDoS.rb:54:5:54:8 | name | PolynomialReDoS.rb:56:38:56:41 | name | +| PolynomialReDoS.rb:54:5:54:8 | name | PolynomialReDoS.rb:58:37:58:40 | name | +| PolynomialReDoS.rb:54:12:54:17 | call to params | PolynomialReDoS.rb:54:12:54:24 | ...[...] | +| PolynomialReDoS.rb:54:12:54:24 | ...[...] | PolynomialReDoS.rb:54:5:54:8 | name | +| PolynomialReDoS.rb:56:38:56:41 | name | PolynomialReDoS.rb:61:33:61:37 | input | +| PolynomialReDoS.rb:58:37:58:40 | name | PolynomialReDoS.rb:65:42:65:46 | input | +| PolynomialReDoS.rb:61:33:61:37 | input | PolynomialReDoS.rb:62:5:62:9 | input | +| PolynomialReDoS.rb:65:42:65:46 | input | PolynomialReDoS.rb:66:5:66:9 | input | +| PolynomialReDoS.rb:70:5:70:8 | name | PolynomialReDoS.rb:73:32:73:35 | name | +| PolynomialReDoS.rb:70:12:70:17 | call to params | PolynomialReDoS.rb:70:12:70:24 | ...[...] | +| PolynomialReDoS.rb:70:12:70:24 | ...[...] | PolynomialReDoS.rb:70:5:70:8 | name | +| PolynomialReDoS.rb:73:32:73:35 | name | PolynomialReDoS.rb:76:35:76:39 | input | +| PolynomialReDoS.rb:76:35:76:39 | input | PolynomialReDoS.rb:77:5:77:9 | input | +| lib/index.rb:2:11:2:11 | x | lib/index.rb:4:13:4:13 | x | +| lib/index.rb:8:13:8:13 | x | lib/index.rb:9:15:9:15 | x | +| lib/index.rb:8:13:8:13 | x | lib/index.rb:11:16:11:16 | x | nodes -| PolynomialReDoS.rb:4:5:4:8 | name : | semmle.label | name : | -| PolynomialReDoS.rb:4:12:4:17 | call to params : | semmle.label | call to params : | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | semmle.label | ...[...] : | +| PolynomialReDoS.rb:4:5:4:8 | name | semmle.label | name | +| PolynomialReDoS.rb:4:12:4:17 | call to params | semmle.label | call to params | +| PolynomialReDoS.rb:4:12:4:24 | ...[...] | semmle.label | ...[...] | | PolynomialReDoS.rb:10:5:10:8 | name | semmle.label | name | | PolynomialReDoS.rb:11:5:11:8 | name | semmle.label | name | | PolynomialReDoS.rb:12:5:12:8 | name | semmle.label | name | @@ -62,65 +62,65 @@ nodes | PolynomialReDoS.rb:22:5:22:8 | name | semmle.label | name | | PolynomialReDoS.rb:23:17:23:20 | name | semmle.label | name | | PolynomialReDoS.rb:24:18:24:21 | name | semmle.label | name | -| PolynomialReDoS.rb:27:5:27:5 | a : | semmle.label | a : | -| PolynomialReDoS.rb:27:9:27:14 | call to params : | semmle.label | call to params : | -| PolynomialReDoS.rb:27:9:27:18 | ...[...] : | semmle.label | ...[...] : | +| PolynomialReDoS.rb:27:5:27:5 | a | semmle.label | a | +| PolynomialReDoS.rb:27:9:27:14 | call to params | semmle.label | call to params | +| PolynomialReDoS.rb:27:9:27:18 | ...[...] | semmle.label | ...[...] | | PolynomialReDoS.rb:28:5:28:5 | a | semmle.label | a | -| PolynomialReDoS.rb:29:5:29:5 | b : | semmle.label | b : | -| PolynomialReDoS.rb:29:9:29:14 | call to params : | semmle.label | call to params : | -| PolynomialReDoS.rb:29:9:29:18 | ...[...] : | semmle.label | ...[...] : | +| PolynomialReDoS.rb:29:5:29:5 | b | semmle.label | b | +| PolynomialReDoS.rb:29:9:29:14 | call to params | semmle.label | call to params | +| PolynomialReDoS.rb:29:9:29:18 | ...[...] | semmle.label | ...[...] | | PolynomialReDoS.rb:30:5:30:5 | b | semmle.label | b | -| PolynomialReDoS.rb:31:5:31:5 | c : | semmle.label | c : | -| PolynomialReDoS.rb:31:9:31:14 | call to params : | semmle.label | call to params : | -| PolynomialReDoS.rb:31:9:31:18 | ...[...] : | semmle.label | ...[...] : | +| PolynomialReDoS.rb:31:5:31:5 | c | semmle.label | c | +| PolynomialReDoS.rb:31:9:31:14 | call to params | semmle.label | call to params | +| PolynomialReDoS.rb:31:9:31:18 | ...[...] | semmle.label | ...[...] | | PolynomialReDoS.rb:32:5:32:5 | c | semmle.label | c | | PolynomialReDoS.rb:42:10:42:13 | name | semmle.label | name | | PolynomialReDoS.rb:47:10:47:13 | name | semmle.label | name | -| PolynomialReDoS.rb:54:5:54:8 | name : | semmle.label | name : | -| PolynomialReDoS.rb:54:12:54:17 | call to params : | semmle.label | call to params : | -| PolynomialReDoS.rb:54:12:54:24 | ...[...] : | semmle.label | ...[...] : | -| PolynomialReDoS.rb:56:38:56:41 | name : | semmle.label | name : | -| PolynomialReDoS.rb:58:37:58:40 | name : | semmle.label | name : | -| PolynomialReDoS.rb:61:33:61:37 | input : | semmle.label | input : | +| PolynomialReDoS.rb:54:5:54:8 | name | semmle.label | name | +| PolynomialReDoS.rb:54:12:54:17 | call to params | semmle.label | call to params | +| PolynomialReDoS.rb:54:12:54:24 | ...[...] | semmle.label | ...[...] | +| PolynomialReDoS.rb:56:38:56:41 | name | semmle.label | name | +| PolynomialReDoS.rb:58:37:58:40 | name | semmle.label | name | +| PolynomialReDoS.rb:61:33:61:37 | input | semmle.label | input | | PolynomialReDoS.rb:62:5:62:9 | input | semmle.label | input | -| PolynomialReDoS.rb:65:42:65:46 | input : | semmle.label | input : | +| PolynomialReDoS.rb:65:42:65:46 | input | semmle.label | input | | PolynomialReDoS.rb:66:5:66:9 | input | semmle.label | input | -| PolynomialReDoS.rb:70:5:70:8 | name : | semmle.label | name : | -| PolynomialReDoS.rb:70:12:70:17 | call to params : | semmle.label | call to params : | -| PolynomialReDoS.rb:70:12:70:24 | ...[...] : | semmle.label | ...[...] : | -| PolynomialReDoS.rb:73:32:73:35 | name : | semmle.label | name : | -| PolynomialReDoS.rb:76:35:76:39 | input : | semmle.label | input : | +| PolynomialReDoS.rb:70:5:70:8 | name | semmle.label | name | +| PolynomialReDoS.rb:70:12:70:17 | call to params | semmle.label | call to params | +| PolynomialReDoS.rb:70:12:70:24 | ...[...] | semmle.label | ...[...] | +| PolynomialReDoS.rb:73:32:73:35 | name | semmle.label | name | +| PolynomialReDoS.rb:76:35:76:39 | input | semmle.label | input | | PolynomialReDoS.rb:77:5:77:9 | input | semmle.label | input | -| lib/index.rb:2:11:2:11 | x : | semmle.label | x : | +| lib/index.rb:2:11:2:11 | x | semmle.label | x | | lib/index.rb:4:13:4:13 | x | semmle.label | x | -| lib/index.rb:8:13:8:13 | x : | semmle.label | x : | +| lib/index.rb:8:13:8:13 | x | semmle.label | x | | lib/index.rb:9:15:9:15 | x | semmle.label | x | | lib/index.rb:11:16:11:16 | x | semmle.label | x | subpaths #select -| PolynomialReDoS.rb:10:5:10:17 | ... =~ ... | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:10:5:10:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:11:5:11:17 | ... !~ ... | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:11:5:11:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:12:5:12:15 | ...[...] | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:12:5:12:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:13:5:13:23 | call to gsub | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:13:5:13:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:14:5:14:20 | call to index | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:14:5:14:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:15:5:15:20 | call to match | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:15:5:15:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:16:5:16:21 | call to match? | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:16:5:16:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:17:5:17:24 | call to partition | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:17:5:17:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:18:5:18:21 | call to rindex | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:18:5:18:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:19:5:19:25 | call to rpartition | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:19:5:19:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:20:5:20:19 | call to scan | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:20:5:20:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:21:5:21:20 | call to split | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:21:5:21:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:22:5:22:22 | call to sub | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:22:5:22:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:23:5:23:20 | call to match | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:23:17:23:20 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:24:5:24:21 | call to match? | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:24:18:24:21 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:28:5:28:21 | call to gsub! | PolynomialReDoS.rb:27:9:27:14 | call to params : | PolynomialReDoS.rb:28:5:28:5 | a | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:27:9:27:14 | call to params | user-provided value | -| PolynomialReDoS.rb:30:5:30:18 | call to slice! | PolynomialReDoS.rb:29:9:29:14 | call to params : | PolynomialReDoS.rb:30:5:30:5 | b | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:29:9:29:14 | call to params | user-provided value | -| PolynomialReDoS.rb:32:5:32:20 | call to sub! | PolynomialReDoS.rb:31:9:31:14 | call to params : | PolynomialReDoS.rb:32:5:32:5 | c | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:31:9:31:14 | call to params | user-provided value | -| PolynomialReDoS.rb:42:5:45:7 | case ... | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:42:10:42:13 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:47:5:50:7 | case ... | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:47:10:47:13 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:48:14:48:16 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | -| PolynomialReDoS.rb:62:5:62:22 | call to gsub | PolynomialReDoS.rb:54:12:54:17 | call to params : | PolynomialReDoS.rb:62:5:62:9 | input | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:56:31:56:33 | \\s+ | regular expression | PolynomialReDoS.rb:54:12:54:17 | call to params | user-provided value | -| PolynomialReDoS.rb:66:5:66:34 | call to match? | PolynomialReDoS.rb:54:12:54:17 | call to params : | PolynomialReDoS.rb:66:5:66:9 | input | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:58:30:58:32 | \\s+ | regular expression | PolynomialReDoS.rb:54:12:54:17 | call to params | user-provided value | -| PolynomialReDoS.rb:77:5:77:22 | call to gsub | PolynomialReDoS.rb:70:12:70:17 | call to params : | PolynomialReDoS.rb:77:5:77:9 | input | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:72:28:72:30 | \\s+ | regular expression | PolynomialReDoS.rb:70:12:70:17 | call to params | user-provided value | -| lib/index.rb:4:13:4:26 | call to match | lib/index.rb:2:11:2:11 | x : | lib/index.rb:4:13:4:13 | x | This $@ that depends on a $@ may run slow on strings with many repetitions of 'a'. | lib/index.rb:4:22:4:23 | a+ | regular expression | lib/index.rb:2:11:2:11 | x | library input | -| lib/index.rb:9:15:9:28 | call to match | lib/index.rb:8:13:8:13 | x : | lib/index.rb:9:15:9:15 | x | This $@ that depends on a $@ may run slow on strings with many repetitions of 'a'. | lib/index.rb:9:24:9:25 | a+ | regular expression | lib/index.rb:8:13:8:13 | x | library input | -| lib/index.rb:11:16:11:276 | call to match | lib/index.rb:8:13:8:13 | x : | lib/index.rb:11:16:11:16 | x | This $@ that depends on a $@ may run slow on strings starting with 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC' and with many repetitions of 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC'. | lib/index.rb:11:271:11:272 | .* | regular expression | lib/index.rb:8:13:8:13 | x | library input | +| PolynomialReDoS.rb:10:5:10:17 | ... =~ ... | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:10:5:10:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:11:5:11:17 | ... !~ ... | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:11:5:11:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:12:5:12:15 | ...[...] | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:12:5:12:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:13:5:13:23 | call to gsub | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:13:5:13:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:14:5:14:20 | call to index | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:14:5:14:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:15:5:15:20 | call to match | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:15:5:15:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:16:5:16:21 | call to match? | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:16:5:16:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:17:5:17:24 | call to partition | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:17:5:17:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:18:5:18:21 | call to rindex | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:18:5:18:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:19:5:19:25 | call to rpartition | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:19:5:19:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:20:5:20:19 | call to scan | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:20:5:20:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:21:5:21:20 | call to split | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:21:5:21:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:22:5:22:22 | call to sub | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:22:5:22:8 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:23:5:23:20 | call to match | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:23:17:23:20 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:24:5:24:21 | call to match? | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:24:18:24:21 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:28:5:28:21 | call to gsub! | PolynomialReDoS.rb:27:9:27:14 | call to params | PolynomialReDoS.rb:28:5:28:5 | a | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:27:9:27:14 | call to params | user-provided value | +| PolynomialReDoS.rb:30:5:30:18 | call to slice! | PolynomialReDoS.rb:29:9:29:14 | call to params | PolynomialReDoS.rb:30:5:30:5 | b | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:29:9:29:14 | call to params | user-provided value | +| PolynomialReDoS.rb:32:5:32:20 | call to sub! | PolynomialReDoS.rb:31:9:31:14 | call to params | PolynomialReDoS.rb:32:5:32:5 | c | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:31:9:31:14 | call to params | user-provided value | +| PolynomialReDoS.rb:42:5:45:7 | case ... | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:42:10:42:13 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:7:19:7:21 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:47:5:50:7 | case ... | PolynomialReDoS.rb:4:12:4:17 | call to params | PolynomialReDoS.rb:47:10:47:13 | name | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:48:14:48:16 | \\s+ | regular expression | PolynomialReDoS.rb:4:12:4:17 | call to params | user-provided value | +| PolynomialReDoS.rb:62:5:62:22 | call to gsub | PolynomialReDoS.rb:54:12:54:17 | call to params | PolynomialReDoS.rb:62:5:62:9 | input | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:56:31:56:33 | \\s+ | regular expression | PolynomialReDoS.rb:54:12:54:17 | call to params | user-provided value | +| PolynomialReDoS.rb:66:5:66:34 | call to match? | PolynomialReDoS.rb:54:12:54:17 | call to params | PolynomialReDoS.rb:66:5:66:9 | input | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:58:30:58:32 | \\s+ | regular expression | PolynomialReDoS.rb:54:12:54:17 | call to params | user-provided value | +| PolynomialReDoS.rb:77:5:77:22 | call to gsub | PolynomialReDoS.rb:70:12:70:17 | call to params | PolynomialReDoS.rb:77:5:77:9 | input | This $@ that depends on a $@ may run slow on strings with many repetitions of ' '. | PolynomialReDoS.rb:72:28:72:30 | \\s+ | regular expression | PolynomialReDoS.rb:70:12:70:17 | call to params | user-provided value | +| lib/index.rb:4:13:4:26 | call to match | lib/index.rb:2:11:2:11 | x | lib/index.rb:4:13:4:13 | x | This $@ that depends on a $@ may run slow on strings with many repetitions of 'a'. | lib/index.rb:4:22:4:23 | a+ | regular expression | lib/index.rb:2:11:2:11 | x | library input | +| lib/index.rb:9:15:9:28 | call to match | lib/index.rb:8:13:8:13 | x | lib/index.rb:9:15:9:15 | x | This $@ that depends on a $@ may run slow on strings with many repetitions of 'a'. | lib/index.rb:9:24:9:25 | a+ | regular expression | lib/index.rb:8:13:8:13 | x | library input | +| lib/index.rb:11:16:11:276 | call to match | lib/index.rb:8:13:8:13 | x | lib/index.rb:11:16:11:16 | x | This $@ that depends on a $@ may run slow on strings starting with 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC' and with many repetitions of 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC'. | lib/index.rb:11:271:11:272 | .* | regular expression | lib/index.rb:8:13:8:13 | x | library input | diff --git a/ruby/ql/test/query-tests/security/cwe-1333-regexp-injection/RegExpInjection.expected b/ruby/ql/test/query-tests/security/cwe-1333-regexp-injection/RegExpInjection.expected index 8318c0a8ec8..1ad302b6f69 100644 --- a/ruby/ql/test/query-tests/security/cwe-1333-regexp-injection/RegExpInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-1333-regexp-injection/RegExpInjection.expected @@ -1,44 +1,44 @@ edges -| RegExpInjection.rb:4:5:4:8 | name : | RegExpInjection.rb:5:13:5:21 | /#{...}/ | -| RegExpInjection.rb:4:12:4:17 | call to params : | RegExpInjection.rb:4:12:4:24 | ...[...] : | -| RegExpInjection.rb:4:12:4:24 | ...[...] : | RegExpInjection.rb:4:5:4:8 | name : | -| RegExpInjection.rb:10:5:10:8 | name : | RegExpInjection.rb:11:13:11:27 | /foo#{...}bar/ | -| RegExpInjection.rb:10:12:10:17 | call to params : | RegExpInjection.rb:10:12:10:24 | ...[...] : | -| RegExpInjection.rb:10:12:10:24 | ...[...] : | RegExpInjection.rb:10:5:10:8 | name : | -| RegExpInjection.rb:16:5:16:8 | name : | RegExpInjection.rb:17:24:17:27 | name | -| RegExpInjection.rb:16:12:16:17 | call to params : | RegExpInjection.rb:16:12:16:24 | ...[...] : | -| RegExpInjection.rb:16:12:16:24 | ...[...] : | RegExpInjection.rb:16:5:16:8 | name : | -| RegExpInjection.rb:22:5:22:8 | name : | RegExpInjection.rb:23:24:23:33 | ... + ... | -| RegExpInjection.rb:22:12:22:17 | call to params : | RegExpInjection.rb:22:12:22:24 | ...[...] : | -| RegExpInjection.rb:22:12:22:24 | ...[...] : | RegExpInjection.rb:22:5:22:8 | name : | -| RegExpInjection.rb:54:5:54:8 | name : | RegExpInjection.rb:55:28:55:37 | ... + ... | -| RegExpInjection.rb:54:12:54:17 | call to params : | RegExpInjection.rb:54:12:54:24 | ...[...] : | -| RegExpInjection.rb:54:12:54:24 | ...[...] : | RegExpInjection.rb:54:5:54:8 | name : | +| RegExpInjection.rb:4:5:4:8 | name | RegExpInjection.rb:5:13:5:21 | /#{...}/ | +| RegExpInjection.rb:4:12:4:17 | call to params | RegExpInjection.rb:4:12:4:24 | ...[...] | +| RegExpInjection.rb:4:12:4:24 | ...[...] | RegExpInjection.rb:4:5:4:8 | name | +| RegExpInjection.rb:10:5:10:8 | name | RegExpInjection.rb:11:13:11:27 | /foo#{...}bar/ | +| RegExpInjection.rb:10:12:10:17 | call to params | RegExpInjection.rb:10:12:10:24 | ...[...] | +| RegExpInjection.rb:10:12:10:24 | ...[...] | RegExpInjection.rb:10:5:10:8 | name | +| RegExpInjection.rb:16:5:16:8 | name | RegExpInjection.rb:17:24:17:27 | name | +| RegExpInjection.rb:16:12:16:17 | call to params | RegExpInjection.rb:16:12:16:24 | ...[...] | +| RegExpInjection.rb:16:12:16:24 | ...[...] | RegExpInjection.rb:16:5:16:8 | name | +| RegExpInjection.rb:22:5:22:8 | name | RegExpInjection.rb:23:24:23:33 | ... + ... | +| RegExpInjection.rb:22:12:22:17 | call to params | RegExpInjection.rb:22:12:22:24 | ...[...] | +| RegExpInjection.rb:22:12:22:24 | ...[...] | RegExpInjection.rb:22:5:22:8 | name | +| RegExpInjection.rb:54:5:54:8 | name | RegExpInjection.rb:55:28:55:37 | ... + ... | +| RegExpInjection.rb:54:12:54:17 | call to params | RegExpInjection.rb:54:12:54:24 | ...[...] | +| RegExpInjection.rb:54:12:54:24 | ...[...] | RegExpInjection.rb:54:5:54:8 | name | nodes -| RegExpInjection.rb:4:5:4:8 | name : | semmle.label | name : | -| RegExpInjection.rb:4:12:4:17 | call to params : | semmle.label | call to params : | -| RegExpInjection.rb:4:12:4:24 | ...[...] : | semmle.label | ...[...] : | +| RegExpInjection.rb:4:5:4:8 | name | semmle.label | name | +| RegExpInjection.rb:4:12:4:17 | call to params | semmle.label | call to params | +| RegExpInjection.rb:4:12:4:24 | ...[...] | semmle.label | ...[...] | | RegExpInjection.rb:5:13:5:21 | /#{...}/ | semmle.label | /#{...}/ | -| RegExpInjection.rb:10:5:10:8 | name : | semmle.label | name : | -| RegExpInjection.rb:10:12:10:17 | call to params : | semmle.label | call to params : | -| RegExpInjection.rb:10:12:10:24 | ...[...] : | semmle.label | ...[...] : | +| RegExpInjection.rb:10:5:10:8 | name | semmle.label | name | +| RegExpInjection.rb:10:12:10:17 | call to params | semmle.label | call to params | +| RegExpInjection.rb:10:12:10:24 | ...[...] | semmle.label | ...[...] | | RegExpInjection.rb:11:13:11:27 | /foo#{...}bar/ | semmle.label | /foo#{...}bar/ | -| RegExpInjection.rb:16:5:16:8 | name : | semmle.label | name : | -| RegExpInjection.rb:16:12:16:17 | call to params : | semmle.label | call to params : | -| RegExpInjection.rb:16:12:16:24 | ...[...] : | semmle.label | ...[...] : | +| RegExpInjection.rb:16:5:16:8 | name | semmle.label | name | +| RegExpInjection.rb:16:12:16:17 | call to params | semmle.label | call to params | +| RegExpInjection.rb:16:12:16:24 | ...[...] | semmle.label | ...[...] | | RegExpInjection.rb:17:24:17:27 | name | semmle.label | name | -| RegExpInjection.rb:22:5:22:8 | name : | semmle.label | name : | -| RegExpInjection.rb:22:12:22:17 | call to params : | semmle.label | call to params : | -| RegExpInjection.rb:22:12:22:24 | ...[...] : | semmle.label | ...[...] : | +| RegExpInjection.rb:22:5:22:8 | name | semmle.label | name | +| RegExpInjection.rb:22:12:22:17 | call to params | semmle.label | call to params | +| RegExpInjection.rb:22:12:22:24 | ...[...] | semmle.label | ...[...] | | RegExpInjection.rb:23:24:23:33 | ... + ... | semmle.label | ... + ... | -| RegExpInjection.rb:54:5:54:8 | name : | semmle.label | name : | -| RegExpInjection.rb:54:12:54:17 | call to params : | semmle.label | call to params : | -| RegExpInjection.rb:54:12:54:24 | ...[...] : | semmle.label | ...[...] : | +| RegExpInjection.rb:54:5:54:8 | name | semmle.label | name | +| RegExpInjection.rb:54:12:54:17 | call to params | semmle.label | call to params | +| RegExpInjection.rb:54:12:54:24 | ...[...] | semmle.label | ...[...] | | RegExpInjection.rb:55:28:55:37 | ... + ... | semmle.label | ... + ... | subpaths #select -| RegExpInjection.rb:5:13:5:21 | /#{...}/ | RegExpInjection.rb:4:12:4:17 | call to params : | RegExpInjection.rb:5:13:5:21 | /#{...}/ | This regular expression depends on a $@. | RegExpInjection.rb:4:12:4:17 | call to params | user-provided value | -| RegExpInjection.rb:11:13:11:27 | /foo#{...}bar/ | RegExpInjection.rb:10:12:10:17 | call to params : | RegExpInjection.rb:11:13:11:27 | /foo#{...}bar/ | This regular expression depends on a $@. | RegExpInjection.rb:10:12:10:17 | call to params | user-provided value | -| RegExpInjection.rb:17:24:17:27 | name | RegExpInjection.rb:16:12:16:17 | call to params : | RegExpInjection.rb:17:24:17:27 | name | This regular expression depends on a $@. | RegExpInjection.rb:16:12:16:17 | call to params | user-provided value | -| RegExpInjection.rb:23:24:23:33 | ... + ... | RegExpInjection.rb:22:12:22:17 | call to params : | RegExpInjection.rb:23:24:23:33 | ... + ... | This regular expression depends on a $@. | RegExpInjection.rb:22:12:22:17 | call to params | user-provided value | -| RegExpInjection.rb:55:28:55:37 | ... + ... | RegExpInjection.rb:54:12:54:17 | call to params : | RegExpInjection.rb:55:28:55:37 | ... + ... | This regular expression depends on a $@. | RegExpInjection.rb:54:12:54:17 | call to params | user-provided value | +| RegExpInjection.rb:5:13:5:21 | /#{...}/ | RegExpInjection.rb:4:12:4:17 | call to params | RegExpInjection.rb:5:13:5:21 | /#{...}/ | This regular expression depends on a $@. | RegExpInjection.rb:4:12:4:17 | call to params | user-provided value | +| RegExpInjection.rb:11:13:11:27 | /foo#{...}bar/ | RegExpInjection.rb:10:12:10:17 | call to params | RegExpInjection.rb:11:13:11:27 | /foo#{...}bar/ | This regular expression depends on a $@. | RegExpInjection.rb:10:12:10:17 | call to params | user-provided value | +| RegExpInjection.rb:17:24:17:27 | name | RegExpInjection.rb:16:12:16:17 | call to params | RegExpInjection.rb:17:24:17:27 | name | This regular expression depends on a $@. | RegExpInjection.rb:16:12:16:17 | call to params | user-provided value | +| RegExpInjection.rb:23:24:23:33 | ... + ... | RegExpInjection.rb:22:12:22:17 | call to params | RegExpInjection.rb:23:24:23:33 | ... + ... | This regular expression depends on a $@. | RegExpInjection.rb:22:12:22:17 | call to params | user-provided value | +| RegExpInjection.rb:55:28:55:37 | ... + ... | RegExpInjection.rb:54:12:54:17 | call to params | RegExpInjection.rb:55:28:55:37 | ... + ... | This regular expression depends on a $@. | RegExpInjection.rb:54:12:54:17 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-134/TaintedFormatString.expected b/ruby/ql/test/query-tests/security/cwe-134/TaintedFormatString.expected index 09ac79c910c..26f2b0ea05b 100644 --- a/ruby/ql/test/query-tests/security/cwe-134/TaintedFormatString.expected +++ b/ruby/ql/test/query-tests/security/cwe-134/TaintedFormatString.expected @@ -1,64 +1,64 @@ edges -| tainted_format_string.rb:4:12:4:17 | call to params : | tainted_format_string.rb:4:12:4:26 | ...[...] | -| tainted_format_string.rb:5:19:5:24 | call to params : | tainted_format_string.rb:5:19:5:33 | ...[...] | -| tainted_format_string.rb:10:23:10:28 | call to params : | tainted_format_string.rb:10:23:10:37 | ...[...] | -| tainted_format_string.rb:11:30:11:35 | call to params : | tainted_format_string.rb:11:30:11:44 | ...[...] | -| tainted_format_string.rb:18:23:18:28 | call to params : | tainted_format_string.rb:18:23:18:37 | ...[...] | -| tainted_format_string.rb:19:30:19:35 | call to params : | tainted_format_string.rb:19:30:19:44 | ...[...] | -| tainted_format_string.rb:21:27:21:32 | call to params : | tainted_format_string.rb:21:27:21:41 | ...[...] | -| tainted_format_string.rb:22:20:22:25 | call to params : | tainted_format_string.rb:22:20:22:34 | ...[...] | -| tainted_format_string.rb:28:19:28:24 | call to params : | tainted_format_string.rb:28:19:28:33 | ...[...] | -| tainted_format_string.rb:33:32:33:37 | call to params : | tainted_format_string.rb:33:32:33:46 | ...[...] : | -| tainted_format_string.rb:33:32:33:46 | ...[...] : | tainted_format_string.rb:33:12:33:46 | ... + ... | -| tainted_format_string.rb:36:30:36:35 | call to params : | tainted_format_string.rb:36:30:36:44 | ...[...] : | -| tainted_format_string.rb:36:30:36:44 | ...[...] : | tainted_format_string.rb:36:12:36:46 | "A log message: #{...}" | -| tainted_format_string.rb:39:22:39:27 | call to params : | tainted_format_string.rb:39:22:39:36 | ...[...] : | -| tainted_format_string.rb:39:22:39:36 | ...[...] : | tainted_format_string.rb:39:5:39:45 | "A log message #{...} %{foo}" | -| tainted_format_string.rb:42:22:42:27 | call to params : | tainted_format_string.rb:42:22:42:36 | ...[...] : | -| tainted_format_string.rb:42:22:42:36 | ...[...] : | tainted_format_string.rb:42:5:42:43 | "A log message #{...} %08x" | +| tainted_format_string.rb:4:12:4:17 | call to params | tainted_format_string.rb:4:12:4:26 | ...[...] | +| tainted_format_string.rb:5:19:5:24 | call to params | tainted_format_string.rb:5:19:5:33 | ...[...] | +| tainted_format_string.rb:10:23:10:28 | call to params | tainted_format_string.rb:10:23:10:37 | ...[...] | +| tainted_format_string.rb:11:30:11:35 | call to params | tainted_format_string.rb:11:30:11:44 | ...[...] | +| tainted_format_string.rb:18:23:18:28 | call to params | tainted_format_string.rb:18:23:18:37 | ...[...] | +| tainted_format_string.rb:19:30:19:35 | call to params | tainted_format_string.rb:19:30:19:44 | ...[...] | +| tainted_format_string.rb:21:27:21:32 | call to params | tainted_format_string.rb:21:27:21:41 | ...[...] | +| tainted_format_string.rb:22:20:22:25 | call to params | tainted_format_string.rb:22:20:22:34 | ...[...] | +| tainted_format_string.rb:28:19:28:24 | call to params | tainted_format_string.rb:28:19:28:33 | ...[...] | +| tainted_format_string.rb:33:32:33:37 | call to params | tainted_format_string.rb:33:32:33:46 | ...[...] | +| tainted_format_string.rb:33:32:33:46 | ...[...] | tainted_format_string.rb:33:12:33:46 | ... + ... | +| tainted_format_string.rb:36:30:36:35 | call to params | tainted_format_string.rb:36:30:36:44 | ...[...] | +| tainted_format_string.rb:36:30:36:44 | ...[...] | tainted_format_string.rb:36:12:36:46 | "A log message: #{...}" | +| tainted_format_string.rb:39:22:39:27 | call to params | tainted_format_string.rb:39:22:39:36 | ...[...] | +| tainted_format_string.rb:39:22:39:36 | ...[...] | tainted_format_string.rb:39:5:39:45 | "A log message #{...} %{foo}" | +| tainted_format_string.rb:42:22:42:27 | call to params | tainted_format_string.rb:42:22:42:36 | ...[...] | +| tainted_format_string.rb:42:22:42:36 | ...[...] | tainted_format_string.rb:42:5:42:43 | "A log message #{...} %08x" | nodes -| tainted_format_string.rb:4:12:4:17 | call to params : | semmle.label | call to params : | +| tainted_format_string.rb:4:12:4:17 | call to params | semmle.label | call to params | | tainted_format_string.rb:4:12:4:26 | ...[...] | semmle.label | ...[...] | -| tainted_format_string.rb:5:19:5:24 | call to params : | semmle.label | call to params : | +| tainted_format_string.rb:5:19:5:24 | call to params | semmle.label | call to params | | tainted_format_string.rb:5:19:5:33 | ...[...] | semmle.label | ...[...] | -| tainted_format_string.rb:10:23:10:28 | call to params : | semmle.label | call to params : | +| tainted_format_string.rb:10:23:10:28 | call to params | semmle.label | call to params | | tainted_format_string.rb:10:23:10:37 | ...[...] | semmle.label | ...[...] | -| tainted_format_string.rb:11:30:11:35 | call to params : | semmle.label | call to params : | +| tainted_format_string.rb:11:30:11:35 | call to params | semmle.label | call to params | | tainted_format_string.rb:11:30:11:44 | ...[...] | semmle.label | ...[...] | -| tainted_format_string.rb:18:23:18:28 | call to params : | semmle.label | call to params : | +| tainted_format_string.rb:18:23:18:28 | call to params | semmle.label | call to params | | tainted_format_string.rb:18:23:18:37 | ...[...] | semmle.label | ...[...] | -| tainted_format_string.rb:19:30:19:35 | call to params : | semmle.label | call to params : | +| tainted_format_string.rb:19:30:19:35 | call to params | semmle.label | call to params | | tainted_format_string.rb:19:30:19:44 | ...[...] | semmle.label | ...[...] | -| tainted_format_string.rb:21:27:21:32 | call to params : | semmle.label | call to params : | +| tainted_format_string.rb:21:27:21:32 | call to params | semmle.label | call to params | | tainted_format_string.rb:21:27:21:41 | ...[...] | semmle.label | ...[...] | -| tainted_format_string.rb:22:20:22:25 | call to params : | semmle.label | call to params : | +| tainted_format_string.rb:22:20:22:25 | call to params | semmle.label | call to params | | tainted_format_string.rb:22:20:22:34 | ...[...] | semmle.label | ...[...] | -| tainted_format_string.rb:28:19:28:24 | call to params : | semmle.label | call to params : | +| tainted_format_string.rb:28:19:28:24 | call to params | semmle.label | call to params | | tainted_format_string.rb:28:19:28:33 | ...[...] | semmle.label | ...[...] | | tainted_format_string.rb:33:12:33:46 | ... + ... | semmle.label | ... + ... | -| tainted_format_string.rb:33:32:33:37 | call to params : | semmle.label | call to params : | -| tainted_format_string.rb:33:32:33:46 | ...[...] : | semmle.label | ...[...] : | +| tainted_format_string.rb:33:32:33:37 | call to params | semmle.label | call to params | +| tainted_format_string.rb:33:32:33:46 | ...[...] | semmle.label | ...[...] | | tainted_format_string.rb:36:12:36:46 | "A log message: #{...}" | semmle.label | "A log message: #{...}" | -| tainted_format_string.rb:36:30:36:35 | call to params : | semmle.label | call to params : | -| tainted_format_string.rb:36:30:36:44 | ...[...] : | semmle.label | ...[...] : | +| tainted_format_string.rb:36:30:36:35 | call to params | semmle.label | call to params | +| tainted_format_string.rb:36:30:36:44 | ...[...] | semmle.label | ...[...] | | tainted_format_string.rb:39:5:39:45 | "A log message #{...} %{foo}" | semmle.label | "A log message #{...} %{foo}" | -| tainted_format_string.rb:39:22:39:27 | call to params : | semmle.label | call to params : | -| tainted_format_string.rb:39:22:39:36 | ...[...] : | semmle.label | ...[...] : | +| tainted_format_string.rb:39:22:39:27 | call to params | semmle.label | call to params | +| tainted_format_string.rb:39:22:39:36 | ...[...] | semmle.label | ...[...] | | tainted_format_string.rb:42:5:42:43 | "A log message #{...} %08x" | semmle.label | "A log message #{...} %08x" | -| tainted_format_string.rb:42:22:42:27 | call to params : | semmle.label | call to params : | -| tainted_format_string.rb:42:22:42:36 | ...[...] : | semmle.label | ...[...] : | +| tainted_format_string.rb:42:22:42:27 | call to params | semmle.label | call to params | +| tainted_format_string.rb:42:22:42:36 | ...[...] | semmle.label | ...[...] | subpaths #select -| tainted_format_string.rb:4:12:4:26 | ...[...] | tainted_format_string.rb:4:12:4:17 | call to params : | tainted_format_string.rb:4:12:4:26 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:4:12:4:17 | call to params | user-provided value | -| tainted_format_string.rb:5:19:5:33 | ...[...] | tainted_format_string.rb:5:19:5:24 | call to params : | tainted_format_string.rb:5:19:5:33 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:5:19:5:24 | call to params | user-provided value | -| tainted_format_string.rb:10:23:10:37 | ...[...] | tainted_format_string.rb:10:23:10:28 | call to params : | tainted_format_string.rb:10:23:10:37 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:10:23:10:28 | call to params | user-provided value | -| tainted_format_string.rb:11:30:11:44 | ...[...] | tainted_format_string.rb:11:30:11:35 | call to params : | tainted_format_string.rb:11:30:11:44 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:11:30:11:35 | call to params | user-provided value | -| tainted_format_string.rb:18:23:18:37 | ...[...] | tainted_format_string.rb:18:23:18:28 | call to params : | tainted_format_string.rb:18:23:18:37 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:18:23:18:28 | call to params | user-provided value | -| tainted_format_string.rb:19:30:19:44 | ...[...] | tainted_format_string.rb:19:30:19:35 | call to params : | tainted_format_string.rb:19:30:19:44 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:19:30:19:35 | call to params | user-provided value | -| tainted_format_string.rb:21:27:21:41 | ...[...] | tainted_format_string.rb:21:27:21:32 | call to params : | tainted_format_string.rb:21:27:21:41 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:21:27:21:32 | call to params | user-provided value | -| tainted_format_string.rb:22:20:22:34 | ...[...] | tainted_format_string.rb:22:20:22:25 | call to params : | tainted_format_string.rb:22:20:22:34 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:22:20:22:25 | call to params | user-provided value | -| tainted_format_string.rb:28:19:28:33 | ...[...] | tainted_format_string.rb:28:19:28:24 | call to params : | tainted_format_string.rb:28:19:28:33 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:28:19:28:24 | call to params | user-provided value | -| tainted_format_string.rb:33:12:33:46 | ... + ... | tainted_format_string.rb:33:32:33:37 | call to params : | tainted_format_string.rb:33:12:33:46 | ... + ... | Format string depends on a $@. | tainted_format_string.rb:33:32:33:37 | call to params | user-provided value | -| tainted_format_string.rb:36:12:36:46 | "A log message: #{...}" | tainted_format_string.rb:36:30:36:35 | call to params : | tainted_format_string.rb:36:12:36:46 | "A log message: #{...}" | Format string depends on a $@. | tainted_format_string.rb:36:30:36:35 | call to params | user-provided value | -| tainted_format_string.rb:39:5:39:45 | "A log message #{...} %{foo}" | tainted_format_string.rb:39:22:39:27 | call to params : | tainted_format_string.rb:39:5:39:45 | "A log message #{...} %{foo}" | Format string depends on a $@. | tainted_format_string.rb:39:22:39:27 | call to params | user-provided value | -| tainted_format_string.rb:42:5:42:43 | "A log message #{...} %08x" | tainted_format_string.rb:42:22:42:27 | call to params : | tainted_format_string.rb:42:5:42:43 | "A log message #{...} %08x" | Format string depends on a $@. | tainted_format_string.rb:42:22:42:27 | call to params | user-provided value | +| tainted_format_string.rb:4:12:4:26 | ...[...] | tainted_format_string.rb:4:12:4:17 | call to params | tainted_format_string.rb:4:12:4:26 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:4:12:4:17 | call to params | user-provided value | +| tainted_format_string.rb:5:19:5:33 | ...[...] | tainted_format_string.rb:5:19:5:24 | call to params | tainted_format_string.rb:5:19:5:33 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:5:19:5:24 | call to params | user-provided value | +| tainted_format_string.rb:10:23:10:37 | ...[...] | tainted_format_string.rb:10:23:10:28 | call to params | tainted_format_string.rb:10:23:10:37 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:10:23:10:28 | call to params | user-provided value | +| tainted_format_string.rb:11:30:11:44 | ...[...] | tainted_format_string.rb:11:30:11:35 | call to params | tainted_format_string.rb:11:30:11:44 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:11:30:11:35 | call to params | user-provided value | +| tainted_format_string.rb:18:23:18:37 | ...[...] | tainted_format_string.rb:18:23:18:28 | call to params | tainted_format_string.rb:18:23:18:37 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:18:23:18:28 | call to params | user-provided value | +| tainted_format_string.rb:19:30:19:44 | ...[...] | tainted_format_string.rb:19:30:19:35 | call to params | tainted_format_string.rb:19:30:19:44 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:19:30:19:35 | call to params | user-provided value | +| tainted_format_string.rb:21:27:21:41 | ...[...] | tainted_format_string.rb:21:27:21:32 | call to params | tainted_format_string.rb:21:27:21:41 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:21:27:21:32 | call to params | user-provided value | +| tainted_format_string.rb:22:20:22:34 | ...[...] | tainted_format_string.rb:22:20:22:25 | call to params | tainted_format_string.rb:22:20:22:34 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:22:20:22:25 | call to params | user-provided value | +| tainted_format_string.rb:28:19:28:33 | ...[...] | tainted_format_string.rb:28:19:28:24 | call to params | tainted_format_string.rb:28:19:28:33 | ...[...] | Format string depends on a $@. | tainted_format_string.rb:28:19:28:24 | call to params | user-provided value | +| tainted_format_string.rb:33:12:33:46 | ... + ... | tainted_format_string.rb:33:32:33:37 | call to params | tainted_format_string.rb:33:12:33:46 | ... + ... | Format string depends on a $@. | tainted_format_string.rb:33:32:33:37 | call to params | user-provided value | +| tainted_format_string.rb:36:12:36:46 | "A log message: #{...}" | tainted_format_string.rb:36:30:36:35 | call to params | tainted_format_string.rb:36:12:36:46 | "A log message: #{...}" | Format string depends on a $@. | tainted_format_string.rb:36:30:36:35 | call to params | user-provided value | +| tainted_format_string.rb:39:5:39:45 | "A log message #{...} %{foo}" | tainted_format_string.rb:39:22:39:27 | call to params | tainted_format_string.rb:39:5:39:45 | "A log message #{...} %{foo}" | Format string depends on a $@. | tainted_format_string.rb:39:22:39:27 | call to params | user-provided value | +| tainted_format_string.rb:42:5:42:43 | "A log message #{...} %08x" | tainted_format_string.rb:42:22:42:27 | call to params | tainted_format_string.rb:42:5:42:43 | "A log message #{...} %08x" | Format string depends on a $@. | tainted_format_string.rb:42:22:42:27 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-209/StackTraceExposure.expected b/ruby/ql/test/query-tests/security/cwe-209/StackTraceExposure.expected index 532c7752905..59dc2e070ee 100644 --- a/ruby/ql/test/query-tests/security/cwe-209/StackTraceExposure.expected +++ b/ruby/ql/test/query-tests/security/cwe-209/StackTraceExposure.expected @@ -1,14 +1,14 @@ edges -| StackTraceExposure.rb:11:5:11:6 | bt : | StackTraceExposure.rb:12:18:12:19 | bt | -| StackTraceExposure.rb:11:10:11:17 | call to caller : | StackTraceExposure.rb:11:5:11:6 | bt : | +| StackTraceExposure.rb:11:5:11:6 | bt | StackTraceExposure.rb:12:18:12:19 | bt | +| StackTraceExposure.rb:11:10:11:17 | call to caller | StackTraceExposure.rb:11:5:11:6 | bt | nodes | StackTraceExposure.rb:6:18:6:28 | call to backtrace | semmle.label | call to backtrace | -| StackTraceExposure.rb:11:5:11:6 | bt : | semmle.label | bt : | -| StackTraceExposure.rb:11:10:11:17 | call to caller : | semmle.label | call to caller : | +| StackTraceExposure.rb:11:5:11:6 | bt | semmle.label | bt | +| StackTraceExposure.rb:11:10:11:17 | call to caller | semmle.label | call to caller | | StackTraceExposure.rb:12:18:12:19 | bt | semmle.label | bt | | StackTraceExposure.rb:18:18:18:28 | call to backtrace | semmle.label | call to backtrace | subpaths #select | StackTraceExposure.rb:6:18:6:28 | call to backtrace | StackTraceExposure.rb:6:18:6:28 | call to backtrace | StackTraceExposure.rb:6:18:6:28 | call to backtrace | $@ can be exposed to an external user. | StackTraceExposure.rb:6:18:6:28 | call to backtrace | Error information | -| StackTraceExposure.rb:12:18:12:19 | bt | StackTraceExposure.rb:11:10:11:17 | call to caller : | StackTraceExposure.rb:12:18:12:19 | bt | $@ can be exposed to an external user. | StackTraceExposure.rb:11:10:11:17 | call to caller | Error information | +| StackTraceExposure.rb:12:18:12:19 | bt | StackTraceExposure.rb:11:10:11:17 | call to caller | StackTraceExposure.rb:12:18:12:19 | bt | $@ can be exposed to an external user. | StackTraceExposure.rb:11:10:11:17 | call to caller | Error information | | StackTraceExposure.rb:18:18:18:28 | call to backtrace | StackTraceExposure.rb:18:18:18:28 | call to backtrace | StackTraceExposure.rb:18:18:18:28 | call to backtrace | $@ can be exposed to an external user. | StackTraceExposure.rb:18:18:18:28 | call to backtrace | Error information | diff --git a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected index 90968a06b2b..a35aef72936 100644 --- a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected @@ -1,46 +1,46 @@ edges -| logging.rb:3:1:3:8 | password : | logging.rb:6:20:6:27 | password | -| logging.rb:3:1:3:8 | password : | logging.rb:8:21:8:28 | password | -| logging.rb:3:1:3:8 | password : | logging.rb:10:21:10:28 | password | -| logging.rb:3:1:3:8 | password : | logging.rb:12:21:12:28 | password | -| logging.rb:3:1:3:8 | password : | logging.rb:14:23:14:30 | password | -| logging.rb:3:1:3:8 | password : | logging.rb:16:20:16:27 | password | -| logging.rb:3:1:3:8 | password : | logging.rb:19:33:19:40 | password | -| logging.rb:3:1:3:8 | password : | logging.rb:21:44:21:51 | password | -| logging.rb:3:1:3:8 | password : | logging.rb:23:33:23:40 | password | -| logging.rb:3:1:3:8 | password : | logging.rb:26:18:26:34 | "pw: #{...}" | -| logging.rb:3:1:3:8 | password : | logging.rb:28:26:28:33 | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:3:1:3:8 | password : | -| logging.rb:30:1:30:4 | hsh1 [element :password] : | logging.rb:38:20:38:23 | hsh1 [element :password] : | -| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" : | logging.rb:30:1:30:4 | hsh1 [element :password] : | -| logging.rb:34:1:34:4 | [post] hsh2 [element :password] : | logging.rb:35:1:35:4 | hsh3 [element :password] : | -| logging.rb:34:1:34:4 | [post] hsh2 [element :password] : | logging.rb:40:20:40:23 | hsh2 [element :password] : | -| logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" : | logging.rb:34:1:34:4 | [post] hsh2 [element :password] : | -| logging.rb:35:1:35:4 | hsh3 [element :password] : | logging.rb:42:20:42:23 | hsh3 [element :password] : | -| logging.rb:38:20:38:23 | hsh1 [element :password] : | logging.rb:38:20:38:34 | ...[...] | -| logging.rb:40:20:40:23 | hsh2 [element :password] : | logging.rb:40:20:40:34 | ...[...] | -| logging.rb:42:20:42:23 | hsh3 [element :password] : | logging.rb:42:20:42:34 | ...[...] | -| logging.rb:64:1:64:31 | password_masked_ineffective_sub : | logging.rb:68:35:68:65 | password_masked_ineffective_sub : | -| logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:64:1:64:31 | password_masked_ineffective_sub : | -| logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex : | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | -| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex : | -| logging.rb:66:1:66:32 | password_masked_ineffective_gsub : | logging.rb:70:36:70:67 | password_masked_ineffective_gsub : | -| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:66:1:66:32 | password_masked_ineffective_gsub : | -| logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex : | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | -| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex : | -| logging.rb:68:1:68:31 | password_masked_ineffective_sub : | logging.rb:74:20:74:50 | password_masked_ineffective_sub | -| logging.rb:68:35:68:65 | password_masked_ineffective_sub : | logging.rb:68:35:68:88 | call to sub : | -| logging.rb:68:35:68:88 | call to sub : | logging.rb:68:1:68:31 | password_masked_ineffective_sub : | -| logging.rb:70:1:70:32 | password_masked_ineffective_gsub : | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | -| logging.rb:70:36:70:67 | password_masked_ineffective_gsub : | logging.rb:70:36:70:86 | call to gsub : | -| logging.rb:70:36:70:86 | call to gsub : | logging.rb:70:1:70:32 | password_masked_ineffective_gsub : | -| logging.rb:82:9:82:16 | password : | logging.rb:84:15:84:22 | password | -| logging.rb:87:1:87:12 | password_arg : | logging.rb:88:5:88:16 | password_arg : | -| logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" : | logging.rb:87:1:87:12 | password_arg : | -| logging.rb:88:5:88:16 | password_arg : | logging.rb:82:9:82:16 | password : | +| logging.rb:3:1:3:8 | password | logging.rb:6:20:6:27 | password | +| logging.rb:3:1:3:8 | password | logging.rb:8:21:8:28 | password | +| logging.rb:3:1:3:8 | password | logging.rb:10:21:10:28 | password | +| logging.rb:3:1:3:8 | password | logging.rb:12:21:12:28 | password | +| logging.rb:3:1:3:8 | password | logging.rb:14:23:14:30 | password | +| logging.rb:3:1:3:8 | password | logging.rb:16:20:16:27 | password | +| logging.rb:3:1:3:8 | password | logging.rb:19:33:19:40 | password | +| logging.rb:3:1:3:8 | password | logging.rb:21:44:21:51 | password | +| logging.rb:3:1:3:8 | password | logging.rb:23:33:23:40 | password | +| logging.rb:3:1:3:8 | password | logging.rb:26:18:26:34 | "pw: #{...}" | +| logging.rb:3:1:3:8 | password | logging.rb:28:26:28:33 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:3:1:3:8 | password | +| logging.rb:30:1:30:4 | hsh1 [element :password] | logging.rb:38:20:38:23 | hsh1 [element :password] | +| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | logging.rb:30:1:30:4 | hsh1 [element :password] | +| logging.rb:34:1:34:4 | [post] hsh2 [element :password] | logging.rb:35:1:35:4 | hsh3 [element :password] | +| logging.rb:34:1:34:4 | [post] hsh2 [element :password] | logging.rb:40:20:40:23 | hsh2 [element :password] | +| logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | logging.rb:34:1:34:4 | [post] hsh2 [element :password] | +| logging.rb:35:1:35:4 | hsh3 [element :password] | logging.rb:42:20:42:23 | hsh3 [element :password] | +| logging.rb:38:20:38:23 | hsh1 [element :password] | logging.rb:38:20:38:34 | ...[...] | +| logging.rb:40:20:40:23 | hsh2 [element :password] | logging.rb:40:20:40:34 | ...[...] | +| logging.rb:42:20:42:23 | hsh3 [element :password] | logging.rb:42:20:42:34 | ...[...] | +| logging.rb:64:1:64:31 | password_masked_ineffective_sub | logging.rb:68:35:68:65 | password_masked_ineffective_sub | +| logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" | logging.rb:64:1:64:31 | password_masked_ineffective_sub | +| logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | +| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" | logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex | +| logging.rb:66:1:66:32 | password_masked_ineffective_gsub | logging.rb:70:36:70:67 | password_masked_ineffective_gsub | +| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" | logging.rb:66:1:66:32 | password_masked_ineffective_gsub | +| logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | +| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" | logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex | +| logging.rb:68:1:68:31 | password_masked_ineffective_sub | logging.rb:74:20:74:50 | password_masked_ineffective_sub | +| logging.rb:68:35:68:65 | password_masked_ineffective_sub | logging.rb:68:35:68:88 | call to sub | +| logging.rb:68:35:68:88 | call to sub | logging.rb:68:1:68:31 | password_masked_ineffective_sub | +| logging.rb:70:1:70:32 | password_masked_ineffective_gsub | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | +| logging.rb:70:36:70:67 | password_masked_ineffective_gsub | logging.rb:70:36:70:86 | call to gsub | +| logging.rb:70:36:70:86 | call to gsub | logging.rb:70:1:70:32 | password_masked_ineffective_gsub | +| logging.rb:82:9:82:16 | password | logging.rb:84:15:84:22 | password | +| logging.rb:87:1:87:12 | password_arg | logging.rb:88:5:88:16 | password_arg | +| logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" | logging.rb:87:1:87:12 | password_arg | +| logging.rb:88:5:88:16 | password_arg | logging.rb:82:9:82:16 | password | nodes -| logging.rb:3:1:3:8 | password : | semmle.label | password : | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | semmle.label | "043697b96909e03ca907599d6420555f" : | +| logging.rb:3:1:3:8 | password | semmle.label | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | semmle.label | "043697b96909e03ca907599d6420555f" | | logging.rb:6:20:6:27 | password | semmle.label | password | | logging.rb:8:21:8:28 | password | semmle.label | password | | logging.rb:10:21:10:28 | password | semmle.label | password | @@ -52,61 +52,61 @@ nodes | logging.rb:23:33:23:40 | password | semmle.label | password | | logging.rb:26:18:26:34 | "pw: #{...}" | semmle.label | "pw: #{...}" | | logging.rb:28:26:28:33 | password | semmle.label | password | -| logging.rb:30:1:30:4 | hsh1 [element :password] : | semmle.label | hsh1 [element :password] : | -| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" : | semmle.label | "aec5058e61f7f122998b1a30ee2c66b6" : | -| logging.rb:34:1:34:4 | [post] hsh2 [element :password] : | semmle.label | [post] hsh2 [element :password] : | -| logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" : | semmle.label | "beeda625d7306b45784d91ea0336e201" : | -| logging.rb:35:1:35:4 | hsh3 [element :password] : | semmle.label | hsh3 [element :password] : | -| logging.rb:38:20:38:23 | hsh1 [element :password] : | semmle.label | hsh1 [element :password] : | +| logging.rb:30:1:30:4 | hsh1 [element :password] | semmle.label | hsh1 [element :password] | +| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | semmle.label | "aec5058e61f7f122998b1a30ee2c66b6" | +| logging.rb:34:1:34:4 | [post] hsh2 [element :password] | semmle.label | [post] hsh2 [element :password] | +| logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | semmle.label | "beeda625d7306b45784d91ea0336e201" | +| logging.rb:35:1:35:4 | hsh3 [element :password] | semmle.label | hsh3 [element :password] | +| logging.rb:38:20:38:23 | hsh1 [element :password] | semmle.label | hsh1 [element :password] | | logging.rb:38:20:38:34 | ...[...] | semmle.label | ...[...] | -| logging.rb:40:20:40:23 | hsh2 [element :password] : | semmle.label | hsh2 [element :password] : | +| logging.rb:40:20:40:23 | hsh2 [element :password] | semmle.label | hsh2 [element :password] | | logging.rb:40:20:40:34 | ...[...] | semmle.label | ...[...] | -| logging.rb:42:20:42:23 | hsh3 [element :password] : | semmle.label | hsh3 [element :password] : | +| logging.rb:42:20:42:23 | hsh3 [element :password] | semmle.label | hsh3 [element :password] | | logging.rb:42:20:42:34 | ...[...] | semmle.label | ...[...] | -| logging.rb:64:1:64:31 | password_masked_ineffective_sub : | semmle.label | password_masked_ineffective_sub : | -| logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" : | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" : | -| logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex : | semmle.label | password_masked_ineffective_sub_ex : | -| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" : | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" : | -| logging.rb:66:1:66:32 | password_masked_ineffective_gsub : | semmle.label | password_masked_ineffective_gsub : | -| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" : | semmle.label | "a7e3747b19930d4f4b8181047194832f" : | -| logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex : | semmle.label | password_masked_ineffective_gsub_ex : | -| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" : | semmle.label | "a7e3747b19930d4f4b8181047194832f" : | -| logging.rb:68:1:68:31 | password_masked_ineffective_sub : | semmle.label | password_masked_ineffective_sub : | -| logging.rb:68:35:68:65 | password_masked_ineffective_sub : | semmle.label | password_masked_ineffective_sub : | -| logging.rb:68:35:68:88 | call to sub : | semmle.label | call to sub : | -| logging.rb:70:1:70:32 | password_masked_ineffective_gsub : | semmle.label | password_masked_ineffective_gsub : | -| logging.rb:70:36:70:67 | password_masked_ineffective_gsub : | semmle.label | password_masked_ineffective_gsub : | -| logging.rb:70:36:70:86 | call to gsub : | semmle.label | call to gsub : | +| logging.rb:64:1:64:31 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | +| logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" | +| logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex | semmle.label | password_masked_ineffective_sub_ex | +| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" | +| logging.rb:66:1:66:32 | password_masked_ineffective_gsub | semmle.label | password_masked_ineffective_gsub | +| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" | semmle.label | "a7e3747b19930d4f4b8181047194832f" | +| logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex | semmle.label | password_masked_ineffective_gsub_ex | +| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" | semmle.label | "a7e3747b19930d4f4b8181047194832f" | +| logging.rb:68:1:68:31 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | +| logging.rb:68:35:68:65 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | +| logging.rb:68:35:68:88 | call to sub | semmle.label | call to sub | +| logging.rb:70:1:70:32 | password_masked_ineffective_gsub | semmle.label | password_masked_ineffective_gsub | +| logging.rb:70:36:70:67 | password_masked_ineffective_gsub | semmle.label | password_masked_ineffective_gsub | +| logging.rb:70:36:70:86 | call to gsub | semmle.label | call to gsub | | logging.rb:74:20:74:50 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | semmle.label | password_masked_ineffective_gsub | | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | semmle.label | password_masked_ineffective_sub_ex | | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | semmle.label | password_masked_ineffective_gsub_ex | -| logging.rb:82:9:82:16 | password : | semmle.label | password : | +| logging.rb:82:9:82:16 | password | semmle.label | password | | logging.rb:84:15:84:22 | password | semmle.label | password | -| logging.rb:87:1:87:12 | password_arg : | semmle.label | password_arg : | -| logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" : | semmle.label | "65f2950df2f0e2c38d7ba2ccca767291" : | -| logging.rb:88:5:88:16 | password_arg : | semmle.label | password_arg : | +| logging.rb:87:1:87:12 | password_arg | semmle.label | password_arg | +| logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" | semmle.label | "65f2950df2f0e2c38d7ba2ccca767291" | +| logging.rb:88:5:88:16 | password_arg | semmle.label | password_arg | subpaths #select -| logging.rb:6:20:6:27 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:6:20:6:27 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:8:21:8:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:8:21:8:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:10:21:10:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:10:21:10:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:12:21:12:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:12:21:12:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:14:23:14:30 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:14:23:14:30 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:16:20:16:27 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:16:20:16:27 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:19:33:19:40 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:19:33:19:40 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:21:44:21:51 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:21:44:21:51 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:23:33:23:40 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:23:33:23:40 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:26:18:26:34 | "pw: #{...}" | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:26:18:26:34 | "pw: #{...}" | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:28:26:28:33 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:28:26:28:33 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:38:20:38:34 | ...[...] | logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" : | logging.rb:38:20:38:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | a write to password | -| logging.rb:40:20:40:34 | ...[...] | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" : | logging.rb:40:20:40:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | a write to password | -| logging.rb:42:20:42:34 | ...[...] | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" : | logging.rb:42:20:42:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | a write to password | -| logging.rb:74:20:74:50 | password_masked_ineffective_sub | logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:74:20:74:50 | password_masked_ineffective_sub | This logs sensitive data returned by $@ as clear text. | logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" | an assignment to password_masked_ineffective_sub | -| logging.rb:74:20:74:50 | password_masked_ineffective_sub | logging.rb:68:35:68:88 | call to sub : | logging.rb:74:20:74:50 | password_masked_ineffective_sub | This logs sensitive data returned by $@ as clear text. | logging.rb:68:35:68:88 | call to sub | an assignment to password_masked_ineffective_sub | -| logging.rb:76:20:76:51 | password_masked_ineffective_gsub | logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | This logs sensitive data returned by $@ as clear text. | logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" | an assignment to password_masked_ineffective_gsub | -| logging.rb:76:20:76:51 | password_masked_ineffective_gsub | logging.rb:70:36:70:86 | call to gsub : | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | This logs sensitive data returned by $@ as clear text. | logging.rb:70:36:70:86 | call to gsub | an assignment to password_masked_ineffective_gsub | -| logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | This logs sensitive data returned by $@ as clear text. | logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" | an assignment to password_masked_ineffective_sub_ex | -| logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | This logs sensitive data returned by $@ as clear text. | logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" | an assignment to password_masked_ineffective_gsub_ex | +| logging.rb:6:20:6:27 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:6:20:6:27 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:8:21:8:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:8:21:8:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:10:21:10:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:10:21:10:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:12:21:12:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:12:21:12:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:14:23:14:30 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:14:23:14:30 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:16:20:16:27 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:16:20:16:27 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:19:33:19:40 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:19:33:19:40 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:21:44:21:51 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:21:44:21:51 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:23:33:23:40 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:23:33:23:40 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:26:18:26:34 | "pw: #{...}" | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:26:18:26:34 | "pw: #{...}" | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:28:26:28:33 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:28:26:28:33 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:38:20:38:34 | ...[...] | logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | logging.rb:38:20:38:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | a write to password | +| logging.rb:40:20:40:34 | ...[...] | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | logging.rb:40:20:40:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | a write to password | +| logging.rb:42:20:42:34 | ...[...] | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | logging.rb:42:20:42:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | a write to password | +| logging.rb:74:20:74:50 | password_masked_ineffective_sub | logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" | logging.rb:74:20:74:50 | password_masked_ineffective_sub | This logs sensitive data returned by $@ as clear text. | logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" | an assignment to password_masked_ineffective_sub | +| logging.rb:74:20:74:50 | password_masked_ineffective_sub | logging.rb:68:35:68:88 | call to sub | logging.rb:74:20:74:50 | password_masked_ineffective_sub | This logs sensitive data returned by $@ as clear text. | logging.rb:68:35:68:88 | call to sub | an assignment to password_masked_ineffective_sub | +| logging.rb:76:20:76:51 | password_masked_ineffective_gsub | logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | This logs sensitive data returned by $@ as clear text. | logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" | an assignment to password_masked_ineffective_gsub | +| logging.rb:76:20:76:51 | password_masked_ineffective_gsub | logging.rb:70:36:70:86 | call to gsub | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | This logs sensitive data returned by $@ as clear text. | logging.rb:70:36:70:86 | call to gsub | an assignment to password_masked_ineffective_gsub | +| logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | This logs sensitive data returned by $@ as clear text. | logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" | an assignment to password_masked_ineffective_sub_ex | +| logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | This logs sensitive data returned by $@ as clear text. | logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" | an assignment to password_masked_ineffective_gsub_ex | | logging.rb:84:15:84:22 | password | logging.rb:84:15:84:22 | password | logging.rb:84:15:84:22 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:84:15:84:22 | password | a parameter password | -| logging.rb:84:15:84:22 | password | logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" : | logging.rb:84:15:84:22 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" | an assignment to password_arg | +| logging.rb:84:15:84:22 | password | logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" | logging.rb:84:15:84:22 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" | an assignment to password_arg | diff --git a/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected b/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected index 9f8f849b10a..9ec7e50e460 100644 --- a/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected @@ -1,96 +1,96 @@ edges -| app/controllers/users_controller.rb:3:5:3:16 | new_password : | app/controllers/users_controller.rb:5:39:5:50 | new_password | -| app/controllers/users_controller.rb:3:5:3:16 | new_password : | app/controllers/users_controller.rb:7:41:7:52 | new_password | -| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : | app/controllers/users_controller.rb:3:5:3:16 | new_password : | -| app/controllers/users_controller.rb:11:5:11:16 | new_password : | app/controllers/users_controller.rb:13:42:13:53 | new_password | -| app/controllers/users_controller.rb:11:5:11:16 | new_password : | app/controllers/users_controller.rb:15:49:15:60 | new_password | -| app/controllers/users_controller.rb:11:5:11:16 | new_password : | app/controllers/users_controller.rb:15:49:15:60 | new_password : | -| app/controllers/users_controller.rb:11:5:11:16 | new_password : | app/controllers/users_controller.rb:15:87:15:98 | new_password | -| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | app/controllers/users_controller.rb:11:5:11:16 | new_password : | -| app/controllers/users_controller.rb:15:49:15:60 | new_password : | app/controllers/users_controller.rb:15:87:15:98 | new_password | -| app/controllers/users_controller.rb:19:5:19:16 | new_password : | app/controllers/users_controller.rb:21:45:21:56 | new_password | -| app/controllers/users_controller.rb:19:5:19:16 | new_password : | app/controllers/users_controller.rb:21:45:21:56 | new_password : | -| app/controllers/users_controller.rb:19:5:19:16 | new_password : | app/controllers/users_controller.rb:21:83:21:94 | new_password | -| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | app/controllers/users_controller.rb:19:5:19:16 | new_password : | -| app/controllers/users_controller.rb:21:45:21:56 | new_password : | app/controllers/users_controller.rb:21:83:21:94 | new_password | -| app/controllers/users_controller.rb:26:5:26:16 | new_password : | app/controllers/users_controller.rb:28:27:28:38 | new_password | -| app/controllers/users_controller.rb:26:5:26:16 | new_password : | app/controllers/users_controller.rb:30:28:30:39 | new_password | -| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : | app/controllers/users_controller.rb:26:5:26:16 | new_password : | -| app/controllers/users_controller.rb:35:5:35:16 | new_password : | app/controllers/users_controller.rb:37:39:37:50 | new_password | -| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" : | app/controllers/users_controller.rb:35:5:35:16 | new_password : | -| app/controllers/users_controller.rb:42:5:42:16 | new_password : | app/controllers/users_controller.rb:44:21:44:32 | new_password | -| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" : | app/controllers/users_controller.rb:42:5:42:16 | new_password : | -| app/controllers/users_controller.rb:58:5:58:16 | new_password : | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | -| app/controllers/users_controller.rb:58:5:58:16 | new_password : | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | -| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : | app/controllers/users_controller.rb:58:5:58:16 | new_password : | -| app/models/user.rb:3:5:3:16 | new_password : | app/models/user.rb:5:27:5:38 | new_password | -| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" : | app/models/user.rb:3:5:3:16 | new_password : | -| app/models/user.rb:9:5:9:16 | new_password : | app/models/user.rb:11:22:11:33 | new_password | -| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" : | app/models/user.rb:9:5:9:16 | new_password : | -| app/models/user.rb:15:5:15:16 | new_password : | app/models/user.rb:17:21:17:32 | new_password | -| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" : | app/models/user.rb:15:5:15:16 | new_password : | +| app/controllers/users_controller.rb:3:5:3:16 | new_password | app/controllers/users_controller.rb:5:39:5:50 | new_password | +| app/controllers/users_controller.rb:3:5:3:16 | new_password | app/controllers/users_controller.rb:7:41:7:52 | new_password | +| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | app/controllers/users_controller.rb:3:5:3:16 | new_password | +| app/controllers/users_controller.rb:11:5:11:16 | new_password | app/controllers/users_controller.rb:13:42:13:53 | new_password | +| app/controllers/users_controller.rb:11:5:11:16 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password | +| app/controllers/users_controller.rb:11:5:11:16 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password | +| app/controllers/users_controller.rb:11:5:11:16 | new_password | app/controllers/users_controller.rb:15:87:15:98 | new_password | +| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | app/controllers/users_controller.rb:11:5:11:16 | new_password | +| app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:15:87:15:98 | new_password | +| app/controllers/users_controller.rb:19:5:19:16 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password | +| app/controllers/users_controller.rb:19:5:19:16 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password | +| app/controllers/users_controller.rb:19:5:19:16 | new_password | app/controllers/users_controller.rb:21:83:21:94 | new_password | +| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | app/controllers/users_controller.rb:19:5:19:16 | new_password | +| app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:21:83:21:94 | new_password | +| app/controllers/users_controller.rb:26:5:26:16 | new_password | app/controllers/users_controller.rb:28:27:28:38 | new_password | +| app/controllers/users_controller.rb:26:5:26:16 | new_password | app/controllers/users_controller.rb:30:28:30:39 | new_password | +| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | app/controllers/users_controller.rb:26:5:26:16 | new_password | +| app/controllers/users_controller.rb:35:5:35:16 | new_password | app/controllers/users_controller.rb:37:39:37:50 | new_password | +| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" | app/controllers/users_controller.rb:35:5:35:16 | new_password | +| app/controllers/users_controller.rb:42:5:42:16 | new_password | app/controllers/users_controller.rb:44:21:44:32 | new_password | +| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" | app/controllers/users_controller.rb:42:5:42:16 | new_password | +| app/controllers/users_controller.rb:58:5:58:16 | new_password | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | +| app/controllers/users_controller.rb:58:5:58:16 | new_password | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | +| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | app/controllers/users_controller.rb:58:5:58:16 | new_password | +| app/models/user.rb:3:5:3:16 | new_password | app/models/user.rb:5:27:5:38 | new_password | +| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" | app/models/user.rb:3:5:3:16 | new_password | +| app/models/user.rb:9:5:9:16 | new_password | app/models/user.rb:11:22:11:33 | new_password | +| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" | app/models/user.rb:9:5:9:16 | new_password | +| app/models/user.rb:15:5:15:16 | new_password | app/models/user.rb:17:21:17:32 | new_password | +| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" | app/models/user.rb:15:5:15:16 | new_password | nodes -| app/controllers/users_controller.rb:3:5:3:16 | new_password : | semmle.label | new_password : | -| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : | semmle.label | "043697b96909e03ca907599d6420555f" : | +| app/controllers/users_controller.rb:3:5:3:16 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | semmle.label | "043697b96909e03ca907599d6420555f" | | app/controllers/users_controller.rb:5:39:5:50 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:7:41:7:52 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:11:5:11:16 | new_password : | semmle.label | new_password : | -| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | semmle.label | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | +| app/controllers/users_controller.rb:11:5:11:16 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | semmle.label | "083c9e1da4cc0c2f5480bb4dbe6ff141" | | app/controllers/users_controller.rb:13:42:13:53 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:15:49:15:60 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:15:49:15:60 | new_password : | semmle.label | new_password : | +| app/controllers/users_controller.rb:15:49:15:60 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:15:87:15:98 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:19:5:19:16 | new_password : | semmle.label | new_password : | -| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | semmle.label | "504d224a806cf8073cd14ef08242d422" : | +| app/controllers/users_controller.rb:19:5:19:16 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | semmle.label | "504d224a806cf8073cd14ef08242d422" | +| app/controllers/users_controller.rb:21:45:21:56 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:21:45:21:56 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:21:45:21:56 | new_password : | semmle.label | new_password : | | app/controllers/users_controller.rb:21:83:21:94 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:26:5:26:16 | new_password : | semmle.label | new_password : | -| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : | semmle.label | "7d6ae08394c3f284506dca70f05995f6" : | +| app/controllers/users_controller.rb:26:5:26:16 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | semmle.label | "7d6ae08394c3f284506dca70f05995f6" | | app/controllers/users_controller.rb:28:27:28:38 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:30:28:30:39 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:35:5:35:16 | new_password : | semmle.label | new_password : | -| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" : | semmle.label | "ff295f8648a406c37fbe378377320e4c" : | +| app/controllers/users_controller.rb:35:5:35:16 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" | semmle.label | "ff295f8648a406c37fbe378377320e4c" | | app/controllers/users_controller.rb:37:39:37:50 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:42:5:42:16 | new_password : | semmle.label | new_password : | -| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" : | semmle.label | "78ffbec583b546bd073efd898f833184" : | +| app/controllers/users_controller.rb:42:5:42:16 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" | semmle.label | "78ffbec583b546bd073efd898f833184" | | app/controllers/users_controller.rb:44:21:44:32 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:58:5:58:16 | new_password : | semmle.label | new_password : | -| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : | semmle.label | "0157af7c38cbdd24f1616de4e5321861" : | +| app/controllers/users_controller.rb:58:5:58:16 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | semmle.label | "0157af7c38cbdd24f1616de4e5321861" | | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | semmle.label | "password: #{...}\\n" | | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | semmle.label | "password: #{...}" | -| app/models/user.rb:3:5:3:16 | new_password : | semmle.label | new_password : | -| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" : | semmle.label | "06c38c6a8a9c11a9d3b209a3193047b4" : | +| app/models/user.rb:3:5:3:16 | new_password | semmle.label | new_password | +| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" | semmle.label | "06c38c6a8a9c11a9d3b209a3193047b4" | | app/models/user.rb:5:27:5:38 | new_password | semmle.label | new_password | -| app/models/user.rb:9:5:9:16 | new_password : | semmle.label | new_password : | -| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" : | semmle.label | "52652fb5c709fb6b9b5a0194af7c6067" : | +| app/models/user.rb:9:5:9:16 | new_password | semmle.label | new_password | +| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" | semmle.label | "52652fb5c709fb6b9b5a0194af7c6067" | | app/models/user.rb:11:22:11:33 | new_password | semmle.label | new_password | -| app/models/user.rb:15:5:15:16 | new_password : | semmle.label | new_password : | -| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" : | semmle.label | "f982bf2531c149a8a1444a951b12e830" : | +| app/models/user.rb:15:5:15:16 | new_password | semmle.label | new_password | +| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" | semmle.label | "f982bf2531c149a8a1444a951b12e830" | | app/models/user.rb:17:21:17:32 | new_password | semmle.label | new_password | subpaths #select -| app/controllers/users_controller.rb:5:39:5:50 | new_password | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : | app/controllers/users_controller.rb:5:39:5:50 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | an assignment to new_password | -| app/controllers/users_controller.rb:7:41:7:52 | new_password | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : | app/controllers/users_controller.rb:7:41:7:52 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | an assignment to new_password | +| app/controllers/users_controller.rb:5:39:5:50 | new_password | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | app/controllers/users_controller.rb:5:39:5:50 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | an assignment to new_password | +| app/controllers/users_controller.rb:7:41:7:52 | new_password | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | app/controllers/users_controller.rb:7:41:7:52 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | an assignment to new_password | | app/controllers/users_controller.rb:7:41:7:52 | new_password | app/controllers/users_controller.rb:7:41:7:52 | new_password | app/controllers/users_controller.rb:7:41:7:52 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:7:41:7:52 | new_password | a write to password | -| app/controllers/users_controller.rb:13:42:13:53 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | app/controllers/users_controller.rb:13:42:13:53 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | -| app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | app/controllers/users_controller.rb:15:49:15:60 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | +| app/controllers/users_controller.rb:13:42:13:53 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | app/controllers/users_controller.rb:13:42:13:53 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | +| app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | app/controllers/users_controller.rb:15:49:15:60 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | | app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:15:49:15:60 | new_password | a write to password | -| app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | app/controllers/users_controller.rb:15:87:15:98 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | -| app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password : | app/controllers/users_controller.rb:15:87:15:98 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:15:49:15:60 | new_password | a write to password | +| app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | app/controllers/users_controller.rb:15:87:15:98 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | +| app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:15:87:15:98 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:15:49:15:60 | new_password | a write to password | | app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:15:87:15:98 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:15:87:15:98 | new_password | a write to password | -| app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | app/controllers/users_controller.rb:21:45:21:56 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | an assignment to new_password | +| app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | app/controllers/users_controller.rb:21:45:21:56 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | an assignment to new_password | | app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:21:45:21:56 | new_password | a write to password | -| app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | app/controllers/users_controller.rb:21:83:21:94 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | an assignment to new_password | -| app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password : | app/controllers/users_controller.rb:21:83:21:94 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:21:45:21:56 | new_password | a write to password | +| app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | app/controllers/users_controller.rb:21:83:21:94 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | an assignment to new_password | +| app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:21:83:21:94 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:21:45:21:56 | new_password | a write to password | | app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:21:83:21:94 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:21:83:21:94 | new_password | a write to password | -| app/controllers/users_controller.rb:28:27:28:38 | new_password | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : | app/controllers/users_controller.rb:28:27:28:38 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | an assignment to new_password | -| app/controllers/users_controller.rb:30:28:30:39 | new_password | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : | app/controllers/users_controller.rb:30:28:30:39 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | an assignment to new_password | +| app/controllers/users_controller.rb:28:27:28:38 | new_password | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | app/controllers/users_controller.rb:28:27:28:38 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | an assignment to new_password | +| app/controllers/users_controller.rb:30:28:30:39 | new_password | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | app/controllers/users_controller.rb:30:28:30:39 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | an assignment to new_password | | app/controllers/users_controller.rb:30:28:30:39 | new_password | app/controllers/users_controller.rb:30:28:30:39 | new_password | app/controllers/users_controller.rb:30:28:30:39 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:30:28:30:39 | new_password | a write to password | -| app/controllers/users_controller.rb:37:39:37:50 | new_password | app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" : | app/controllers/users_controller.rb:37:39:37:50 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" | an assignment to new_password | -| app/controllers/users_controller.rb:44:21:44:32 | new_password | app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" : | app/controllers/users_controller.rb:44:21:44:32 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" | an assignment to new_password | -| app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | an assignment to new_password | -| app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | an assignment to new_password | -| app/models/user.rb:5:27:5:38 | new_password | app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" : | app/models/user.rb:5:27:5:38 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" | an assignment to new_password | -| app/models/user.rb:11:22:11:33 | new_password | app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" : | app/models/user.rb:11:22:11:33 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" | an assignment to new_password | -| app/models/user.rb:17:21:17:32 | new_password | app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" : | app/models/user.rb:17:21:17:32 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" | an assignment to new_password | +| app/controllers/users_controller.rb:37:39:37:50 | new_password | app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" | app/controllers/users_controller.rb:37:39:37:50 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" | an assignment to new_password | +| app/controllers/users_controller.rb:44:21:44:32 | new_password | app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" | app/controllers/users_controller.rb:44:21:44:32 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" | an assignment to new_password | +| app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | an assignment to new_password | +| app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | an assignment to new_password | +| app/models/user.rb:5:27:5:38 | new_password | app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" | app/models/user.rb:5:27:5:38 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" | an assignment to new_password | +| app/models/user.rb:11:22:11:33 | new_password | app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" | app/models/user.rb:11:22:11:33 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" | an assignment to new_password | +| app/models/user.rb:17:21:17:32 | new_password | app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" | app/models/user.rb:17:21:17:32 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" | an assignment to new_password | diff --git a/ruby/ql/test/query-tests/security/cwe-502/oj-global-options/UnsafeDeserialization.expected b/ruby/ql/test/query-tests/security/cwe-502/oj-global-options/UnsafeDeserialization.expected index 38499665118..27bfc08947f 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/oj-global-options/UnsafeDeserialization.expected +++ b/ruby/ql/test/query-tests/security/cwe-502/oj-global-options/UnsafeDeserialization.expected @@ -1,12 +1,12 @@ edges -| OjGlobalOptions.rb:13:5:13:13 | json_data : | OjGlobalOptions.rb:14:22:14:30 | json_data | -| OjGlobalOptions.rb:13:17:13:22 | call to params : | OjGlobalOptions.rb:13:17:13:28 | ...[...] : | -| OjGlobalOptions.rb:13:17:13:28 | ...[...] : | OjGlobalOptions.rb:13:5:13:13 | json_data : | +| OjGlobalOptions.rb:13:5:13:13 | json_data | OjGlobalOptions.rb:14:22:14:30 | json_data | +| OjGlobalOptions.rb:13:17:13:22 | call to params | OjGlobalOptions.rb:13:17:13:28 | ...[...] | +| OjGlobalOptions.rb:13:17:13:28 | ...[...] | OjGlobalOptions.rb:13:5:13:13 | json_data | nodes -| OjGlobalOptions.rb:13:5:13:13 | json_data : | semmle.label | json_data : | -| OjGlobalOptions.rb:13:17:13:22 | call to params : | semmle.label | call to params : | -| OjGlobalOptions.rb:13:17:13:28 | ...[...] : | semmle.label | ...[...] : | +| OjGlobalOptions.rb:13:5:13:13 | json_data | semmle.label | json_data | +| OjGlobalOptions.rb:13:17:13:22 | call to params | semmle.label | call to params | +| OjGlobalOptions.rb:13:17:13:28 | ...[...] | semmle.label | ...[...] | | OjGlobalOptions.rb:14:22:14:30 | json_data | semmle.label | json_data | subpaths #select -| OjGlobalOptions.rb:14:22:14:30 | json_data | OjGlobalOptions.rb:13:17:13:22 | call to params : | OjGlobalOptions.rb:14:22:14:30 | json_data | Unsafe deserialization depends on a $@. | OjGlobalOptions.rb:13:17:13:22 | call to params | user-provided value | +| OjGlobalOptions.rb:14:22:14:30 | json_data | OjGlobalOptions.rb:13:17:13:22 | call to params | OjGlobalOptions.rb:14:22:14:30 | json_data | Unsafe deserialization depends on a $@. | OjGlobalOptions.rb:13:17:13:22 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected index 13fe16295d9..6fbbb14ef8a 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected @@ -1,73 +1,73 @@ edges -| UnsafeDeserialization.rb:10:5:10:19 | serialized_data : | UnsafeDeserialization.rb:11:27:11:41 | serialized_data | -| UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : | UnsafeDeserialization.rb:10:5:10:19 | serialized_data : | -| UnsafeDeserialization.rb:10:39:10:44 | call to params : | UnsafeDeserialization.rb:10:39:10:50 | ...[...] : | -| UnsafeDeserialization.rb:10:39:10:50 | ...[...] : | UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : | -| UnsafeDeserialization.rb:16:5:16:19 | serialized_data : | UnsafeDeserialization.rb:17:30:17:44 | serialized_data | -| UnsafeDeserialization.rb:16:23:16:50 | call to decode64 : | UnsafeDeserialization.rb:16:5:16:19 | serialized_data : | -| UnsafeDeserialization.rb:16:39:16:44 | call to params : | UnsafeDeserialization.rb:16:39:16:50 | ...[...] : | -| UnsafeDeserialization.rb:16:39:16:50 | ...[...] : | UnsafeDeserialization.rb:16:23:16:50 | call to decode64 : | -| UnsafeDeserialization.rb:22:5:22:13 | json_data : | UnsafeDeserialization.rb:23:24:23:32 | json_data | -| UnsafeDeserialization.rb:22:17:22:22 | call to params : | UnsafeDeserialization.rb:22:17:22:28 | ...[...] : | -| UnsafeDeserialization.rb:22:17:22:28 | ...[...] : | UnsafeDeserialization.rb:22:5:22:13 | json_data : | -| UnsafeDeserialization.rb:28:5:28:13 | json_data : | UnsafeDeserialization.rb:29:27:29:35 | json_data | -| UnsafeDeserialization.rb:28:17:28:22 | call to params : | UnsafeDeserialization.rb:28:17:28:28 | ...[...] : | -| UnsafeDeserialization.rb:28:17:28:28 | ...[...] : | UnsafeDeserialization.rb:28:5:28:13 | json_data : | -| UnsafeDeserialization.rb:40:5:40:13 | yaml_data : | UnsafeDeserialization.rb:41:24:41:32 | yaml_data | -| UnsafeDeserialization.rb:40:17:40:22 | call to params : | UnsafeDeserialization.rb:40:17:40:28 | ...[...] : | -| UnsafeDeserialization.rb:40:17:40:28 | ...[...] : | UnsafeDeserialization.rb:40:5:40:13 | yaml_data : | -| UnsafeDeserialization.rb:52:5:52:13 | json_data : | UnsafeDeserialization.rb:53:22:53:30 | json_data | -| UnsafeDeserialization.rb:52:5:52:13 | json_data : | UnsafeDeserialization.rb:54:22:54:30 | json_data | -| UnsafeDeserialization.rb:52:17:52:22 | call to params : | UnsafeDeserialization.rb:52:17:52:28 | ...[...] : | -| UnsafeDeserialization.rb:52:17:52:28 | ...[...] : | UnsafeDeserialization.rb:52:5:52:13 | json_data : | -| UnsafeDeserialization.rb:59:5:59:13 | json_data : | UnsafeDeserialization.rb:69:23:69:31 | json_data | -| UnsafeDeserialization.rb:59:17:59:22 | call to params : | UnsafeDeserialization.rb:59:17:59:28 | ...[...] : | -| UnsafeDeserialization.rb:59:17:59:28 | ...[...] : | UnsafeDeserialization.rb:59:5:59:13 | json_data : | -| UnsafeDeserialization.rb:81:5:81:7 | xml : | UnsafeDeserialization.rb:82:34:82:36 | xml | -| UnsafeDeserialization.rb:81:11:81:16 | call to params : | UnsafeDeserialization.rb:81:11:81:22 | ...[...] : | -| UnsafeDeserialization.rb:81:11:81:22 | ...[...] : | UnsafeDeserialization.rb:81:5:81:7 | xml : | -| UnsafeDeserialization.rb:87:5:87:13 | yaml_data : | UnsafeDeserialization.rb:88:25:88:33 | yaml_data | -| UnsafeDeserialization.rb:87:17:87:22 | call to params : | UnsafeDeserialization.rb:87:17:87:28 | ...[...] : | -| UnsafeDeserialization.rb:87:17:87:28 | ...[...] : | UnsafeDeserialization.rb:87:5:87:13 | yaml_data : | +| UnsafeDeserialization.rb:10:5:10:19 | serialized_data | UnsafeDeserialization.rb:11:27:11:41 | serialized_data | +| UnsafeDeserialization.rb:10:23:10:50 | call to decode64 | UnsafeDeserialization.rb:10:5:10:19 | serialized_data | +| UnsafeDeserialization.rb:10:39:10:44 | call to params | UnsafeDeserialization.rb:10:39:10:50 | ...[...] | +| UnsafeDeserialization.rb:10:39:10:50 | ...[...] | UnsafeDeserialization.rb:10:23:10:50 | call to decode64 | +| UnsafeDeserialization.rb:16:5:16:19 | serialized_data | UnsafeDeserialization.rb:17:30:17:44 | serialized_data | +| UnsafeDeserialization.rb:16:23:16:50 | call to decode64 | UnsafeDeserialization.rb:16:5:16:19 | serialized_data | +| UnsafeDeserialization.rb:16:39:16:44 | call to params | UnsafeDeserialization.rb:16:39:16:50 | ...[...] | +| UnsafeDeserialization.rb:16:39:16:50 | ...[...] | UnsafeDeserialization.rb:16:23:16:50 | call to decode64 | +| UnsafeDeserialization.rb:22:5:22:13 | json_data | UnsafeDeserialization.rb:23:24:23:32 | json_data | +| UnsafeDeserialization.rb:22:17:22:22 | call to params | UnsafeDeserialization.rb:22:17:22:28 | ...[...] | +| UnsafeDeserialization.rb:22:17:22:28 | ...[...] | UnsafeDeserialization.rb:22:5:22:13 | json_data | +| UnsafeDeserialization.rb:28:5:28:13 | json_data | UnsafeDeserialization.rb:29:27:29:35 | json_data | +| UnsafeDeserialization.rb:28:17:28:22 | call to params | UnsafeDeserialization.rb:28:17:28:28 | ...[...] | +| UnsafeDeserialization.rb:28:17:28:28 | ...[...] | UnsafeDeserialization.rb:28:5:28:13 | json_data | +| UnsafeDeserialization.rb:40:5:40:13 | yaml_data | UnsafeDeserialization.rb:41:24:41:32 | yaml_data | +| UnsafeDeserialization.rb:40:17:40:22 | call to params | UnsafeDeserialization.rb:40:17:40:28 | ...[...] | +| UnsafeDeserialization.rb:40:17:40:28 | ...[...] | UnsafeDeserialization.rb:40:5:40:13 | yaml_data | +| UnsafeDeserialization.rb:52:5:52:13 | json_data | UnsafeDeserialization.rb:53:22:53:30 | json_data | +| UnsafeDeserialization.rb:52:5:52:13 | json_data | UnsafeDeserialization.rb:54:22:54:30 | json_data | +| UnsafeDeserialization.rb:52:17:52:22 | call to params | UnsafeDeserialization.rb:52:17:52:28 | ...[...] | +| UnsafeDeserialization.rb:52:17:52:28 | ...[...] | UnsafeDeserialization.rb:52:5:52:13 | json_data | +| UnsafeDeserialization.rb:59:5:59:13 | json_data | UnsafeDeserialization.rb:69:23:69:31 | json_data | +| UnsafeDeserialization.rb:59:17:59:22 | call to params | UnsafeDeserialization.rb:59:17:59:28 | ...[...] | +| UnsafeDeserialization.rb:59:17:59:28 | ...[...] | UnsafeDeserialization.rb:59:5:59:13 | json_data | +| UnsafeDeserialization.rb:81:5:81:7 | xml | UnsafeDeserialization.rb:82:34:82:36 | xml | +| UnsafeDeserialization.rb:81:11:81:16 | call to params | UnsafeDeserialization.rb:81:11:81:22 | ...[...] | +| UnsafeDeserialization.rb:81:11:81:22 | ...[...] | UnsafeDeserialization.rb:81:5:81:7 | xml | +| UnsafeDeserialization.rb:87:5:87:13 | yaml_data | UnsafeDeserialization.rb:88:25:88:33 | yaml_data | +| UnsafeDeserialization.rb:87:17:87:22 | call to params | UnsafeDeserialization.rb:87:17:87:28 | ...[...] | +| UnsafeDeserialization.rb:87:17:87:28 | ...[...] | UnsafeDeserialization.rb:87:5:87:13 | yaml_data | nodes -| UnsafeDeserialization.rb:10:5:10:19 | serialized_data : | semmle.label | serialized_data : | -| UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : | semmle.label | call to decode64 : | -| UnsafeDeserialization.rb:10:39:10:44 | call to params : | semmle.label | call to params : | -| UnsafeDeserialization.rb:10:39:10:50 | ...[...] : | semmle.label | ...[...] : | +| UnsafeDeserialization.rb:10:5:10:19 | serialized_data | semmle.label | serialized_data | +| UnsafeDeserialization.rb:10:23:10:50 | call to decode64 | semmle.label | call to decode64 | +| UnsafeDeserialization.rb:10:39:10:44 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:10:39:10:50 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:11:27:11:41 | serialized_data | semmle.label | serialized_data | -| UnsafeDeserialization.rb:16:5:16:19 | serialized_data : | semmle.label | serialized_data : | -| UnsafeDeserialization.rb:16:23:16:50 | call to decode64 : | semmle.label | call to decode64 : | -| UnsafeDeserialization.rb:16:39:16:44 | call to params : | semmle.label | call to params : | -| UnsafeDeserialization.rb:16:39:16:50 | ...[...] : | semmle.label | ...[...] : | +| UnsafeDeserialization.rb:16:5:16:19 | serialized_data | semmle.label | serialized_data | +| UnsafeDeserialization.rb:16:23:16:50 | call to decode64 | semmle.label | call to decode64 | +| UnsafeDeserialization.rb:16:39:16:44 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:16:39:16:50 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:17:30:17:44 | serialized_data | semmle.label | serialized_data | -| UnsafeDeserialization.rb:22:5:22:13 | json_data : | semmle.label | json_data : | -| UnsafeDeserialization.rb:22:17:22:22 | call to params : | semmle.label | call to params : | -| UnsafeDeserialization.rb:22:17:22:28 | ...[...] : | semmle.label | ...[...] : | +| UnsafeDeserialization.rb:22:5:22:13 | json_data | semmle.label | json_data | +| UnsafeDeserialization.rb:22:17:22:22 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:22:17:22:28 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:23:24:23:32 | json_data | semmle.label | json_data | -| UnsafeDeserialization.rb:28:5:28:13 | json_data : | semmle.label | json_data : | -| UnsafeDeserialization.rb:28:17:28:22 | call to params : | semmle.label | call to params : | -| UnsafeDeserialization.rb:28:17:28:28 | ...[...] : | semmle.label | ...[...] : | +| UnsafeDeserialization.rb:28:5:28:13 | json_data | semmle.label | json_data | +| UnsafeDeserialization.rb:28:17:28:22 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:28:17:28:28 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:29:27:29:35 | json_data | semmle.label | json_data | -| UnsafeDeserialization.rb:40:5:40:13 | yaml_data : | semmle.label | yaml_data : | -| UnsafeDeserialization.rb:40:17:40:22 | call to params : | semmle.label | call to params : | -| UnsafeDeserialization.rb:40:17:40:28 | ...[...] : | semmle.label | ...[...] : | +| UnsafeDeserialization.rb:40:5:40:13 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:40:17:40:22 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:40:17:40:28 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:41:24:41:32 | yaml_data | semmle.label | yaml_data | -| UnsafeDeserialization.rb:52:5:52:13 | json_data : | semmle.label | json_data : | -| UnsafeDeserialization.rb:52:17:52:22 | call to params : | semmle.label | call to params : | -| UnsafeDeserialization.rb:52:17:52:28 | ...[...] : | semmle.label | ...[...] : | +| UnsafeDeserialization.rb:52:5:52:13 | json_data | semmle.label | json_data | +| UnsafeDeserialization.rb:52:17:52:22 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:52:17:52:28 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:53:22:53:30 | json_data | semmle.label | json_data | | UnsafeDeserialization.rb:54:22:54:30 | json_data | semmle.label | json_data | -| UnsafeDeserialization.rb:59:5:59:13 | json_data : | semmle.label | json_data : | -| UnsafeDeserialization.rb:59:17:59:22 | call to params : | semmle.label | call to params : | -| UnsafeDeserialization.rb:59:17:59:28 | ...[...] : | semmle.label | ...[...] : | +| UnsafeDeserialization.rb:59:5:59:13 | json_data | semmle.label | json_data | +| UnsafeDeserialization.rb:59:17:59:22 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:59:17:59:28 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:69:23:69:31 | json_data | semmle.label | json_data | -| UnsafeDeserialization.rb:81:5:81:7 | xml : | semmle.label | xml : | -| UnsafeDeserialization.rb:81:11:81:16 | call to params : | semmle.label | call to params : | -| UnsafeDeserialization.rb:81:11:81:22 | ...[...] : | semmle.label | ...[...] : | +| UnsafeDeserialization.rb:81:5:81:7 | xml | semmle.label | xml | +| UnsafeDeserialization.rb:81:11:81:16 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:81:11:81:22 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:82:34:82:36 | xml | semmle.label | xml | -| UnsafeDeserialization.rb:87:5:87:13 | yaml_data : | semmle.label | yaml_data : | -| UnsafeDeserialization.rb:87:17:87:22 | call to params : | semmle.label | call to params : | -| UnsafeDeserialization.rb:87:17:87:28 | ...[...] : | semmle.label | ...[...] : | +| UnsafeDeserialization.rb:87:5:87:13 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:87:17:87:22 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:87:17:87:28 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:88:25:88:33 | yaml_data | semmle.label | yaml_data | | UnsafeDeserialization.rb:92:24:92:34 | call to read | semmle.label | call to read | | UnsafeDeserialization.rb:95:24:95:33 | call to gets | semmle.label | call to gets | @@ -76,16 +76,16 @@ nodes | UnsafeDeserialization.rb:104:24:104:32 | call to readlines | semmle.label | call to readlines | subpaths #select -| UnsafeDeserialization.rb:11:27:11:41 | serialized_data | UnsafeDeserialization.rb:10:39:10:44 | call to params : | UnsafeDeserialization.rb:11:27:11:41 | serialized_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:10:39:10:44 | call to params | user-provided value | -| UnsafeDeserialization.rb:17:30:17:44 | serialized_data | UnsafeDeserialization.rb:16:39:16:44 | call to params : | UnsafeDeserialization.rb:17:30:17:44 | serialized_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:16:39:16:44 | call to params | user-provided value | -| UnsafeDeserialization.rb:23:24:23:32 | json_data | UnsafeDeserialization.rb:22:17:22:22 | call to params : | UnsafeDeserialization.rb:23:24:23:32 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:22:17:22:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:29:27:29:35 | json_data | UnsafeDeserialization.rb:28:17:28:22 | call to params : | UnsafeDeserialization.rb:29:27:29:35 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:28:17:28:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:41:24:41:32 | yaml_data | UnsafeDeserialization.rb:40:17:40:22 | call to params : | UnsafeDeserialization.rb:41:24:41:32 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:40:17:40:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:53:22:53:30 | json_data | UnsafeDeserialization.rb:52:17:52:22 | call to params : | UnsafeDeserialization.rb:53:22:53:30 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:52:17:52:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:54:22:54:30 | json_data | UnsafeDeserialization.rb:52:17:52:22 | call to params : | UnsafeDeserialization.rb:54:22:54:30 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:52:17:52:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:69:23:69:31 | json_data | UnsafeDeserialization.rb:59:17:59:22 | call to params : | UnsafeDeserialization.rb:69:23:69:31 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:59:17:59:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:82:34:82:36 | xml | UnsafeDeserialization.rb:81:11:81:16 | call to params : | UnsafeDeserialization.rb:82:34:82:36 | xml | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:81:11:81:16 | call to params | user-provided value | -| UnsafeDeserialization.rb:88:25:88:33 | yaml_data | UnsafeDeserialization.rb:87:17:87:22 | call to params : | UnsafeDeserialization.rb:88:25:88:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:87:17:87:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:11:27:11:41 | serialized_data | UnsafeDeserialization.rb:10:39:10:44 | call to params | UnsafeDeserialization.rb:11:27:11:41 | serialized_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:10:39:10:44 | call to params | user-provided value | +| UnsafeDeserialization.rb:17:30:17:44 | serialized_data | UnsafeDeserialization.rb:16:39:16:44 | call to params | UnsafeDeserialization.rb:17:30:17:44 | serialized_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:16:39:16:44 | call to params | user-provided value | +| UnsafeDeserialization.rb:23:24:23:32 | json_data | UnsafeDeserialization.rb:22:17:22:22 | call to params | UnsafeDeserialization.rb:23:24:23:32 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:22:17:22:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:29:27:29:35 | json_data | UnsafeDeserialization.rb:28:17:28:22 | call to params | UnsafeDeserialization.rb:29:27:29:35 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:28:17:28:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:41:24:41:32 | yaml_data | UnsafeDeserialization.rb:40:17:40:22 | call to params | UnsafeDeserialization.rb:41:24:41:32 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:40:17:40:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:53:22:53:30 | json_data | UnsafeDeserialization.rb:52:17:52:22 | call to params | UnsafeDeserialization.rb:53:22:53:30 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:52:17:52:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:54:22:54:30 | json_data | UnsafeDeserialization.rb:52:17:52:22 | call to params | UnsafeDeserialization.rb:54:22:54:30 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:52:17:52:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:69:23:69:31 | json_data | UnsafeDeserialization.rb:59:17:59:22 | call to params | UnsafeDeserialization.rb:69:23:69:31 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:59:17:59:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:82:34:82:36 | xml | UnsafeDeserialization.rb:81:11:81:16 | call to params | UnsafeDeserialization.rb:82:34:82:36 | xml | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:81:11:81:16 | call to params | user-provided value | +| UnsafeDeserialization.rb:88:25:88:33 | yaml_data | UnsafeDeserialization.rb:87:17:87:22 | call to params | UnsafeDeserialization.rb:88:25:88:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:87:17:87:22 | call to params | user-provided value | | UnsafeDeserialization.rb:92:24:92:34 | call to read | UnsafeDeserialization.rb:92:24:92:34 | call to read | UnsafeDeserialization.rb:92:24:92:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:92:24:92:34 | call to read | value from stdin | | UnsafeDeserialization.rb:95:24:95:33 | call to gets | UnsafeDeserialization.rb:95:24:95:33 | call to gets | UnsafeDeserialization.rb:95:24:95:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:95:24:95:33 | call to gets | value from stdin | | UnsafeDeserialization.rb:98:24:98:32 | call to read | UnsafeDeserialization.rb:98:24:98:32 | call to read | UnsafeDeserialization.rb:98:24:98:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:98:24:98:32 | call to read | value from stdin | diff --git a/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected b/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected index cf3cc204cbd..57918d9da20 100644 --- a/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected +++ b/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected @@ -1,33 +1,33 @@ edges -| tst.rb:1:7:1:7 | r : | tst.rb:2:4:2:4 | r : | -| tst.rb:2:4:2:4 | r : | tst.rb:2:3:2:15 | call to pack : | -| tst.rb:5:1:5:23 | totally_harmless_string : | tst.rb:7:8:7:30 | totally_harmless_string : | -| tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." : | tst.rb:5:1:5:23 | totally_harmless_string : | -| tst.rb:7:8:7:30 | totally_harmless_string : | tst.rb:1:7:1:7 | r : | -| tst.rb:7:8:7:30 | totally_harmless_string : | tst.rb:7:6:7:31 | call to e | -| tst.rb:10:11:10:24 | "666f6f626172" : | tst.rb:1:7:1:7 | r : | -| tst.rb:10:11:10:24 | "666f6f626172" : | tst.rb:10:9:10:25 | call to e | -| tst.rb:16:1:16:27 | another_questionable_string : | tst.rb:17:6:17:32 | another_questionable_string : | -| tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : | tst.rb:16:1:16:27 | another_questionable_string : | -| tst.rb:17:6:17:32 | another_questionable_string : | tst.rb:17:6:17:38 | call to strip | +| tst.rb:1:7:1:7 | r | tst.rb:2:4:2:4 | r | +| tst.rb:2:4:2:4 | r | tst.rb:2:3:2:15 | call to pack | +| tst.rb:5:1:5:23 | totally_harmless_string | tst.rb:7:8:7:30 | totally_harmless_string | +| tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | tst.rb:5:1:5:23 | totally_harmless_string | +| tst.rb:7:8:7:30 | totally_harmless_string | tst.rb:1:7:1:7 | r | +| tst.rb:7:8:7:30 | totally_harmless_string | tst.rb:7:6:7:31 | call to e | +| tst.rb:10:11:10:24 | "666f6f626172" | tst.rb:1:7:1:7 | r | +| tst.rb:10:11:10:24 | "666f6f626172" | tst.rb:10:9:10:25 | call to e | +| tst.rb:16:1:16:27 | another_questionable_string | tst.rb:17:6:17:32 | another_questionable_string | +| tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | tst.rb:16:1:16:27 | another_questionable_string | +| tst.rb:17:6:17:32 | another_questionable_string | tst.rb:17:6:17:38 | call to strip | nodes -| tst.rb:1:7:1:7 | r : | semmle.label | r : | -| tst.rb:2:3:2:15 | call to pack : | semmle.label | call to pack : | -| tst.rb:2:4:2:4 | r : | semmle.label | r : | -| tst.rb:5:1:5:23 | totally_harmless_string : | semmle.label | totally_harmless_string : | -| tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." : | semmle.label | "707574732822636f646520696e6a6..." : | +| tst.rb:1:7:1:7 | r | semmle.label | r | +| tst.rb:2:3:2:15 | call to pack | semmle.label | call to pack | +| tst.rb:2:4:2:4 | r | semmle.label | r | +| tst.rb:5:1:5:23 | totally_harmless_string | semmle.label | totally_harmless_string | +| tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | semmle.label | "707574732822636f646520696e6a6..." | | tst.rb:7:6:7:31 | call to e | semmle.label | call to e | -| tst.rb:7:8:7:30 | totally_harmless_string : | semmle.label | totally_harmless_string : | +| tst.rb:7:8:7:30 | totally_harmless_string | semmle.label | totally_harmless_string | | tst.rb:10:9:10:25 | call to e | semmle.label | call to e | -| tst.rb:10:11:10:24 | "666f6f626172" : | semmle.label | "666f6f626172" : | -| tst.rb:16:1:16:27 | another_questionable_string : | semmle.label | another_questionable_string : | -| tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : | semmle.label | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : | -| tst.rb:17:6:17:32 | another_questionable_string : | semmle.label | another_questionable_string : | +| tst.rb:10:11:10:24 | "666f6f626172" | semmle.label | "666f6f626172" | +| tst.rb:16:1:16:27 | another_questionable_string | semmle.label | another_questionable_string | +| tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | semmle.label | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | +| tst.rb:17:6:17:32 | another_questionable_string | semmle.label | another_questionable_string | | tst.rb:17:6:17:38 | call to strip | semmle.label | call to strip | subpaths -| tst.rb:7:8:7:30 | totally_harmless_string : | tst.rb:1:7:1:7 | r : | tst.rb:2:3:2:15 | call to pack : | tst.rb:7:6:7:31 | call to e | -| tst.rb:10:11:10:24 | "666f6f626172" : | tst.rb:1:7:1:7 | r : | tst.rb:2:3:2:15 | call to pack : | tst.rb:10:9:10:25 | call to e | +| tst.rb:7:8:7:30 | totally_harmless_string | tst.rb:1:7:1:7 | r | tst.rb:2:3:2:15 | call to pack | tst.rb:7:6:7:31 | call to e | +| tst.rb:10:11:10:24 | "666f6f626172" | tst.rb:1:7:1:7 | r | tst.rb:2:3:2:15 | call to pack | tst.rb:10:9:10:25 | call to e | #select -| tst.rb:7:6:7:31 | call to e | tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." : | tst.rb:7:6:7:31 | call to e | $@ is interpreted as code. | tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | Hard-coded data | -| tst.rb:10:9:10:25 | call to e | tst.rb:10:11:10:24 | "666f6f626172" : | tst.rb:10:9:10:25 | call to e | $@ is interpreted as an import path. | tst.rb:10:11:10:24 | "666f6f626172" | Hard-coded data | -| tst.rb:17:6:17:38 | call to strip | tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : | tst.rb:17:6:17:38 | call to strip | $@ is interpreted as code. | tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | Hard-coded data | +| tst.rb:7:6:7:31 | call to e | tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | tst.rb:7:6:7:31 | call to e | $@ is interpreted as code. | tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | Hard-coded data | +| tst.rb:10:9:10:25 | call to e | tst.rb:10:11:10:24 | "666f6f626172" | tst.rb:10:9:10:25 | call to e | $@ is interpreted as an import path. | tst.rb:10:11:10:24 | "666f6f626172" | Hard-coded data | +| tst.rb:17:6:17:38 | call to strip | tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | tst.rb:17:6:17:38 | call to strip | $@ is interpreted as code. | tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | Hard-coded data | diff --git a/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.expected b/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.expected index a07f42fda18..5b8a592d907 100644 --- a/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.expected +++ b/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.expected @@ -1,49 +1,49 @@ edges -| UrlRedirect.rb:9:17:9:22 | call to params : | UrlRedirect.rb:9:17:9:28 | ...[...] | -| UrlRedirect.rb:14:17:14:22 | call to params : | UrlRedirect.rb:14:17:14:43 | call to fetch | -| UrlRedirect.rb:19:17:19:22 | call to params : | UrlRedirect.rb:19:17:19:37 | call to to_unsafe_hash | -| UrlRedirect.rb:24:31:24:36 | call to params : | UrlRedirect.rb:24:17:24:37 | call to filter_params | -| UrlRedirect.rb:24:31:24:36 | call to params : | UrlRedirect.rb:93:21:93:32 | input_params : | -| UrlRedirect.rb:34:20:34:25 | call to params : | UrlRedirect.rb:34:20:34:31 | ...[...] : | -| UrlRedirect.rb:34:20:34:31 | ...[...] : | UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | -| UrlRedirect.rb:58:17:58:22 | call to params : | UrlRedirect.rb:58:17:58:28 | ...[...] | -| UrlRedirect.rb:63:38:63:43 | call to params : | UrlRedirect.rb:63:38:63:49 | ...[...] | -| UrlRedirect.rb:68:38:68:43 | call to params : | UrlRedirect.rb:68:38:68:49 | ...[...] | -| UrlRedirect.rb:73:25:73:30 | call to params : | UrlRedirect.rb:73:25:73:36 | ...[...] | -| UrlRedirect.rb:93:21:93:32 | input_params : | UrlRedirect.rb:94:5:94:29 | call to permit : | +| UrlRedirect.rb:9:17:9:22 | call to params | UrlRedirect.rb:9:17:9:28 | ...[...] | +| UrlRedirect.rb:14:17:14:22 | call to params | UrlRedirect.rb:14:17:14:43 | call to fetch | +| UrlRedirect.rb:19:17:19:22 | call to params | UrlRedirect.rb:19:17:19:37 | call to to_unsafe_hash | +| UrlRedirect.rb:24:31:24:36 | call to params | UrlRedirect.rb:24:17:24:37 | call to filter_params | +| UrlRedirect.rb:24:31:24:36 | call to params | UrlRedirect.rb:93:21:93:32 | input_params | +| UrlRedirect.rb:34:20:34:25 | call to params | UrlRedirect.rb:34:20:34:31 | ...[...] | +| UrlRedirect.rb:34:20:34:31 | ...[...] | UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | +| UrlRedirect.rb:58:17:58:22 | call to params | UrlRedirect.rb:58:17:58:28 | ...[...] | +| UrlRedirect.rb:63:38:63:43 | call to params | UrlRedirect.rb:63:38:63:49 | ...[...] | +| UrlRedirect.rb:68:38:68:43 | call to params | UrlRedirect.rb:68:38:68:49 | ...[...] | +| UrlRedirect.rb:73:25:73:30 | call to params | UrlRedirect.rb:73:25:73:36 | ...[...] | +| UrlRedirect.rb:93:21:93:32 | input_params | UrlRedirect.rb:94:5:94:29 | call to permit | nodes | UrlRedirect.rb:4:17:4:22 | call to params | semmle.label | call to params | -| UrlRedirect.rb:9:17:9:22 | call to params : | semmle.label | call to params : | +| UrlRedirect.rb:9:17:9:22 | call to params | semmle.label | call to params | | UrlRedirect.rb:9:17:9:28 | ...[...] | semmle.label | ...[...] | -| UrlRedirect.rb:14:17:14:22 | call to params : | semmle.label | call to params : | +| UrlRedirect.rb:14:17:14:22 | call to params | semmle.label | call to params | | UrlRedirect.rb:14:17:14:43 | call to fetch | semmle.label | call to fetch | -| UrlRedirect.rb:19:17:19:22 | call to params : | semmle.label | call to params : | +| UrlRedirect.rb:19:17:19:22 | call to params | semmle.label | call to params | | UrlRedirect.rb:19:17:19:37 | call to to_unsafe_hash | semmle.label | call to to_unsafe_hash | | UrlRedirect.rb:24:17:24:37 | call to filter_params | semmle.label | call to filter_params | -| UrlRedirect.rb:24:31:24:36 | call to params : | semmle.label | call to params : | +| UrlRedirect.rb:24:31:24:36 | call to params | semmle.label | call to params | | UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | semmle.label | "#{...}/foo" | -| UrlRedirect.rb:34:20:34:25 | call to params : | semmle.label | call to params : | -| UrlRedirect.rb:34:20:34:31 | ...[...] : | semmle.label | ...[...] : | -| UrlRedirect.rb:58:17:58:22 | call to params : | semmle.label | call to params : | +| UrlRedirect.rb:34:20:34:25 | call to params | semmle.label | call to params | +| UrlRedirect.rb:34:20:34:31 | ...[...] | semmle.label | ...[...] | +| UrlRedirect.rb:58:17:58:22 | call to params | semmle.label | call to params | | UrlRedirect.rb:58:17:58:28 | ...[...] | semmle.label | ...[...] | -| UrlRedirect.rb:63:38:63:43 | call to params : | semmle.label | call to params : | +| UrlRedirect.rb:63:38:63:43 | call to params | semmle.label | call to params | | UrlRedirect.rb:63:38:63:49 | ...[...] | semmle.label | ...[...] | -| UrlRedirect.rb:68:38:68:43 | call to params : | semmle.label | call to params : | +| UrlRedirect.rb:68:38:68:43 | call to params | semmle.label | call to params | | UrlRedirect.rb:68:38:68:49 | ...[...] | semmle.label | ...[...] | -| UrlRedirect.rb:73:25:73:30 | call to params : | semmle.label | call to params : | +| UrlRedirect.rb:73:25:73:30 | call to params | semmle.label | call to params | | UrlRedirect.rb:73:25:73:36 | ...[...] | semmle.label | ...[...] | -| UrlRedirect.rb:93:21:93:32 | input_params : | semmle.label | input_params : | -| UrlRedirect.rb:94:5:94:29 | call to permit : | semmle.label | call to permit : | +| UrlRedirect.rb:93:21:93:32 | input_params | semmle.label | input_params | +| UrlRedirect.rb:94:5:94:29 | call to permit | semmle.label | call to permit | subpaths -| UrlRedirect.rb:24:31:24:36 | call to params : | UrlRedirect.rb:93:21:93:32 | input_params : | UrlRedirect.rb:94:5:94:29 | call to permit : | UrlRedirect.rb:24:17:24:37 | call to filter_params | +| UrlRedirect.rb:24:31:24:36 | call to params | UrlRedirect.rb:93:21:93:32 | input_params | UrlRedirect.rb:94:5:94:29 | call to permit | UrlRedirect.rb:24:17:24:37 | call to filter_params | #select | UrlRedirect.rb:4:17:4:22 | call to params | UrlRedirect.rb:4:17:4:22 | call to params | UrlRedirect.rb:4:17:4:22 | call to params | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:4:17:4:22 | call to params | user-provided value | -| UrlRedirect.rb:9:17:9:28 | ...[...] | UrlRedirect.rb:9:17:9:22 | call to params : | UrlRedirect.rb:9:17:9:28 | ...[...] | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:9:17:9:22 | call to params | user-provided value | -| UrlRedirect.rb:14:17:14:43 | call to fetch | UrlRedirect.rb:14:17:14:22 | call to params : | UrlRedirect.rb:14:17:14:43 | call to fetch | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:14:17:14:22 | call to params | user-provided value | -| UrlRedirect.rb:19:17:19:37 | call to to_unsafe_hash | UrlRedirect.rb:19:17:19:22 | call to params : | UrlRedirect.rb:19:17:19:37 | call to to_unsafe_hash | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:19:17:19:22 | call to params | user-provided value | -| UrlRedirect.rb:24:17:24:37 | call to filter_params | UrlRedirect.rb:24:31:24:36 | call to params : | UrlRedirect.rb:24:17:24:37 | call to filter_params | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:24:31:24:36 | call to params | user-provided value | -| UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | UrlRedirect.rb:34:20:34:25 | call to params : | UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:34:20:34:25 | call to params | user-provided value | -| UrlRedirect.rb:58:17:58:28 | ...[...] | UrlRedirect.rb:58:17:58:22 | call to params : | UrlRedirect.rb:58:17:58:28 | ...[...] | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:58:17:58:22 | call to params | user-provided value | -| UrlRedirect.rb:63:38:63:49 | ...[...] | UrlRedirect.rb:63:38:63:43 | call to params : | UrlRedirect.rb:63:38:63:49 | ...[...] | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:63:38:63:43 | call to params | user-provided value | -| UrlRedirect.rb:68:38:68:49 | ...[...] | UrlRedirect.rb:68:38:68:43 | call to params : | UrlRedirect.rb:68:38:68:49 | ...[...] | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:68:38:68:43 | call to params | user-provided value | -| UrlRedirect.rb:73:25:73:36 | ...[...] | UrlRedirect.rb:73:25:73:30 | call to params : | UrlRedirect.rb:73:25:73:36 | ...[...] | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:73:25:73:30 | call to params | user-provided value | +| UrlRedirect.rb:9:17:9:28 | ...[...] | UrlRedirect.rb:9:17:9:22 | call to params | UrlRedirect.rb:9:17:9:28 | ...[...] | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:9:17:9:22 | call to params | user-provided value | +| UrlRedirect.rb:14:17:14:43 | call to fetch | UrlRedirect.rb:14:17:14:22 | call to params | UrlRedirect.rb:14:17:14:43 | call to fetch | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:14:17:14:22 | call to params | user-provided value | +| UrlRedirect.rb:19:17:19:37 | call to to_unsafe_hash | UrlRedirect.rb:19:17:19:22 | call to params | UrlRedirect.rb:19:17:19:37 | call to to_unsafe_hash | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:19:17:19:22 | call to params | user-provided value | +| UrlRedirect.rb:24:17:24:37 | call to filter_params | UrlRedirect.rb:24:31:24:36 | call to params | UrlRedirect.rb:24:17:24:37 | call to filter_params | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:24:31:24:36 | call to params | user-provided value | +| UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | UrlRedirect.rb:34:20:34:25 | call to params | UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:34:20:34:25 | call to params | user-provided value | +| UrlRedirect.rb:58:17:58:28 | ...[...] | UrlRedirect.rb:58:17:58:22 | call to params | UrlRedirect.rb:58:17:58:28 | ...[...] | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:58:17:58:22 | call to params | user-provided value | +| UrlRedirect.rb:63:38:63:49 | ...[...] | UrlRedirect.rb:63:38:63:43 | call to params | UrlRedirect.rb:63:38:63:49 | ...[...] | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:63:38:63:43 | call to params | user-provided value | +| UrlRedirect.rb:68:38:68:49 | ...[...] | UrlRedirect.rb:68:38:68:43 | call to params | UrlRedirect.rb:68:38:68:49 | ...[...] | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:68:38:68:43 | call to params | user-provided value | +| UrlRedirect.rb:73:25:73:36 | ...[...] | UrlRedirect.rb:73:25:73:30 | call to params | UrlRedirect.rb:73:25:73:36 | ...[...] | Untrusted URL redirection depends on a $@. | UrlRedirect.rb:73:25:73:30 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-611/libxml-backend/Xxe.expected b/ruby/ql/test/query-tests/security/cwe-611/libxml-backend/Xxe.expected index 6e0473c62c8..f4af8eaf7c0 100644 --- a/ruby/ql/test/query-tests/security/cwe-611/libxml-backend/Xxe.expected +++ b/ruby/ql/test/query-tests/security/cwe-611/libxml-backend/Xxe.expected @@ -1,21 +1,21 @@ edges -| LibXmlBackend.rb:16:5:16:11 | content : | LibXmlBackend.rb:18:30:18:36 | content | -| LibXmlBackend.rb:16:5:16:11 | content : | LibXmlBackend.rb:19:19:19:25 | content | -| LibXmlBackend.rb:16:5:16:11 | content : | LibXmlBackend.rb:20:27:20:33 | content | -| LibXmlBackend.rb:16:5:16:11 | content : | LibXmlBackend.rb:21:34:21:40 | content | -| LibXmlBackend.rb:16:15:16:20 | call to params : | LibXmlBackend.rb:16:15:16:26 | ...[...] : | -| LibXmlBackend.rb:16:15:16:26 | ...[...] : | LibXmlBackend.rb:16:5:16:11 | content : | +| LibXmlBackend.rb:16:5:16:11 | content | LibXmlBackend.rb:18:30:18:36 | content | +| LibXmlBackend.rb:16:5:16:11 | content | LibXmlBackend.rb:19:19:19:25 | content | +| LibXmlBackend.rb:16:5:16:11 | content | LibXmlBackend.rb:20:27:20:33 | content | +| LibXmlBackend.rb:16:5:16:11 | content | LibXmlBackend.rb:21:34:21:40 | content | +| LibXmlBackend.rb:16:15:16:20 | call to params | LibXmlBackend.rb:16:15:16:26 | ...[...] | +| LibXmlBackend.rb:16:15:16:26 | ...[...] | LibXmlBackend.rb:16:5:16:11 | content | nodes -| LibXmlBackend.rb:16:5:16:11 | content : | semmle.label | content : | -| LibXmlBackend.rb:16:15:16:20 | call to params : | semmle.label | call to params : | -| LibXmlBackend.rb:16:15:16:26 | ...[...] : | semmle.label | ...[...] : | +| LibXmlBackend.rb:16:5:16:11 | content | semmle.label | content | +| LibXmlBackend.rb:16:15:16:20 | call to params | semmle.label | call to params | +| LibXmlBackend.rb:16:15:16:26 | ...[...] | semmle.label | ...[...] | | LibXmlBackend.rb:18:30:18:36 | content | semmle.label | content | | LibXmlBackend.rb:19:19:19:25 | content | semmle.label | content | | LibXmlBackend.rb:20:27:20:33 | content | semmle.label | content | | LibXmlBackend.rb:21:34:21:40 | content | semmle.label | content | subpaths #select -| LibXmlBackend.rb:18:30:18:36 | content | LibXmlBackend.rb:16:15:16:20 | call to params : | LibXmlBackend.rb:18:30:18:36 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlBackend.rb:16:15:16:20 | call to params | user-provided value | -| LibXmlBackend.rb:19:19:19:25 | content | LibXmlBackend.rb:16:15:16:20 | call to params : | LibXmlBackend.rb:19:19:19:25 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlBackend.rb:16:15:16:20 | call to params | user-provided value | -| LibXmlBackend.rb:20:27:20:33 | content | LibXmlBackend.rb:16:15:16:20 | call to params : | LibXmlBackend.rb:20:27:20:33 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlBackend.rb:16:15:16:20 | call to params | user-provided value | -| LibXmlBackend.rb:21:34:21:40 | content | LibXmlBackend.rb:16:15:16:20 | call to params : | LibXmlBackend.rb:21:34:21:40 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlBackend.rb:16:15:16:20 | call to params | user-provided value | +| LibXmlBackend.rb:18:30:18:36 | content | LibXmlBackend.rb:16:15:16:20 | call to params | LibXmlBackend.rb:18:30:18:36 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlBackend.rb:16:15:16:20 | call to params | user-provided value | +| LibXmlBackend.rb:19:19:19:25 | content | LibXmlBackend.rb:16:15:16:20 | call to params | LibXmlBackend.rb:19:19:19:25 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlBackend.rb:16:15:16:20 | call to params | user-provided value | +| LibXmlBackend.rb:20:27:20:33 | content | LibXmlBackend.rb:16:15:16:20 | call to params | LibXmlBackend.rb:20:27:20:33 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlBackend.rb:16:15:16:20 | call to params | user-provided value | +| LibXmlBackend.rb:21:34:21:40 | content | LibXmlBackend.rb:16:15:16:20 | call to params | LibXmlBackend.rb:21:34:21:40 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlBackend.rb:16:15:16:20 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-611/xxe/Xxe.expected b/ruby/ql/test/query-tests/security/cwe-611/xxe/Xxe.expected index 638a3f3f805..9474c258561 100644 --- a/ruby/ql/test/query-tests/security/cwe-611/xxe/Xxe.expected +++ b/ruby/ql/test/query-tests/security/cwe-611/xxe/Xxe.expected @@ -1,35 +1,35 @@ edges -| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:4:34:4:40 | content | -| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:5:32:5:38 | content | -| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:6:30:6:36 | content | -| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:7:32:7:38 | content | -| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:8:30:8:36 | content | -| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:9:28:9:34 | content | -| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:11:26:11:32 | content | -| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:12:24:12:30 | content | -| LibXmlRuby.rb:3:15:3:20 | call to params : | LibXmlRuby.rb:3:15:3:26 | ...[...] : | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:3:5:3:11 | content : | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:5:26:5:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:6:26:6:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:7:26:7:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:8:26:8:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:9:26:9:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:11:26:11:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:12:26:12:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:15:26:15:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:16:26:16:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:18:26:18:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:19:26:19:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:22:26:22:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:25:26:25:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:27:26:27:32 | content | -| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:28:26:28:32 | content | -| Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:3:15:3:26 | ...[...] : | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:3:5:3:11 | content : | +| LibXmlRuby.rb:3:5:3:11 | content | LibXmlRuby.rb:4:34:4:40 | content | +| LibXmlRuby.rb:3:5:3:11 | content | LibXmlRuby.rb:5:32:5:38 | content | +| LibXmlRuby.rb:3:5:3:11 | content | LibXmlRuby.rb:6:30:6:36 | content | +| LibXmlRuby.rb:3:5:3:11 | content | LibXmlRuby.rb:7:32:7:38 | content | +| LibXmlRuby.rb:3:5:3:11 | content | LibXmlRuby.rb:8:30:8:36 | content | +| LibXmlRuby.rb:3:5:3:11 | content | LibXmlRuby.rb:9:28:9:34 | content | +| LibXmlRuby.rb:3:5:3:11 | content | LibXmlRuby.rb:11:26:11:32 | content | +| LibXmlRuby.rb:3:5:3:11 | content | LibXmlRuby.rb:12:24:12:30 | content | +| LibXmlRuby.rb:3:15:3:20 | call to params | LibXmlRuby.rb:3:15:3:26 | ...[...] | +| LibXmlRuby.rb:3:15:3:26 | ...[...] | LibXmlRuby.rb:3:5:3:11 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:5:26:5:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:6:26:6:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:7:26:7:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:8:26:8:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:9:26:9:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:11:26:11:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:12:26:12:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:15:26:15:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:16:26:16:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:18:26:18:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:19:26:19:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:22:26:22:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:25:26:25:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:27:26:27:32 | content | +| Nokogiri.rb:3:5:3:11 | content | Nokogiri.rb:28:26:28:32 | content | +| Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:3:15:3:26 | ...[...] | +| Nokogiri.rb:3:15:3:26 | ...[...] | Nokogiri.rb:3:5:3:11 | content | nodes -| LibXmlRuby.rb:3:5:3:11 | content : | semmle.label | content : | -| LibXmlRuby.rb:3:15:3:20 | call to params : | semmle.label | call to params : | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | semmle.label | ...[...] : | +| LibXmlRuby.rb:3:5:3:11 | content | semmle.label | content | +| LibXmlRuby.rb:3:15:3:20 | call to params | semmle.label | call to params | +| LibXmlRuby.rb:3:15:3:26 | ...[...] | semmle.label | ...[...] | | LibXmlRuby.rb:4:34:4:40 | content | semmle.label | content | | LibXmlRuby.rb:5:32:5:38 | content | semmle.label | content | | LibXmlRuby.rb:6:30:6:36 | content | semmle.label | content | @@ -38,9 +38,9 @@ nodes | LibXmlRuby.rb:9:28:9:34 | content | semmle.label | content | | LibXmlRuby.rb:11:26:11:32 | content | semmle.label | content | | LibXmlRuby.rb:12:24:12:30 | content | semmle.label | content | -| Nokogiri.rb:3:5:3:11 | content : | semmle.label | content : | -| Nokogiri.rb:3:15:3:20 | call to params : | semmle.label | call to params : | -| Nokogiri.rb:3:15:3:26 | ...[...] : | semmle.label | ...[...] : | +| Nokogiri.rb:3:5:3:11 | content | semmle.label | content | +| Nokogiri.rb:3:15:3:20 | call to params | semmle.label | call to params | +| Nokogiri.rb:3:15:3:26 | ...[...] | semmle.label | ...[...] | | Nokogiri.rb:5:26:5:32 | content | semmle.label | content | | Nokogiri.rb:6:26:6:32 | content | semmle.label | content | | Nokogiri.rb:7:26:7:32 | content | semmle.label | content | @@ -58,26 +58,26 @@ nodes | Nokogiri.rb:28:26:28:32 | content | semmle.label | content | subpaths #select -| LibXmlRuby.rb:4:34:4:40 | content | LibXmlRuby.rb:3:15:3:20 | call to params : | LibXmlRuby.rb:4:34:4:40 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | -| LibXmlRuby.rb:5:32:5:38 | content | LibXmlRuby.rb:3:15:3:20 | call to params : | LibXmlRuby.rb:5:32:5:38 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | -| LibXmlRuby.rb:6:30:6:36 | content | LibXmlRuby.rb:3:15:3:20 | call to params : | LibXmlRuby.rb:6:30:6:36 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | -| LibXmlRuby.rb:7:32:7:38 | content | LibXmlRuby.rb:3:15:3:20 | call to params : | LibXmlRuby.rb:7:32:7:38 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | -| LibXmlRuby.rb:8:30:8:36 | content | LibXmlRuby.rb:3:15:3:20 | call to params : | LibXmlRuby.rb:8:30:8:36 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | -| LibXmlRuby.rb:9:28:9:34 | content | LibXmlRuby.rb:3:15:3:20 | call to params : | LibXmlRuby.rb:9:28:9:34 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | -| LibXmlRuby.rb:11:26:11:32 | content | LibXmlRuby.rb:3:15:3:20 | call to params : | LibXmlRuby.rb:11:26:11:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | -| LibXmlRuby.rb:12:24:12:30 | content | LibXmlRuby.rb:3:15:3:20 | call to params : | LibXmlRuby.rb:12:24:12:30 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:5:26:5:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:5:26:5:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:6:26:6:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:6:26:6:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:7:26:7:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:7:26:7:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:8:26:8:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:8:26:8:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:9:26:9:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:9:26:9:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:11:26:11:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:11:26:11:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:12:26:12:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:12:26:12:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:15:26:15:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:15:26:15:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:16:26:16:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:16:26:16:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:18:26:18:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:18:26:18:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:19:26:19:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:19:26:19:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:22:26:22:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:22:26:22:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:25:26:25:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:25:26:25:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:27:26:27:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:27:26:27:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | -| Nokogiri.rb:28:26:28:32 | content | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:28:26:28:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| LibXmlRuby.rb:4:34:4:40 | content | LibXmlRuby.rb:3:15:3:20 | call to params | LibXmlRuby.rb:4:34:4:40 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | +| LibXmlRuby.rb:5:32:5:38 | content | LibXmlRuby.rb:3:15:3:20 | call to params | LibXmlRuby.rb:5:32:5:38 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | +| LibXmlRuby.rb:6:30:6:36 | content | LibXmlRuby.rb:3:15:3:20 | call to params | LibXmlRuby.rb:6:30:6:36 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | +| LibXmlRuby.rb:7:32:7:38 | content | LibXmlRuby.rb:3:15:3:20 | call to params | LibXmlRuby.rb:7:32:7:38 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | +| LibXmlRuby.rb:8:30:8:36 | content | LibXmlRuby.rb:3:15:3:20 | call to params | LibXmlRuby.rb:8:30:8:36 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | +| LibXmlRuby.rb:9:28:9:34 | content | LibXmlRuby.rb:3:15:3:20 | call to params | LibXmlRuby.rb:9:28:9:34 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | +| LibXmlRuby.rb:11:26:11:32 | content | LibXmlRuby.rb:3:15:3:20 | call to params | LibXmlRuby.rb:11:26:11:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | +| LibXmlRuby.rb:12:24:12:30 | content | LibXmlRuby.rb:3:15:3:20 | call to params | LibXmlRuby.rb:12:24:12:30 | content | XML parsing depends on a $@ without guarding against external entity expansion. | LibXmlRuby.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:5:26:5:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:5:26:5:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:6:26:6:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:6:26:6:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:7:26:7:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:7:26:7:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:8:26:8:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:8:26:8:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:9:26:9:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:9:26:9:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:11:26:11:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:11:26:11:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:12:26:12:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:12:26:12:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:15:26:15:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:15:26:15:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:16:26:16:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:16:26:16:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:18:26:18:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:18:26:18:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:19:26:19:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:19:26:19:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:22:26:22:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:22:26:22:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:25:26:25:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:25:26:25:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:27:26:27:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:27:26:27:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | +| Nokogiri.rb:28:26:28:32 | content | Nokogiri.rb:3:15:3:20 | call to params | Nokogiri.rb:28:26:28:32 | content | XML parsing depends on a $@ without guarding against external entity expansion. | Nokogiri.rb:3:15:3:20 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected b/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected index 5df273f589f..a4e8218f8c1 100644 --- a/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected +++ b/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected @@ -1,25 +1,25 @@ edges -| FilePermissions.rb:51:3:51:6 | perm : | FilePermissions.rb:53:19:53:22 | perm | -| FilePermissions.rb:51:3:51:6 | perm : | FilePermissions.rb:54:3:54:7 | perm2 : | -| FilePermissions.rb:51:10:51:13 | 0777 : | FilePermissions.rb:51:3:51:6 | perm : | -| FilePermissions.rb:54:3:54:7 | perm2 : | FilePermissions.rb:56:19:56:23 | perm2 | -| FilePermissions.rb:58:3:58:6 | perm : | FilePermissions.rb:59:3:59:7 | perm2 : | -| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" : | FilePermissions.rb:58:3:58:6 | perm : | -| FilePermissions.rb:59:3:59:7 | perm2 : | FilePermissions.rb:61:19:61:23 | perm2 | +| FilePermissions.rb:51:3:51:6 | perm | FilePermissions.rb:53:19:53:22 | perm | +| FilePermissions.rb:51:3:51:6 | perm | FilePermissions.rb:54:3:54:7 | perm2 | +| FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:51:3:51:6 | perm | +| FilePermissions.rb:54:3:54:7 | perm2 | FilePermissions.rb:56:19:56:23 | perm2 | +| FilePermissions.rb:58:3:58:6 | perm | FilePermissions.rb:59:3:59:7 | perm2 | +| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" | FilePermissions.rb:58:3:58:6 | perm | +| FilePermissions.rb:59:3:59:7 | perm2 | FilePermissions.rb:61:19:61:23 | perm2 | nodes | FilePermissions.rb:5:19:5:22 | 0222 | semmle.label | 0222 | | FilePermissions.rb:7:19:7:22 | 0622 | semmle.label | 0622 | | FilePermissions.rb:9:19:9:22 | 0755 | semmle.label | 0755 | | FilePermissions.rb:11:19:11:22 | 0777 | semmle.label | 0777 | | FilePermissions.rb:28:13:28:16 | 0755 | semmle.label | 0755 | -| FilePermissions.rb:51:3:51:6 | perm : | semmle.label | perm : | -| FilePermissions.rb:51:10:51:13 | 0777 : | semmle.label | 0777 : | +| FilePermissions.rb:51:3:51:6 | perm | semmle.label | perm | +| FilePermissions.rb:51:10:51:13 | 0777 | semmle.label | 0777 | | FilePermissions.rb:53:19:53:22 | perm | semmle.label | perm | -| FilePermissions.rb:54:3:54:7 | perm2 : | semmle.label | perm2 : | +| FilePermissions.rb:54:3:54:7 | perm2 | semmle.label | perm2 | | FilePermissions.rb:56:19:56:23 | perm2 | semmle.label | perm2 | -| FilePermissions.rb:58:3:58:6 | perm : | semmle.label | perm : | -| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" : | semmle.label | "u=wrx,g=rwx,o=x" : | -| FilePermissions.rb:59:3:59:7 | perm2 : | semmle.label | perm2 : | +| FilePermissions.rb:58:3:58:6 | perm | semmle.label | perm | +| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" | semmle.label | "u=wrx,g=rwx,o=x" | +| FilePermissions.rb:59:3:59:7 | perm2 | semmle.label | perm2 | | FilePermissions.rb:61:19:61:23 | perm2 | semmle.label | perm2 | | FilePermissions.rb:63:19:63:29 | "u=rwx,o+r" | semmle.label | "u=rwx,o+r" | | FilePermissions.rb:67:19:67:24 | "a+rw" | semmle.label | "a+rw" | @@ -31,9 +31,9 @@ subpaths | FilePermissions.rb:9:19:9:22 | 0755 | FilePermissions.rb:9:19:9:22 | 0755 | FilePermissions.rb:9:19:9:22 | 0755 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:9:3:9:32 | call to chmod | call to chmod | | FilePermissions.rb:11:19:11:22 | 0777 | FilePermissions.rb:11:19:11:22 | 0777 | FilePermissions.rb:11:19:11:22 | 0777 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:11:3:11:32 | call to chmod | call to chmod | | FilePermissions.rb:28:13:28:16 | 0755 | FilePermissions.rb:28:13:28:16 | 0755 | FilePermissions.rb:28:13:28:16 | 0755 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:28:3:28:26 | call to chmod | call to chmod | -| FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:51:10:51:13 | 0777 : | FilePermissions.rb:53:19:53:22 | perm | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:53:3:53:32 | call to chmod | call to chmod | -| FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:51:10:51:13 | 0777 : | FilePermissions.rb:56:19:56:23 | perm2 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:56:3:56:33 | call to chmod | call to chmod | -| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" | FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" : | FilePermissions.rb:61:19:61:23 | perm2 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:61:3:61:33 | call to chmod | call to chmod | +| FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:53:19:53:22 | perm | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:53:3:53:32 | call to chmod | call to chmod | +| FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:56:19:56:23 | perm2 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:56:3:56:33 | call to chmod | call to chmod | +| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" | FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" | FilePermissions.rb:61:19:61:23 | perm2 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:61:3:61:33 | call to chmod | call to chmod | | FilePermissions.rb:63:19:63:29 | "u=rwx,o+r" | FilePermissions.rb:63:19:63:29 | "u=rwx,o+r" | FilePermissions.rb:63:19:63:29 | "u=rwx,o+r" | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:63:3:63:39 | call to chmod | call to chmod | | FilePermissions.rb:67:19:67:24 | "a+rw" | FilePermissions.rb:67:19:67:24 | "a+rw" | FilePermissions.rb:67:19:67:24 | "a+rw" | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:67:3:67:34 | call to chmod | call to chmod | | FilePermissions.rb:72:21:72:24 | 0755 | FilePermissions.rb:72:21:72:24 | 0755 | FilePermissions.rb:72:21:72:24 | 0755 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:72:3:72:34 | call to chmod_R | call to chmod_R | diff --git a/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected b/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected index 4d358671e34..f72ff8cc2a4 100644 --- a/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected +++ b/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected @@ -1,49 +1,49 @@ edges -| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." : | HardcodedCredentials.rb:1:23:1:30 | password | -| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : | HardcodedCredentials.rb:1:33:1:36 | cert | -| HardcodedCredentials.rb:18:19:18:72 | ... + ... : | HardcodedCredentials.rb:1:23:1:30 | password | -| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : | HardcodedCredentials.rb:18:19:18:72 | ... + ... : | -| HardcodedCredentials.rb:20:1:20:7 | pw_left : | HardcodedCredentials.rb:22:1:22:2 | pw : | -| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : | HardcodedCredentials.rb:20:1:20:7 | pw_left : | -| HardcodedCredentials.rb:21:1:21:8 | pw_right : | HardcodedCredentials.rb:22:1:22:2 | pw : | -| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" : | HardcodedCredentials.rb:21:1:21:8 | pw_right : | -| HardcodedCredentials.rb:22:1:22:2 | pw : | HardcodedCredentials.rb:23:19:23:20 | pw : | -| HardcodedCredentials.rb:23:19:23:20 | pw : | HardcodedCredentials.rb:1:23:1:30 | password | -| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : | HardcodedCredentials.rb:31:18:31:23 | passwd | -| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" : | HardcodedCredentials.rb:43:18:43:25 | username | -| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" : | HardcodedCredentials.rb:43:46:43:53 | password | +| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | HardcodedCredentials.rb:1:23:1:30 | password | +| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:1:33:1:36 | cert | +| HardcodedCredentials.rb:18:19:18:72 | ... + ... | HardcodedCredentials.rb:1:23:1:30 | password | +| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | HardcodedCredentials.rb:18:19:18:72 | ... + ... | +| HardcodedCredentials.rb:20:1:20:7 | pw_left | HardcodedCredentials.rb:22:1:22:2 | pw | +| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | HardcodedCredentials.rb:20:1:20:7 | pw_left | +| HardcodedCredentials.rb:21:1:21:8 | pw_right | HardcodedCredentials.rb:22:1:22:2 | pw | +| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" | HardcodedCredentials.rb:21:1:21:8 | pw_right | +| HardcodedCredentials.rb:22:1:22:2 | pw | HardcodedCredentials.rb:23:19:23:20 | pw | +| HardcodedCredentials.rb:23:19:23:20 | pw | HardcodedCredentials.rb:1:23:1:30 | password | +| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | HardcodedCredentials.rb:31:18:31:23 | passwd | +| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" | HardcodedCredentials.rb:43:18:43:25 | username | +| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" | HardcodedCredentials.rb:43:46:43:53 | password | nodes | HardcodedCredentials.rb:1:23:1:30 | password | semmle.label | password | | HardcodedCredentials.rb:1:33:1:36 | cert | semmle.label | cert | | HardcodedCredentials.rb:4:20:4:65 | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | semmle.label | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | | HardcodedCredentials.rb:8:30:8:75 | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | semmle.label | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | -| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." : | semmle.label | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." : | +| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | semmle.label | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | semmle.label | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | -| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : | semmle.label | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : | -| HardcodedCredentials.rb:18:19:18:72 | ... + ... : | semmle.label | ... + ... : | -| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : | semmle.label | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : | -| HardcodedCredentials.rb:20:1:20:7 | pw_left : | semmle.label | pw_left : | -| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : | semmle.label | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : | -| HardcodedCredentials.rb:21:1:21:8 | pw_right : | semmle.label | pw_right : | -| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" : | semmle.label | "4fQuzXef4f2yow8KWvIJTA==" : | -| HardcodedCredentials.rb:22:1:22:2 | pw : | semmle.label | pw : | -| HardcodedCredentials.rb:23:19:23:20 | pw : | semmle.label | pw : | +| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | semmle.label | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | +| HardcodedCredentials.rb:18:19:18:72 | ... + ... | semmle.label | ... + ... | +| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | semmle.label | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | +| HardcodedCredentials.rb:20:1:20:7 | pw_left | semmle.label | pw_left | +| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | semmle.label | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | +| HardcodedCredentials.rb:21:1:21:8 | pw_right | semmle.label | pw_right | +| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" | semmle.label | "4fQuzXef4f2yow8KWvIJTA==" | +| HardcodedCredentials.rb:22:1:22:2 | pw | semmle.label | pw | +| HardcodedCredentials.rb:23:19:23:20 | pw | semmle.label | pw | | HardcodedCredentials.rb:31:18:31:23 | passwd | semmle.label | passwd | -| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : | semmle.label | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : | +| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | semmle.label | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | | HardcodedCredentials.rb:43:18:43:25 | username | semmle.label | username | -| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" : | semmle.label | "user@test.com" : | +| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" | semmle.label | "user@test.com" | | HardcodedCredentials.rb:43:46:43:53 | password | semmle.label | password | -| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" : | semmle.label | "abcdef123456" : | +| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" | semmle.label | "abcdef123456" | subpaths #select | HardcodedCredentials.rb:4:20:4:65 | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | HardcodedCredentials.rb:4:20:4:65 | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | HardcodedCredentials.rb:4:20:4:65 | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | This hardcoded value is $@. | HardcodedCredentials.rb:4:20:4:65 | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | used as credentials | | HardcodedCredentials.rb:8:30:8:75 | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | HardcodedCredentials.rb:8:30:8:75 | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | HardcodedCredentials.rb:8:30:8:75 | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | This hardcoded value is $@. | HardcodedCredentials.rb:8:30:8:75 | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | used as credentials | -| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." : | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | +| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | +| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:1:33:1:36 | cert | This hardcoded value is $@. | HardcodedCredentials.rb:1:33:1:36 | cert | used as credentials | | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | This hardcoded value is $@. | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | used as credentials | -| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : | HardcodedCredentials.rb:1:33:1:36 | cert | This hardcoded value is $@. | HardcodedCredentials.rb:1:33:1:36 | cert | used as credentials | -| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | -| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | -| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" | HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" : | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | -| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : | HardcodedCredentials.rb:31:18:31:23 | passwd | This hardcoded value is $@. | HardcodedCredentials.rb:31:18:31:23 | passwd | used as credentials | -| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" | HardcodedCredentials.rb:43:29:43:43 | "user@test.com" : | HardcodedCredentials.rb:43:18:43:25 | username | This hardcoded value is $@. | HardcodedCredentials.rb:43:18:43:25 | username | used as credentials | -| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" | HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" : | HardcodedCredentials.rb:43:46:43:53 | password | This hardcoded value is $@. | HardcodedCredentials.rb:43:46:43:53 | password | used as credentials | +| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | +| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | +| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" | HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | +| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | HardcodedCredentials.rb:31:18:31:23 | passwd | This hardcoded value is $@. | HardcodedCredentials.rb:31:18:31:23 | passwd | used as credentials | +| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" | HardcodedCredentials.rb:43:29:43:43 | "user@test.com" | HardcodedCredentials.rb:43:18:43:25 | username | This hardcoded value is $@. | HardcodedCredentials.rb:43:18:43:25 | username | used as credentials | +| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" | HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" | HardcodedCredentials.rb:43:46:43:53 | password | This hardcoded value is $@. | HardcodedCredentials.rb:43:46:43:53 | password | used as credentials | diff --git a/ruby/ql/test/query-tests/security/cwe-807-user-controlled-bypass/ConditionalBypass.expected b/ruby/ql/test/query-tests/security/cwe-807-user-controlled-bypass/ConditionalBypass.expected index 32b778130ef..c591f922334 100644 --- a/ruby/ql/test/query-tests/security/cwe-807-user-controlled-bypass/ConditionalBypass.expected +++ b/ruby/ql/test/query-tests/security/cwe-807-user-controlled-bypass/ConditionalBypass.expected @@ -1,26 +1,26 @@ edges -| ConditionalBypass.rb:3:5:3:9 | check : | ConditionalBypass.rb:6:8:6:12 | check | -| ConditionalBypass.rb:3:13:3:18 | call to params : | ConditionalBypass.rb:3:13:3:26 | ...[...] : | -| ConditionalBypass.rb:3:13:3:26 | ...[...] : | ConditionalBypass.rb:3:5:3:9 | check : | -| ConditionalBypass.rb:14:14:14:19 | call to params : | ConditionalBypass.rb:14:14:14:27 | ...[...] | -| ConditionalBypass.rb:25:5:25:5 | p : | ConditionalBypass.rb:27:8:27:8 | p | -| ConditionalBypass.rb:25:10:25:15 | call to params : | ConditionalBypass.rb:25:10:25:22 | ...[...] | -| ConditionalBypass.rb:25:10:25:15 | call to params : | ConditionalBypass.rb:25:10:25:22 | ...[...] : | -| ConditionalBypass.rb:25:10:25:22 | ...[...] : | ConditionalBypass.rb:25:5:25:5 | p : | +| ConditionalBypass.rb:3:5:3:9 | check | ConditionalBypass.rb:6:8:6:12 | check | +| ConditionalBypass.rb:3:13:3:18 | call to params | ConditionalBypass.rb:3:13:3:26 | ...[...] | +| ConditionalBypass.rb:3:13:3:26 | ...[...] | ConditionalBypass.rb:3:5:3:9 | check | +| ConditionalBypass.rb:14:14:14:19 | call to params | ConditionalBypass.rb:14:14:14:27 | ...[...] | +| ConditionalBypass.rb:25:5:25:5 | p | ConditionalBypass.rb:27:8:27:8 | p | +| ConditionalBypass.rb:25:10:25:15 | call to params | ConditionalBypass.rb:25:10:25:22 | ...[...] | +| ConditionalBypass.rb:25:10:25:15 | call to params | ConditionalBypass.rb:25:10:25:22 | ...[...] | +| ConditionalBypass.rb:25:10:25:22 | ...[...] | ConditionalBypass.rb:25:5:25:5 | p | nodes -| ConditionalBypass.rb:3:5:3:9 | check : | semmle.label | check : | -| ConditionalBypass.rb:3:13:3:18 | call to params : | semmle.label | call to params : | -| ConditionalBypass.rb:3:13:3:26 | ...[...] : | semmle.label | ...[...] : | +| ConditionalBypass.rb:3:5:3:9 | check | semmle.label | check | +| ConditionalBypass.rb:3:13:3:18 | call to params | semmle.label | call to params | +| ConditionalBypass.rb:3:13:3:26 | ...[...] | semmle.label | ...[...] | | ConditionalBypass.rb:6:8:6:12 | check | semmle.label | check | -| ConditionalBypass.rb:14:14:14:19 | call to params : | semmle.label | call to params : | +| ConditionalBypass.rb:14:14:14:19 | call to params | semmle.label | call to params | | ConditionalBypass.rb:14:14:14:27 | ...[...] | semmle.label | ...[...] | -| ConditionalBypass.rb:25:5:25:5 | p : | semmle.label | p : | -| ConditionalBypass.rb:25:10:25:15 | call to params : | semmle.label | call to params : | +| ConditionalBypass.rb:25:5:25:5 | p | semmle.label | p | +| ConditionalBypass.rb:25:10:25:15 | call to params | semmle.label | call to params | +| ConditionalBypass.rb:25:10:25:22 | ...[...] | semmle.label | ...[...] | | ConditionalBypass.rb:25:10:25:22 | ...[...] | semmle.label | ...[...] | -| ConditionalBypass.rb:25:10:25:22 | ...[...] : | semmle.label | ...[...] : | | ConditionalBypass.rb:27:8:27:8 | p | semmle.label | p | subpaths #select -| ConditionalBypass.rb:6:8:6:12 | check | ConditionalBypass.rb:3:13:3:18 | call to params : | ConditionalBypass.rb:6:8:6:12 | check | This condition guards a sensitive $@, but a $@ controls it. | ConditionalBypass.rb:8:7:8:29 | call to authenticate_user! | action | ConditionalBypass.rb:3:13:3:18 | call to params | user-provided value | -| ConditionalBypass.rb:14:14:14:27 | ...[...] | ConditionalBypass.rb:14:14:14:19 | call to params : | ConditionalBypass.rb:14:14:14:27 | ...[...] | This condition guards a sensitive $@, but a $@ controls it. | ConditionalBypass.rb:14:5:14:9 | call to login | action | ConditionalBypass.rb:14:14:14:19 | call to params | user-provided value | -| ConditionalBypass.rb:27:8:27:8 | p | ConditionalBypass.rb:25:10:25:15 | call to params : | ConditionalBypass.rb:27:8:27:8 | p | This condition guards a sensitive $@, but a $@ controls it. | ConditionalBypass.rb:28:7:28:13 | call to verify! | action | ConditionalBypass.rb:25:10:25:15 | call to params | user-provided value | +| ConditionalBypass.rb:6:8:6:12 | check | ConditionalBypass.rb:3:13:3:18 | call to params | ConditionalBypass.rb:6:8:6:12 | check | This condition guards a sensitive $@, but a $@ controls it. | ConditionalBypass.rb:8:7:8:29 | call to authenticate_user! | action | ConditionalBypass.rb:3:13:3:18 | call to params | user-provided value | +| ConditionalBypass.rb:14:14:14:27 | ...[...] | ConditionalBypass.rb:14:14:14:19 | call to params | ConditionalBypass.rb:14:14:14:27 | ...[...] | This condition guards a sensitive $@, but a $@ controls it. | ConditionalBypass.rb:14:5:14:9 | call to login | action | ConditionalBypass.rb:14:14:14:19 | call to params | user-provided value | +| ConditionalBypass.rb:27:8:27:8 | p | ConditionalBypass.rb:25:10:25:15 | call to params | ConditionalBypass.rb:27:8:27:8 | p | This condition guards a sensitive $@, but a $@ controls it. | ConditionalBypass.rb:28:7:28:13 | call to verify! | action | ConditionalBypass.rb:25:10:25:15 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected b/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected index 3562b7a8c98..6e30aeeb235 100644 --- a/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected +++ b/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected @@ -1,16 +1,16 @@ failures edges -| insecure_download.rb:31:5:31:7 | url : | insecure_download.rb:33:15:33:17 | url | -| insecure_download.rb:31:5:31:7 | url : | insecure_download.rb:33:15:33:17 | url | -| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | insecure_download.rb:31:5:31:7 | url : | -| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | insecure_download.rb:31:5:31:7 | url : | +| insecure_download.rb:31:5:31:7 | url | insecure_download.rb:33:15:33:17 | url | +| insecure_download.rb:31:5:31:7 | url | insecure_download.rb:33:15:33:17 | url | +| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | insecure_download.rb:31:5:31:7 | url | +| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | insecure_download.rb:31:5:31:7 | url | nodes | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | semmle.label | "http://example.org/unsafe.APK" | | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | semmle.label | "http://example.org/unsafe.APK" | -| insecure_download.rb:31:5:31:7 | url : | semmle.label | url : | -| insecure_download.rb:31:5:31:7 | url : | semmle.label | url : | -| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | semmle.label | "http://example.org/unsafe.APK" : | -| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | semmle.label | "http://example.org/unsafe.APK" : | +| insecure_download.rb:31:5:31:7 | url | semmle.label | url | +| insecure_download.rb:31:5:31:7 | url | semmle.label | url | +| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | semmle.label | "http://example.org/unsafe.APK" | +| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | semmle.label | "http://example.org/unsafe.APK" | | insecure_download.rb:33:15:33:17 | url | semmle.label | url | | insecure_download.rb:33:15:33:17 | url | semmle.label | url | | insecure_download.rb:37:42:37:68 | "http://example.org/unsafe" | semmle.label | "http://example.org/unsafe" | @@ -21,8 +21,8 @@ subpaths #select | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | $@ | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | "http://example.org/unsafe.APK" | | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | $@ | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | "http://example.org/unsafe.APK" | -| insecure_download.rb:33:15:33:17 | url | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | "http://example.org/unsafe.APK" : | -| insecure_download.rb:33:15:33:17 | url | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | "http://example.org/unsafe.APK" : | +| insecure_download.rb:33:15:33:17 | url | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | "http://example.org/unsafe.APK" | +| insecure_download.rb:33:15:33:17 | url | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | "http://example.org/unsafe.APK" | | insecure_download.rb:33:15:33:17 | url | insecure_download.rb:33:15:33:17 | url | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:33:15:33:17 | url | url | | insecure_download.rb:33:15:33:17 | url | insecure_download.rb:33:15:33:17 | url | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:33:15:33:17 | url | url | | insecure_download.rb:37:42:37:68 | "http://example.org/unsafe" | insecure_download.rb:37:42:37:68 | "http://example.org/unsafe" | insecure_download.rb:37:42:37:68 | "http://example.org/unsafe" | $@ | insecure_download.rb:37:42:37:68 | "http://example.org/unsafe" | "http://example.org/unsafe" | diff --git a/ruby/ql/test/query-tests/security/cwe-912/HttpToFileAccess.expected b/ruby/ql/test/query-tests/security/cwe-912/HttpToFileAccess.expected index 1f26bdc2221..19b955a9a8d 100644 --- a/ruby/ql/test/query-tests/security/cwe-912/HttpToFileAccess.expected +++ b/ruby/ql/test/query-tests/security/cwe-912/HttpToFileAccess.expected @@ -1,18 +1,18 @@ edges -| http_to_file_access.rb:3:1:3:4 | resp : | http_to_file_access.rb:5:12:5:15 | resp | -| http_to_file_access.rb:3:8:3:52 | call to body : | http_to_file_access.rb:3:1:3:4 | resp : | -| http_to_file_access.rb:9:7:9:12 | script : | http_to_file_access.rb:11:18:11:23 | script | -| http_to_file_access.rb:9:16:9:21 | call to params : | http_to_file_access.rb:9:16:9:30 | ...[...] : | -| http_to_file_access.rb:9:16:9:30 | ...[...] : | http_to_file_access.rb:9:7:9:12 | script : | +| http_to_file_access.rb:3:1:3:4 | resp | http_to_file_access.rb:5:12:5:15 | resp | +| http_to_file_access.rb:3:8:3:52 | call to body | http_to_file_access.rb:3:1:3:4 | resp | +| http_to_file_access.rb:9:7:9:12 | script | http_to_file_access.rb:11:18:11:23 | script | +| http_to_file_access.rb:9:16:9:21 | call to params | http_to_file_access.rb:9:16:9:30 | ...[...] | +| http_to_file_access.rb:9:16:9:30 | ...[...] | http_to_file_access.rb:9:7:9:12 | script | nodes -| http_to_file_access.rb:3:1:3:4 | resp : | semmle.label | resp : | -| http_to_file_access.rb:3:8:3:52 | call to body : | semmle.label | call to body : | +| http_to_file_access.rb:3:1:3:4 | resp | semmle.label | resp | +| http_to_file_access.rb:3:8:3:52 | call to body | semmle.label | call to body | | http_to_file_access.rb:5:12:5:15 | resp | semmle.label | resp | -| http_to_file_access.rb:9:7:9:12 | script : | semmle.label | script : | -| http_to_file_access.rb:9:16:9:21 | call to params : | semmle.label | call to params : | -| http_to_file_access.rb:9:16:9:30 | ...[...] : | semmle.label | ...[...] : | +| http_to_file_access.rb:9:7:9:12 | script | semmle.label | script | +| http_to_file_access.rb:9:16:9:21 | call to params | semmle.label | call to params | +| http_to_file_access.rb:9:16:9:30 | ...[...] | semmle.label | ...[...] | | http_to_file_access.rb:11:18:11:23 | script | semmle.label | script | subpaths #select -| http_to_file_access.rb:5:12:5:15 | resp | http_to_file_access.rb:3:8:3:52 | call to body : | http_to_file_access.rb:5:12:5:15 | resp | Write to file system depends on $@. | http_to_file_access.rb:3:8:3:52 | call to body | untrusted data | -| http_to_file_access.rb:11:18:11:23 | script | http_to_file_access.rb:9:16:9:21 | call to params : | http_to_file_access.rb:11:18:11:23 | script | Write to file system depends on $@. | http_to_file_access.rb:9:16:9:21 | call to params | untrusted data | +| http_to_file_access.rb:5:12:5:15 | resp | http_to_file_access.rb:3:8:3:52 | call to body | http_to_file_access.rb:5:12:5:15 | resp | Write to file system depends on $@. | http_to_file_access.rb:3:8:3:52 | call to body | untrusted data | +| http_to_file_access.rb:11:18:11:23 | script | http_to_file_access.rb:9:16:9:21 | call to params | http_to_file_access.rb:11:18:11:23 | script | Write to file system depends on $@. | http_to_file_access.rb:9:16:9:21 | call to params | untrusted data | diff --git a/ruby/ql/test/query-tests/security/cwe-918/ServerSideRequestForgery.expected b/ruby/ql/test/query-tests/security/cwe-918/ServerSideRequestForgery.expected index 906d4666020..0145d9bddf5 100644 --- a/ruby/ql/test/query-tests/security/cwe-918/ServerSideRequestForgery.expected +++ b/ruby/ql/test/query-tests/security/cwe-918/ServerSideRequestForgery.expected @@ -1,20 +1,20 @@ edges -| ServerSideRequestForgery.rb:10:9:10:28 | users_service_domain : | ServerSideRequestForgery.rb:11:31:11:62 | "#{...}/logins" | -| ServerSideRequestForgery.rb:10:32:10:37 | call to params : | ServerSideRequestForgery.rb:10:32:10:60 | ...[...] : | -| ServerSideRequestForgery.rb:10:32:10:60 | ...[...] : | ServerSideRequestForgery.rb:10:9:10:28 | users_service_domain : | -| ServerSideRequestForgery.rb:15:33:15:38 | call to params : | ServerSideRequestForgery.rb:15:33:15:44 | ...[...] | -| ServerSideRequestForgery.rb:20:45:20:50 | call to params : | ServerSideRequestForgery.rb:20:45:20:56 | ...[...] | +| ServerSideRequestForgery.rb:10:9:10:28 | users_service_domain | ServerSideRequestForgery.rb:11:31:11:62 | "#{...}/logins" | +| ServerSideRequestForgery.rb:10:32:10:37 | call to params | ServerSideRequestForgery.rb:10:32:10:60 | ...[...] | +| ServerSideRequestForgery.rb:10:32:10:60 | ...[...] | ServerSideRequestForgery.rb:10:9:10:28 | users_service_domain | +| ServerSideRequestForgery.rb:15:33:15:38 | call to params | ServerSideRequestForgery.rb:15:33:15:44 | ...[...] | +| ServerSideRequestForgery.rb:20:45:20:50 | call to params | ServerSideRequestForgery.rb:20:45:20:56 | ...[...] | nodes -| ServerSideRequestForgery.rb:10:9:10:28 | users_service_domain : | semmle.label | users_service_domain : | -| ServerSideRequestForgery.rb:10:32:10:37 | call to params : | semmle.label | call to params : | -| ServerSideRequestForgery.rb:10:32:10:60 | ...[...] : | semmle.label | ...[...] : | +| ServerSideRequestForgery.rb:10:9:10:28 | users_service_domain | semmle.label | users_service_domain | +| ServerSideRequestForgery.rb:10:32:10:37 | call to params | semmle.label | call to params | +| ServerSideRequestForgery.rb:10:32:10:60 | ...[...] | semmle.label | ...[...] | | ServerSideRequestForgery.rb:11:31:11:62 | "#{...}/logins" | semmle.label | "#{...}/logins" | -| ServerSideRequestForgery.rb:15:33:15:38 | call to params : | semmle.label | call to params : | +| ServerSideRequestForgery.rb:15:33:15:38 | call to params | semmle.label | call to params | | ServerSideRequestForgery.rb:15:33:15:44 | ...[...] | semmle.label | ...[...] | -| ServerSideRequestForgery.rb:20:45:20:50 | call to params : | semmle.label | call to params : | +| ServerSideRequestForgery.rb:20:45:20:50 | call to params | semmle.label | call to params | | ServerSideRequestForgery.rb:20:45:20:56 | ...[...] | semmle.label | ...[...] | subpaths #select -| ServerSideRequestForgery.rb:11:31:11:62 | "#{...}/logins" | ServerSideRequestForgery.rb:10:32:10:37 | call to params : | ServerSideRequestForgery.rb:11:31:11:62 | "#{...}/logins" | The URL of this request depends on a $@. | ServerSideRequestForgery.rb:10:32:10:37 | call to params | user-provided value | -| ServerSideRequestForgery.rb:15:33:15:44 | ...[...] | ServerSideRequestForgery.rb:15:33:15:38 | call to params : | ServerSideRequestForgery.rb:15:33:15:44 | ...[...] | The URL of this request depends on a $@. | ServerSideRequestForgery.rb:15:33:15:38 | call to params | user-provided value | -| ServerSideRequestForgery.rb:20:45:20:56 | ...[...] | ServerSideRequestForgery.rb:20:45:20:50 | call to params : | ServerSideRequestForgery.rb:20:45:20:56 | ...[...] | The URL of this request depends on a $@. | ServerSideRequestForgery.rb:20:45:20:50 | call to params | user-provided value | +| ServerSideRequestForgery.rb:11:31:11:62 | "#{...}/logins" | ServerSideRequestForgery.rb:10:32:10:37 | call to params | ServerSideRequestForgery.rb:11:31:11:62 | "#{...}/logins" | The URL of this request depends on a $@. | ServerSideRequestForgery.rb:10:32:10:37 | call to params | user-provided value | +| ServerSideRequestForgery.rb:15:33:15:44 | ...[...] | ServerSideRequestForgery.rb:15:33:15:38 | call to params | ServerSideRequestForgery.rb:15:33:15:44 | ...[...] | The URL of this request depends on a $@. | ServerSideRequestForgery.rb:15:33:15:38 | call to params | user-provided value | +| ServerSideRequestForgery.rb:20:45:20:56 | ...[...] | ServerSideRequestForgery.rb:20:45:20:50 | call to params | ServerSideRequestForgery.rb:20:45:20:56 | ...[...] | The URL of this request depends on a $@. | ServerSideRequestForgery.rb:20:45:20:50 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/decompression-api/DecompressionApi.expected b/ruby/ql/test/query-tests/security/decompression-api/DecompressionApi.expected index 265142d1ccd..dbcca414cf1 100644 --- a/ruby/ql/test/query-tests/security/decompression-api/DecompressionApi.expected +++ b/ruby/ql/test/query-tests/security/decompression-api/DecompressionApi.expected @@ -1,16 +1,16 @@ edges -| decompression_api.rb:4:9:4:12 | path : | decompression_api.rb:5:31:5:34 | path | -| decompression_api.rb:4:16:4:21 | call to params : | decompression_api.rb:4:16:4:28 | ...[...] : | -| decompression_api.rb:4:16:4:28 | ...[...] : | decompression_api.rb:4:9:4:12 | path : | -| decompression_api.rb:15:31:15:36 | call to params : | decompression_api.rb:15:31:15:43 | ...[...] | +| decompression_api.rb:4:9:4:12 | path | decompression_api.rb:5:31:5:34 | path | +| decompression_api.rb:4:16:4:21 | call to params | decompression_api.rb:4:16:4:28 | ...[...] | +| decompression_api.rb:4:16:4:28 | ...[...] | decompression_api.rb:4:9:4:12 | path | +| decompression_api.rb:15:31:15:36 | call to params | decompression_api.rb:15:31:15:43 | ...[...] | nodes -| decompression_api.rb:4:9:4:12 | path : | semmle.label | path : | -| decompression_api.rb:4:16:4:21 | call to params : | semmle.label | call to params : | -| decompression_api.rb:4:16:4:28 | ...[...] : | semmle.label | ...[...] : | +| decompression_api.rb:4:9:4:12 | path | semmle.label | path | +| decompression_api.rb:4:16:4:21 | call to params | semmle.label | call to params | +| decompression_api.rb:4:16:4:28 | ...[...] | semmle.label | ...[...] | | decompression_api.rb:5:31:5:34 | path | semmle.label | path | -| decompression_api.rb:15:31:15:36 | call to params : | semmle.label | call to params : | +| decompression_api.rb:15:31:15:36 | call to params | semmle.label | call to params | | decompression_api.rb:15:31:15:43 | ...[...] | semmle.label | ...[...] | subpaths #select -| decompression_api.rb:5:31:5:34 | path | decompression_api.rb:4:16:4:21 | call to params : | decompression_api.rb:5:31:5:34 | path | This call to $@ is unsafe because user-controlled data is used to set the object being decompressed, which could lead to a denial of service attack or malicious code extracted from an unknown source. | decompression_api.rb:5:9:5:35 | call to inflate | inflate | -| decompression_api.rb:15:31:15:43 | ...[...] | decompression_api.rb:15:31:15:36 | call to params : | decompression_api.rb:15:31:15:43 | ...[...] | This call to $@ is unsafe because user-controlled data is used to set the object being decompressed, which could lead to a denial of service attack or malicious code extracted from an unknown source. | decompression_api.rb:15:9:15:44 | call to open_buffer | open_buffer | +| decompression_api.rb:5:31:5:34 | path | decompression_api.rb:4:16:4:21 | call to params | decompression_api.rb:5:31:5:34 | path | This call to $@ is unsafe because user-controlled data is used to set the object being decompressed, which could lead to a denial of service attack or malicious code extracted from an unknown source. | decompression_api.rb:5:9:5:35 | call to inflate | inflate | +| decompression_api.rb:15:31:15:43 | ...[...] | decompression_api.rb:15:31:15:36 | call to params | decompression_api.rb:15:31:15:43 | ...[...] | This call to $@ is unsafe because user-controlled data is used to set the object being decompressed, which could lead to a denial of service attack or malicious code extracted from an unknown source. | decompression_api.rb:15:9:15:44 | call to open_buffer | open_buffer | diff --git a/ruby/scripts/create-extractor-pack.ps1 b/ruby/scripts/create-extractor-pack.ps1 index 920d5032855..72c7d01180c 100644 --- a/ruby/scripts/create-extractor-pack.ps1 +++ b/ruby/scripts/create-extractor-pack.ps1 @@ -2,7 +2,7 @@ cd extractor cargo build --release cd .. -extractor\target\release\generator --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll +extractor\target\release\codeql-extractor-ruby -- generate --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll codeql query format -i ql\lib\codeql/ruby\ast\internal\TreeSitter.qll @@ -12,5 +12,4 @@ cp codeql-extractor.yml, ql\lib\ruby.dbscheme, ql\lib\ruby.dbscheme.stats extrac cp -Recurse tools extractor-pack cp -Recurse downgrades extractor-pack mkdir extractor-pack\tools\win64 | Out-Null -cp extractor\target\release\extractor.exe extractor-pack\tools\win64\extractor.exe -cp extractor\target\release\autobuilder.exe extractor-pack\tools\win64\autobuilder.exe +cp extractor\target\release\codeql-extractor-ruby.exe extractor-pack\tools\win64\extractor.exe diff --git a/ruby/scripts/create-extractor-pack.sh b/ruby/scripts/create-extractor-pack.sh index c014ed52016..15efba5350e 100755 --- a/ruby/scripts/create-extractor-pack.sh +++ b/ruby/scripts/create-extractor-pack.sh @@ -22,7 +22,7 @@ if [[ "$CARGO" == "cross" ]]; then BIN_DIR=extractor/target/x86_64-unknown-linux-gnu/release fi -"$BIN_DIR/generator" --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll +"$BIN_DIR/codeql-extractor-ruby" generate --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll codeql query format -i ql/lib/codeql/ruby/ast/internal/TreeSitter.qll @@ -30,5 +30,4 @@ rm -rf extractor-pack mkdir -p extractor-pack cp -r codeql-extractor.yml downgrades tools ql/lib/ruby.dbscheme ql/lib/ruby.dbscheme.stats extractor-pack/ mkdir -p extractor-pack/tools/${platform} -cp "$BIN_DIR/extractor" extractor-pack/tools/${platform}/extractor -cp "$BIN_DIR/autobuilder" extractor-pack/tools/${platform}/autobuilder +cp "$BIN_DIR/codeql-extractor-ruby" extractor-pack/tools/${platform}/extractor diff --git a/ruby/tools/autobuild.cmd b/ruby/tools/autobuild.cmd index 30509b1c57f..01bfd679cd7 100644 --- a/ruby/tools/autobuild.cmd +++ b/ruby/tools/autobuild.cmd @@ -1,5 +1,5 @@ @echo off -type NUL && "%CODEQL_EXTRACTOR_RUBY_ROOT%\tools\%CODEQL_PLATFORM%\autobuilder" +type NUL && "%CODEQL_EXTRACTOR_RUBY_ROOT%\tools\%CODEQL_PLATFORM%\extractor" autobuild exit /b %ERRORLEVEL% diff --git a/ruby/tools/autobuild.sh b/ruby/tools/autobuild.sh index 7c386131c39..0b249ed6e12 100755 --- a/ruby/tools/autobuild.sh +++ b/ruby/tools/autobuild.sh @@ -1,3 +1,3 @@ #!/bin/sh -exec "${CODEQL_EXTRACTOR_RUBY_ROOT}/tools/${CODEQL_PLATFORM}/autobuilder" +exec "${CODEQL_EXTRACTOR_RUBY_ROOT}/tools/${CODEQL_PLATFORM}/extractor" autobuild diff --git a/ruby/tools/index-files.cmd b/ruby/tools/index-files.cmd index bc96895a988..0f2c66deb73 100644 --- a/ruby/tools/index-files.cmd +++ b/ruby/tools/index-files.cmd @@ -1,6 +1,7 @@ @echo off type NUL && "%CODEQL_EXTRACTOR_RUBY_ROOT%\tools\win64\extractor.exe" ^ + extract ^ --file-list "%1" ^ --source-archive-dir "%CODEQL_EXTRACTOR_RUBY_SOURCE_ARCHIVE_DIR%" ^ --output-dir "%CODEQL_EXTRACTOR_RUBY_TRAP_DIR%" diff --git a/ruby/tools/index-files.sh b/ruby/tools/index-files.sh index cfd5a360a27..dd733ea0cc2 100755 --- a/ruby/tools/index-files.sh +++ b/ruby/tools/index-files.sh @@ -3,6 +3,7 @@ set -eu exec "${CODEQL_EXTRACTOR_RUBY_ROOT}/tools/${CODEQL_PLATFORM}/extractor" \ + extract \ --file-list "$1" \ --source-archive-dir "$CODEQL_EXTRACTOR_RUBY_SOURCE_ARCHIVE_DIR" \ --output-dir "$CODEQL_EXTRACTOR_RUBY_TRAP_DIR" diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 1caa4f79cdf..64199d2b5ca 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.12 + +No user-facing changes. + ## 0.0.11 No user-facing changes. diff --git a/shared/regex/change-notes/released/0.0.12.md b/shared/regex/change-notes/released/0.0.12.md new file mode 100644 index 00000000000..0e206033bc4 --- /dev/null +++ b/shared/regex/change-notes/released/0.0.12.md @@ -0,0 +1,3 @@ +## 0.0.12 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index e679dc42092..997fb8da83c 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.11 +lastReleaseVersion: 0.0.12 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index c9d2c83e537..aa135e375da 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 0.0.11 +version: 0.0.12 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index d64164f4289..52bdc7e1442 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.16 + +No user-facing changes. + ## 0.0.15 No user-facing changes. diff --git a/shared/ssa/change-notes/released/0.0.16.md b/shared/ssa/change-notes/released/0.0.16.md new file mode 100644 index 00000000000..62b5521ea01 --- /dev/null +++ b/shared/ssa/change-notes/released/0.0.16.md @@ -0,0 +1,3 @@ +## 0.0.16 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index dff35216fc6..a49f7be4cff 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.15 +lastReleaseVersion: 0.0.16 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 0df782d2950..0ec03e8ad6d 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/ssa -version: 0.0.15 +version: 0.0.16 groups: shared library: true diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 5eff2c5f852..1e8bd30fccd 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/0.0.9.md b/shared/tutorial/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..c9e17c6d6cf --- /dev/null +++ b/shared/tutorial/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index 58fdc6b45de..ecdd64fbab8 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.9 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 7cc8cfcd230..599b1490de2 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 0.0.8 +version: 0.0.9 groups: shared library: true diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 3af44590ddf..77af08547b4 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/0.0.9.md b/shared/typetracking/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..c9e17c6d6cf --- /dev/null +++ b/shared/typetracking/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index 58fdc6b45de..ecdd64fbab8 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.9 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index ccff6bd3fc7..6602b83639d 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 0.0.8 +version: 0.0.9 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index a67f89533a5..600b6f93329 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.16 + +No user-facing changes. + ## 0.0.15 No user-facing changes. diff --git a/shared/typos/change-notes/released/0.0.16.md b/shared/typos/change-notes/released/0.0.16.md new file mode 100644 index 00000000000..62b5521ea01 --- /dev/null +++ b/shared/typos/change-notes/released/0.0.16.md @@ -0,0 +1,3 @@ +## 0.0.16 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index dff35216fc6..a49f7be4cff 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.15 +lastReleaseVersion: 0.0.16 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index ebf75de8e45..1682ed5057a 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/typos -version: 0.0.15 +version: 0.0.16 groups: shared library: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 97861ced583..aad25b929dc 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/shared/util/change-notes/released/0.0.9.md b/shared/util/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..c9e17c6d6cf --- /dev/null +++ b/shared/util/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 58fdc6b45de..ecdd64fbab8 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.9 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 7293c9c339c..33acea959bb 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 0.0.8 +version: 0.0.9 groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md new file mode 100644 index 00000000000..9e8194d5e01 --- /dev/null +++ b/shared/yaml/CHANGELOG.md @@ -0,0 +1,5 @@ +## 0.0.1 + +### Minor Analysis Improvements + +* Initial release. Extracted YAML related code into a library pack to share code between languages. diff --git a/shared/yaml/change-notes/released/0.0.1.md b/shared/yaml/change-notes/released/0.0.1.md new file mode 100644 index 00000000000..9e8194d5e01 --- /dev/null +++ b/shared/yaml/change-notes/released/0.0.1.md @@ -0,0 +1,5 @@ +## 0.0.1 + +### Minor Analysis Improvements + +* Initial release. Extracted YAML related code into a library pack to share code between languages. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml new file mode 100644 index 00000000000..c6933410b71 --- /dev/null +++ b/shared/yaml/codeql-pack.release.yml @@ -0,0 +1,2 @@ +--- +lastReleaseVersion: 0.0.1 diff --git a/shared/yaml/codeql/yaml/Yaml.qll b/shared/yaml/codeql/yaml/Yaml.qll new file mode 100644 index 00000000000..028654de226 --- /dev/null +++ b/shared/yaml/codeql/yaml/Yaml.qll @@ -0,0 +1,668 @@ +/** + * Provides classes for working with YAML data. + * + * YAML documents are represented as abstract syntax trees whose nodes + * are either YAML values or alias nodes referring to another YAML value. + */ + +/** Provides the input specification of YAML implementation. */ +signature module InputSig { + class Container { + string getAbsolutePath(); + + Container getParentContainer(); + } + + class File extends Container; + + class Location { + File getFile(); + } + + class LocatableBase { + /** + * Gets the `Location` of this node. + * + * Typically `yaml_locations(this, result)`. + */ + Location getLocation(); + } + + /** + * A base class for Nodes. + * + * Typically `@yaml_node`. + */ + class NodeBase extends LocatableBase { + /** + * Gets the `i`th child node of this node. + * + * Typically `yaml(result, _, this, i, _, _)`. + */ + NodeBase getChildNode(int i); + + /** + * Gets the tag of this node. + * + * Typically `yaml(this, _, _, _, result, _)`. + */ + string getTag(); + + /** + * Gets the anchor associated with this node, if any. + * + * Typically `yaml_anchors(this, result)`. + */ + string getAnchor(); + + /** + * Gets a textual representation of this node. + * + * Typically `yaml(this, _, _, _, _, result)`. + */ + string toString(); + } + + /** + * A base class for scalar nodes. + * + * Typically `@yaml_scalar_node`. + */ + class ScalarNodeBase extends NodeBase { + /** + * Gets the style of this scalar. + * + * Typically `yaml_scalars(this, result, _)`. + */ + int getStyle(); + + /** + * Gets the value of this scalar, as a string. + * + * Typically `yaml_scalars(this, _, result)`. + */ + string getValue(); + } + + /** + * A base class for collections. + * + * Typically `@yaml_collection_node`. + */ + class CollectionNodeBase extends NodeBase; + + /** + * A base class for objects. + * + * Typically `@yaml_mapping_node`. + */ + class MappingNodeBase extends CollectionNodeBase; + + /** + * A base class for arrays. + * + * Typically `@yaml_sequence_node`. + */ + class SequenceNodeBase extends CollectionNodeBase; + + /** + * A base class for aliases. + * + * Typically `@yaml_alias_node`. + */ + class AliasNodeBase extends NodeBase { + /** + * Gets the target anchor this alias refers to. + * + * Typically `yaml_aliases(this, result)`. + */ + string getTarget(); + } + + /** + * A base class for parse errors. + * + * Typically `@yaml_parse_error`. + */ + class ParseErrorBase extends LocatableBase { + /** + * Gets the message of this parse error. + * + * Typically `yaml_errors(this, result)`. + */ + string getMessage(); + } +} + +/** Provides a class hierarchy for working with YAML files. */ +module Make { + /** + * A node in the AST representation of a YAML file, which may either be + * a YAML value (such as a scalar or a collection) or an alias node + * referring to some other YAML value. + * + * Examples: + * + * ``` + * # a mapping + * x: 1 + * << : *DEFAULTS # an alias node referring to anchor `DEFAULTS` + * ``` + */ + class YamlNode instanceof Input::NodeBase { + /** Gets the file this node comes from. */ + Input::File getFile() { result = this.getLocation().getFile() } + + /** + * Gets the `Location` of this node. + */ + Input::Location getLocation() { result = super.getLocation() } + + /** + * Gets the parent node of this node, which is always a collection. + */ + YamlCollection getParentNode() { this = result.getChildNode(_) } + + /** + * Gets the `i`th child node of this node. + * + * _Note_: The index of a child node relative to its parent is considered + * an implementation detail and may change between versions of the extractor. + */ + YamlNode getChildNode(int i) { result = super.getChildNode(i) } + + /** + * Gets a child node of this node. + */ + YamlNode getAChildNode() { result = this.getChildNode(_) } + + /** + * Gets the number of child nodes of this node. + */ + int getNumChild() { result = count(this.getAChildNode()) } + + /** + * Gets the `i`th child of this node, as a YAML value. + */ + YamlValue getChild(int i) { result = this.getChildNode(i).eval() } + + /** + * Gets a child of this node, as a YAML value. + */ + YamlValue getAChild() { result = this.getChild(_) } + + /** + * Gets the tag of this node. + */ + string getTag() { result = super.getTag() } + + /** + * Holds if this node is tagged with a standard type tag of the form + * `tag:yaml.org,2002:`. + */ + predicate hasStandardTypeTag(string t) { + t = this.getTag().regexpCapture("tag:yaml.org,2002:(.*)", 1) + } + + /** Gets a textual representation of this node. */ + string toString() { result = super.toString() } + + /** + * Gets the anchor associated with this node, if any. + */ + string getAnchor() { result = super.getAnchor() } + + /** + * Gets the toplevel document to which this node belongs. + */ + YamlDocument getDocument() { result = this.getParentNode*() } + + /** + * Gets the YAML value this node corresponds to after resolving aliases and includes. + */ + YamlValue eval() { result = this } + + /** + * Gets the primary QL class for this node. + */ + string getAPrimaryQlClass() { result = "YamlNode" } + } + + /** + * A YAML value; that is, either a scalar or a collection. + * + * Examples: + * + * ``` + * --- + * "a string" + * --- + * - a + * - sequence + * ``` + */ + abstract class YamlValue extends YamlNode { } + + /** + * A YAML scalar. + * + * Examples: + * + * ``` + * 42 + * 1.0 + * 2001-12-15T02:59:43.1Z + * true + * null + * "hello" + * ``` + */ + class YamlScalar extends YamlValue instanceof Input::ScalarNodeBase { + /** + * Gets the style of this scalar, which is one of the following: + * + * - `""` (empty string): plain style + * - `"\""` (double quote): double quoted style + * - `"'"` (single quote): single quoted style + * - `">"` (greater-than): folded style + * - `"|"` (pipe): literal style + */ + string getStyle() { + exists(int s | s = super.getStyle() | + s = 0 and result = "" + or + s = 34 and result = "\"" + or + s = 39 and result = "'" + or + s = 62 and result = ">" + or + s = 124 and result = "|" + ) + } + + /** + * Gets the value of this scalar, as a string. + */ + string getValue() { result = super.getValue() } + + override string getAPrimaryQlClass() { result = "YamlScalar" } + } + + /** + * A YAML scalar representing an integer value. + * + * Examples: + * + * ``` + * 42 + * 0xffff + * ``` + */ + class YamlInteger extends YamlScalar { + YamlInteger() { this.hasStandardTypeTag("int") } + + /** + * Gets the value of this scalar, as an integer. + */ + int getIntValue() { result = this.getValue().toInt() } + } + + /** + * A YAML scalar representing a floating point value. + * + * Examples: + * + * ``` + * 1.0 + * 6.626e-34 + * ``` + */ + class YamlFloat extends YamlScalar { + YamlFloat() { this.hasStandardTypeTag("float") } + + /** + * Gets the value of this scalar, as a floating point number. + */ + float getFloatValue() { result = this.getValue().toFloat() } + } + + /** + * A YAML scalar representing a time stamp. + * + * Example: + * + * ``` + * 2001-12-15T02:59:43.1Z + * ``` + */ + class YamlTimestamp extends YamlScalar { + YamlTimestamp() { this.hasStandardTypeTag("timestamp") } + + /** + * Gets the value of this scalar, as a date. + */ + date getDateValue() { result = this.getValue().toDate() } + } + + /** + * A YAML scalar representing a Boolean value. + * + * Example: + * + * ``` + * true + * ``` + */ + class YamlBool extends YamlScalar { + YamlBool() { this.hasStandardTypeTag("bool") } + + /** + * Gets the value of this scalar, as a Boolean. + */ + boolean getBoolValue() { if this.getValue() = "true" then result = true else result = false } + } + + /** + * A YAML scalar representing the null value. + * + * Example: + * + * ``` + * null + * ``` + */ + class YamlNull extends YamlScalar { + YamlNull() { this.hasStandardTypeTag("null") } + } + + /** + * A YAML scalar representing a string value. + * + * Example: + * + * ``` + * "hello" + * ``` + */ + class YamlString extends YamlScalar { + YamlString() { this.hasStandardTypeTag("str") } + } + + /** + * A YAML scalar representing a merge key. + * + * Example: + * + * ``` + * x: 1 + * << : *DEFAULTS # merge key + * ``` + */ + class YamlMergeKey extends YamlScalar { + YamlMergeKey() { this.hasStandardTypeTag("merge") } + } + + /** + * A YAML scalar representing an `!include` directive. + * + * ``` + * !include common.yaml + * ``` + */ + class YamlInclude extends YamlScalar { + YamlInclude() { this.getTag() = "!include" } + + override YamlValue eval() { + exists(YamlDocument targetDoc | + targetDoc.getLocation().getFile().getAbsolutePath() = this.getTargetPath() and + result = targetDoc.eval() + ) + } + + /** + * Gets the absolute path of the file included by this directive. + */ + private string getTargetPath() { + exists(string path | path = this.getValue() | + if path.matches("/%") + then result = path + else + result = + this.getDocument().getLocation().getFile().getParentContainer().getAbsolutePath() + "/" + + path + ) + } + } + + /** + * A YAML collection, that is, either a mapping or a sequence. + * + * Examples: + * + * ``` + * --- + * # a mapping + * x: 0 + * y: 1 + * --- + * # a sequence + * - red + * - green + * - -blue + * ``` + */ + class YamlCollection extends YamlValue instanceof Input::CollectionNodeBase { + override string getAPrimaryQlClass() { result = "YamlCollection" } + } + + /** + * A YAML mapping. + * + * Example: + * + * ``` + * x: 0 + * y: 1 + * ``` + */ + class YamlMapping extends YamlCollection instanceof Input::MappingNodeBase { + /** + * Gets the `i`th key of this mapping. + */ + YamlNode getKeyNode(int i) { + i >= 0 and + exists(int j | i = j - 1 and result = this.getChildNode(j)) + } + + /** + * Gets the `i`th value of this mapping. + */ + YamlNode getValueNode(int i) { + i >= 0 and + exists(int j | i = -j - 1 and result = this.getChildNode(j)) + } + + /** + * Gets the `i`th key of this mapping, as a YAML value. + */ + YamlValue getKey(int i) { result = this.getKeyNode(i).eval() } + + /** + * Gets the `i`th value of this mapping, as a YAML value. + */ + YamlValue getValue(int i) { result = this.getValueNode(i).eval() } + + /** + * Holds if this mapping maps `key` to `value`. + */ + predicate maps(YamlValue key, YamlValue value) { + exists(int i | key = this.getKey(i) and value = this.getValue(i)) + or + exists(YamlMergeKey merge, YamlMapping that | this.maps(merge, that) | that.maps(key, value)) + } + + /** + * Gets the value that this mapping maps `key` to. + */ + YamlValue lookup(string key) { + exists(YamlScalar s | s.getValue() = key | this.maps(s, result)) + } + + override string getAPrimaryQlClass() { result = "YamlMapping" } + } + + /** + * A YAML sequence. + * + * Example: + * + * ``` + * - red + * - green + * - blue + * ``` + */ + class YamlSequence extends YamlCollection instanceof Input::SequenceNodeBase { + /** + * Gets the `i`th element in this sequence. + */ + YamlNode getElementNode(int i) { result = this.getChildNode(i) } + + /** + * Gets the `i`th element in this sequence, as a YAML value. + */ + YamlValue getElement(int i) { result = this.getElementNode(i).eval() } + + override string getAPrimaryQlClass() { result = "YamlSequence" } + } + + /** + * A YAML alias node referring to a target anchor. + * + * Example: + * + * ``` + * *DEFAULTS + * ``` + */ + class YamlAliasNode extends YamlNode instanceof Input::AliasNodeBase { + override YamlValue eval() { + result.getAnchor() = this.getTarget() and + result.getDocument() = this.getDocument() + } + + /** + * Gets the target anchor this alias refers to. + */ + string getTarget() { result = super.getTarget() } + + override string getAPrimaryQlClass() { result = "YamlAliasNode" } + } + + /** + * A YAML document. + * + * Example: + * + * ``` + * --- + * x: 0 + * y: 1 + * ``` + */ + class YamlDocument extends YamlNode { + YamlDocument() { not exists(this.getParentNode()) } + } + + /** + * An error message produced by the YAML parser while processing a YAML file. + */ + class YamlParseError instanceof Input::ParseErrorBase { + /** + * Gets the `Location` of this error. + */ + Input::Location getLocation() { result = super.getLocation() } + + /** + * Gets the message of this error. + */ + string getMessage() { result = super.getMessage() } + + /** + * Get the string representation of this error. + */ + string toString() { result = super.getMessage() } + } + + /** + * A YAML node that may contain sub-nodes that can be identified by a name. + * I.e. a mapping, sequence, or scalar. + * + * Is used in e.g. GithHub Actions, which is quite flexible in parsing YAML. + * + * For example: + * ``` + * on: pull_request + * ``` + * and + * ``` + * on: [pull_request] + * ``` + * and + * ``` + * on: + * pull_request: + * ``` + * + * are equivalent. + */ + class YamlMappingLikeNode extends YamlNode { + YamlMappingLikeNode() { + this instanceof YamlMapping + or + this instanceof YamlSequence + or + this instanceof YamlScalar + } + + /** Gets sub-name identified by `name`. */ + YamlNode getNode(string name) { + exists(YamlMapping mapping | + mapping = this and + result = mapping.lookup(name) + ) + or + exists(YamlSequence sequence, YamlNode node | + sequence = this and + sequence.getAChildNode() = node and + node.eval().toString() = name and + result = node + ) + or + exists(YamlScalar scalar | + scalar = this and + scalar.getValue() = name and + result = scalar + ) + } + + /** Gets the number of elements in this mapping or sequence. */ + int getElementCount() { + exists(YamlMapping mapping | + mapping = this and + result = mapping.getNumChild() / 2 + ) + or + exists(YamlSequence sequence | + sequence = this and + result = sequence.getNumChild() + ) + or + exists(YamlScalar scalar | + scalar = this and + result = 1 + ) + } + } +} diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml new file mode 100644 index 00000000000..b8b76cae8d6 --- /dev/null +++ b/shared/yaml/qlpack.yml @@ -0,0 +1,4 @@ +name: codeql/yaml +version: 0.0.1 +groups: shared +library: true diff --git a/swift/README.md b/swift/README.md index 766c5ff1dce..bbf0ef30dc6 100644 --- a/swift/README.md +++ b/swift/README.md @@ -4,6 +4,8 @@ The Swift CodeQL package is an experimental and unsupported work in progress. +## + ## Building the Swift extractor First ensure you have Bazel installed, for example with @@ -28,7 +30,9 @@ set up the search path in [the per-user CodeQL configuration file](https://docs.github.com/en/code-security/codeql-cli/using-the-codeql-cli/specifying-command-options-in-a-codeql-configuration-file#using-a-codeql-configuration-file) . -## Code generation +## Development + +### Code generation Run @@ -41,7 +45,27 @@ to update generated files. This can be shortened to You can also run `../misc/codegen/codegen.py`, as long as you are beneath the `swift` directory. -## IDE setup +### Logging configuration + +A log file is produced for each run under `CODEQL_EXTRACTOR_SWIFT_LOG_DIR` (the usual DB log directory). + +You can use the environment variable `CODEQL_EXTRACTOR_SWIFT_LOG_LEVELS` to configure levels for +loggers and outputs. This must have the form of a comma separated `spec:min_level` list, where +`spec` is either a glob pattern (made up of alphanumeric, `/`, `*` and `.` characters) for +matching logger names or one of `out:bin`, `out:text` or `out:console`, and `min_level` is one +of `trace`, `debug`, `info`, `warning`, `error`, `critical` or `no_logs` to turn logs completely off. + +Current output default levels are no binary logs, `info` logs or higher in the text file and `warning` logs or higher on +standard error. By default, all loggers are configured with the lowest logging level of all outputs (`info` by default). +Logger names are visible in the textual logs between `[...]`. Examples are `extractor/dispatcher` +or `extractor/.trap`. An example of `CODEQL_EXTRACTOR_SWIFT_LOG_LEVELS` usage is the following: + +```bash +export CODEQL_EXTRACTOR_SWIFT_LOG_LEVELS=out:console:trace,out:text:no_logs,*:warning,*.trap:trace +``` + +This will turn off generation of a text log file, redirecting all logs to standard error, but will make all loggers only +write warnings or above, except for trap emission logs which will output all logs. ### CLion and the native bazel plugin @@ -84,3 +108,7 @@ In particular for breakpoints to work you might need to setup the following remo |-------------|--------------------------------------| | `swift` | `/absolute/path/to/codeql/swift` | | `bazel-out` | `/absolute/path/to/codeql/bazel-out` | + +### Thread safety + +The extractor is single-threaded, and there was no effort to make anything in it thread-safe. diff --git a/swift/extractor/BUILD.bazel b/swift/extractor/BUILD.bazel index 804335cf65f..26077dadbd8 100644 --- a/swift/extractor/BUILD.bazel +++ b/swift/extractor/BUILD.bazel @@ -12,10 +12,10 @@ swift_cc_binary( "//swift/extractor/config", "//swift/extractor/infra", "//swift/extractor/invocation", - "//swift/extractor/mangler", "//swift/extractor/remapping", "//swift/extractor/translators", "//swift/third_party/swift-llvm-support", + "@absl//absl/strings", ], ) diff --git a/swift/extractor/SwiftExtractor.cpp b/swift/extractor/SwiftExtractor.cpp index c331dcbc3c1..33cb2088f6a 100644 --- a/swift/extractor/SwiftExtractor.cpp +++ b/swift/extractor/SwiftExtractor.cpp @@ -14,6 +14,7 @@ #include "swift/extractor/infra/SwiftLocationExtractor.h" #include "swift/extractor/infra/SwiftBodyEmissionStrategy.h" #include "swift/extractor/mangler/SwiftMangler.h" +#include using namespace codeql; using namespace std::string_literals; @@ -43,6 +44,26 @@ static void archiveFile(const SwiftExtractorConfiguration& config, swift::Source } } +// TODO: This should be factored out/replaced with simplified version of custom mangling +static std::string mangledDeclName(const swift::ValueDecl& decl) { + std::string_view moduleName = decl.getModuleContext()->getRealName().str(); + // ASTMangler::mangleAnyDecl crashes when called on `ModuleDecl` + if (decl.getKind() == swift::DeclKind::Module) { + return std::string{moduleName}; + } + swift::Mangle::ASTMangler mangler; + if (decl.getKind() == swift::DeclKind::TypeAlias) { + // In cases like this (when coming from PCM) + // typealias CFXMLTree = CFTree + // typealias CFXMLTreeRef = CFXMLTree + // mangleAnyDecl mangles both CFXMLTree and CFXMLTreeRef into 'So12CFXMLTreeRefa' + // which is not correct and causes inconsistencies. mangleEntity makes these two distinct + // prefix adds a couple of special symbols, we don't necessary need them + return mangler.mangleEntity(&decl); + } + return mangler.mangleAnyDecl(&decl, /* prefix = */ false); +} + static fs::path getFilename(swift::ModuleDecl& module, swift::SourceFile* primaryFile, const swift::Decl* lazyDeclaration) { @@ -50,8 +71,20 @@ static fs::path getFilename(swift::ModuleDecl& module, return resolvePath(primaryFile->getFilename()); } if (lazyDeclaration) { - SwiftMangler mangler; - return mangler.mangledName(*lazyDeclaration); + // this code will be thrown away in the near future + auto decl = llvm::dyn_cast(lazyDeclaration); + assert(decl); + auto mangled = mangledDeclName(*decl); + // mangled name can be too long to use as a file name, so we can't use it directly + mangled = picosha2::hash256_hex_string(mangled); + std::string ret; + ret += module.getRealName().str(); + ret += '_'; + ret += decl->getBaseName().userFacingName(); + ret += '_'; + // half a SHA2 is enough + ret += std::string_view(mangled).substr(0, mangled.size() / 2); + return ret; } // PCM clang module if (module.isNonSwiftModule()) { diff --git a/swift/extractor/infra/BUILD.bazel b/swift/extractor/infra/BUILD.bazel index 86e1df1a751..0b69dc1c3b9 100644 --- a/swift/extractor/infra/BUILD.bazel +++ b/swift/extractor/infra/BUILD.bazel @@ -8,6 +8,7 @@ swift_cc_library( deps = [ "//swift/extractor/config", "//swift/extractor/infra/file", + "//swift/extractor/infra/log", "//swift/extractor/trap", "//swift/third_party/swift-llvm-support", ], diff --git a/swift/extractor/infra/SwiftDispatcher.h b/swift/extractor/infra/SwiftDispatcher.h index dcd903c242f..6ab49ec79f8 100644 --- a/swift/extractor/infra/SwiftDispatcher.h +++ b/swift/extractor/infra/SwiftDispatcher.h @@ -6,13 +6,14 @@ #include #include -#include "swift/extractor/trap/TrapLabelStore.h" #include "swift/extractor/trap/TrapDomain.h" #include "swift/extractor/infra/SwiftTagTraits.h" #include "swift/extractor/trap/generated/TrapClasses.h" #include "swift/extractor/infra/SwiftLocationExtractor.h" #include "swift/extractor/infra/SwiftBodyEmissionStrategy.h" +#include "swift/extractor/infra/SwiftMangledName.h" #include "swift/extractor/config/SwiftExtractorState.h" +#include "swift/extractor/infra/log/SwiftLogging.h" namespace codeql { @@ -23,24 +24,31 @@ namespace codeql { // node (AST nodes that are not types: declarations, statements, expressions, etc.). class SwiftDispatcher { // types to be supported by assignNewLabel/fetchLabel need to be listed here - using Store = TrapLabelStore; + using Handle = std::variant; template - static constexpr bool IsStorable = std::is_constructible_v; + static constexpr bool IsFetchable = std::is_constructible_v; template - static constexpr bool IsLocatable = std::is_base_of_v>; + static constexpr bool IsLocatable = + std::is_base_of_v> && !std::is_base_of_v>; + + template + static constexpr bool IsDeclPointer = std::is_convertible_v; + + template + static constexpr bool IsTypePointer = std::is_convertible_v; public: // all references and pointers passed as parameters to this constructor are supposed to outlive @@ -111,7 +119,7 @@ class SwiftDispatcher { TrapLabel emitUnspecified(std::optional>&& parent, const char* property, int index) { - UnspecifiedElement entry{trap.createLabel()}; + UnspecifiedElement entry{trap.createTypedLabel()}; entry.error = "element was unspecified by the extractor"; entry.parent = std::move(parent); entry.property = property; @@ -134,33 +142,22 @@ class SwiftDispatcher { // This method gives a TRAP label for already emitted AST node. // If the AST node was not emitted yet, then the emission is dispatched to a corresponding // visitor (see `visit(T *)` methods below). - template >* = nullptr> - TrapLabelOf fetchLabel(const E& e, Args&&... args) { + template >* = nullptr> + TrapLabelOf fetchLabel(const E& e, swift::Type type = {}) { if constexpr (std::is_constructible_v) { if (!e) { // this will be treated on emission return undefined_label; } } - // this is required so we avoid any recursive loop: a `fetchLabel` during the visit of `e` might - // end up calling `fetchLabel` on `e` itself, so we want the visit of `e` to call `fetchLabel` - // only after having called `assignNewLabel` on `e`. - assert(std::holds_alternative(waitingForNewLabel) && - "fetchLabel called before assignNewLabel"); - if (auto l = store.get(e)) { - return *l; + auto& stored = store[e]; + if (!stored.valid()) { + auto inserted = fetching.insert(e); + assert(inserted.second && "detected infinite fetchLabel recursion"); + stored = createLabel(e, type); + fetching.erase(e); } - waitingForNewLabel = e; - visit(e, std::forward(args)...); - // TODO when everything is moved to structured C++ classes, this should be moved to createEntry - if (auto l = store.get(e)) { - if constexpr (IsLocatable) { - locationExtractor.attachLocation(sourceManager, e, *l); - } - return *l; - } - assert(!"assignNewLabel not called during visit"); - return {}; + return TrapLabelOf::unsafeCreateFromUntyped(stored); } // convenience `fetchLabel` overload for `swift::Type` (which is just a wrapper for @@ -171,39 +168,28 @@ class SwiftDispatcher { return fetchLabelFromUnion(node); } - template >* = nullptr> + template >* = nullptr> TrapLabelOf fetchLabel(const E& e) { return fetchLabel(&e); } - // Due to the lazy emission approach, we must assign a label to a corresponding AST node before - // it actually gets emitted to handle recursive cases such as recursive calls, or recursive type - // declarations - template >* = nullptr> - TrapLabel> assignNewLabel(const E& e, Args&&... args) { - assert(waitingForNewLabel == Store::Handle{e} && "assignNewLabel called on wrong entity"); - auto label = trap.createLabel>(std::forward(args)...); - store.insert(e, label); - waitingForNewLabel = std::monostate{}; - return label; - } - - template >* = nullptr> - TrapLabel> assignNewLabel(const E& e, Args&&... args) { - return assignNewLabel(&e, std::forward(args)...); - } - // convenience methods for structured C++ creation - template - auto createEntry(const E& e, Args&&... args) { - return TrapClassOf{assignNewLabel(e, std::forward(args)...)}; + template + auto createEntry(const E& e) { + auto found = store.find(&e); + assert(found != store.end() && "createEntry called on non-fetched label"); + auto label = TrapLabel>::unsafeCreateFromUntyped(found->second); + if constexpr (IsLocatable) { + locationExtractor.attachLocation(sourceManager, e, label); + } + return TrapClassOf{label}; } // used to create a new entry for entities that should not be cached // an example is swift::Argument, that are created on the fly and thus have no stable pointer - template - auto createUncachedEntry(const E& e, Args&&... args) { - auto label = trap.createLabel>(std::forward(args)...); + template + auto createUncachedEntry(const E& e) { + auto label = trap.createTypedLabel>(); locationExtractor.attachLocation(sourceManager, &e, label); return TrapClassOf{label}; } @@ -240,31 +226,65 @@ class SwiftDispatcher { trap.debug(args...); } - bool shouldEmitDeclBody(const swift::Decl& decl) { - encounteredModules.insert(decl.getModuleContext()); - return bodyEmissionStrategy.shouldEmitDeclBody(decl); - } - void emitComment(swift::Token& comment) { - CommentsTrap entry{trap.createLabel(), comment.getRawText().str()}; + CommentsTrap entry{trap.createTypedLabel(), comment.getRawText().str()}; trap.emit(entry); locationExtractor.attachLocation(sourceManager, comment, entry.id); } - void extractedDeclaration(const swift::Decl& decl) { - if (isLazyDeclaration(decl)) { - state.emittedDeclarations.insert(&decl); - } - } - void skippedDeclaration(const swift::Decl& decl) { - if (isLazyDeclaration(decl)) { - state.pendingDeclarations.insert(&decl); + protected: + void visitPending() { + while (!toBeVisited.empty()) { + auto [next, type] = toBeVisited.back(); + toBeVisited.pop_back(); + // TODO: add tracing logs for visited stuff, maybe within the translators? + std::visit([this, type = type](const auto* e) { visit(e, type); }, next); } } private: - bool isLazyDeclaration(const swift::Decl& decl) { - swift::ModuleDecl* module = decl.getModuleContext(); + template + UntypedTrapLabel createLabel(const E& e, swift::Type type) { + if constexpr (IsDeclPointer || IsTypePointer) { + if (auto mangledName = name(e)) { + if (shouldVisit(e)) { + toBeVisited.emplace_back(e, type); + } + return trap.createLabel(mangledName); + } + } + // we always need to visit unnamed things + toBeVisited.emplace_back(e, type); + return trap.createLabel(); + } + + template + bool shouldVisit(const E& e) { + if constexpr (IsDeclPointer) { + encounteredModules.insert(e->getModuleContext()); + if (bodyEmissionStrategy.shouldEmitDeclBody(*e)) { + extractedDeclaration(e); + return true; + } + skippedDeclaration(e); + return false; + } + return true; + } + + void extractedDeclaration(const swift::Decl* decl) { + if (isLazyDeclaration(decl)) { + state.emittedDeclarations.insert(decl); + } + } + void skippedDeclaration(const swift::Decl* decl) { + if (isLazyDeclaration(decl)) { + state.pendingDeclarations.insert(decl); + } + } + + static bool isLazyDeclaration(const swift::Decl* decl) { + swift::ModuleDecl* module = decl->getModuleContext(); return module->isBuiltinModule() || module->getName().str() == "__ObjC" || module->isNonSwiftModule(); } @@ -308,6 +328,8 @@ class SwiftDispatcher { return false; } + virtual SwiftMangledName name(const swift::Decl* decl) = 0; + virtual SwiftMangledName name(const swift::TypeBase* type) = 0; virtual void visit(const swift::Decl* decl) = 0; virtual void visit(const swift::Stmt* stmt) = 0; virtual void visit(const swift::StmtCondition* cond) = 0; @@ -321,14 +343,21 @@ class SwiftDispatcher { virtual void visit(const swift::TypeBase* type) = 0; virtual void visit(const swift::CapturedValue* capture) = 0; + template >* = nullptr> + void visit(const T* e, swift::Type) { + visit(e); + } + const swift::SourceManager& sourceManager; SwiftExtractorState& state; TrapDomain& trap; - Store store; + std::unordered_map store; + std::unordered_set fetching; + std::vector> toBeVisited; SwiftLocationExtractor& locationExtractor; SwiftBodyEmissionStrategy& bodyEmissionStrategy; - Store::Handle waitingForNewLabel{std::monostate{}}; std::unordered_set encounteredModules; + Logger logger{"dispatcher"}; }; } // namespace codeql diff --git a/swift/extractor/infra/SwiftLocationExtractor.cpp b/swift/extractor/infra/SwiftLocationExtractor.cpp index a5134b714b0..de7c5aff70d 100644 --- a/swift/extractor/infra/SwiftLocationExtractor.cpp +++ b/swift/extractor/infra/SwiftLocationExtractor.cpp @@ -8,13 +8,14 @@ #include "swift/extractor/trap/generated/TrapClasses.h" #include "swift/extractor/infra/SwiftLocationExtractor.h" #include "swift/extractor/infra/file/Path.h" +#include "swift/extractor/infra/SwiftMangledName.h" using namespace codeql; -void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceManager, - swift::SourceLoc start, - swift::SourceLoc end, - TrapLabel locatableLabel) { +void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, + swift::SourceLoc start, + swift::SourceLoc end, + TrapLabel locatableLabel) { if (!start.isValid() || !end.isValid()) { // invalid locations seem to come from entities synthesized by the compiler return; @@ -24,9 +25,9 @@ void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceMa entry.file = fetchFileLabel(file); std::tie(entry.start_line, entry.start_column) = sourceManager.getLineAndColumnInBuffer(start); std::tie(entry.end_line, entry.end_column) = sourceManager.getLineAndColumnInBuffer(end); - entry.id = trap.createLabel('{', entry.file, "}:", entry.start_line, ':', - entry.start_column, ':', entry.end_line, ':', - entry.end_column); + SwiftMangledName locName{{"loc", entry.file, ":", entry.start_line, ":", entry.start_column, ":", + entry.end_line, ":", entry.end_column}}; + entry.id = trap.createTypedLabel(locName); trap.emit(entry); trap.emit(LocatableLocationsTrap{locatableLabel, entry.id}); } @@ -42,43 +43,54 @@ TrapLabel SwiftLocationExtractor::emitFile(const std::filesystem::path& return fetchFileLabel(resolvePath(file)); } -void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceManager, - const swift::CapturedValue* capture, - TrapLabel locatableLabel) { - attachLocation(sourceManager, capture->getLoc(), locatableLabel); +void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::SourceRange& range, + TrapLabel locatableLabel) { + attachLocationImpl(sourceManager, range.Start, range.End, locatableLabel); } -void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceManager, - const swift::IfConfigClause* clause, - TrapLabel locatableLabel) { - attachLocation(sourceManager, clause->Loc, clause->Loc, locatableLabel); +void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::CapturedValue* capture, + TrapLabel locatableLabel) { + attachLocationImpl(sourceManager, capture->getLoc(), locatableLabel); } -void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceManager, - swift::AvailabilitySpec* spec, - TrapLabel locatableLabel) { - attachLocation(sourceManager, spec->getSourceRange().Start, spec->getSourceRange().End, - locatableLabel); +void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::IfConfigClause* clause, + TrapLabel locatableLabel) { + attachLocationImpl(sourceManager, clause->Loc, locatableLabel); } -void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceManager, - swift::Token& token, - TrapLabel locatableLabel) { - attachLocation(sourceManager, token.getRange().getStart(), token.getRange().getEnd(), - locatableLabel); +void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::AvailabilitySpec* spec, + TrapLabel locatableLabel) { + attachLocationImpl(sourceManager, spec->getSourceRange(), locatableLabel); } -void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceManager, - const swift::KeyPathExpr::Component* component, - TrapLabel locatableLabel) { - attachLocation(sourceManager, component->getSourceRange().Start, component->getSourceRange().End, - locatableLabel); +void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::KeyPathExpr::Component* component, + TrapLabel locatableLabel) { + attachLocationImpl(sourceManager, component->getSourceRange().Start, + component->getSourceRange().End, locatableLabel); } -void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceManager, - swift::SourceLoc loc, - TrapLabel locatableLabel) { - attachLocation(sourceManager, loc, loc, locatableLabel); +void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::Token* token, + TrapLabel locatableLabel) { + attachLocationImpl(sourceManager, token->getRange().getStart(), token->getRange().getEnd(), + locatableLabel); +} + +void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, + swift::SourceLoc loc, + TrapLabel locatableLabel) { + attachLocationImpl(sourceManager, loc, loc, locatableLabel); +} + +void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::DiagnosticInfo* diagInfo, + TrapLabel locatableLabel) { + attachLocationImpl(sourceManager, diagInfo->Loc, locatableLabel); } TrapLabel SwiftLocationExtractor::fetchFileLabel(const std::filesystem::path& file) { @@ -87,7 +99,7 @@ TrapLabel SwiftLocationExtractor::fetchFileLabel(const std::filesystem: } DbFile entry({}); - entry.id = trap.createLabel(file.string()); + entry.id = trap.createTypedLabel({{"file_", file.string()}}); entry.name = file.string(); trap.emit(entry); store[file] = entry.id; diff --git a/swift/extractor/infra/SwiftLocationExtractor.h b/swift/extractor/infra/SwiftLocationExtractor.h index bcdce512dd8..2dba1c31b96 100644 --- a/swift/extractor/infra/SwiftLocationExtractor.h +++ b/swift/extractor/infra/SwiftLocationExtractor.h @@ -16,6 +16,9 @@ namespace codeql { class TrapDomain; class SwiftLocationExtractor { + template + struct HasSpecializedImplementation : std::false_type {}; + public: explicit SwiftLocationExtractor(TrapDomain& trap) : trap(trap) {} @@ -24,60 +27,79 @@ class SwiftLocationExtractor { template void attachLocation(const swift::SourceManager& sourceManager, - Locatable locatable, + const Locatable& locatable, TrapLabel locatableLabel) { attachLocation(sourceManager, &locatable, locatableLabel); } // Emits a Location TRAP entry and attaches it to a `Locatable` trap label - template + template ::value>* = nullptr> void attachLocation(const swift::SourceManager& sourceManager, - Locatable* locatable, + const Locatable* locatable, TrapLabel locatableLabel) { - attachLocation(sourceManager, locatable->getStartLoc(), locatable->getEndLoc(), locatableLabel); + attachLocationImpl(sourceManager, locatable->getStartLoc(), locatable->getEndLoc(), + locatableLabel); } + template ::value>* = nullptr> + void attachLocation(const swift::SourceManager& sourceManager, + const Locatable* locatable, + TrapLabel locatableLabel) { + attachLocationImpl(sourceManager, locatable, locatableLabel); + } + + private: // Emits a Location TRAP entry for a list of swift entities and attaches it to a `Locatable` trap // label template - void attachLocation(const swift::SourceManager& sourceManager, - llvm::MutableArrayRef* locatables, - TrapLabel locatableLabel) { + void attachLocationImpl(const swift::SourceManager& sourceManager, + const llvm::MutableArrayRef* locatables, + TrapLabel locatableLabel) { if (locatables->empty()) { return; } - attachLocation(sourceManager, locatables->front().getStartLoc(), locatables->back().getEndLoc(), - locatableLabel); + attachLocationImpl(sourceManager, locatables->front().getStartLoc(), + locatables->back().getEndLoc(), locatableLabel); } - void attachLocation(const swift::SourceManager& sourceManager, - swift::SourceLoc start, - swift::SourceLoc end, - TrapLabel locatableLabel); + void attachLocationImpl(const swift::SourceManager& sourceManager, + swift::SourceLoc start, + swift::SourceLoc end, + TrapLabel locatableLabel); - void attachLocation(const swift::SourceManager& sourceManager, - swift::SourceLoc loc, - TrapLabel locatableLabel); + void attachLocationImpl(const swift::SourceManager& sourceManager, + swift::SourceLoc loc, + TrapLabel locatableLabel); - void attachLocation(const swift::SourceManager& sourceManager, - const swift::CapturedValue* capture, - TrapLabel locatableLabel); + void attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::SourceRange& range, + TrapLabel locatableLabel); - void attachLocation(const swift::SourceManager& sourceManager, - const swift::IfConfigClause* clause, - TrapLabel locatableLabel); + void attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::CapturedValue* capture, + TrapLabel locatableLabel); - void attachLocation(const swift::SourceManager& sourceManager, - swift::AvailabilitySpec* spec, - TrapLabel locatableLabel); + void attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::IfConfigClause* clause, + TrapLabel locatableLabel); - void attachLocation(const swift::SourceManager& sourceManager, - swift::Token& token, - TrapLabel locatableLabel); + void attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::AvailabilitySpec* spec, + TrapLabel locatableLabel); - void attachLocation(const swift::SourceManager& sourceManager, - const swift::KeyPathExpr::Component* component, - TrapLabel locatableLabel); + void attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::Token* token, + TrapLabel locatableLabel); + + void attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::DiagnosticInfo* token, + TrapLabel locatableLabel); + + void attachLocationImpl(const swift::SourceManager& sourceManager, + const swift::KeyPathExpr::Component* component, + TrapLabel locatableLabel); private: TrapLabel fetchFileLabel(const std::filesystem::path& file); @@ -85,4 +107,12 @@ class SwiftLocationExtractor { std::unordered_map> store; }; +template +struct SwiftLocationExtractor::HasSpecializedImplementation< + Locatable, + decltype(std::declval().attachLocationImpl( + std::declval(), + std::declval(), + std::declval>()))> : std::true_type {}; + } // namespace codeql diff --git a/swift/extractor/infra/SwiftMangledName.cpp b/swift/extractor/infra/SwiftMangledName.cpp new file mode 100644 index 00000000000..83bf2ff5708 --- /dev/null +++ b/swift/extractor/infra/SwiftMangledName.cpp @@ -0,0 +1,30 @@ +#include "swift/extractor/infra/SwiftMangledName.h" + +namespace codeql { + +namespace { +void appendPart(std::string& out, const std::string& prefix) { + out += prefix; +} + +void appendPart(std::string& out, UntypedTrapLabel label) { + out += '{'; + out += label.str(); + out += '}'; +} + +void appendPart(std::string& out, unsigned index) { + out += std::to_string(index); +} + +} // namespace + +std::string SwiftMangledName::str() const { + std::string out; + for (const auto& part : parts) { + std::visit([&](const auto& contents) { appendPart(out, contents); }, part); + } + return out; +} + +} // namespace codeql diff --git a/swift/extractor/infra/SwiftMangledName.h b/swift/extractor/infra/SwiftMangledName.h new file mode 100644 index 00000000000..8eaa0070593 --- /dev/null +++ b/swift/extractor/infra/SwiftMangledName.h @@ -0,0 +1,45 @@ +#pragma once + +#include +#include +#include +#include + +#include "swift/extractor/trap/TrapLabel.h" + +namespace codeql { + +struct SwiftMangledName { + using Part = std::variant; + + std::vector parts; + + explicit operator bool() const { return !parts.empty(); } + + std::string str() const; + + // streaming labels or ints into a SwiftMangledName just appends them + template + SwiftMangledName& operator<<(TrapLabel label) { + parts.emplace_back(label); + return *this; + } + + SwiftMangledName& operator<<(unsigned i) { + parts.emplace_back(i); + return *this; + } + + // streaming string-like stuff will add a new part it only if strictly required, otherwise it will + // append to the last part if it is a string + template + SwiftMangledName& operator<<(T&& arg) { + if (parts.empty() || !std::holds_alternative(parts.back())) { + parts.emplace_back(""); + } + std::get(parts.back()) += std::forward(arg); + return *this; + } +}; + +} // namespace codeql diff --git a/swift/extractor/infra/file/TargetFile.h b/swift/extractor/infra/file/TargetFile.h index ba3106b7d7a..6d52d443af3 100644 --- a/swift/extractor/infra/file/TargetFile.h +++ b/swift/extractor/infra/file/TargetFile.h @@ -36,6 +36,8 @@ class TargetFile { return *this; } + const std::filesystem::path& target() const { return targetPath; } + private: TargetFile(const std::filesystem::path& target, const std::filesystem::path& targetDir, diff --git a/swift/extractor/infra/log/BUILD.bazel b/swift/extractor/infra/log/BUILD.bazel new file mode 100644 index 00000000000..2a384e136a5 --- /dev/null +++ b/swift/extractor/infra/log/BUILD.bazel @@ -0,0 +1,7 @@ +cc_library( + name = "log", + srcs = glob(["*.cpp"]), + hdrs = glob(["*.h"]), + visibility = ["//visibility:public"], + deps = ["@binlog"], +) diff --git a/swift/extractor/infra/log/SwiftLogging.cpp b/swift/extractor/infra/log/SwiftLogging.cpp new file mode 100644 index 00000000000..ab7ae278d4d --- /dev/null +++ b/swift/extractor/infra/log/SwiftLogging.cpp @@ -0,0 +1,164 @@ +#include "swift/extractor/infra/log/SwiftLogging.h" + +#include +#include +#include + +#define LEVEL_REGEX_PATTERN "trace|debug|info|warning|error|critical|no_logs" + +BINLOG_ADAPT_ENUM(codeql::Log::Level, trace, debug, info, warning, error, critical, no_logs) + +namespace codeql { + +namespace { +using LevelRule = std::pair; +using LevelRules = std::vector; + +Log::Level getLevelFor(std::string_view name, const LevelRules& rules, Log::Level dflt) { + for (auto it = rules.rbegin(); it != rules.rend(); ++it) { + if (std::regex_match(std::begin(name), std::end(name), it->first)) { + return it->second; + } + } + return dflt; +} + +const char* getEnvOr(const char* var, const char* dflt) { + if (const char* ret = getenv(var)) { + return ret; + } + return dflt; +} + +std::string_view matchToView(std::csub_match m) { + return {m.first, static_cast(m.length())}; +} + +Log::Level stringToLevel(std::string_view v) { + if (v == "trace") return Log::Level::trace; + if (v == "debug") return Log::Level::debug; + if (v == "info") return Log::Level::info; + if (v == "warning") return Log::Level::warning; + if (v == "error") return Log::Level::error; + if (v == "critical") return Log::Level::critical; + return Log::Level::no_logs; +} + +Log::Level matchToLevel(std::csub_match m) { + return stringToLevel(matchToView(m)); +} + +} // namespace + +std::vector Log::collectSeverityRulesAndReturnProblems(const char* envVar) { + std::vector problems; + if (auto levels = getEnvOr(envVar, nullptr)) { + // expect comma-separated : + std::regex comma{","}; + std::regex levelAssignment{R"((?:([*./\w]+)|(?:out:(bin|text|console))):()" LEVEL_REGEX_PATTERN + ")"}; + std::cregex_token_iterator begin{levels, levels + strlen(levels), comma, -1}; + std::cregex_token_iterator end{}; + for (auto it = begin; it != end; ++it) { + std::cmatch match; + if (std::regex_match(it->first, it->second, match, levelAssignment)) { + auto level = matchToLevel(match[3]); + if (match[1].matched) { + auto pattern = match[1].str(); + // replace all "*" with ".*" and all "." with "\.", turning the glob pattern into a regex + std::string::size_type pos = 0; + while ((pos = pattern.find_first_of("*.", pos)) != std::string::npos) { + pattern.insert(pos, (pattern[pos] == '*') ? "." : "\\"); + pos += 2; + } + sourceRules.emplace_back(pattern, level); + } else { + auto out = matchToView(match[2]); + if (out == "bin") { + binary.level = level; + } else if (out == "text") { + text.level = level; + } else if (out == "console") { + console.level = level; + } + } + } else { + problems.emplace_back("Malformed log level rule: " + it->str()); + } + } + } + return problems; +} + +void Log::configure() { + // as we are configuring logging right now, we collect problems and log them at the end + auto problems = collectSeverityRulesAndReturnProblems("CODEQL_EXTRACTOR_SWIFT_LOG_LEVELS"); + if (text || binary) { + std::filesystem::path logFile = getEnvOr("CODEQL_EXTRACTOR_SWIFT_LOG_DIR", "extractor-out/log"); + logFile /= "swift"; + logFile /= logRootName; + logFile /= std::to_string(std::chrono::system_clock::now().time_since_epoch().count()); + std::error_code ec; + std::filesystem::create_directories(logFile.parent_path(), ec); + if (!ec) { + if (text) { + logFile.replace_extension(".log"); + textFile.open(logFile); + if (!textFile) { + problems.emplace_back("Unable to open text log file " + logFile.string()); + text.level = Level::no_logs; + } + } + if (binary) { + logFile.replace_extension(".blog"); + binary.output.open(logFile, std::fstream::out | std::fstream::binary); + if (!binary.output) { + problems.emplace_back("Unable to open binary log file " + logFile.string()); + binary.level = Level::no_logs; + } + } + } else { + problems.emplace_back("Unable to create log directory " + logFile.parent_path().string() + + ": " + ec.message()); + binary.level = Level::no_logs; + text.level = Level::no_logs; + } + } + for (const auto& problem : problems) { + LOG_ERROR("{}", problem); + } + LOG_INFO("Logging configured (binary: {}, text: {}, console: {})", binary.level, text.level, + console.level); + flushImpl(); +} + +void Log::flushImpl() { + session.consume(*this); +} + +Log::LoggerConfiguration Log::getLoggerConfigurationImpl(std::string_view name) { + LoggerConfiguration ret{session, std::string{logRootName}}; + ret.fullyQualifiedName += '/'; + ret.fullyQualifiedName += name; + ret.level = std::min({binary.level, text.level, console.level}); + ret.level = getLevelFor(ret.fullyQualifiedName, sourceRules, ret.level); + // avoid Logger constructor loop + if (name != "logging") { + LOG_DEBUG("Configuring logger {} with level {}", ret.fullyQualifiedName, ret.level); + } + return ret; +} + +Log& Log::write(const char* buffer, std::streamsize size) { + if (text) text.write(buffer, size); + if (binary) binary.write(buffer, size); + if (console) console.write(buffer, size); + return *this; +} + +Logger& Log::logger() { + static Logger ret{getLoggerConfigurationImpl("logging")}; + return ret; +} + +} // namespace codeql diff --git a/swift/extractor/infra/log/SwiftLogging.h b/swift/extractor/infra/log/SwiftLogging.h new file mode 100644 index 00000000000..41ace7648e4 --- /dev/null +++ b/swift/extractor/infra/log/SwiftLogging.h @@ -0,0 +1,189 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +// Logging macros. These will call `logger()` to get a Logger instance, picking up any `logger` +// defined in the current scope. Domain-specific loggers can be added or used by either: +// * providing a class field called `logger` (as `Logger::operator()()` returns itself) +// * declaring a local `logger` variable (to be used for one-time execution like code in `main`) +// * declaring a `Logger& logger()` function returning a reference to a static local variable +// * passing a logger around using a `Logger& logger` function parameter +// They are created with a name that appears in the logs and can be used to filter debug levels (see +// `Logger`). +#define LOG_CRITICAL(...) LOG_WITH_LEVEL(codeql::Log::Level::critical, __VA_ARGS__) +#define LOG_ERROR(...) LOG_WITH_LEVEL(codeql::Log::Level::error, __VA_ARGS__) +#define LOG_WARNING(...) LOG_WITH_LEVEL(codeql::Log::Level::warning, __VA_ARGS__) +#define LOG_INFO(...) LOG_WITH_LEVEL(codeql::Log::Level::info, __VA_ARGS__) +#define LOG_DEBUG(...) LOG_WITH_LEVEL(codeql::Log::Level::debug, __VA_ARGS__) +#define LOG_TRACE(...) LOG_WITH_LEVEL(codeql::Log::Level::trace, __VA_ARGS__) + +// only do the actual logging if the picked up `Logger` instance is configured to handle the +// provided log level. `LEVEL` must be a compile-time constant. `logger()` is evaluated once +#define LOG_WITH_LEVEL(LEVEL, ...) \ + do { \ + constexpr codeql::Log::Level _level = LEVEL; \ + codeql::Logger& _logger = logger(); \ + if (_level >= _logger.level()) { \ + BINLOG_CREATE_SOURCE_AND_EVENT(_logger.writer(), _level, /* category */, binlog::clockNow(), \ + __VA_ARGS__); \ + } \ + } while (false) + +// avoid calling into binlog's original macros +#undef BINLOG_CRITICAL +#undef BINLOG_CRITICAL_W +#undef BINLOG_CRITICAL_C +#undef BINLOG_CRITICAL_WC +#undef BINLOG_ERROR +#undef BINLOG_ERROR_W +#undef BINLOG_ERROR_C +#undef BINLOG_ERROR_WC +#undef BINLOG_WARNING +#undef BINLOG_WARNING_W +#undef BINLOG_WARNING_C +#undef BINLOG_WARNING_WC +#undef BINLOG_INFO +#undef BINLOG_INFO_W +#undef BINLOG_INFO_C +#undef BINLOG_INFO_WC +#undef BINLOG_DEBUG +#undef BINLOG_DEBUG_W +#undef BINLOG_DEBUG_C +#undef BINLOG_DEBUG_WC +#undef BINLOG_TRACE +#undef BINLOG_TRACE_W +#undef BINLOG_TRACE_C +#undef BINLOG_TRACE_WC + +namespace codeql { + +// tools should define this to tweak the root name of all loggers +extern const std::string_view logRootName; + +// This class is responsible for the global log state (outputs, log level rules, flushing) +// State is stored in the singleton `Log::instance()`. +// Before using logging, `Log::configure("")` should be used (e.g. +// `Log::configure("extractor")`). Then, `Log::flush()` should be regularly called. +// Logging is configured upon first usage. This consists in +// * using environment variable `CODEQL_EXTRACTOR_SWIFT_LOG_DIR` to choose where to dump the log +// file(s). Log files will go to a subdirectory thereof named after `logRootName` +// * using environment variable `CODEQL_EXTRACTOR_SWIFT_LOG_LEVELS` to configure levels for +// loggers and outputs. This must have the form of a comma separated `spec:level` list, where +// `spec` is either a glob pattern (made up of alphanumeric, `/`, `*` and `.` characters) for +// matching logger names or one of `out:bin`, `out:text` or `out:console`. +// Output default levels can be seen in the corresponding initializers below. By default, all +// loggers are configured with the lowest output level +class Log { + public: + using Level = binlog::Severity; + + // Internal data required to build `Logger` instances + struct LoggerConfiguration { + binlog::Session& session; + std::string fullyQualifiedName; + Level level; + }; + + // Flush logs to the designated outputs + static void flush() { instance().flushImpl(); } + + // create `Logger` configuration, used internally by `Logger`'s constructor + static LoggerConfiguration getLoggerConfiguration(std::string_view name) { + return instance().getLoggerConfigurationImpl(name); + } + + private: + static constexpr const char* format = "%u %S [%n] %m (%G:%L)\n"; + + Log() { configure(); } + + static Log& instance() { + static Log ret; + return ret; + } + + class Logger& logger(); + + void configure(); + void flushImpl(); + LoggerConfiguration getLoggerConfigurationImpl(std::string_view name); + + // make `session.consume(*this)` work, which requires access to `write` + friend binlog::Session; + Log& write(const char* buffer, std::streamsize size); + + // Output filtered according to a configured log level + template + struct FilteredOutput { + binlog::Severity level; + Output output; + binlog::EventFilter filter{ + [this](const binlog::EventSource& src) { return src.severity >= level; }}; + + template + FilteredOutput(Level level, Args&&... args) + : level{level}, output{std::forward(args)...} {} + + FilteredOutput& write(const char* buffer, std::streamsize size) { + filter.writeAllowed(buffer, size, output); + return *this; + } + + // if configured as `no_logs`, the output is effectively disabled + explicit operator bool() const { return level < Level::no_logs; } + }; + + using LevelRule = std::pair; + using LevelRules = std::vector; + + binlog::Session session; + std::ofstream textFile; + FilteredOutput binary{Level::no_logs}; + FilteredOutput text{Level::info, textFile, format}; + FilteredOutput console{Level::warning, std::cerr, format}; + LevelRules sourceRules; + std::vector collectSeverityRulesAndReturnProblems(const char* envVar); +}; + +// This class represent a named domain-specific logger, responsible for pushing logs using the +// underlying `binlog::SessionWriter` class. This has a configured log level, so that logs on this +// `Logger` with a level lower than the configured one are no-ops. The level is configured based +// on rules matching `/` in `CODEQL_EXTRACTOR_SWIFT_LOG_LEVELS` (see above). +// `` is provided in the constructor. If no rule matches the name, the log level defaults to +// the minimum level of all outputs. +class Logger { + public: + // configured logger based on name, as explained above + explicit Logger(std::string_view name) : Logger(Log::getLoggerConfiguration(name)) {} + + // used internally, public to be accessible to Log for its own logger + explicit Logger(Log::LoggerConfiguration&& configuration) + : w{configuration.session, queueSize, /* id */ 0, + std::move(configuration.fullyQualifiedName)}, + level_{configuration.level} {} + + binlog::SessionWriter& writer() { return w; } + Log::Level level() const { return level_; } + + // make defining a `Logger logger` field be equivalent to providing a `Logger& logger()` function + // in order to be picked up by logging macros + Logger& operator()() { return *this; } + + private: + static constexpr size_t queueSize = 1 << 20; // default taken from binlog + + binlog::SessionWriter w; + Log::Level level_; +}; + +} // namespace codeql diff --git a/swift/extractor/invocation/BUILD.bazel b/swift/extractor/invocation/BUILD.bazel index b80dfe6f09b..03dbb0d75ef 100644 --- a/swift/extractor/invocation/BUILD.bazel +++ b/swift/extractor/invocation/BUILD.bazel @@ -8,6 +8,7 @@ swift_cc_library( deps = [ "//swift/extractor/config", "//swift/extractor/infra", + "//swift/extractor/mangler", "//swift/extractor/remapping", ], ) diff --git a/swift/extractor/invocation/SwiftDiagnosticsConsumer.cpp b/swift/extractor/invocation/SwiftDiagnosticsConsumer.cpp index 5ac875a1e1e..9d5aa4654d5 100644 --- a/swift/extractor/invocation/SwiftDiagnosticsConsumer.cpp +++ b/swift/extractor/invocation/SwiftDiagnosticsConsumer.cpp @@ -15,11 +15,11 @@ void SwiftDiagnosticsConsumer::handleDiagnostic(swift::SourceManager& sourceMana const swift::DiagnosticInfo& diagInfo) { auto message = getDiagMessage(sourceManager, diagInfo); DiagnosticsTrap diag{}; - diag.id = trap.createLabel(); + diag.id = trap.createTypedLabel(); diag.kind = translateDiagnosticsKind(diagInfo.Kind); diag.text = message; trap.emit(diag); - locationExtractor.attachLocation(sourceManager, diagInfo.Loc, diagInfo.Loc, diag.id); + locationExtractor.attachLocation(sourceManager, diagInfo, diag.id); } std::string SwiftDiagnosticsConsumer::getDiagMessage(swift::SourceManager& sourceManager, diff --git a/swift/extractor/invocation/SwiftInvocationExtractor.cpp b/swift/extractor/invocation/SwiftInvocationExtractor.cpp index 776c0602ad3..4ad8e915cce 100644 --- a/swift/extractor/invocation/SwiftInvocationExtractor.cpp +++ b/swift/extractor/invocation/SwiftInvocationExtractor.cpp @@ -4,7 +4,7 @@ #include "swift/extractor/trap/generated/TrapTags.h" #include "swift/extractor/infra/file/TargetFile.h" #include "swift/extractor/infra/file/Path.h" -#include "swift/extractor/trap/LinkDomain.h" +#include "swift/extractor/mangler/SwiftMangler.h" namespace fs = std::filesystem; using namespace std::string_literals; @@ -65,7 +65,8 @@ std::vector emitModuleImplementations(SwiftExtractorState& state, if (auto hash = getModuleHash(modulePath)) { auto target = getModuleTarget(moduleName, *hash); if (auto moduleTrap = createTargetTrapDomain(state, target, TrapType::linkage)) { - moduleTrap->createLabelWithImplementationId(*hash, moduleName); + moduleTrap->createTypedLabelWithImplementationId( + SwiftMangler::mangleModuleName(moduleName), *hash); ret.push_back({target, getModuleId(moduleName, *hash)}); } } diff --git a/swift/extractor/main.cpp b/swift/extractor/main.cpp index bb4f1d775c2..200868c9d98 100644 --- a/swift/extractor/main.cpp +++ b/swift/extractor/main.cpp @@ -9,6 +9,8 @@ #include #include +#include "absl/strings/str_join.h" + #include "swift/extractor/SwiftExtractor.h" #include "swift/extractor/infra/TargetDomains.h" #include "swift/extractor/remapping/SwiftFileInterception.h" @@ -16,9 +18,12 @@ #include "swift/extractor/invocation/SwiftInvocationExtractor.h" #include "swift/extractor/trap/TrapDomain.h" #include "swift/extractor/infra/file/Path.h" +#include "swift/extractor/infra/log/SwiftLogging.h" using namespace std::string_literals; +const std::string_view codeql::logRootName = "extractor"; + // must be called before processFrontendOptions modifies output paths static void lockOutputSwiftModuleTraps(codeql::SwiftExtractorState& state, const swift::FrontendOptions& options) { @@ -172,14 +177,32 @@ codeql::TrapDomain invocationTrapDomain(codeql::SwiftExtractorState& state) { codeql::SwiftExtractorConfiguration configure(int argc, char** argv) { codeql::SwiftExtractorConfiguration configuration{}; - configuration.trapDir = getenv_or("CODEQL_EXTRACTOR_SWIFT_TRAP_DIR", "."); - configuration.sourceArchiveDir = getenv_or("CODEQL_EXTRACTOR_SWIFT_SOURCE_ARCHIVE_DIR", "."); - configuration.scratchDir = getenv_or("CODEQL_EXTRACTOR_SWIFT_SCRATCH_DIR", "."); + configuration.trapDir = getenv_or("CODEQL_EXTRACTOR_SWIFT_TRAP_DIR", "extractor-out/trap/swift"); + configuration.sourceArchiveDir = + getenv_or("CODEQL_EXTRACTOR_SWIFT_SOURCE_ARCHIVE_DIR", "extractor-out/src"); + configuration.scratchDir = + getenv_or("CODEQL_EXTRACTOR_SWIFT_SCRATCH_DIR", "extractor-out/working"); configuration.frontendOptions.assign(argv + 1, argv + argc); return configuration; } -int main(int argc, char** argv) { +static auto argDump(int argc, char** argv) { + if (argc < 2) { + return ""s; + } + return absl::StrJoin(argv + 1, argv + argc, " "); +} + +static auto envDump(char** envp) { + std::string ret; + for (auto env = envp; *env; ++env) { + ret += *env; + ret += '\n'; + } + return ret; +} + +int main(int argc, char** argv, char** envp) { checkWhetherToRunUnderTool(argc, argv); if (argc == 1) { @@ -193,6 +216,11 @@ int main(int argc, char** argv) { initializeSwiftModules(); const auto configuration = configure(argc, argv); + { + codeql::Logger logger{"main"}; + LOG_INFO("calling extractor with arguments \"{}\"", argDump(argc, argv)); + LOG_DEBUG("environment:\n{}\n", envDump(envp)); + } auto openInterception = codeql::setupFileInterception(configuration); @@ -204,5 +232,7 @@ int main(int argc, char** argv) { observer.markSuccessfullyExtractedFiles(); } + codeql::Log::flush(); + return frontend_rc; } diff --git a/swift/extractor/mangler/BUILD.bazel b/swift/extractor/mangler/BUILD.bazel index 149ee260092..71c9cbf900e 100644 --- a/swift/extractor/mangler/BUILD.bazel +++ b/swift/extractor/mangler/BUILD.bazel @@ -6,6 +6,7 @@ swift_cc_library( hdrs = glob(["*.h"]), visibility = ["//swift:__subpackages__"], deps = [ + "//swift/extractor/infra", "//swift/extractor/trap", "//swift/third_party/swift-llvm-support", ], diff --git a/swift/extractor/mangler/SwiftMangler.cpp b/swift/extractor/mangler/SwiftMangler.cpp index 00be81ee11f..2614652df68 100644 --- a/swift/extractor/mangler/SwiftMangler.cpp +++ b/swift/extractor/mangler/SwiftMangler.cpp @@ -1,21 +1,62 @@ #include "swift/extractor/mangler/SwiftMangler.h" +#include "swift/extractor/infra/SwiftDispatcher.h" #include "swift/extractor/trap/generated/decl/TrapClasses.h" #include #include using namespace codeql; -std::string SwiftMangler::mangledName(const swift::Decl& decl) { - assert(llvm::isa(decl)); - auto& valueDecl = llvm::cast(decl); - std::string_view moduleName = decl.getModuleContext()->getRealName().str(); - // ASTMangler::mangleAnyDecl crashes when called on `ModuleDecl` - if (decl.getKind() == swift::DeclKind::Module) { - return std::string{moduleName}; +namespace { +SwiftMangledName initMangled(const swift::TypeBase* type) { + switch (type->getKind()) { +#define TYPE(ID, PARENT) \ + case swift::TypeKind::ID: \ + return {{#ID "Type_"}}; +#include + default: + return {}; } - std::ostringstream ret; +} + +SwiftMangledName initMangled(const swift::Decl* decl) { + SwiftMangledName ret; + ret << swift::Decl::getKindName(decl->getKind()) << "Decl_"; + return ret; +} +} // namespace + +SwiftMangledName SwiftMangler::mangleModuleName(std::string_view name) { + SwiftMangledName ret = {{"ModuleDecl_"}}; + ret << name; + return ret; +} + +SwiftMangledName SwiftMangler::mangleDecl(const swift::Decl& decl) { + if (!llvm::isa(decl)) { + return {}; + } + // We do not deduplicate local variables, but for the moment also non-local vars from non-swift + // (PCM, clang modules) modules as the mangler crashes sometimes + if (decl.getKind() == swift::DeclKind::Var && + (decl.getDeclContext()->isLocalContext() || decl.getModuleContext()->isNonSwiftModule())) { + return {}; + } + + // we do not deduplicate GenericTypeParamDecl, as their mangling is ambiguous in the presence of + // extensions + if (decl.getKind() == swift::DeclKind::GenericTypeParam) { + return {}; + } + + if (decl.getKind() == swift::DeclKind::Module) { + return mangleModuleName(llvm::cast(decl).getRealName().str()); + } + + auto ret = initMangled(&decl); + const auto& valueDecl = llvm::cast(decl); // stamp all declarations with an id-ref of the containing module - ret << '{' << ModuleDeclTag::prefix << '_' << moduleName << '}'; + auto moduleLabel = dispatcher.fetchLabel(decl.getModuleContext()); + ret << moduleLabel; if (decl.getKind() == swift::DeclKind::TypeAlias) { // In cases like this (when coming from PCM) // typealias CFXMLTree = CFTree @@ -28,22 +69,21 @@ std::string SwiftMangler::mangledName(const swift::Decl& decl) { // prefix adds a couple of special symbols, we don't necessary need them ret << mangler.mangleAnyDecl(&valueDecl, /* prefix = */ false); } - return ret.str(); + return ret; } -std::optional SwiftMangler::mangleType(const swift::ModuleType& type) { - auto key = type.getModule()->getRealName().str().str(); - if (type.getModule()->isNonSwiftModule()) { - key += "|clang"; +SwiftMangledName SwiftMangler::visitModuleType(const swift::ModuleType* type) { + auto ret = initMangled(type); + ret << type->getModule()->getRealName().str(); + if (type->getModule()->isNonSwiftModule()) { + ret << "|clang"; } - return key; + return ret; } -#define TYPE(TYPE_ID, PARENT_TYPE) -#define BUILTIN_TYPE(TYPE_ID, PARENT_TYPE) \ - std::optional SwiftMangler::mangleType(const swift::TYPE_ID##Type& type) { \ - llvm::SmallString<32> buffer; \ - type.getTypeName(buffer); \ - return buffer.str().str(); \ - } -#include +SwiftMangledName SwiftMangler::visitBuiltinType(const swift::BuiltinType* type) { + auto ret = initMangled(type); + llvm::SmallString<32> buffer; + ret << type->getTypeName(buffer, /* prependBuiltinNamespace= */ false); + return ret; +} diff --git a/swift/extractor/mangler/SwiftMangler.h b/swift/extractor/mangler/SwiftMangler.h index 2a32b70b1b8..a8e975d0094 100644 --- a/swift/extractor/mangler/SwiftMangler.h +++ b/swift/extractor/mangler/SwiftMangler.h @@ -2,28 +2,48 @@ #include #include +#include +#include + +#include + +#include "swift/extractor/trap/TrapLabel.h" +#include "swift/extractor/infra/SwiftMangledName.h" #include namespace codeql { -class SwiftMangler { - public: - std::string mangledName(const swift::Decl& decl); - template - std::optional mangleType(const T& type) { - return std::nullopt; +class SwiftDispatcher; + +class SwiftMangler : private swift::TypeVisitor { + public: + explicit SwiftMangler(SwiftDispatcher& dispatcher) : dispatcher(dispatcher) {} + + static SwiftMangledName mangleModuleName(std::string_view name); + + // TODO actual visit + SwiftMangledName mangleDecl(const swift::Decl& decl); + + SwiftMangledName mangleType(const swift::TypeBase& type) { + return visit(const_cast(&type)); } - std::optional mangleType(const swift::ModuleType& type); + private: + friend class swift::TypeVisitor; -#define TYPE(TYPE_ID, PARENT_TYPE) -#define BUILTIN_TYPE(TYPE_ID, PARENT_TYPE) \ - std::optional mangleType(const swift::TYPE_ID##Type& type); -#include + // default fallback for not yet mangled types. This should never be called in normal situations + // will just spawn a random name + // TODO: make it assert once we mangle all types + static SwiftMangledName visitType(const swift::TypeBase* type) { return {}; } + + SwiftMangledName visitModuleType(const swift::ModuleType* type); + + SwiftMangledName visitBuiltinType(const swift::BuiltinType* type); private: swift::Mangle::ASTMangler mangler; + SwiftDispatcher& dispatcher; }; } // namespace codeql diff --git a/swift/extractor/translators/DeclTranslator.cpp b/swift/extractor/translators/DeclTranslator.cpp index 453379b2984..a0cd6e4ff34 100644 --- a/swift/extractor/translators/DeclTranslator.cpp +++ b/swift/extractor/translators/DeclTranslator.cpp @@ -24,31 +24,23 @@ std::string constructName(const swift::DeclName& declName) { } } // namespace -std::optional DeclTranslator::translateFuncDecl( - const swift::FuncDecl& decl) { - if (auto entry = createNamedEntry(decl)) { - fillAbstractFunctionDecl(decl, *entry); - return entry; - } - return std::nullopt; +codeql::ConcreteFuncDecl DeclTranslator::translateFuncDecl(const swift::FuncDecl& decl) { + auto entry = createEntry(decl); + fillAbstractFunctionDecl(decl, entry); + return entry; } -std::optional DeclTranslator::translateConstructorDecl( +codeql::ConstructorDecl DeclTranslator::translateConstructorDecl( const swift::ConstructorDecl& decl) { - if (auto entry = createNamedEntry(decl)) { - fillAbstractFunctionDecl(decl, *entry); - return entry; - } - return std::nullopt; + auto entry = createEntry(decl); + fillAbstractFunctionDecl(decl, entry); + return entry; } -std::optional DeclTranslator::translateDestructorDecl( - const swift::DestructorDecl& decl) { - if (auto entry = createNamedEntry(decl)) { - fillAbstractFunctionDecl(decl, *entry); - return entry; - } - return std::nullopt; +codeql::DestructorDecl DeclTranslator::translateDestructorDecl(const swift::DestructorDecl& decl) { + auto entry = createEntry(decl); + fillAbstractFunctionDecl(decl, entry); + return entry; } codeql::PrefixOperatorDecl DeclTranslator::translatePrefixOperatorDecl( @@ -79,16 +71,13 @@ codeql::PrecedenceGroupDecl DeclTranslator::translatePrecedenceGroupDecl( return entry; } -std::optional DeclTranslator::translateParamDecl(const swift::ParamDecl& decl) { - auto entry = createNamedEntry(decl); - if (!entry) { - return std::nullopt; - } - fillVarDecl(decl, *entry); - entry->is_inout = decl.isInOut(); +codeql::ParamDecl DeclTranslator::translateParamDecl(const swift::ParamDecl& decl) { + auto entry = createEntry(decl); + fillVarDecl(decl, entry); + entry.is_inout = decl.isInOut(); if (auto wrapped = decl.getPropertyWrapperWrappedValueVar()) { - entry->property_wrapper_local_wrapped_var = dispatcher.fetchLabel(wrapped); - entry->property_wrapper_local_wrapped_var_binding = + entry.property_wrapper_local_wrapped_var = dispatcher.fetchLabel(wrapped); + entry.property_wrapper_local_wrapped_var_binding = dispatcher.fetchLabel(wrapped->getParentPatternBinding()); } return entry; @@ -114,56 +103,35 @@ codeql::PatternBindingDecl DeclTranslator::translatePatternBindingDecl( return entry; } -std::optional DeclTranslator::translateVarDecl( - const swift::VarDecl& decl) { - std::optional entry; - // We do not deduplicate variables from non-swift (PCM, clang modules) modules as the mangler - // crashes sometimes - if (decl.getDeclContext()->isLocalContext() || decl.getModuleContext()->isNonSwiftModule()) { - entry = createEntry(decl); - } else { - entry = createNamedEntry(decl); - if (!entry) { - return std::nullopt; - } - } - entry->introducer_int = static_cast(decl.getIntroducer()); - fillVarDecl(decl, *entry); +codeql::ConcreteVarDecl DeclTranslator::translateVarDecl(const swift::VarDecl& decl) { + auto entry = createEntry(decl); + entry.introducer_int = static_cast(decl.getIntroducer()); + fillVarDecl(decl, entry); return entry; } -std::optional DeclTranslator::translateStructDecl( - const swift::StructDecl& decl) { - if (auto entry = createNamedEntry(decl)) { - fillNominalTypeDecl(decl, *entry); - return entry; - } - return std::nullopt; +codeql::StructDecl DeclTranslator::translateStructDecl(const swift::StructDecl& decl) { + auto entry = createEntry(decl); + fillNominalTypeDecl(decl, entry); + return entry; } -std::optional DeclTranslator::translateClassDecl(const swift::ClassDecl& decl) { - if (auto entry = createNamedEntry(decl)) { - fillNominalTypeDecl(decl, *entry); - return entry; - } - return std::nullopt; +codeql::ClassDecl DeclTranslator::translateClassDecl(const swift::ClassDecl& decl) { + auto entry = createEntry(decl); + fillNominalTypeDecl(decl, entry); + return entry; } -std::optional DeclTranslator::translateEnumDecl(const swift::EnumDecl& decl) { - if (auto entry = createNamedEntry(decl)) { - fillNominalTypeDecl(decl, *entry); - return entry; - } - return std::nullopt; +codeql::EnumDecl DeclTranslator::translateEnumDecl(const swift::EnumDecl& decl) { + auto entry = createEntry(decl); + fillNominalTypeDecl(decl, entry); + return entry; } -std::optional DeclTranslator::translateProtocolDecl( - const swift::ProtocolDecl& decl) { - if (auto entry = createNamedEntry(decl)) { - fillNominalTypeDecl(decl, *entry); - return entry; - } - return std::nullopt; +codeql::ProtocolDecl DeclTranslator::translateProtocolDecl(const swift::ProtocolDecl& decl) { + auto entry = createEntry(decl); + fillNominalTypeDecl(decl, entry); + return entry; } codeql::EnumCaseDecl DeclTranslator::translateEnumCaseDecl(const swift::EnumCaseDecl& decl) { @@ -172,17 +140,14 @@ codeql::EnumCaseDecl DeclTranslator::translateEnumCaseDecl(const swift::EnumCase return entry; } -std::optional DeclTranslator::translateEnumElementDecl( +codeql::EnumElementDecl DeclTranslator::translateEnumElementDecl( const swift::EnumElementDecl& decl) { - auto entry = createNamedEntry(decl); - if (!entry) { - return std::nullopt; - } - entry->name = decl.getNameStr().str(); + auto entry = createEntry(decl); + entry.name = decl.getNameStr().str(); if (decl.hasParameterList()) { - entry->params = dispatcher.fetchRepeatedLabels(*decl.getParameterList()); + entry.params = dispatcher.fetchRepeatedLabels(*decl.getParameterList()); } - fillValueDecl(decl, *entry); + fillValueDecl(decl, entry); return entry; } @@ -194,72 +159,59 @@ codeql::GenericTypeParamDecl DeclTranslator::translateGenericTypeParamDecl( return entry; } -std::optional DeclTranslator::translateAssociatedTypeDecl( +codeql::AssociatedTypeDecl DeclTranslator::translateAssociatedTypeDecl( const swift::AssociatedTypeDecl& decl) { - if (auto entry = createNamedEntry(decl)) { - fillTypeDecl(decl, *entry); - return entry; - } - return std::nullopt; -} - -std::optional DeclTranslator::translateTypeAliasDecl( - const swift::TypeAliasDecl& decl) { - if (auto entry = createNamedEntry(decl)) { - entry->aliased_type = dispatcher.fetchLabel(decl.getUnderlyingType()); - fillTypeDecl(decl, *entry); - return entry; - } - return std::nullopt; -} - -std::optional DeclTranslator::translateAccessorDecl( - const swift::AccessorDecl& decl) { - auto entry = createNamedEntry(decl); - if (!entry) { - return std::nullopt; - } - switch (decl.getAccessorKind()) { - case swift::AccessorKind::Get: - entry->is_getter = true; - break; - case swift::AccessorKind::Set: - entry->is_setter = true; - break; - case swift::AccessorKind::WillSet: - entry->is_will_set = true; - break; - case swift::AccessorKind::DidSet: - entry->is_did_set = true; - break; - case swift::AccessorKind::Read: - entry->is_read = true; - break; - case swift::AccessorKind::Modify: - entry->is_modify = true; - break; - case swift::AccessorKind::Address: - entry->is_unsafe_address = true; - break; - case swift::AccessorKind::MutableAddress: - entry->is_unsafe_mutable_address = true; - break; - } - fillAbstractFunctionDecl(decl, *entry); + auto entry = createEntry(decl); + fillTypeDecl(decl, entry); return entry; } -std::optional DeclTranslator::translateSubscriptDecl( - const swift::SubscriptDecl& decl) { - auto entry = createNamedEntry(decl); - if (!entry) { - return std::nullopt; +codeql::TypeAliasDecl DeclTranslator::translateTypeAliasDecl(const swift::TypeAliasDecl& decl) { + auto entry = createEntry(decl); + entry.aliased_type = dispatcher.fetchLabel(decl.getUnderlyingType()); + fillTypeDecl(decl, entry); + return entry; +} + +codeql::AccessorDecl DeclTranslator::translateAccessorDecl(const swift::AccessorDecl& decl) { + auto entry = createEntry(decl); + switch (decl.getAccessorKind()) { + case swift::AccessorKind::Get: + entry.is_getter = true; + break; + case swift::AccessorKind::Set: + entry.is_setter = true; + break; + case swift::AccessorKind::WillSet: + entry.is_will_set = true; + break; + case swift::AccessorKind::DidSet: + entry.is_did_set = true; + break; + case swift::AccessorKind::Read: + entry.is_read = true; + break; + case swift::AccessorKind::Modify: + entry.is_modify = true; + break; + case swift::AccessorKind::Address: + entry.is_unsafe_address = true; + break; + case swift::AccessorKind::MutableAddress: + entry.is_unsafe_mutable_address = true; + break; } - entry->element_type = dispatcher.fetchLabel(decl.getElementInterfaceType()); + fillAbstractFunctionDecl(decl, entry); + return entry; +} + +codeql::SubscriptDecl DeclTranslator::translateSubscriptDecl(const swift::SubscriptDecl& decl) { + auto entry = createEntry(decl); + entry.element_type = dispatcher.fetchLabel(decl.getElementInterfaceType()); if (auto indices = decl.getIndices()) { - entry->params = dispatcher.fetchRepeatedLabels(*indices); + entry.params = dispatcher.fetchRepeatedLabels(*indices); } - fillAbstractStorageDecl(decl, *entry); + fillAbstractStorageDecl(decl, entry); return entry; } @@ -280,33 +232,25 @@ codeql::ImportDecl DeclTranslator::translateImportDecl(const swift::ImportDecl& return entry; } -std::optional DeclTranslator::translateModuleDecl( - const swift::ModuleDecl& decl) { - auto entry = createNamedEntry(decl); - if (!entry) { - return std::nullopt; - } - entry->is_builtin_module = decl.isBuiltinModule(); - entry->is_system_module = decl.isSystemModule(); +codeql::ModuleDecl DeclTranslator::translateModuleDecl(const swift::ModuleDecl& decl) { + auto entry = createEntry(decl); + entry.is_builtin_module = decl.isBuiltinModule(); + entry.is_system_module = decl.isSystemModule(); using K = swift::ModuleDecl::ImportFilterKind; llvm::SmallVector imports; decl.getImportedModules(imports, K::Default); for (const auto& import : imports) { - entry->imported_modules.push_back(dispatcher.fetchLabel(import.importedModule)); + entry.imported_modules.push_back(dispatcher.fetchLabel(import.importedModule)); } imports.clear(); decl.getImportedModules(imports, K::Exported); for (const auto& import : imports) { - entry->exported_modules.push_back(dispatcher.fetchLabel(import.importedModule)); + entry.exported_modules.push_back(dispatcher.fetchLabel(import.importedModule)); } - fillTypeDecl(decl, *entry); + fillTypeDecl(decl, entry); return entry; } -std::string DeclTranslator::mangledName(const swift::ValueDecl& decl) { - return mangler.mangledName(decl); -} - void DeclTranslator::fillAbstractFunctionDecl(const swift::AbstractFunctionDecl& decl, codeql::AbstractFunctionDecl& entry) { assert(decl.hasParameterList() && "Expect functions to have a parameter list"); @@ -396,15 +340,12 @@ codeql::IfConfigDecl DeclTranslator::translateIfConfigDecl(const swift::IfConfig return entry; } -std::optional DeclTranslator::translateOpaqueTypeDecl( - const swift::OpaqueTypeDecl& decl) { - if (auto entry = createNamedEntry(decl)) { - fillTypeDecl(decl, *entry); - entry->naming_declaration = dispatcher.fetchLabel(decl.getNamingDecl()); - entry->opaque_generic_params = dispatcher.fetchRepeatedLabels(decl.getOpaqueGenericParams()); - return entry; - } - return std::nullopt; +codeql::OpaqueTypeDecl DeclTranslator::translateOpaqueTypeDecl(const swift::OpaqueTypeDecl& decl) { + auto entry = createEntry(decl); + fillTypeDecl(decl, entry); + entry.naming_declaration = dispatcher.fetchLabel(decl.getNamingDecl()); + entry.opaque_generic_params = dispatcher.fetchRepeatedLabels(decl.getOpaqueGenericParams()); + return entry; } codeql::PoundDiagnosticDecl DeclTranslator::translatePoundDiagnosticDecl( @@ -423,7 +364,7 @@ codeql::MissingMemberDecl DeclTranslator::translateMissingMemberDecl( } codeql::CapturedDecl DeclTranslator::translateCapturedValue(const swift::CapturedValue& capture) { - codeql::CapturedDecl entry{dispatcher.template assignNewLabel(capture)}; + auto entry = dispatcher.createEntry(capture); auto decl = capture.getDecl(); entry.decl = dispatcher.fetchLabel(decl); entry.module = dispatcher.fetchLabel(decl->getModuleContext()); diff --git a/swift/extractor/translators/DeclTranslator.h b/swift/extractor/translators/DeclTranslator.h index e4713063d0a..6abadd03188 100644 --- a/swift/extractor/translators/DeclTranslator.h +++ b/swift/extractor/translators/DeclTranslator.h @@ -6,7 +6,6 @@ #include "swift/extractor/translators/TranslatorBase.h" #include "swift/extractor/trap/generated/decl/TrapClasses.h" -#include "swift/extractor/mangler/SwiftMangler.h" namespace codeql { @@ -17,43 +16,39 @@ class DeclTranslator : public AstTranslatorBase { public: using AstTranslatorBase::AstTranslatorBase; - std::optional translateFuncDecl(const swift::FuncDecl& decl); - std::optional translateConstructorDecl( - const swift::ConstructorDecl& decl); - std::optional translateDestructorDecl(const swift::DestructorDecl& decl); + codeql::ConcreteFuncDecl translateFuncDecl(const swift::FuncDecl& decl); + codeql::ConstructorDecl translateConstructorDecl(const swift::ConstructorDecl& decl); + codeql::DestructorDecl translateDestructorDecl(const swift::DestructorDecl& decl); codeql::PrefixOperatorDecl translatePrefixOperatorDecl(const swift::PrefixOperatorDecl& decl); codeql::PostfixOperatorDecl translatePostfixOperatorDecl(const swift::PostfixOperatorDecl& decl); codeql::InfixOperatorDecl translateInfixOperatorDecl(const swift::InfixOperatorDecl& decl); codeql::PrecedenceGroupDecl translatePrecedenceGroupDecl(const swift::PrecedenceGroupDecl& decl); - std::optional translateParamDecl(const swift::ParamDecl& decl); + codeql::ParamDecl translateParamDecl(const swift::ParamDecl& decl); codeql::TopLevelCodeDecl translateTopLevelCodeDecl(const swift::TopLevelCodeDecl& decl); codeql::PatternBindingDecl translatePatternBindingDecl(const swift::PatternBindingDecl& decl); - std::optional translateVarDecl(const swift::VarDecl& decl); - std::optional translateStructDecl(const swift::StructDecl& decl); - std::optional translateClassDecl(const swift::ClassDecl& decl); - std::optional translateEnumDecl(const swift::EnumDecl& decl); - std::optional translateProtocolDecl(const swift::ProtocolDecl& decl); + codeql::ConcreteVarDecl translateVarDecl(const swift::VarDecl& decl); + codeql::StructDecl translateStructDecl(const swift::StructDecl& decl); + codeql::ClassDecl translateClassDecl(const swift::ClassDecl& decl); + codeql::EnumDecl translateEnumDecl(const swift::EnumDecl& decl); + codeql::ProtocolDecl translateProtocolDecl(const swift::ProtocolDecl& decl); codeql::EnumCaseDecl translateEnumCaseDecl(const swift::EnumCaseDecl& decl); - std::optional translateEnumElementDecl( - const swift::EnumElementDecl& decl); + codeql::EnumElementDecl translateEnumElementDecl(const swift::EnumElementDecl& decl); codeql::GenericTypeParamDecl translateGenericTypeParamDecl( const swift::GenericTypeParamDecl& decl); - std::optional translateAssociatedTypeDecl( - const swift::AssociatedTypeDecl& decl); - std::optional translateTypeAliasDecl(const swift::TypeAliasDecl& decl); - std::optional translateAccessorDecl(const swift::AccessorDecl& decl); - std::optional translateSubscriptDecl(const swift::SubscriptDecl& decl); + codeql::AssociatedTypeDecl translateAssociatedTypeDecl(const swift::AssociatedTypeDecl& decl); + codeql::TypeAliasDecl translateTypeAliasDecl(const swift::TypeAliasDecl& decl); + codeql::AccessorDecl translateAccessorDecl(const swift::AccessorDecl& decl); + codeql::SubscriptDecl translateSubscriptDecl(const swift::SubscriptDecl& decl); codeql::ExtensionDecl translateExtensionDecl(const swift::ExtensionDecl& decl); codeql::ImportDecl translateImportDecl(const swift::ImportDecl& decl); - std::optional translateModuleDecl(const swift::ModuleDecl& decl); + codeql::ModuleDecl translateModuleDecl(const swift::ModuleDecl& decl); codeql::IfConfigDecl translateIfConfigDecl(const swift::IfConfigDecl& decl); - std::optional translateOpaqueTypeDecl(const swift::OpaqueTypeDecl& decl); + codeql::OpaqueTypeDecl translateOpaqueTypeDecl(const swift::OpaqueTypeDecl& decl); codeql::PoundDiagnosticDecl translatePoundDiagnosticDecl(const swift::PoundDiagnosticDecl& decl); codeql::MissingMemberDecl translateMissingMemberDecl(const swift::MissingMemberDecl& decl); codeql::CapturedDecl translateCapturedValue(const swift::CapturedValue& capture); private: - std::string mangledName(const swift::ValueDecl& decl); void fillAbstractFunctionDecl(const swift::AbstractFunctionDecl& decl, codeql::AbstractFunctionDecl& entry); void fillOperatorDecl(const swift::OperatorDecl& decl, codeql::OperatorDecl& entry); @@ -66,23 +61,9 @@ class DeclTranslator : public AstTranslatorBase { void fillAbstractStorageDecl(const swift::AbstractStorageDecl& decl, codeql::AbstractStorageDecl& entry); - template - auto createNamedEntry(const D& decl) { - std::optional> entry; - auto id = dispatcher.assignNewLabel(decl, mangledName(decl)); - if (dispatcher.shouldEmitDeclBody(decl)) { - dispatcher.extractedDeclaration(decl); - entry.emplace(id); - fillDecl(decl, *entry); - } else { - dispatcher.skippedDeclaration(decl); - } - return entry; - } - template auto createEntry(const D& decl) { - TrapClassOf entry{dispatcher.template assignNewLabel(decl)}; + auto entry = dispatcher.createEntry(decl); fillDecl(decl, entry); return entry; } @@ -90,8 +71,6 @@ class DeclTranslator : public AstTranslatorBase { void fillDecl(const swift::Decl& decl, codeql::Decl& entry) { entry.module = dispatcher.fetchLabel(decl.getModuleContext()); } - - SwiftMangler mangler; }; } // namespace codeql diff --git a/swift/extractor/translators/SwiftVisitor.h b/swift/extractor/translators/SwiftVisitor.h index dbb0dabaa83..db38d9608ee 100644 --- a/swift/extractor/translators/SwiftVisitor.h +++ b/swift/extractor/translators/SwiftVisitor.h @@ -6,6 +6,7 @@ #include "swift/extractor/translators/StmtTranslator.h" #include "swift/extractor/translators/TypeTranslator.h" #include "swift/extractor/translators/PatternTranslator.h" +#include "swift/extractor/mangler/SwiftMangler.h" namespace codeql { @@ -17,10 +18,13 @@ class SwiftVisitor : private SwiftDispatcher { template void extract(const T& entity) { fetchLabel(entity); + visitPending(); } void extract(swift::Token& comment) { emitComment(comment); } private: + SwiftMangledName name(const swift::Decl* decl) override { return mangler.mangleDecl(*decl); } + SwiftMangledName name(const swift::TypeBase* type) override { return mangler.mangleType(*type); } void visit(const swift::Decl* decl) override { declTranslator.translateAndEmit(*decl); } void visit(const swift::Stmt* stmt) override { stmtTranslator.translateAndEmit(*stmt); } void visit(const swift::StmtCondition* cond) override { stmtTranslator.translateAndEmit(*cond); } @@ -54,6 +58,7 @@ class SwiftVisitor : private SwiftDispatcher { StmtTranslator stmtTranslator{*this}; TypeTranslator typeTranslator{*this}; PatternTranslator patternTranslator{*this}; + SwiftMangler mangler{*this}; }; } // namespace codeql diff --git a/swift/extractor/translators/TypeTranslator.h b/swift/extractor/translators/TypeTranslator.h index b46b271139d..5ba41041bab 100644 --- a/swift/extractor/translators/TypeTranslator.h +++ b/swift/extractor/translators/TypeTranslator.h @@ -2,7 +2,6 @@ #include "swift/extractor/translators/TranslatorBase.h" #include "swift/extractor/trap/generated/type/TrapClasses.h" -#include "swift/extractor/mangler/SwiftMangler.h" namespace codeql { class TypeTranslator : public TypeTranslatorBase { @@ -88,23 +87,12 @@ class TypeTranslator : public TypeTranslatorBase { void fillBoundGenericType(const swift::BoundGenericType& type, codeql::BoundGenericType& entry); void fillAnyGenericType(const swift::AnyGenericType& type, codeql::AnyGenericType& entry); - template - auto createMangledTypeEntry(const T& type) { - auto mangledName = mangler.mangleType(type); - if (mangledName) { - return dispatcher.createEntry(type, mangledName.value()); - } - return dispatcher.createEntry(type); - } - template auto createTypeEntry(const T& type) { - auto entry = createMangledTypeEntry(type); + auto entry = dispatcher.createEntry(type); fillType(type, entry); return entry; } - - SwiftMangler mangler; }; } // namespace codeql diff --git a/swift/extractor/trap/BUILD.bazel b/swift/extractor/trap/BUILD.bazel index 0db9b3b3248..59870efbf88 100644 --- a/swift/extractor/trap/BUILD.bazel +++ b/swift/extractor/trap/BUILD.bazel @@ -49,5 +49,7 @@ swift_cc_library( visibility = ["//visibility:public"], deps = [ "//swift/extractor/infra/file", + "//swift/extractor/infra/log", + "@absl//absl/numeric:bits", ], ) diff --git a/swift/extractor/trap/TrapDomain.h b/swift/extractor/trap/TrapDomain.h index 12c498418e2..6709873f5be 100644 --- a/swift/extractor/trap/TrapDomain.h +++ b/swift/extractor/trap/TrapDomain.h @@ -5,18 +5,24 @@ #include "swift/extractor/trap/TrapLabel.h" #include "swift/extractor/infra/file/TargetFile.h" +#include "swift/extractor/infra/log/SwiftLogging.h" +#include "swift/extractor/infra/SwiftMangledName.h" namespace codeql { // Abstracts a given trap output file, with its own universe of trap labels class TrapDomain { TargetFile out; + Logger logger{getLoggerName()}; public: - explicit TrapDomain(TargetFile&& out) : out{std::move(out)} {} + explicit TrapDomain(TargetFile&& out) : out{std::move(out)} { + LOG_DEBUG("writing trap file with target {}", this->out.target()); + } template void emit(const Entry& e) { + LOG_TRACE("{}", e); out << e << '\n'; } @@ -27,56 +33,67 @@ class TrapDomain { out << "\n*/\n"; } - template - TrapLabel createLabel() { - auto ret = allocateLabel(); + UntypedTrapLabel createLabel() { + auto ret = allocateLabel(); assignStar(ret); out << '\n'; return ret; } - template - TrapLabel createLabel(Args&&... args) { - auto ret = allocateLabel(); - assignKey(ret, std::forward(args)...); + template + TrapLabel createTypedLabel() { + auto untyped = createLabel(); + return TrapLabel::unsafeCreateFromUntyped(untyped); + } + + UntypedTrapLabel createLabel(const SwiftMangledName& name) { + auto ret = allocateLabel(); + assignKey(ret, name); out << '\n'; return ret; } - template - TrapLabel createLabelWithImplementationId(const std::string_view& implementationId, - Args&&... args) { - auto ret = allocateLabel(); - assignKey(ret, std::forward(args)...); + template + TrapLabel createTypedLabel(const SwiftMangledName& name) { + auto untyped = createLabel(name); + return TrapLabel::unsafeCreateFromUntyped(untyped); + } + + template + TrapLabel createTypedLabelWithImplementationId(const SwiftMangledName& name, + const std::string_view& implementationId) { + auto untyped = allocateLabel(); + assignKey(untyped, name); + LOG_TRACE("^^^ .implementation {}", implementationId); out << " .implementation " << trapQuoted(implementationId) << '\n'; - return ret; + return TrapLabel::unsafeCreateFromUntyped(untyped); } private: uint64_t id_{0}; - template - TrapLabel allocateLabel() { - return TrapLabel::unsafeCreateFromExplicitId(id_++); - } + UntypedTrapLabel allocateLabel() { return UntypedTrapLabel{id_++}; } - template - void assignStar(TrapLabel label) { + void assignStar(UntypedTrapLabel label) { + LOG_TRACE("{}=*", label); out << label << "=*"; } - template - void assignKey(TrapLabel label, const std::string& key) { - // prefix the key with the id to guarantee the same key is not used wrongly with different tags - auto prefixed = std::string(Tag::prefix) + '_' + key; - out << label << "=@" << trapQuoted(prefixed); + void assignKey(UntypedTrapLabel label, const SwiftMangledName& name) { + auto key = name.str(); + LOG_TRACE("{}=@{}", label, key); + out << label << "=@" << trapQuoted(key); } - template - void assignKey(TrapLabel label, const Args&... keyParts) { - std::ostringstream oss; - (oss << ... << keyParts); - assignKey(label, oss.str()); + std::string getLoggerName() { + // packaged swift modules are typically structured as + // `Module.swiftmodule/.swiftmodule`, so the parent is more informative + // We use `Module.swiftmodule/.trap` then + if (auto parent = out.target().parent_path(); parent.extension() == ".swiftmodule") { + return parent.filename() / ".trap"; + } else { + return out.target().filename(); + } } }; diff --git a/swift/extractor/trap/TrapLabel.h b/swift/extractor/trap/TrapLabel.h index 645f7787d70..13766cf20a7 100644 --- a/swift/extractor/trap/TrapLabel.h +++ b/swift/extractor/trap/TrapLabel.h @@ -5,6 +5,10 @@ #include #include #include +#include "absl/numeric/bits.h" +#include +#include +#include namespace codeql { @@ -18,14 +22,15 @@ class UntypedTrapLabel { friend class std::hash; template friend class TrapLabel; + BINLOG_ADAPT_STRUCT_FRIEND; static constexpr uint64_t undefined = 0xffffffffffffffff; - protected: - UntypedTrapLabel() : id_{undefined} {} - UntypedTrapLabel(uint64_t id) : id_{id} { assert(id != undefined); } - public: + UntypedTrapLabel() : id_{undefined} {} + explicit UntypedTrapLabel(uint64_t id) : id_{id} { assert(id != undefined); } + UntypedTrapLabel(UndefinedTrapLabel) : UntypedTrapLabel() {} + bool valid() const { return id_ != undefined; } explicit operator bool() const { return valid(); } @@ -38,7 +43,23 @@ class UntypedTrapLabel { return out; } + std::string str() const { + std::string ret(strSize(), '\0'); + ret[0] = '#'; + std::to_chars(ret.data() + 1, ret.data() + ret.size(), id_, 16); + return ret; + } + friend bool operator==(UntypedTrapLabel lhs, UntypedTrapLabel rhs) { return lhs.id_ == rhs.id_; } + + private: + size_t strSize() const { + if (id_ == 0) return 2; // #0 + // Number of hex digits is ceil(bit_width(id) / 4), but C++ integer division can only do floor. + return /* # */ 1 + /* hex digits */ 1 + (absl::bit_width(id_) - 1) / 4; + } + + friend bool operator!=(UntypedTrapLabel lhs, UntypedTrapLabel rhs) { return lhs.id_ != rhs.id_; } }; template @@ -60,8 +81,8 @@ class TrapLabel : public UntypedTrapLabel { } // The caller is responsible for ensuring ID uniqueness. - static TrapLabel unsafeCreateFromExplicitId(uint64_t id) { return {id}; } - static TrapLabel unsafeCreateFromUntyped(UntypedTrapLabel label) { return {label.id_}; } + static TrapLabel unsafeCreateFromExplicitId(uint64_t id) { return TrapLabel{id}; } + static TrapLabel unsafeCreateFromUntyped(UntypedTrapLabel label) { return TrapLabel{label.id_}; } template TrapLabel(const TrapLabel& other) : UntypedTrapLabel(other) { @@ -100,3 +121,33 @@ struct hash { } }; } // namespace std + +namespace mserialize { +// log labels using their string representation, using binlog/mserialize internal plumbing +template <> +struct CustomTag : detail::BuiltinTag { + using T = codeql::UntypedTrapLabel; +}; + +template +struct CustomTag, void> : detail::BuiltinTag { + using T = codeql::TrapLabel; +}; + +template <> +struct CustomSerializer { + template + static void serialize(codeql::UntypedTrapLabel label, OutputStream& out) { + mserialize::serialize(label.str(), out); + } + + static size_t serialized_size(codeql::UntypedTrapLabel label) { + return sizeof(std::uint32_t) + label.strSize(); + } +}; + +template +struct CustomSerializer, void> : CustomSerializer { +}; + +} // namespace mserialize diff --git a/swift/extractor/trap/TrapLabelStore.h b/swift/extractor/trap/TrapLabelStore.h deleted file mode 100644 index f9b0edd1753..00000000000 --- a/swift/extractor/trap/TrapLabelStore.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include - -#include "swift/extractor/trap/TrapLabel.h" -#include "swift/extractor/trap/TrapTagTraits.h" -#include "swift/extractor/trap/generated/TrapTags.h" - -namespace codeql { - -// The extraction is done in a lazy/on-demand fashion: -// Each emitted TRAP entry for an AST node gets a TRAP label assigned to it. -// To avoid re-emission, we store the "AST node <> label" entry in the TrapLabelStore. -// The template parameters `Ts...` indicate to what entity types we restrict the storage -template -class TrapLabelStore { - public: - using Handle = std::variant; - - template - std::optional> get(const T& e) { - if (auto found = store_.find(e); found != store_.end()) { - return TrapLabelOf::unsafeCreateFromUntyped(found->second); - } - return std::nullopt; - } - - template - void insert(const T& e, TrapLabelOf l) { - auto [_, inserted] = store_.emplace(e, l); - assert(inserted && "already inserted"); - } - - private: - std::unordered_map store_; -}; - -} // namespace codeql diff --git a/swift/ql/.generated.list b/swift/ql/.generated.list index 7d721073d74..d25c1414e89 100644 --- a/swift/ql/.generated.list +++ b/swift/ql/.generated.list @@ -60,7 +60,6 @@ ql/lib/codeql/swift/elements/decl/SubscriptDeclConstructor.qll 3a88617b41f96827c ql/lib/codeql/swift/elements/decl/TopLevelCodeDeclConstructor.qll 6920a4e7aec45ae2a561cef95b9082b861f81c16c259698541f317481645e194 4bd65820b93a5ec7332dd1bbf59326fc19b77e94c122ad65d41393c84e6ac581 ql/lib/codeql/swift/elements/decl/TypeAliasDecl.qll 984c5802c35e595388f7652cef1a50fb963b32342ab4f9d813b7200a0e6a37ca 630dc9cbf20603855c599a9f86037ba0d889ad3d2c2b6f9ac17508d398bff9e3 ql/lib/codeql/swift/elements/decl/TypeAliasDeclConstructor.qll ba70bb69b3a14283def254cc1859c29963838f624b3f1062a200a8df38f1edd5 96ac51d1b3156d4139e583f7f803e9eb95fe25cc61c12986e1b2972a781f9c8b -ql/lib/codeql/swift/elements/decl/ValueDecl.qll 1b7d8eeb17be4bdbabc156cb0689641ed4f9e697e334d2d14f423ed3d1a419f6 e3056cf6a883da2737cb220a89499a9e3977eb1c56b9e1d2f41a56b71a0c29f9 ql/lib/codeql/swift/elements/expr/AbiSafeConversionExpr.qll 39b856c89b8aff769b75051fd9e319f2d064c602733eaa6fed90d8f626516306 a87738539276438cef63145461adf25309d1938cfac367f53f53d33db9b12844 ql/lib/codeql/swift/elements/expr/AbiSafeConversionExprConstructor.qll 7d70e7c47a9919efcb1ebcbf70e69cab1be30dd006297b75f6d72b25ae75502a e7a741c42401963f0c1da414b3ae779adeba091e9b8f56c9abf2a686e3a04d52 ql/lib/codeql/swift/elements/expr/AbstractClosureExpr.qll 4027b51a171387332f96cb7b78ca87a6906aec76419938157ac24a60cff16519 400790fe643585ad39f40c433eff8934bbe542d140b81341bca3b6dfc5b22861 @@ -386,8 +385,8 @@ ql/lib/codeql/swift/generated/OtherAvailabilitySpec.qll 0e26a203b26ff0581b7396b0 ql/lib/codeql/swift/generated/ParentChild.qll 3998d73048297cf2df42176b0060c025e57d409d56f3fbfab9c202bd46c07b5e 425b01328baf38bd5e46403e11b25b0e17cd5bc40731dbf64a46e01604611e15 ql/lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll f82d9ca416fe8bd59b5531b65b1c74c9f317b3297a6101544a11339a1cffce38 7f5c6d3309e66c134107afe55bae76dfc9a72cb7cdd6d4c3706b6b34cee09fa0 ql/lib/codeql/swift/generated/PureSynthConstructors.qll 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98 -ql/lib/codeql/swift/generated/Raw.qll 16ef0c379f1b3ceb73df393a34b8d2c5c4fb180e337fb3b8f33078fa9d827b7e 4b608cd9fc3f425fc568322ae17036e6407a54d0a6a30ff03fe04942f4ef897f -ql/lib/codeql/swift/generated/Synth.qll 1b60c8eab214c8f9a3a1fb39a8785979bc3d86f2615ba0a580c35e17fd496851 052940a87ffb32214b1b3c774bc643aa5d4f31c484d3121b4da384c2839cb10b +ql/lib/codeql/swift/generated/Raw.qll cda40b44e2b72ceb32a3c03d2f16028fc4db723c8cdc0a9638693794f4f07411 eb4b59f4dbd2159f59132994e6d1840a1273e5c316232b8439ddc0cc08ef8736 +ql/lib/codeql/swift/generated/Synth.qll e26debaea7feaabbdd4180983a03fa406584e2a0dc4902520d5549d106770fee a448e51acba628d63fc4ae59aa23efa7cd5b567230ae24749d31d2a4ad51baf9 ql/lib/codeql/swift/generated/SynthConstructors.qll bb0c69cea79a06ec3cc0e176fc6e63cfe125107a45373e41083fc4de056133b8 bb0c69cea79a06ec3cc0e176fc6e63cfe125107a45373e41083fc4de056133b8 ql/lib/codeql/swift/generated/UnknownFile.qll 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6 ql/lib/codeql/swift/generated/UnknownLocation.qll e50efefa02a0ec1ff635a00951b5924602fc8cab57e5756e4a039382c69d3882 e50efefa02a0ec1ff635a00951b5924602fc8cab57e5756e4a039382c69d3882 diff --git a/swift/ql/lib/codeql/swift/controlflow/CfgNodes.qll b/swift/ql/lib/codeql/swift/controlflow/CfgNodes.qll index b1b93a17e4d..872fced8a03 100644 --- a/swift/ql/lib/codeql/swift/controlflow/CfgNodes.qll +++ b/swift/ql/lib/codeql/swift/controlflow/CfgNodes.qll @@ -179,3 +179,25 @@ class ApplyExprCfgNode extends ExprCfgNode { class CallExprCfgNode extends ApplyExprCfgNode { override CallExpr e; } + +/** A control-flow node that wraps a key-path application. */ +class KeyPathApplicationExprCfgNode extends ExprCfgNode { + override KeyPathApplicationExpr e; + + /** + * Gets the control-flow node that wraps the key-path of + * this control-flow element. + */ + CfgNode getKeyPath() { result.getAst() = e.getKeyPath() } + + /** + * Gets the control-flow node that wraps the base of + * this control-flow element. + */ + CfgNode getBase() { result.getAst() = e.getBase() } +} + +/** A control-flow node that wraps a key-path expression. */ +class KeyPathExprCfgNode extends ExprCfgNode { + override KeyPathExpr e; +} diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll index 80f07564747..422f98a89c4 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll +++ b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll @@ -58,7 +58,7 @@ module CfgScope { } private class KeyPathScope extends Range_ instanceof KeyPathExpr { - AstControlFlowTree tree; + KeyPathControlFlowTree tree; KeyPathScope() { tree.getAst() = this } @@ -76,6 +76,12 @@ module CfgScope { final override predicate exit(ControlFlowElement last, Completion c) { last(tree, last, c) } } + + private class KeyPathControlFlowTree extends StandardPostOrderTree, KeyPathElement { + final override ControlFlowElement getChildElement(int i) { + result.asAstNode() = expr.getComponent(i) + } + } } /** Holds if `first` is first executed when entering `scope`. */ @@ -88,6 +94,14 @@ predicate succExit(CfgScope::Range_ scope, ControlFlowElement last, Completion c scope.exit(last, c) } +private class KeyPathComponentTree extends AstStandardPostOrderTree { + override KeyPathComponent ast; + + final override ControlFlowElement getChildElement(int i) { + result.asAstNode() = ast.getSubscriptArgument(i).getExpr().getFullyConverted() + } +} + /** * Control-flow for statements. */ diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll index 7c11c2c2f84..2dd57faa420 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll +++ b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll @@ -45,7 +45,9 @@ predicate successorTypeIsSimple(SuccessorType t) { } /** Holds if `t` is an abnormal exit type out of a CFG scope. */ -predicate isAbnormalExitType(SuccessorType t) { none() } // TODO +predicate isAbnormalExitType(SuccessorType t) { + t instanceof CFG::SuccessorTypes::ExceptionSuccessor +} class Location = S::Location; diff --git a/swift/ql/lib/codeql/swift/dataflow/ExternalFlow.qll b/swift/ql/lib/codeql/swift/dataflow/ExternalFlow.qll index 6917f8ea209..672405107d7 100644 --- a/swift/ql/lib/codeql/swift/dataflow/ExternalFlow.qll +++ b/swift/ql/lib/codeql/swift/dataflow/ExternalFlow.qll @@ -97,9 +97,12 @@ private module Frameworks { private import codeql.swift.frameworks.Alamofire.Alamofire private import codeql.swift.security.CleartextLoggingExtensions private import codeql.swift.security.CleartextStorageDatabaseExtensions + private import codeql.swift.security.ECBEncryptionExtensions + private import codeql.swift.security.HardcodedEncryptionKeyExtensions private import codeql.swift.security.PathInjectionExtensions private import codeql.swift.security.PredicateInjectionExtensions private import codeql.swift.security.StringLengthConflationExtensions + private import codeql.swift.security.WeakSensitiveDataHashingExtensions } /** diff --git a/swift/ql/lib/codeql/swift/dataflow/Ssa.qll b/swift/ql/lib/codeql/swift/dataflow/Ssa.qll index 16ff1d27924..44c07c3c5a8 100644 --- a/swift/ql/lib/codeql/swift/dataflow/Ssa.qll +++ b/swift/ql/lib/codeql/swift/dataflow/Ssa.qll @@ -21,7 +21,39 @@ module Ssa { class ExitBasicBlock = BasicBlocks::ExitBasicBlock; - class SourceVariable = VarDecl; + private newtype TSourceVariable = + TNormalSourceVariable(VarDecl v) or + TKeyPathSourceVariable(EntryNode entry) { entry.getScope() instanceof KeyPathExpr } + + abstract class SourceVariable extends TSourceVariable { + abstract string toString(); + + VarDecl asVarDecl() { none() } + + EntryNode asKeyPath() { none() } + + DeclRefExpr getAnAccess() { result.getDecl() = this.asVarDecl() } + } + + private class NormalSourceVariable extends SourceVariable, TNormalSourceVariable { + VarDecl v; + + NormalSourceVariable() { this = TNormalSourceVariable(v) } + + override string toString() { result = v.toString() } + + override VarDecl asVarDecl() { result = v } + } + + private class KeyPathSourceVariable extends SourceVariable, TKeyPathSourceVariable { + EntryNode enter; + + KeyPathSourceVariable() { this = TKeyPathSourceVariable(enter) } + + override string toString() { result = enter.toString() } + + override EntryNode asKeyPath() { result = enter } + } predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) { exists(AssignExpr assign | @@ -40,17 +72,22 @@ module Ssa { // ``` exists(NamedPattern pattern | bb.getNode(i).getNode().asAstNode() = pattern and - v = pattern.getVarDecl() and + v.asVarDecl() = pattern.getVarDecl() and certain = true ) or - v instanceof ParamDecl and - bb.getNode(i).getNode().asAstNode() = v and + exists(ParamDecl p | + p = v.asVarDecl() and + bb.getNode(i).getNode().asAstNode() = p and + certain = true + ) + or + bb.getNode(i) = v.asKeyPath() and certain = true or // Mark the subexpression as a write of the local variable declared in the `TapExpr`. exists(TapExpr tap | - v = tap.getVar() and + v.asVarDecl() = tap.getVar() and bb.getNode(i).getNode().asAstNode() = tap.getSubExpr() and certain = true ) @@ -60,7 +97,7 @@ module Ssa { exists(DeclRefExpr ref | not isLValue(ref) and bb.getNode(i).getNode().asAstNode() = ref and - v = ref.getDecl() and + v.asVarDecl() = ref.getDecl() and certain = true ) or @@ -71,24 +108,26 @@ module Ssa { ) or exists(ExitNode exit, AbstractFunctionDecl func | - func.getAParam() = v or func.getSelfParam() = v - | + [func.getAParam(), func.getSelfParam()] = v.asVarDecl() and bb.getNode(i) = exit and - modifiableParam(v) and + modifiableParam(v.asVarDecl()) and bb.getScope() = func and certain = true ) or // Mark the `TapExpr` as a read of the of the local variable. exists(TapExpr tap | - v = tap.getVar() and + v.asVarDecl() = tap.getVar() and bb.getNode(i).getNode().asAstNode() = tap and certain = true ) } } - private module SsaImpl = SsaImplCommon::Make; + /** + * INTERNAL: Do not use. + */ + module SsaImpl = SsaImplCommon::Make; cached class Definition extends SsaImpl::Definition { @@ -97,7 +136,7 @@ module Ssa { cached ControlFlowNode getARead() { - exists(VarDecl v, SsaInput::BasicBlock bb, int i | + exists(SsaInput::SourceVariable v, SsaInput::BasicBlock bb, int i | SsaImpl::ssaDefReachesRead(v, this, bb, i) and SsaInput::variableRead(bb, i, v, true) and result = bb.getNode(i) diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll index 865d7b4d6ce..f34554d6eea 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll @@ -361,3 +361,52 @@ module MergePathGraph< } } } + +/** + * Constructs a `PathGraph` from three `PathGraph`s by disjoint union. + */ +module MergePathGraph3< + PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3, + PathGraphSig Graph1, PathGraphSig Graph2, PathGraphSig Graph3> +{ + private module MergedInner = MergePathGraph; + + private module Merged = + MergePathGraph; + + /** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */ + class PathNode instanceof Merged::PathNode { + /** Gets this as a projection on the first given `PathGraph`. */ + PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() } + + /** Gets this as a projection on the second given `PathGraph`. */ + PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() } + + /** Gets this as a projection on the third given `PathGraph`. */ + PathNode3 asPathNode3() { result = super.asPathNode2() } + + /** Gets a textual representation of this element. */ + string toString() { result = super.toString() } + + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + Node getNode() { result = super.getNode() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PathGraph = Merged::PathGraph; +} diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowDispatch.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowDispatch.qll index 9bd9ba78a18..6647d176879 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowDispatch.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowDispatch.qll @@ -74,6 +74,7 @@ newtype TDataFlowCall = TPropertyGetterCall(PropertyGetterCfgNode getter) or TPropertySetterCall(PropertySetterCfgNode setter) or TPropertyObserverCall(PropertyObserverCfgNode observer) or + TKeyPathCall(KeyPathApplicationExprCfgNode keyPathApplication) or TSummaryCall(FlowSummaryImpl::Public::SummarizedCallable c, Node receiver) { FlowSummaryImpl::Private::summaryCallbackRange(c, receiver) } @@ -89,6 +90,9 @@ class DataFlowCall extends TDataFlowCall { /** Gets the underlying source code call, if any. */ ApplyExprCfgNode asCall() { none() } + /** Gets the underlying key-path application node, if any. */ + KeyPathApplicationExprCfgNode asKeyPath() { none() } + /** * Gets the i'th argument of call.class * The qualifier is considered to have index `-1`. @@ -138,6 +142,25 @@ private class NormalCall extends DataFlowCall, TNormalCall { override Location getLocation() { result = apply.getLocation() } } +private class KeyPathCall extends DataFlowCall, TKeyPathCall { + private KeyPathApplicationExprCfgNode apply; + + KeyPathCall() { this = TKeyPathCall(apply) } + + override KeyPathApplicationExprCfgNode asKeyPath() { result = apply } + + override CfgNode getArgument(int i) { + i = -1 and + result = apply.getBase() + } + + override DataFlowCallable getEnclosingCallable() { result = TDataFlowFunc(apply.getScope()) } + + override string toString() { result = apply.toString() } + + override Location getLocation() { result = apply.getLocation() } +} + class PropertyGetterCall extends DataFlowCall, TPropertyGetterCall { private PropertyGetterCfgNode getter; diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll index 6ea97954bdf..cd8e992c980 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll @@ -3031,6 +3031,17 @@ module Impl { this instanceof PathNodeSinkGroup } + private string ppType() { + this instanceof PathNodeSink and result = "" + or + this.(PathNodeMid).getAp() instanceof AccessPathNil and result = "" + or + exists(DataFlowType t | t = this.(PathNodeMid).getAp().getHead().getContainerType() | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { this instanceof PathNodeSink and result = "" or @@ -3046,14 +3057,14 @@ module Impl { } /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -3998,14 +4009,14 @@ module Impl { */ class PartialPathNode extends TPartialPathNode { /** Gets a textual representation of this element. */ - string toString() { result = this.getNodeEx().toString() + this.ppAp() } + string toString() { result = this.getNodeEx().toString() + this.ppType() + this.ppAp() } /** * Gets a textual representation of this element, including a textual * representation of the call context. */ string toStringWithContext() { - result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + result = this.getNodeEx().toString() + this.ppType() + this.ppAp() + this.ppCtx() } /** @@ -4046,6 +4057,19 @@ module Impl { */ int getSinkDistance() { result = distSink(this.getNodeEx().getEnclosingCallable()) } + private string ppType() { + this instanceof PartialPathNodeRev and result = "" + or + this.(PartialPathNodeFwd).getAp() instanceof PartialAccessPathNil and result = "" + or + exists(DataFlowType t | + t = this.(PartialPathNodeFwd).getAp().(PartialAccessPathCons).getType() + | + // The `concat` becomes "" if `ppReprType` has no result. + result = concat(" : " + ppReprType(t)) + ) + } + private string ppAp() { exists(string s | s = this.(PartialPathNodeFwd).getAp().toString() or diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll index 25bc8adfccc..a11bb602103 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll @@ -40,6 +40,22 @@ private class ExprNodeImpl extends ExprNode, NodeImpl { override DataFlowCallable getEnclosingCallable() { result = TDataFlowFunc(n.getScope()) } } +private class KeyPathComponentNodeImpl extends TKeyPathComponentNode, NodeImpl { + KeyPathComponent component; + + KeyPathComponentNodeImpl() { this = TKeyPathComponentNode(component) } + + override Location getLocationImpl() { result = component.getLocation() } + + override string toStringImpl() { result = component.toString() } + + override DataFlowCallable getEnclosingCallable() { + result.asSourceCallable() = component.getKeyPathExpr() + } + + KeyPathComponent getComponent() { result = component } +} + private class PatternNodeImpl extends PatternNode, NodeImpl { override Location getLocationImpl() { result = pattern.getLocation() } @@ -78,6 +94,9 @@ private module Cached { FlowSummaryImpl::Private::summaryNodeRange(c, state) } or TSourceParameterNode(ParamDecl param) or + TKeyPathParameterNode(EntryNode entry) { entry.getScope() instanceof KeyPathExpr } or + TKeyPathReturnNode(ExitNode exit) { exit.getScope() instanceof KeyPathExpr } or + TKeyPathComponentNode(KeyPathComponent component) or TSummaryParameterNode(FlowSummary::SummarizedCallable c, ParameterPosition pos) { FlowSummaryImpl::Private::summaryParameterNodeRange(c, pos) } or @@ -105,7 +124,7 @@ private module Cached { ( nodeTo instanceof InoutReturnNode implies - nodeTo.(InoutReturnNode).getParameter() = def.getSourceVariable() + nodeTo.(InoutReturnNode).getParameter() = def.getSourceVariable().asVarDecl() ) } @@ -135,7 +154,7 @@ private module Cached { ( nodeTo instanceof InoutReturnNode implies - nodeTo.(InoutReturnNode).getParameter() = def.getSourceVariable() + nodeTo.(InoutReturnNode).getParameter() = def.getSourceVariable().asVarDecl() ) or // use-use flow @@ -198,6 +217,11 @@ private module Cached { nodeFrom.asPattern().(TypedPattern).getSubPattern() ] or + // Flow from the unique parameter of a key path expression to + // the first component in the chain. + nodeTo.(KeyPathComponentNodeImpl).getComponent() = + nodeFrom.(KeyPathParameterNode).getComponent(0) + or // flow through a flow summary (extension of `SummaryModelCsv`) FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, true) } @@ -311,6 +335,28 @@ private module ParameterNodes { override DataFlowCallable getEnclosingCallable() { this.isParameterOf(result, _) } } + + class KeyPathParameterNode extends ParameterNodeImpl, TKeyPathParameterNode { + private EntryNode entry; + + KeyPathParameterNode() { this = TKeyPathParameterNode(entry) } + + override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { + c.asSourceCallable() = entry.getScope() and pos = TThisParameter() + } + + override Location getLocationImpl() { result = entry.getLocation() } + + override string toStringImpl() { result = entry.toString() } + + override DataFlowCallable getEnclosingCallable() { this.isParameterOf(result, _) } + + KeyPathComponent getComponent(int i) { result = entry.getScope().(KeyPathExpr).getComponent(i) } + + KeyPathComponent getAComponent() { result = this.getComponent(_) } + + KeyPathExpr getKeyPathExpr() { result = entry.getScope() } + } } import ParameterNodes @@ -412,6 +458,17 @@ private module ArgumentNodes { FlowSummaryImpl::Private::summaryArgumentNode(call, this, pos) } } + + class KeyPathArgumentNode extends ExprNode, ArgumentNode { + private KeyPathApplicationExprCfgNode keyPath; + + KeyPathArgumentNode() { keyPath.getBase() = this.getCfgNode() } + + override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { + call.asKeyPath() = keyPath and + pos = TThisArgument() + } + } } import ArgumentNodes @@ -474,6 +531,24 @@ private module ReturnNodes { override ReturnKind getKind() { result = rk } } + + class KeyPathReturnNodeImpl extends ReturnNode, TKeyPathReturnNode, NodeImpl { + ExitNode exit; + + KeyPathReturnNodeImpl() { this = TKeyPathReturnNode(exit) } + + override ReturnKind getKind() { result instanceof NormalReturnKind } + + override ControlFlowNode getCfgNode() { result = exit } + + override DataFlowCallable getEnclosingCallable() { result.asSourceCallable() = exit.getScope() } + + override Location getLocationImpl() { result = exit.getLocation() } + + override string toStringImpl() { result = exit.toString() } + + KeyPathExpr getKeyPathExpr() { result = exit.getScope() } + } } import ReturnNodes @@ -495,6 +570,16 @@ private module OutNodes { } } + class KeyPathOutNode extends OutNode, ExprNodeImpl { + KeyPathApplicationExprCfgNode keyPath; + + KeyPathOutNode() { keyPath = this.getCfgNode() } + + override DataFlowCall getCall(ReturnKind kind) { + result.asKeyPath() = keyPath and kind instanceof NormalReturnKind + } + } + class SummaryOutNode extends OutNode, SummaryNode { SummaryOutNode() { FlowSummaryImpl::Private::summaryOutNode(_, this, _) } @@ -658,6 +743,20 @@ predicate readStep(Node node1, ContentSet c, Node node2) { node2.asPattern() = pat.getSubPattern() and c instanceof OptionalSomeContentSet ) + or + // read of a component in a key-path expression chain + exists(KeyPathComponent component, FieldDecl f | + component = node1.(KeyPathComponentNodeImpl).getComponent() and + f = component.getDeclRef() and + c.isSingleton(any(Content::FieldContent ct | ct.getField() = f)) + | + // the next node is either the next element in the chain + node2.(KeyPathComponentNodeImpl).getComponent() = component.getNextComponent() + or + // or the return node, if this is the last component in the chain + not exists(component.getNextComponent()) and + node2.(KeyPathReturnNodeImpl).getKeyPathExpr() = component.getKeyPathExpr() + ) } /** @@ -703,7 +802,7 @@ DataFlowType getNodeType(NodeImpl n) { } /** Gets a string representation of a `DataFlowType`. */ -string ppReprType(DataFlowType t) { result = t.toString() } +string ppReprType(DataFlowType t) { none() } /** * Holds if `t1` and `t2` are compatible, that is, whether data can flow from @@ -786,6 +885,9 @@ predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { or kind = TLambdaCallKind() and receiver = call.(SummaryCall).getReceiver() + or + kind = TLambdaCallKind() and + receiver.asExpr() = call.asKeyPath().getExpr().(KeyPathApplicationExpr).getKeyPath() } /** Extra data-flow steps needed for lambda flow analysis. */ diff --git a/swift/ql/lib/codeql/swift/elements/AstNode.qll b/swift/ql/lib/codeql/swift/elements/AstNode.qll index e6dca824a21..edbdae81a52 100644 --- a/swift/ql/lib/codeql/swift/elements/AstNode.qll +++ b/swift/ql/lib/codeql/swift/elements/AstNode.qll @@ -1,6 +1,8 @@ private import codeql.swift.generated.AstNode private import codeql.swift.elements.decl.AbstractFunctionDecl private import codeql.swift.elements.decl.Decl +private import codeql.swift.elements.expr.AbstractClosureExpr +private import codeql.swift.elements.Callable private import codeql.swift.generated.ParentChild private module Cached { @@ -21,10 +23,59 @@ private module Cached { AbstractFunctionDecl getEnclosingFunction(AstNode ast) { result = getEnclosingFunctionStep*(getEnclosingDecl(ast)) } + + private Element getEnclosingClosureStep(Element e) { + not e instanceof Callable and + result = getImmediateParent(e) + } + + cached + AbstractClosureExpr getEnclosingClosure(AstNode ast) { + result = getEnclosingClosureStep*(getImmediateParent(ast)) + } } +/** + * A node in the abstract syntax tree. + */ class AstNode extends Generated::AstNode { + /** + * Gets the nearest function definition that contains this AST node, if any. + * This includes functions, methods, (de)initializers, and accessors, but not closures. + * + * For example, in the following code, the AST node for `n + 1` has `foo` as its + * enclosing function (via `getEnclosingFunction`), whereas its enclosing callable is + * the closure `{(n : Int) in n + 1 }` (via `getEnclosingCallable`): + * + * ```swift + * func foo() { + * var f = { (n : Int) in n + 1 } + * } + * ``` + */ final AbstractFunctionDecl getEnclosingFunction() { result = Cached::getEnclosingFunction(this) } + /** + * Gets the nearest declaration that contains this AST node, if any. + */ final Decl getEnclosingDecl() { result = Cached::getEnclosingDecl(this) } + + /** + * Gets the nearest `Callable` that contains this AST node, if any. + * This includes (auto)closures, functions, methods, (de)initializers, and accessors. + * + * For example, in the following code, the AST node for `n + 1` has the closure + * `{(n : Int) in n + 1 }` as its enclosing callable. + * + * ```swift + * func foo() { + * var f = { (n : Int) in n + 1 } + * } + * ``` + */ + final Callable getEnclosingCallable() { + if exists(Cached::getEnclosingClosure(this)) + then result = Cached::getEnclosingClosure(this) + else result = Cached::getEnclosingFunction(this) + } } diff --git a/swift/ql/lib/codeql/swift/elements/KeyPathComponent.qll b/swift/ql/lib/codeql/swift/elements/KeyPathComponent.qll index e8ce561c84b..f2580c08426 100644 --- a/swift/ql/lib/codeql/swift/elements/KeyPathComponent.qll +++ b/swift/ql/lib/codeql/swift/elements/KeyPathComponent.qll @@ -1,4 +1,5 @@ private import codeql.swift.generated.KeyPathComponent +private import swift class KeyPathComponent extends Generated::KeyPathComponent { /** @@ -35,4 +36,23 @@ class KeyPathComponent extends Generated::KeyPathComponent { * Tuple indexing like `.1`. */ predicate isTupleIndexing() { getKind() = 9 } + + /** Gets the underlying key-path expression which this is a component of. */ + KeyPathExpr getKeyPathExpr() { result.getAComponent() = this } + + /** Holds if this component is the i'th component of the underling key-path expression. */ + predicate hasIndex(int i) { any(KeyPathExpr e).getComponent(i) = this } + + /** Gets the next component of the underlying key-path expression. */ + KeyPathComponent getNextComponent() { + exists(int i, KeyPathExpr e | + hasKeyPathExprAndIndex(e, i, this) and + hasKeyPathExprAndIndex(e, i + 1, result) + ) + } +} + +pragma[nomagic] +private predicate hasKeyPathExprAndIndex(KeyPathExpr e, int i, KeyPathComponent c) { + e.getComponent(i) = c } diff --git a/swift/ql/lib/codeql/swift/elements/decl/CapturedDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/CapturedDecl.qll index be5b7fae11a..fe9ea0ed32b 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/CapturedDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/CapturedDecl.qll @@ -1,5 +1,23 @@ private import codeql.swift.generated.decl.CapturedDecl +private import codeql.swift.elements.Callable +private import codeql.swift.elements.expr.DeclRefExpr +/** + * A captured variable or function parameter in the scope of a closure. + */ class CapturedDecl extends Generated::CapturedDecl { override string toString() { result = this.getDecl().toString() } + + /** + * Gets the closure or function that captures this variable. + */ + Callable getScope() { result.getACapture() = this } + + /** + * Get an access to this capture within the scope of its closure. + */ + DeclRefExpr getAnAccess() { + result.getEnclosingCallable() = this.getScope() and + result.getDecl() = this.getDecl() + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll index b8cb7ffc0d8..47dcfe04ac1 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll @@ -2,6 +2,9 @@ private import codeql.swift.generated.decl.ExtensionDecl class ExtensionDecl extends Generated::ExtensionDecl { override string toString() { - result = "extension" // TODO: Once we extract the name of this one we can provide a better `toString`. + result = "extension of " + getExtendedTypeDecl().toString() + or + not exists(getExtendedTypeDecl()) and + result = "extension" } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/ValueDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/ValueDecl.qll index 4c3e6d83007..4598815fcec 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/ValueDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/ValueDecl.qll @@ -1,4 +1,23 @@ -// generated by codegen/codegen.py, remove this comment if you wish to edit this file private import codeql.swift.generated.decl.ValueDecl +private import codeql.swift.elements.decl.CapturedDecl +private import codeql.swift.elements.expr.DeclRefExpr -class ValueDecl extends Generated::ValueDecl { } +/** + * A declaration that introduces a value with a type. + */ +class ValueDecl extends Generated::ValueDecl { + /** + * Gets a capture of this declaration in the scope of a closure. + */ + CapturedDecl asCapturedDecl() { result.getDecl() = this } + + /** + * Holds if this declaration is captured by a closure. + */ + predicate isCaptured() { exists(this.asCapturedDecl()) } + + /** + * Gets an expression that references this declaration. + */ + DeclRefExpr getAnAccess() { result.getDecl() = this } +} diff --git a/swift/ql/lib/codeql/swift/elements/decl/VarDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/VarDecl.qll index 0bc74d7b34a..ca650d12407 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/VarDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/VarDecl.qll @@ -1,13 +1,16 @@ private import codeql.swift.generated.decl.VarDecl -private import codeql.swift.elements.expr.DeclRefExpr private import codeql.swift.elements.decl.Decl +/** + * A variable declaration. + */ class VarDecl extends Generated::VarDecl { override string toString() { result = this.getName() } - - DeclRefExpr getAnAccess() { result.getDecl() = this } } +/** + * A field declaration. + */ class FieldDecl extends VarDecl { FieldDecl() { this = any(Decl ctx).getAMember() } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/DeclRefExpr.qll b/swift/ql/lib/codeql/swift/elements/expr/DeclRefExpr.qll index 683bd542880..8493f85d3c7 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DeclRefExpr.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DeclRefExpr.qll @@ -1,9 +1,23 @@ private import codeql.swift.generated.expr.DeclRefExpr +private import codeql.swift.elements.decl.CapturedDecl +/** + * An expression that references or accesses a declaration. + */ class DeclRefExpr extends Generated::DeclRefExpr { override string toString() { if exists(this.getDecl().toString()) then result = this.getDecl().toString() else result = "(unknown declaration)" } + + /** + * Gets the closure capture referenced by this expression, if any. + */ + CapturedDecl getCapturedDecl() { result.getAnAccess() = this } + + /** + * Holds if this expression references a closure capture. + */ + predicate hasCapturedDecl() { exists(this.getCapturedDecl()) } } diff --git a/swift/ql/lib/codeql/swift/generated/Raw.qll b/swift/ql/lib/codeql/swift/generated/Raw.qll index d307b3e53fb..7a13a82dbcd 100644 --- a/swift/ql/lib/codeql/swift/generated/Raw.qll +++ b/swift/ql/lib/codeql/swift/generated/Raw.qll @@ -1,4 +1,11 @@ +/** + * INTERNAL: Do not use. + * This module holds thin fully generated class definitions around DB entities. + */ module Raw { + /** + * INTERNAL: Do not use. + */ class Element extends @element { string toString() { none() } @@ -8,6 +15,9 @@ module Raw { predicate isUnknown() { element_is_unknown(this) } } + /** + * INTERNAL: Do not use. + */ class Callable extends @callable, Element { /** * Gets the name of this callable, if it exists. @@ -37,6 +47,9 @@ module Raw { CapturedDecl getCapture(int index) { callable_captures(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class File extends @file, Element { /** * Gets the name of this file. @@ -49,6 +62,9 @@ module Raw { predicate isSuccessfullyExtracted() { file_is_successfully_extracted(this) } } + /** + * INTERNAL: Do not use. + */ class Locatable extends @locatable, Element { /** * Gets the location associated with this element in the code, if it exists. @@ -56,6 +72,9 @@ module Raw { Location getLocation() { locatable_locations(this, result) } } + /** + * INTERNAL: Do not use. + */ class Location extends @location, Element { /** * Gets the file of this location. @@ -83,8 +102,14 @@ module Raw { int getEndColumn() { locations(this, _, _, _, _, result) } } + /** + * INTERNAL: Do not use. + */ class AstNode extends @ast_node, Locatable { } + /** + * INTERNAL: Do not use. + */ class Comment extends @comment, Locatable { override string toString() { result = "Comment" } @@ -94,14 +119,23 @@ module Raw { string getText() { comments(this, result) } } + /** + * INTERNAL: Do not use. + */ class DbFile extends @db_file, File { override string toString() { result = "DbFile" } } + /** + * INTERNAL: Do not use. + */ class DbLocation extends @db_location, Location { override string toString() { result = "DbLocation" } } + /** + * INTERNAL: Do not use. + */ class Diagnostics extends @diagnostics, Locatable { override string toString() { result = "Diagnostics" } @@ -116,8 +150,28 @@ module Raw { int getKind() { diagnostics(this, _, result) } } + /** + * INTERNAL: Do not use. + * The superclass of all elements indicating some kind of error. + */ class ErrorElement extends @error_element, Locatable { } + /** + * INTERNAL: Do not use. + * An availability condition of an `if`, `while`, or `guard` statements. + * + * Examples: + * ``` + * if #available(iOS 12, *) { + * // Runs on iOS 12 and above + * } else { + * // Runs only anything below iOS 12 + * } + * if #unavailable(macOS 10.14, *) { + * // Runs only on macOS 10 and below + * } + * ``` + */ class AvailabilityInfo extends @availability_info, AstNode { override string toString() { result = "AvailabilityInfo" } @@ -132,8 +186,19 @@ module Raw { AvailabilitySpec getSpec(int index) { availability_info_specs(this, index, result) } } + /** + * INTERNAL: Do not use. + * An availability spec, that is, part of an `AvailabilityInfo` condition. For example `iOS 12` and `*` in: + * ``` + * if #available(iOS 12, *) + * ``` + */ class AvailabilitySpec extends @availability_spec, AstNode { } + /** + * INTERNAL: Do not use. + * A component of a `KeyPathExpr`. + */ class KeyPathComponent extends @key_path_component, AstNode { override string toString() { result = "KeyPathComponent" } @@ -179,6 +244,9 @@ module Raw { Type getComponentType() { key_path_components(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class UnspecifiedElement extends @unspecified_element, ErrorElement { override string toString() { result = "UnspecifiedElement" } @@ -203,10 +271,18 @@ module Raw { string getError() { unspecified_elements(this, _, result) } } + /** + * INTERNAL: Do not use. + * A wildcard availability spec `*` + */ class OtherAvailabilitySpec extends @other_availability_spec, AvailabilitySpec { override string toString() { result = "OtherAvailabilitySpec" } } + /** + * INTERNAL: Do not use. + * An availability spec based on platform and version, for example `macOS 12` or `watchOS 14` + */ class PlatformVersionAvailabilitySpec extends @platform_version_availability_spec, AvailabilitySpec { @@ -223,6 +299,9 @@ module Raw { string getVersion() { platform_version_availability_specs(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class Decl extends @decl, AstNode { /** * Gets the module of this declaration. @@ -235,6 +314,9 @@ module Raw { Decl getMember(int index) { decl_members(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class GenericContext extends @generic_context, Element { /** * Gets the `index`th generic type parameter of this generic context (0-based). @@ -244,6 +326,9 @@ module Raw { } } + /** + * INTERNAL: Do not use. + */ class CapturedDecl extends @captured_decl, Decl { override string toString() { result = "CapturedDecl" } @@ -263,6 +348,9 @@ module Raw { predicate isEscaping() { captured_decl_is_escaping(this) } } + /** + * INTERNAL: Do not use. + */ class EnumCaseDecl extends @enum_case_decl, Decl { override string toString() { result = "EnumCaseDecl" } @@ -272,6 +360,9 @@ module Raw { EnumElementDecl getElement(int index) { enum_case_decl_elements(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class ExtensionDecl extends @extension_decl, GenericContext, Decl { override string toString() { result = "ExtensionDecl" } @@ -286,6 +377,9 @@ module Raw { ProtocolDecl getProtocol(int index) { extension_decl_protocols(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class IfConfigDecl extends @if_config_decl, Decl { override string toString() { result = "IfConfigDecl" } @@ -295,6 +389,9 @@ module Raw { AstNode getActiveElement(int index) { if_config_decl_active_elements(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class ImportDecl extends @import_decl, Decl { override string toString() { result = "ImportDecl" } @@ -314,6 +411,10 @@ module Raw { ValueDecl getDeclaration(int index) { import_decl_declarations(this, index, result) } } + /** + * INTERNAL: Do not use. + * A placeholder for missing declarations that can arise on object deserialization. + */ class MissingMemberDecl extends @missing_member_decl, Decl { override string toString() { result = "MissingMemberDecl" } @@ -323,6 +424,9 @@ module Raw { string getName() { missing_member_decls(this, result) } } + /** + * INTERNAL: Do not use. + */ class OperatorDecl extends @operator_decl, Decl { /** * Gets the name of this operator declaration. @@ -330,6 +434,9 @@ module Raw { string getName() { operator_decls(this, result) } } + /** + * INTERNAL: Do not use. + */ class PatternBindingDecl extends @pattern_binding_decl, Decl { override string toString() { result = "PatternBindingDecl" } @@ -344,6 +451,10 @@ module Raw { Pattern getPattern(int index) { pattern_binding_decl_patterns(this, index, result) } } + /** + * INTERNAL: Do not use. + * A diagnostic directive, which is either `#error` or `#warning`. + */ class PoundDiagnosticDecl extends @pound_diagnostic_decl, Decl { override string toString() { result = "PoundDiagnosticDecl" } @@ -360,10 +471,16 @@ module Raw { StringLiteralExpr getMessage() { pound_diagnostic_decls(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class PrecedenceGroupDecl extends @precedence_group_decl, Decl { override string toString() { result = "PrecedenceGroupDecl" } } + /** + * INTERNAL: Do not use. + */ class TopLevelCodeDecl extends @top_level_code_decl, Decl { override string toString() { result = "TopLevelCodeDecl" } @@ -373,6 +490,9 @@ module Raw { BraceStmt getBody() { top_level_code_decls(this, result) } } + /** + * INTERNAL: Do not use. + */ class ValueDecl extends @value_decl, Decl { /** * Gets the interface type of this value declaration. @@ -380,9 +500,15 @@ module Raw { Type getInterfaceType() { value_decls(this, result) } } + /** + * INTERNAL: Do not use. + */ class AbstractFunctionDecl extends @abstract_function_decl, GenericContext, ValueDecl, Callable { } + /** + * INTERNAL: Do not use. + */ class AbstractStorageDecl extends @abstract_storage_decl, ValueDecl { /** * Gets the `index`th accessor declaration of this abstract storage declaration (0-based). @@ -392,6 +518,9 @@ module Raw { } } + /** + * INTERNAL: Do not use. + */ class EnumElementDecl extends @enum_element_decl, ValueDecl { override string toString() { result = "EnumElementDecl" } @@ -406,6 +535,9 @@ module Raw { ParamDecl getParam(int index) { enum_element_decl_params(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class InfixOperatorDecl extends @infix_operator_decl, OperatorDecl { override string toString() { result = "InfixOperatorDecl" } @@ -415,14 +547,23 @@ module Raw { PrecedenceGroupDecl getPrecedenceGroup() { infix_operator_decl_precedence_groups(this, result) } } + /** + * INTERNAL: Do not use. + */ class PostfixOperatorDecl extends @postfix_operator_decl, OperatorDecl { override string toString() { result = "PostfixOperatorDecl" } } + /** + * INTERNAL: Do not use. + */ class PrefixOperatorDecl extends @prefix_operator_decl, OperatorDecl { override string toString() { result = "PrefixOperatorDecl" } } + /** + * INTERNAL: Do not use. + */ class TypeDecl extends @type_decl, ValueDecl { /** * Gets the name of this type declaration. @@ -435,20 +576,38 @@ module Raw { Type getBaseType(int index) { type_decl_base_types(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class AbstractTypeParamDecl extends @abstract_type_param_decl, TypeDecl { } + /** + * INTERNAL: Do not use. + */ class ConstructorDecl extends @constructor_decl, AbstractFunctionDecl { override string toString() { result = "ConstructorDecl" } } + /** + * INTERNAL: Do not use. + */ class DestructorDecl extends @destructor_decl, AbstractFunctionDecl { override string toString() { result = "DestructorDecl" } } + /** + * INTERNAL: Do not use. + */ class FuncDecl extends @func_decl, AbstractFunctionDecl { } + /** + * INTERNAL: Do not use. + */ class GenericTypeDecl extends @generic_type_decl, GenericContext, TypeDecl { } + /** + * INTERNAL: Do not use. + */ class ModuleDecl extends @module_decl, TypeDecl { override string toString() { result = "ModuleDecl" } @@ -475,6 +634,9 @@ module Raw { ModuleDecl getAnExportedModule() { module_decl_exported_modules(this, result) } } + /** + * INTERNAL: Do not use. + */ class SubscriptDecl extends @subscript_decl, AbstractStorageDecl, GenericContext { override string toString() { result = "SubscriptDecl" } @@ -489,6 +651,25 @@ module Raw { Type getElementType() { subscript_decls(this, result) } } + /** + * INTERNAL: Do not use. + * A declaration of a variable such as + * * a local variable in a function: + * ``` + * func foo() { + * var x = 42 // <- + * let y = "hello" // <- + * ... + * } + * ``` + * * a member of a `struct` or `class`: + * ``` + * struct S { + * var size : Int // <- + * } + * ``` + * * ... + */ class VarDecl extends @var_decl, AbstractStorageDecl { /** * Gets the name of this variable declaration. @@ -586,6 +767,9 @@ module Raw { } } + /** + * INTERNAL: Do not use. + */ class AccessorDecl extends @accessor_decl, FuncDecl { override string toString() { result = "AccessorDecl" } @@ -630,14 +814,23 @@ module Raw { predicate isUnsafeMutableAddress() { accessor_decl_is_unsafe_mutable_address(this) } } + /** + * INTERNAL: Do not use. + */ class AssociatedTypeDecl extends @associated_type_decl, AbstractTypeParamDecl { override string toString() { result = "AssociatedTypeDecl" } } + /** + * INTERNAL: Do not use. + */ class ConcreteFuncDecl extends @concrete_func_decl, FuncDecl { override string toString() { result = "ConcreteFuncDecl" } } + /** + * INTERNAL: Do not use. + */ class ConcreteVarDecl extends @concrete_var_decl, VarDecl { override string toString() { result = "ConcreteVarDecl" } @@ -649,10 +842,16 @@ module Raw { int getIntroducerInt() { concrete_var_decls(this, result) } } + /** + * INTERNAL: Do not use. + */ class GenericTypeParamDecl extends @generic_type_param_decl, AbstractTypeParamDecl { override string toString() { result = "GenericTypeParamDecl" } } + /** + * INTERNAL: Do not use. + */ class NominalTypeDecl extends @nominal_type_decl, GenericTypeDecl { /** * Gets the type of this nominal type declaration. @@ -660,6 +859,18 @@ module Raw { Type getType() { nominal_type_decls(this, result) } } + /** + * INTERNAL: Do not use. + * A declaration of an opaque type, that is formally equivalent to a given type but abstracts it + * away. + * + * Such a declaration is implicitly given when a declaration is written with an opaque result type, + * for example + * ``` + * func opaque() -> some SignedInteger { return 1 } + * ``` + * See https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html. + */ class OpaqueTypeDecl extends @opaque_type_decl, GenericTypeDecl { override string toString() { result = "OpaqueTypeDecl" } @@ -676,6 +887,9 @@ module Raw { } } + /** + * INTERNAL: Do not use. + */ class ParamDecl extends @param_decl, VarDecl { override string toString() { result = "ParamDecl" } @@ -705,6 +919,13 @@ module Raw { } } + /** + * INTERNAL: Do not use. + * A declaration of a type alias to another type. For example: + * ``` + * typealias MyInt = Int + * ``` + */ class TypeAliasDecl extends @type_alias_decl, GenericTypeDecl { override string toString() { result = "TypeAliasDecl" } @@ -719,22 +940,37 @@ module Raw { Type getAliasedType() { type_alias_decls(this, result) } } + /** + * INTERNAL: Do not use. + */ class ClassDecl extends @class_decl, NominalTypeDecl { override string toString() { result = "ClassDecl" } } + /** + * INTERNAL: Do not use. + */ class EnumDecl extends @enum_decl, NominalTypeDecl { override string toString() { result = "EnumDecl" } } + /** + * INTERNAL: Do not use. + */ class ProtocolDecl extends @protocol_decl, NominalTypeDecl { override string toString() { result = "ProtocolDecl" } } + /** + * INTERNAL: Do not use. + */ class StructDecl extends @struct_decl, NominalTypeDecl { override string toString() { result = "StructDecl" } } + /** + * INTERNAL: Do not use. + */ class Argument extends @argument, Locatable { override string toString() { result = "Argument" } @@ -749,6 +985,10 @@ module Raw { Expr getExpr() { arguments(this, _, result) } } + /** + * INTERNAL: Do not use. + * The base class for all expressions in Swift. + */ class Expr extends @expr, AstNode { /** * Gets the type of this expression, if it exists. @@ -756,8 +996,14 @@ module Raw { Type getType() { expr_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class AbstractClosureExpr extends @abstract_closure_expr, Expr, Callable { } + /** + * INTERNAL: Do not use. + */ class AnyTryExpr extends @any_try_expr, Expr { /** * Gets the sub expression of this any try expression. @@ -765,6 +1011,10 @@ module Raw { Expr getSubExpr() { any_try_exprs(this, result) } } + /** + * INTERNAL: Do not use. + * An implicit application of a property wrapper on the argument of a call. + */ class AppliedPropertyWrapperExpr extends @applied_property_wrapper_expr, Expr { override string toString() { result = "AppliedPropertyWrapperExpr" } @@ -788,6 +1038,9 @@ module Raw { ParamDecl getParam() { applied_property_wrapper_exprs(this, _, _, result) } } + /** + * INTERNAL: Do not use. + */ class ApplyExpr extends @apply_expr, Expr { /** * Gets the function being applied. @@ -800,6 +1053,9 @@ module Raw { Argument getArgument(int index) { apply_expr_arguments(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class AssignExpr extends @assign_expr, Expr { override string toString() { result = "AssignExpr" } @@ -814,6 +1070,9 @@ module Raw { Expr getSource() { assign_exprs(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class BindOptionalExpr extends @bind_optional_expr, Expr { override string toString() { result = "BindOptionalExpr" } @@ -823,6 +1082,9 @@ module Raw { Expr getSubExpr() { bind_optional_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class CaptureListExpr extends @capture_list_expr, Expr { override string toString() { result = "CaptureListExpr" } @@ -839,8 +1101,14 @@ module Raw { ClosureExpr getClosureBody() { capture_list_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class CollectionExpr extends @collection_expr, Expr { } + /** + * INTERNAL: Do not use. + */ class DeclRefExpr extends @decl_ref_expr, Expr { override string toString() { result = "DeclRefExpr" } @@ -877,6 +1145,9 @@ module Raw { predicate hasDistributedThunkSemantics() { decl_ref_expr_has_distributed_thunk_semantics(this) } } + /** + * INTERNAL: Do not use. + */ class DefaultArgumentExpr extends @default_argument_expr, Expr { override string toString() { result = "DefaultArgumentExpr" } @@ -896,10 +1167,16 @@ module Raw { Expr getCallerSideDefault() { default_argument_expr_caller_side_defaults(this, result) } } + /** + * INTERNAL: Do not use. + */ class DiscardAssignmentExpr extends @discard_assignment_expr, Expr { override string toString() { result = "DiscardAssignmentExpr" } } + /** + * INTERNAL: Do not use. + */ class DotSyntaxBaseIgnoredExpr extends @dot_syntax_base_ignored_expr, Expr { override string toString() { result = "DotSyntaxBaseIgnoredExpr" } @@ -914,6 +1191,9 @@ module Raw { Expr getSubExpr() { dot_syntax_base_ignored_exprs(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class DynamicTypeExpr extends @dynamic_type_expr, Expr { override string toString() { result = "DynamicTypeExpr" } @@ -923,6 +1203,9 @@ module Raw { Expr getBase() { dynamic_type_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class EnumIsCaseExpr extends @enum_is_case_expr, Expr { override string toString() { result = "EnumIsCaseExpr" } @@ -937,10 +1220,16 @@ module Raw { EnumElementDecl getElement() { enum_is_case_exprs(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class ErrorExpr extends @error_expr, Expr, ErrorElement { override string toString() { result = "ErrorExpr" } } + /** + * INTERNAL: Do not use. + */ class ExplicitCastExpr extends @explicit_cast_expr, Expr { /** * Gets the sub expression of this explicit cast expression. @@ -948,6 +1237,9 @@ module Raw { Expr getSubExpr() { explicit_cast_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class ForceValueExpr extends @force_value_expr, Expr { override string toString() { result = "ForceValueExpr" } @@ -957,6 +1249,9 @@ module Raw { Expr getSubExpr() { force_value_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class IdentityExpr extends @identity_expr, Expr { /** * Gets the sub expression of this identity expression. @@ -964,6 +1259,9 @@ module Raw { Expr getSubExpr() { identity_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class IfExpr extends @if_expr, Expr { override string toString() { result = "IfExpr" } @@ -983,6 +1281,9 @@ module Raw { Expr getElseExpr() { if_exprs(this, _, _, result) } } + /** + * INTERNAL: Do not use. + */ class ImplicitConversionExpr extends @implicit_conversion_expr, Expr { /** * Gets the sub expression of this implicit conversion expression. @@ -990,6 +1291,9 @@ module Raw { Expr getSubExpr() { implicit_conversion_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class InOutExpr extends @in_out_expr, Expr { override string toString() { result = "InOutExpr" } @@ -999,6 +1303,9 @@ module Raw { Expr getSubExpr() { in_out_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class KeyPathApplicationExpr extends @key_path_application_expr, Expr { override string toString() { result = "KeyPathApplicationExpr" } @@ -1013,10 +1320,17 @@ module Raw { Expr getKeyPath() { key_path_application_exprs(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class KeyPathDotExpr extends @key_path_dot_expr, Expr { override string toString() { result = "KeyPathDotExpr" } } + /** + * INTERNAL: Do not use. + * A key-path expression. + */ class KeyPathExpr extends @key_path_expr, Expr { override string toString() { result = "KeyPathExpr" } @@ -1031,6 +1345,9 @@ module Raw { KeyPathComponent getComponent(int index) { key_path_expr_components(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class LazyInitializerExpr extends @lazy_initializer_expr, Expr { override string toString() { result = "LazyInitializerExpr" } @@ -1040,8 +1357,14 @@ module Raw { Expr getSubExpr() { lazy_initializer_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class LiteralExpr extends @literal_expr, Expr { } + /** + * INTERNAL: Do not use. + */ class LookupExpr extends @lookup_expr, Expr { /** * Gets the base of this lookup expression. @@ -1054,6 +1377,9 @@ module Raw { Decl getMember() { lookup_expr_members(this, result) } } + /** + * INTERNAL: Do not use. + */ class MakeTemporarilyEscapableExpr extends @make_temporarily_escapable_expr, Expr { override string toString() { result = "MakeTemporarilyEscapableExpr" } @@ -1073,6 +1399,9 @@ module Raw { Expr getSubExpr() { make_temporarily_escapable_exprs(this, _, _, result) } } + /** + * INTERNAL: Do not use. + */ class ObjCSelectorExpr extends @obj_c_selector_expr, Expr { override string toString() { result = "ObjCSelectorExpr" } @@ -1087,6 +1416,9 @@ module Raw { AbstractFunctionDecl getMethod() { obj_c_selector_exprs(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class OneWayExpr extends @one_way_expr, Expr { override string toString() { result = "OneWayExpr" } @@ -1096,10 +1428,16 @@ module Raw { Expr getSubExpr() { one_way_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class OpaqueValueExpr extends @opaque_value_expr, Expr { override string toString() { result = "OpaqueValueExpr" } } + /** + * INTERNAL: Do not use. + */ class OpenExistentialExpr extends @open_existential_expr, Expr { override string toString() { result = "OpenExistentialExpr" } @@ -1119,6 +1457,9 @@ module Raw { OpaqueValueExpr getOpaqueExpr() { open_existential_exprs(this, _, _, result) } } + /** + * INTERNAL: Do not use. + */ class OptionalEvaluationExpr extends @optional_evaluation_expr, Expr { override string toString() { result = "OptionalEvaluationExpr" } @@ -1128,6 +1469,9 @@ module Raw { Expr getSubExpr() { optional_evaluation_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class OtherConstructorDeclRefExpr extends @other_constructor_decl_ref_expr, Expr { override string toString() { result = "OtherConstructorDeclRefExpr" } @@ -1137,6 +1481,11 @@ module Raw { ConstructorDecl getConstructorDecl() { other_constructor_decl_ref_exprs(this, result) } } + /** + * INTERNAL: Do not use. + * An ambiguous expression that might refer to multiple declarations. This will be present only + * for failing compilations. + */ class OverloadedDeclRefExpr extends @overloaded_decl_ref_expr, Expr, ErrorElement { override string toString() { result = "OverloadedDeclRefExpr" } @@ -1148,6 +1497,11 @@ module Raw { } } + /** + * INTERNAL: Do not use. + * A placeholder substituting property initializations with `=` when the property has a property + * wrapper with an initializer. + */ class PropertyWrapperValuePlaceholderExpr extends @property_wrapper_value_placeholder_expr, Expr { override string toString() { result = "PropertyWrapperValuePlaceholderExpr" } @@ -1162,6 +1516,9 @@ module Raw { OpaqueValueExpr getPlaceholder() { property_wrapper_value_placeholder_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class RebindSelfInConstructorExpr extends @rebind_self_in_constructor_expr, Expr { override string toString() { result = "RebindSelfInConstructorExpr" } @@ -1176,6 +1533,9 @@ module Raw { VarDecl getSelf() { rebind_self_in_constructor_exprs(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class SequenceExpr extends @sequence_expr, Expr { override string toString() { result = "SequenceExpr" } @@ -1185,6 +1545,9 @@ module Raw { Expr getElement(int index) { sequence_expr_elements(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class SuperRefExpr extends @super_ref_expr, Expr { override string toString() { result = "SuperRefExpr" } @@ -1194,6 +1557,9 @@ module Raw { VarDecl getSelf() { super_ref_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class TapExpr extends @tap_expr, Expr { override string toString() { result = "TapExpr" } @@ -1213,6 +1579,9 @@ module Raw { VarDecl getVar() { tap_exprs(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class TupleElementExpr extends @tuple_element_expr, Expr { override string toString() { result = "TupleElementExpr" } @@ -1227,6 +1596,9 @@ module Raw { int getIndex() { tuple_element_exprs(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class TupleExpr extends @tuple_expr, Expr { override string toString() { result = "TupleExpr" } @@ -1236,6 +1608,9 @@ module Raw { Expr getElement(int index) { tuple_expr_elements(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class TypeExpr extends @type_expr, Expr { override string toString() { result = "TypeExpr" } @@ -1245,6 +1620,9 @@ module Raw { TypeRepr getTypeRepr() { type_expr_type_reprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class UnresolvedDeclRefExpr extends @unresolved_decl_ref_expr, Expr, ErrorElement { override string toString() { result = "UnresolvedDeclRefExpr" } @@ -1254,6 +1632,9 @@ module Raw { string getName() { unresolved_decl_ref_expr_names(this, result) } } + /** + * INTERNAL: Do not use. + */ class UnresolvedDotExpr extends @unresolved_dot_expr, Expr, ErrorElement { override string toString() { result = "UnresolvedDotExpr" } @@ -1268,6 +1649,9 @@ module Raw { string getName() { unresolved_dot_exprs(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class UnresolvedMemberExpr extends @unresolved_member_expr, Expr, ErrorElement { override string toString() { result = "UnresolvedMemberExpr" } @@ -1277,6 +1661,9 @@ module Raw { string getName() { unresolved_member_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class UnresolvedPatternExpr extends @unresolved_pattern_expr, Expr, ErrorElement { override string toString() { result = "UnresolvedPatternExpr" } @@ -1286,6 +1673,9 @@ module Raw { Pattern getSubPattern() { unresolved_pattern_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class UnresolvedSpecializeExpr extends @unresolved_specialize_expr, Expr, ErrorElement { override string toString() { result = "UnresolvedSpecializeExpr" } @@ -1295,6 +1685,9 @@ module Raw { Expr getSubExpr() { unresolved_specialize_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class VarargExpansionExpr extends @vararg_expansion_expr, Expr { override string toString() { result = "VarargExpansionExpr" } @@ -1304,18 +1697,30 @@ module Raw { Expr getSubExpr() { vararg_expansion_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class AbiSafeConversionExpr extends @abi_safe_conversion_expr, ImplicitConversionExpr { override string toString() { result = "AbiSafeConversionExpr" } } + /** + * INTERNAL: Do not use. + */ class AnyHashableErasureExpr extends @any_hashable_erasure_expr, ImplicitConversionExpr { override string toString() { result = "AnyHashableErasureExpr" } } + /** + * INTERNAL: Do not use. + */ class ArchetypeToSuperExpr extends @archetype_to_super_expr, ImplicitConversionExpr { override string toString() { result = "ArchetypeToSuperExpr" } } + /** + * INTERNAL: Do not use. + */ class ArrayExpr extends @array_expr, CollectionExpr { override string toString() { result = "ArrayExpr" } @@ -1325,82 +1730,139 @@ module Raw { Expr getElement(int index) { array_expr_elements(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class ArrayToPointerExpr extends @array_to_pointer_expr, ImplicitConversionExpr { override string toString() { result = "ArrayToPointerExpr" } } + /** + * INTERNAL: Do not use. + */ class AutoClosureExpr extends @auto_closure_expr, AbstractClosureExpr { override string toString() { result = "AutoClosureExpr" } } + /** + * INTERNAL: Do not use. + */ class AwaitExpr extends @await_expr, IdentityExpr { override string toString() { result = "AwaitExpr" } } + /** + * INTERNAL: Do not use. + */ class BinaryExpr extends @binary_expr, ApplyExpr { override string toString() { result = "BinaryExpr" } } + /** + * INTERNAL: Do not use. + */ class BridgeFromObjCExpr extends @bridge_from_obj_c_expr, ImplicitConversionExpr { override string toString() { result = "BridgeFromObjCExpr" } } + /** + * INTERNAL: Do not use. + */ class BridgeToObjCExpr extends @bridge_to_obj_c_expr, ImplicitConversionExpr { override string toString() { result = "BridgeToObjCExpr" } } + /** + * INTERNAL: Do not use. + */ class BuiltinLiteralExpr extends @builtin_literal_expr, LiteralExpr { } + /** + * INTERNAL: Do not use. + */ class CallExpr extends @call_expr, ApplyExpr { override string toString() { result = "CallExpr" } } + /** + * INTERNAL: Do not use. + */ class CheckedCastExpr extends @checked_cast_expr, ExplicitCastExpr { } + /** + * INTERNAL: Do not use. + */ class ClassMetatypeToObjectExpr extends @class_metatype_to_object_expr, ImplicitConversionExpr { override string toString() { result = "ClassMetatypeToObjectExpr" } } + /** + * INTERNAL: Do not use. + */ class ClosureExpr extends @closure_expr, AbstractClosureExpr { override string toString() { result = "ClosureExpr" } } + /** + * INTERNAL: Do not use. + */ class CoerceExpr extends @coerce_expr, ExplicitCastExpr { override string toString() { result = "CoerceExpr" } } + /** + * INTERNAL: Do not use. + */ class CollectionUpcastConversionExpr extends @collection_upcast_conversion_expr, ImplicitConversionExpr { override string toString() { result = "CollectionUpcastConversionExpr" } } + /** + * INTERNAL: Do not use. + */ class ConditionalBridgeFromObjCExpr extends @conditional_bridge_from_obj_c_expr, ImplicitConversionExpr { override string toString() { result = "ConditionalBridgeFromObjCExpr" } } + /** + * INTERNAL: Do not use. + */ class CovariantFunctionConversionExpr extends @covariant_function_conversion_expr, ImplicitConversionExpr { override string toString() { result = "CovariantFunctionConversionExpr" } } + /** + * INTERNAL: Do not use. + */ class CovariantReturnConversionExpr extends @covariant_return_conversion_expr, ImplicitConversionExpr { override string toString() { result = "CovariantReturnConversionExpr" } } + /** + * INTERNAL: Do not use. + */ class DerivedToBaseExpr extends @derived_to_base_expr, ImplicitConversionExpr { override string toString() { result = "DerivedToBaseExpr" } } + /** + * INTERNAL: Do not use. + */ class DestructureTupleExpr extends @destructure_tuple_expr, ImplicitConversionExpr { override string toString() { result = "DestructureTupleExpr" } } + /** + * INTERNAL: Do not use. + */ class DictionaryExpr extends @dictionary_expr, CollectionExpr { override string toString() { result = "DictionaryExpr" } @@ -1410,52 +1872,88 @@ module Raw { Expr getElement(int index) { dictionary_expr_elements(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class DifferentiableFunctionExpr extends @differentiable_function_expr, ImplicitConversionExpr { override string toString() { result = "DifferentiableFunctionExpr" } } + /** + * INTERNAL: Do not use. + */ class DifferentiableFunctionExtractOriginalExpr extends @differentiable_function_extract_original_expr, ImplicitConversionExpr { override string toString() { result = "DifferentiableFunctionExtractOriginalExpr" } } + /** + * INTERNAL: Do not use. + */ class DotSelfExpr extends @dot_self_expr, IdentityExpr { override string toString() { result = "DotSelfExpr" } } + /** + * INTERNAL: Do not use. + */ class DynamicLookupExpr extends @dynamic_lookup_expr, LookupExpr { } + /** + * INTERNAL: Do not use. + */ class ErasureExpr extends @erasure_expr, ImplicitConversionExpr { override string toString() { result = "ErasureExpr" } } + /** + * INTERNAL: Do not use. + */ class ExistentialMetatypeToObjectExpr extends @existential_metatype_to_object_expr, ImplicitConversionExpr { override string toString() { result = "ExistentialMetatypeToObjectExpr" } } + /** + * INTERNAL: Do not use. + */ class ForceTryExpr extends @force_try_expr, AnyTryExpr { override string toString() { result = "ForceTryExpr" } } + /** + * INTERNAL: Do not use. + */ class ForeignObjectConversionExpr extends @foreign_object_conversion_expr, ImplicitConversionExpr { override string toString() { result = "ForeignObjectConversionExpr" } } + /** + * INTERNAL: Do not use. + */ class FunctionConversionExpr extends @function_conversion_expr, ImplicitConversionExpr { override string toString() { result = "FunctionConversionExpr" } } + /** + * INTERNAL: Do not use. + */ class InOutToPointerExpr extends @in_out_to_pointer_expr, ImplicitConversionExpr { override string toString() { result = "InOutToPointerExpr" } } + /** + * INTERNAL: Do not use. + */ class InjectIntoOptionalExpr extends @inject_into_optional_expr, ImplicitConversionExpr { override string toString() { result = "InjectIntoOptionalExpr" } } + /** + * INTERNAL: Do not use. + */ class InterpolatedStringLiteralExpr extends @interpolated_string_literal_expr, LiteralExpr { override string toString() { result = "InterpolatedStringLiteralExpr" } @@ -1486,26 +1984,41 @@ module Raw { TapExpr getAppendingExpr() { interpolated_string_literal_expr_appending_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class LinearFunctionExpr extends @linear_function_expr, ImplicitConversionExpr { override string toString() { result = "LinearFunctionExpr" } } + /** + * INTERNAL: Do not use. + */ class LinearFunctionExtractOriginalExpr extends @linear_function_extract_original_expr, ImplicitConversionExpr { override string toString() { result = "LinearFunctionExtractOriginalExpr" } } + /** + * INTERNAL: Do not use. + */ class LinearToDifferentiableFunctionExpr extends @linear_to_differentiable_function_expr, ImplicitConversionExpr { override string toString() { result = "LinearToDifferentiableFunctionExpr" } } + /** + * INTERNAL: Do not use. + */ class LoadExpr extends @load_expr, ImplicitConversionExpr { override string toString() { result = "LoadExpr" } } + /** + * INTERNAL: Do not use. + */ class MemberRefExpr extends @member_ref_expr, LookupExpr { override string toString() { result = "MemberRefExpr" } @@ -1536,14 +2049,24 @@ module Raw { } } + /** + * INTERNAL: Do not use. + */ class MetatypeConversionExpr extends @metatype_conversion_expr, ImplicitConversionExpr { override string toString() { result = "MetatypeConversionExpr" } } + /** + * INTERNAL: Do not use. + */ class NilLiteralExpr extends @nil_literal_expr, LiteralExpr { override string toString() { result = "NilLiteralExpr" } } + /** + * INTERNAL: Do not use. + * An instance of `#fileLiteral`, `#imageLiteral` or `#colorLiteral` expressions, which are used in playgrounds. + */ class ObjectLiteralExpr extends @object_literal_expr, LiteralExpr { override string toString() { result = "ObjectLiteralExpr" } @@ -1560,32 +2083,54 @@ module Raw { Argument getArgument(int index) { object_literal_expr_arguments(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class OptionalTryExpr extends @optional_try_expr, AnyTryExpr { override string toString() { result = "OptionalTryExpr" } } + /** + * INTERNAL: Do not use. + */ class ParenExpr extends @paren_expr, IdentityExpr { override string toString() { result = "ParenExpr" } } + /** + * INTERNAL: Do not use. + */ class PointerToPointerExpr extends @pointer_to_pointer_expr, ImplicitConversionExpr { override string toString() { result = "PointerToPointerExpr" } } + /** + * INTERNAL: Do not use. + */ class PostfixUnaryExpr extends @postfix_unary_expr, ApplyExpr { override string toString() { result = "PostfixUnaryExpr" } } + /** + * INTERNAL: Do not use. + */ class PrefixUnaryExpr extends @prefix_unary_expr, ApplyExpr { override string toString() { result = "PrefixUnaryExpr" } } + /** + * INTERNAL: Do not use. + */ class ProtocolMetatypeToObjectExpr extends @protocol_metatype_to_object_expr, ImplicitConversionExpr { override string toString() { result = "ProtocolMetatypeToObjectExpr" } } + /** + * INTERNAL: Do not use. + * A regular expression literal which is checked at compile time, for example `/a(a|b)*b/`. + */ class RegexLiteralExpr extends @regex_literal_expr, LiteralExpr { override string toString() { result = "RegexLiteralExpr" } @@ -1600,6 +2145,11 @@ module Raw { int getVersion() { regex_literal_exprs(this, _, result) } } + /** + * INTERNAL: Do not use. + * An internal raw instance of method lookups like `x.foo` in `x.foo()`. + * This is completely replaced by the synthesized type `MethodLookupExpr`. + */ class SelfApplyExpr extends @self_apply_expr, ApplyExpr { /** * Gets the base of this self apply expression. @@ -1607,10 +2157,16 @@ module Raw { Expr getBase() { self_apply_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class StringToPointerExpr extends @string_to_pointer_expr, ImplicitConversionExpr { override string toString() { result = "StringToPointerExpr" } } + /** + * INTERNAL: Do not use. + */ class SubscriptExpr extends @subscript_expr, LookupExpr { override string toString() { result = "SubscriptExpr" } @@ -1644,30 +2200,48 @@ module Raw { } } + /** + * INTERNAL: Do not use. + */ class TryExpr extends @try_expr, AnyTryExpr { override string toString() { result = "TryExpr" } } + /** + * INTERNAL: Do not use. + */ class UnderlyingToOpaqueExpr extends @underlying_to_opaque_expr, ImplicitConversionExpr { override string toString() { result = "UnderlyingToOpaqueExpr" } } + /** + * INTERNAL: Do not use. + */ class UnevaluatedInstanceExpr extends @unevaluated_instance_expr, ImplicitConversionExpr { override string toString() { result = "UnevaluatedInstanceExpr" } } + /** + * INTERNAL: Do not use. + */ class UnresolvedMemberChainResultExpr extends @unresolved_member_chain_result_expr, IdentityExpr, ErrorElement { override string toString() { result = "UnresolvedMemberChainResultExpr" } } + /** + * INTERNAL: Do not use. + */ class UnresolvedTypeConversionExpr extends @unresolved_type_conversion_expr, ImplicitConversionExpr, ErrorElement { override string toString() { result = "UnresolvedTypeConversionExpr" } } + /** + * INTERNAL: Do not use. + */ class BooleanLiteralExpr extends @boolean_literal_expr, BuiltinLiteralExpr { override string toString() { result = "BooleanLiteralExpr" } @@ -1677,34 +2251,58 @@ module Raw { boolean getValue() { boolean_literal_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class ConditionalCheckedCastExpr extends @conditional_checked_cast_expr, CheckedCastExpr { override string toString() { result = "ConditionalCheckedCastExpr" } } + /** + * INTERNAL: Do not use. + */ class ConstructorRefCallExpr extends @constructor_ref_call_expr, SelfApplyExpr { override string toString() { result = "ConstructorRefCallExpr" } } + /** + * INTERNAL: Do not use. + */ class DotSyntaxCallExpr extends @dot_syntax_call_expr, SelfApplyExpr { override string toString() { result = "DotSyntaxCallExpr" } } + /** + * INTERNAL: Do not use. + */ class DynamicMemberRefExpr extends @dynamic_member_ref_expr, DynamicLookupExpr { override string toString() { result = "DynamicMemberRefExpr" } } + /** + * INTERNAL: Do not use. + */ class DynamicSubscriptExpr extends @dynamic_subscript_expr, DynamicLookupExpr { override string toString() { result = "DynamicSubscriptExpr" } } + /** + * INTERNAL: Do not use. + */ class ForcedCheckedCastExpr extends @forced_checked_cast_expr, CheckedCastExpr { override string toString() { result = "ForcedCheckedCastExpr" } } + /** + * INTERNAL: Do not use. + */ class IsExpr extends @is_expr, CheckedCastExpr { override string toString() { result = "IsExpr" } } + /** + * INTERNAL: Do not use. + */ class MagicIdentifierLiteralExpr extends @magic_identifier_literal_expr, BuiltinLiteralExpr { override string toString() { result = "MagicIdentifierLiteralExpr" } @@ -1714,8 +2312,14 @@ module Raw { string getKind() { magic_identifier_literal_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class NumberLiteralExpr extends @number_literal_expr, BuiltinLiteralExpr { } + /** + * INTERNAL: Do not use. + */ class StringLiteralExpr extends @string_literal_expr, BuiltinLiteralExpr { override string toString() { result = "StringLiteralExpr" } @@ -1725,6 +2329,9 @@ module Raw { string getValue() { string_literal_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class FloatLiteralExpr extends @float_literal_expr, NumberLiteralExpr { override string toString() { result = "FloatLiteralExpr" } @@ -1734,6 +2341,9 @@ module Raw { string getStringValue() { float_literal_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class IntegerLiteralExpr extends @integer_literal_expr, NumberLiteralExpr { override string toString() { result = "IntegerLiteralExpr" } @@ -1743,12 +2353,21 @@ module Raw { string getStringValue() { integer_literal_exprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class Pattern extends @pattern, AstNode { } + /** + * INTERNAL: Do not use. + */ class AnyPattern extends @any_pattern, Pattern { override string toString() { result = "AnyPattern" } } + /** + * INTERNAL: Do not use. + */ class BindingPattern extends @binding_pattern, Pattern { override string toString() { result = "BindingPattern" } @@ -1758,6 +2377,9 @@ module Raw { Pattern getSubPattern() { binding_patterns(this, result) } } + /** + * INTERNAL: Do not use. + */ class BoolPattern extends @bool_pattern, Pattern { override string toString() { result = "BoolPattern" } @@ -1767,6 +2389,9 @@ module Raw { boolean getValue() { bool_patterns(this, result) } } + /** + * INTERNAL: Do not use. + */ class EnumElementPattern extends @enum_element_pattern, Pattern { override string toString() { result = "EnumElementPattern" } @@ -1781,6 +2406,9 @@ module Raw { Pattern getSubPattern() { enum_element_pattern_sub_patterns(this, result) } } + /** + * INTERNAL: Do not use. + */ class ExprPattern extends @expr_pattern, Pattern { override string toString() { result = "ExprPattern" } @@ -1790,6 +2418,9 @@ module Raw { Expr getSubExpr() { expr_patterns(this, result) } } + /** + * INTERNAL: Do not use. + */ class IsPattern extends @is_pattern, Pattern { override string toString() { result = "IsPattern" } @@ -1804,6 +2435,9 @@ module Raw { Pattern getSubPattern() { is_pattern_sub_patterns(this, result) } } + /** + * INTERNAL: Do not use. + */ class NamedPattern extends @named_pattern, Pattern { override string toString() { result = "NamedPattern" } @@ -1813,6 +2447,9 @@ module Raw { string getName() { named_patterns(this, result) } } + /** + * INTERNAL: Do not use. + */ class OptionalSomePattern extends @optional_some_pattern, Pattern { override string toString() { result = "OptionalSomePattern" } @@ -1822,6 +2459,9 @@ module Raw { Pattern getSubPattern() { optional_some_patterns(this, result) } } + /** + * INTERNAL: Do not use. + */ class ParenPattern extends @paren_pattern, Pattern { override string toString() { result = "ParenPattern" } @@ -1831,6 +2471,9 @@ module Raw { Pattern getSubPattern() { paren_patterns(this, result) } } + /** + * INTERNAL: Do not use. + */ class TuplePattern extends @tuple_pattern, Pattern { override string toString() { result = "TuplePattern" } @@ -1840,6 +2483,9 @@ module Raw { Pattern getElement(int index) { tuple_pattern_elements(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class TypedPattern extends @typed_pattern, Pattern { override string toString() { result = "TypedPattern" } @@ -1854,6 +2500,9 @@ module Raw { TypeRepr getTypeRepr() { typed_pattern_type_reprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class CaseLabelItem extends @case_label_item, AstNode { override string toString() { result = "CaseLabelItem" } @@ -1868,6 +2517,9 @@ module Raw { Expr getGuard() { case_label_item_guards(this, result) } } + /** + * INTERNAL: Do not use. + */ class ConditionElement extends @condition_element, AstNode { override string toString() { result = "ConditionElement" } @@ -1892,8 +2544,14 @@ module Raw { AvailabilityInfo getAvailability() { condition_element_availabilities(this, result) } } + /** + * INTERNAL: Do not use. + */ class Stmt extends @stmt, AstNode { } + /** + * INTERNAL: Do not use. + */ class StmtCondition extends @stmt_condition, AstNode { override string toString() { result = "StmtCondition" } @@ -1903,6 +2561,9 @@ module Raw { ConditionElement getElement(int index) { stmt_condition_elements(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class BraceStmt extends @brace_stmt, Stmt { override string toString() { result = "BraceStmt" } @@ -1912,6 +2573,9 @@ module Raw { AstNode getElement(int index) { brace_stmt_elements(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class BreakStmt extends @break_stmt, Stmt { override string toString() { result = "BreakStmt" } @@ -1926,6 +2590,9 @@ module Raw { Stmt getTarget() { break_stmt_targets(this, result) } } + /** + * INTERNAL: Do not use. + */ class CaseStmt extends @case_stmt, Stmt { override string toString() { result = "CaseStmt" } @@ -1945,6 +2612,9 @@ module Raw { VarDecl getVariable(int index) { case_stmt_variables(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class ContinueStmt extends @continue_stmt, Stmt { override string toString() { result = "ContinueStmt" } @@ -1959,6 +2629,9 @@ module Raw { Stmt getTarget() { continue_stmt_targets(this, result) } } + /** + * INTERNAL: Do not use. + */ class DeferStmt extends @defer_stmt, Stmt { override string toString() { result = "DeferStmt" } @@ -1968,10 +2641,16 @@ module Raw { BraceStmt getBody() { defer_stmts(this, result) } } + /** + * INTERNAL: Do not use. + */ class FailStmt extends @fail_stmt, Stmt { override string toString() { result = "FailStmt" } } + /** + * INTERNAL: Do not use. + */ class FallthroughStmt extends @fallthrough_stmt, Stmt { override string toString() { result = "FallthroughStmt" } @@ -1986,6 +2665,9 @@ module Raw { CaseStmt getFallthroughDest() { fallthrough_stmts(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class LabeledStmt extends @labeled_stmt, Stmt { /** * Gets the label of this labeled statement, if it exists. @@ -1993,6 +2675,9 @@ module Raw { string getLabel() { labeled_stmt_labels(this, result) } } + /** + * INTERNAL: Do not use. + */ class PoundAssertStmt extends @pound_assert_stmt, Stmt { override string toString() { result = "PoundAssertStmt" } @@ -2007,6 +2692,9 @@ module Raw { string getMessage() { pound_assert_stmts(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class ReturnStmt extends @return_stmt, Stmt { override string toString() { result = "ReturnStmt" } @@ -2016,6 +2704,9 @@ module Raw { Expr getResult() { return_stmt_results(this, result) } } + /** + * INTERNAL: Do not use. + */ class ThrowStmt extends @throw_stmt, Stmt { override string toString() { result = "ThrowStmt" } @@ -2025,6 +2716,9 @@ module Raw { Expr getSubExpr() { throw_stmts(this, result) } } + /** + * INTERNAL: Do not use. + */ class YieldStmt extends @yield_stmt, Stmt { override string toString() { result = "YieldStmt" } @@ -2034,6 +2728,9 @@ module Raw { Expr getResult(int index) { yield_stmt_results(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class DoCatchStmt extends @do_catch_stmt, LabeledStmt { override string toString() { result = "DoCatchStmt" } @@ -2048,6 +2745,9 @@ module Raw { CaseStmt getCatch(int index) { do_catch_stmt_catches(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class DoStmt extends @do_stmt, LabeledStmt { override string toString() { result = "DoStmt" } @@ -2057,6 +2757,9 @@ module Raw { BraceStmt getBody() { do_stmts(this, result) } } + /** + * INTERNAL: Do not use. + */ class ForEachStmt extends @for_each_stmt, LabeledStmt { override string toString() { result = "ForEachStmt" } @@ -2081,6 +2784,9 @@ module Raw { BraceStmt getBody() { for_each_stmts(this, _, _, result) } } + /** + * INTERNAL: Do not use. + */ class LabeledConditionalStmt extends @labeled_conditional_stmt, LabeledStmt { /** * Gets the condition of this labeled conditional statement. @@ -2088,6 +2794,9 @@ module Raw { StmtCondition getCondition() { labeled_conditional_stmts(this, result) } } + /** + * INTERNAL: Do not use. + */ class RepeatWhileStmt extends @repeat_while_stmt, LabeledStmt { override string toString() { result = "RepeatWhileStmt" } @@ -2102,6 +2811,9 @@ module Raw { Stmt getBody() { repeat_while_stmts(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class SwitchStmt extends @switch_stmt, LabeledStmt { override string toString() { result = "SwitchStmt" } @@ -2116,6 +2828,9 @@ module Raw { CaseStmt getCase(int index) { switch_stmt_cases(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class GuardStmt extends @guard_stmt, LabeledConditionalStmt { override string toString() { result = "GuardStmt" } @@ -2125,6 +2840,9 @@ module Raw { BraceStmt getBody() { guard_stmts(this, result) } } + /** + * INTERNAL: Do not use. + */ class IfStmt extends @if_stmt, LabeledConditionalStmt { override string toString() { result = "IfStmt" } @@ -2139,6 +2857,9 @@ module Raw { Stmt getElse() { if_stmt_elses(this, result) } } + /** + * INTERNAL: Do not use. + */ class WhileStmt extends @while_stmt, LabeledConditionalStmt { override string toString() { result = "WhileStmt" } @@ -2148,6 +2869,9 @@ module Raw { Stmt getBody() { while_stmts(this, result) } } + /** + * INTERNAL: Do not use. + */ class Type extends @type, Element { /** * Gets the name of this type. @@ -2160,6 +2884,9 @@ module Raw { Type getCanonicalType() { types(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class TypeRepr extends @type_repr, AstNode { override string toString() { result = "TypeRepr" } @@ -2169,6 +2896,9 @@ module Raw { Type getType() { type_reprs(this, result) } } + /** + * INTERNAL: Do not use. + */ class AnyFunctionType extends @any_function_type, Type { /** * Gets the result of this function type. @@ -2191,6 +2921,9 @@ module Raw { predicate isAsync() { any_function_type_is_async(this) } } + /** + * INTERNAL: Do not use. + */ class AnyGenericType extends @any_generic_type, Type { /** * Gets the parent of this any generic type, if it exists. @@ -2203,10 +2936,19 @@ module Raw { GenericTypeDecl getDeclaration() { any_generic_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class AnyMetatypeType extends @any_metatype_type, Type { } + /** + * INTERNAL: Do not use. + */ class BuiltinType extends @builtin_type, Type { } + /** + * INTERNAL: Do not use. + */ class DependentMemberType extends @dependent_member_type, Type { override string toString() { result = "DependentMemberType" } @@ -2221,6 +2963,9 @@ module Raw { AssociatedTypeDecl getAssociatedTypeDecl() { dependent_member_types(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class DynamicSelfType extends @dynamic_self_type, Type { override string toString() { result = "DynamicSelfType" } @@ -2230,10 +2975,16 @@ module Raw { Type getStaticSelfType() { dynamic_self_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class ErrorType extends @error_type, Type, ErrorElement { override string toString() { result = "ErrorType" } } + /** + * INTERNAL: Do not use. + */ class ExistentialType extends @existential_type, Type { override string toString() { result = "ExistentialType" } @@ -2243,6 +2994,9 @@ module Raw { Type getConstraint() { existential_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class InOutType extends @in_out_type, Type { override string toString() { result = "InOutType" } @@ -2252,6 +3006,9 @@ module Raw { Type getObjectType() { in_out_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class LValueType extends @l_value_type, Type { override string toString() { result = "LValueType" } @@ -2261,6 +3018,9 @@ module Raw { Type getObjectType() { l_value_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class ModuleType extends @module_type, Type { override string toString() { result = "ModuleType" } @@ -2270,6 +3030,12 @@ module Raw { ModuleDecl getModule() { module_types(this, result) } } + /** + * INTERNAL: Do not use. + * A sugar type of the form `P` with `P` a protocol. + * + * If `P` has primary associated type `A`, then `T: P` is a shortcut for `T: P where T.A == X`. + */ class ParameterizedProtocolType extends @parameterized_protocol_type, Type { override string toString() { result = "ParameterizedProtocolType" } @@ -2284,6 +3050,9 @@ module Raw { Type getArg(int index) { parameterized_protocol_type_args(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class ProtocolCompositionType extends @protocol_composition_type, Type { override string toString() { result = "ProtocolCompositionType" } @@ -2293,6 +3062,9 @@ module Raw { Type getMember(int index) { protocol_composition_type_members(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class ReferenceStorageType extends @reference_storage_type, Type { /** * Gets the referent type of this reference storage type. @@ -2300,10 +3072,19 @@ module Raw { Type getReferentType() { reference_storage_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class SubstitutableType extends @substitutable_type, Type { } + /** + * INTERNAL: Do not use. + */ class SugarType extends @sugar_type, Type { } + /** + * INTERNAL: Do not use. + */ class TupleType extends @tuple_type, Type { override string toString() { result = "TupleType" } @@ -2318,12 +3099,21 @@ module Raw { string getName(int index) { tuple_type_names(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class UnresolvedType extends @unresolved_type, Type, ErrorElement { override string toString() { result = "UnresolvedType" } } + /** + * INTERNAL: Do not use. + */ class AnyBuiltinIntegerType extends @any_builtin_integer_type, BuiltinType { } + /** + * INTERNAL: Do not use. + */ class ArchetypeType extends @archetype_type, SubstitutableType { /** * Gets the interface type of this archetype type. @@ -2341,54 +3131,94 @@ module Raw { ProtocolDecl getProtocol(int index) { archetype_type_protocols(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class BuiltinBridgeObjectType extends @builtin_bridge_object_type, BuiltinType { override string toString() { result = "BuiltinBridgeObjectType" } } + /** + * INTERNAL: Do not use. + */ class BuiltinDefaultActorStorageType extends @builtin_default_actor_storage_type, BuiltinType { override string toString() { result = "BuiltinDefaultActorStorageType" } } + /** + * INTERNAL: Do not use. + */ class BuiltinExecutorType extends @builtin_executor_type, BuiltinType { override string toString() { result = "BuiltinExecutorType" } } + /** + * INTERNAL: Do not use. + */ class BuiltinFloatType extends @builtin_float_type, BuiltinType { override string toString() { result = "BuiltinFloatType" } } + /** + * INTERNAL: Do not use. + */ class BuiltinJobType extends @builtin_job_type, BuiltinType { override string toString() { result = "BuiltinJobType" } } + /** + * INTERNAL: Do not use. + */ class BuiltinNativeObjectType extends @builtin_native_object_type, BuiltinType { override string toString() { result = "BuiltinNativeObjectType" } } + /** + * INTERNAL: Do not use. + */ class BuiltinRawPointerType extends @builtin_raw_pointer_type, BuiltinType { override string toString() { result = "BuiltinRawPointerType" } } + /** + * INTERNAL: Do not use. + */ class BuiltinRawUnsafeContinuationType extends @builtin_raw_unsafe_continuation_type, BuiltinType { override string toString() { result = "BuiltinRawUnsafeContinuationType" } } + /** + * INTERNAL: Do not use. + */ class BuiltinUnsafeValueBufferType extends @builtin_unsafe_value_buffer_type, BuiltinType { override string toString() { result = "BuiltinUnsafeValueBufferType" } } + /** + * INTERNAL: Do not use. + */ class BuiltinVectorType extends @builtin_vector_type, BuiltinType { override string toString() { result = "BuiltinVectorType" } } + /** + * INTERNAL: Do not use. + */ class ExistentialMetatypeType extends @existential_metatype_type, AnyMetatypeType { override string toString() { result = "ExistentialMetatypeType" } } + /** + * INTERNAL: Do not use. + */ class FunctionType extends @function_type, AnyFunctionType { override string toString() { result = "FunctionType" } } + /** + * INTERNAL: Do not use. + * The type of a generic function with type parameters + */ class GenericFunctionType extends @generic_function_type, AnyFunctionType { override string toString() { result = "GenericFunctionType" } @@ -2400,18 +3230,30 @@ module Raw { } } + /** + * INTERNAL: Do not use. + */ class GenericTypeParamType extends @generic_type_param_type, SubstitutableType { override string toString() { result = "GenericTypeParamType" } } + /** + * INTERNAL: Do not use. + */ class MetatypeType extends @metatype_type, AnyMetatypeType { override string toString() { result = "MetatypeType" } } + /** + * INTERNAL: Do not use. + */ class NominalOrBoundGenericNominalType extends @nominal_or_bound_generic_nominal_type, AnyGenericType { } + /** + * INTERNAL: Do not use. + */ class ParenType extends @paren_type, SugarType { override string toString() { result = "ParenType" } @@ -2421,8 +3263,14 @@ module Raw { Type getType() { paren_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class SyntaxSugarType extends @syntax_sugar_type, SugarType { } + /** + * INTERNAL: Do not use. + */ class TypeAliasType extends @type_alias_type, SugarType { override string toString() { result = "TypeAliasType" } @@ -2432,22 +3280,37 @@ module Raw { TypeAliasDecl getDecl() { type_alias_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class UnboundGenericType extends @unbound_generic_type, AnyGenericType { override string toString() { result = "UnboundGenericType" } } + /** + * INTERNAL: Do not use. + */ class UnmanagedStorageType extends @unmanaged_storage_type, ReferenceStorageType { override string toString() { result = "UnmanagedStorageType" } } + /** + * INTERNAL: Do not use. + */ class UnownedStorageType extends @unowned_storage_type, ReferenceStorageType { override string toString() { result = "UnownedStorageType" } } + /** + * INTERNAL: Do not use. + */ class WeakStorageType extends @weak_storage_type, ReferenceStorageType { override string toString() { result = "WeakStorageType" } } + /** + * INTERNAL: Do not use. + */ class BoundGenericType extends @bound_generic_type, NominalOrBoundGenericNominalType { /** * Gets the `index`th argument type of this bound generic type (0-based). @@ -2455,10 +3318,16 @@ module Raw { Type getArgType(int index) { bound_generic_type_arg_types(this, index, result) } } + /** + * INTERNAL: Do not use. + */ class BuiltinIntegerLiteralType extends @builtin_integer_literal_type, AnyBuiltinIntegerType { override string toString() { result = "BuiltinIntegerLiteralType" } } + /** + * INTERNAL: Do not use. + */ class BuiltinIntegerType extends @builtin_integer_type, AnyBuiltinIntegerType { override string toString() { result = "BuiltinIntegerType" } @@ -2468,6 +3337,9 @@ module Raw { int getWidth() { builtin_integer_type_widths(this, result) } } + /** + * INTERNAL: Do not use. + */ class DictionaryType extends @dictionary_type, SyntaxSugarType { override string toString() { result = "DictionaryType" } @@ -2482,8 +3354,17 @@ module Raw { Type getValueType() { dictionary_types(this, _, result) } } + /** + * INTERNAL: Do not use. + */ class NominalType extends @nominal_type, NominalOrBoundGenericNominalType { } + /** + * INTERNAL: Do not use. + * An opaque type, that is a type formally equivalent to an underlying type but abstracting it away. + * + * See https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html. + */ class OpaqueTypeArchetypeType extends @opaque_type_archetype_type, ArchetypeType { override string toString() { result = "OpaqueTypeArchetypeType" } @@ -2493,14 +3374,23 @@ module Raw { OpaqueTypeDecl getDeclaration() { opaque_type_archetype_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class OpenedArchetypeType extends @opened_archetype_type, ArchetypeType { override string toString() { result = "OpenedArchetypeType" } } + /** + * INTERNAL: Do not use. + */ class PrimaryArchetypeType extends @primary_archetype_type, ArchetypeType { override string toString() { result = "PrimaryArchetypeType" } } + /** + * INTERNAL: Do not use. + */ class UnarySyntaxSugarType extends @unary_syntax_sugar_type, SyntaxSugarType { /** * Gets the base type of this unary syntax sugar type. @@ -2508,42 +3398,72 @@ module Raw { Type getBaseType() { unary_syntax_sugar_types(this, result) } } + /** + * INTERNAL: Do not use. + */ class ArraySliceType extends @array_slice_type, UnarySyntaxSugarType { override string toString() { result = "ArraySliceType" } } + /** + * INTERNAL: Do not use. + */ class BoundGenericClassType extends @bound_generic_class_type, BoundGenericType { override string toString() { result = "BoundGenericClassType" } } + /** + * INTERNAL: Do not use. + */ class BoundGenericEnumType extends @bound_generic_enum_type, BoundGenericType { override string toString() { result = "BoundGenericEnumType" } } + /** + * INTERNAL: Do not use. + */ class BoundGenericStructType extends @bound_generic_struct_type, BoundGenericType { override string toString() { result = "BoundGenericStructType" } } + /** + * INTERNAL: Do not use. + */ class ClassType extends @class_type, NominalType { override string toString() { result = "ClassType" } } + /** + * INTERNAL: Do not use. + */ class EnumType extends @enum_type, NominalType { override string toString() { result = "EnumType" } } + /** + * INTERNAL: Do not use. + */ class OptionalType extends @optional_type, UnarySyntaxSugarType { override string toString() { result = "OptionalType" } } + /** + * INTERNAL: Do not use. + */ class ProtocolType extends @protocol_type, NominalType { override string toString() { result = "ProtocolType" } } + /** + * INTERNAL: Do not use. + */ class StructType extends @struct_type, NominalType { override string toString() { result = "StructType" } } + /** + * INTERNAL: Do not use. + */ class VariadicSequenceType extends @variadic_sequence_type, UnarySyntaxSugarType { override string toString() { result = "VariadicSequenceType" } } diff --git a/swift/ql/lib/codeql/swift/generated/Synth.qll b/swift/ql/lib/codeql/swift/generated/Synth.qll index a30d1b2e695..78077f37c16 100644 --- a/swift/ql/lib/codeql/swift/generated/Synth.qll +++ b/swift/ql/lib/codeql/swift/generated/Synth.qll @@ -1,380 +1,1167 @@ +/** + * INTERNAL: Do not use. + * This module defines the IPA layer on top of raw DB entities, and the conversions between the two + * layers. + */ + private import codeql.swift.generated.SynthConstructors private import codeql.swift.generated.Raw cached module Synth { + /** + * INTERNAL: Do not use. + * The synthesized type of all elements. + */ cached newtype TElement = + /** + * INTERNAL: Do not use. + */ TAvailabilityInfo(Raw::AvailabilityInfo id) { constructAvailabilityInfo(id) } or + /** + * INTERNAL: Do not use. + */ TComment(Raw::Comment id) { constructComment(id) } or + /** + * INTERNAL: Do not use. + */ TDbFile(Raw::DbFile id) { constructDbFile(id) } or + /** + * INTERNAL: Do not use. + */ TDbLocation(Raw::DbLocation id) { constructDbLocation(id) } or + /** + * INTERNAL: Do not use. + */ TDiagnostics(Raw::Diagnostics id) { constructDiagnostics(id) } or + /** + * INTERNAL: Do not use. + */ TKeyPathComponent(Raw::KeyPathComponent id) { constructKeyPathComponent(id) } or + /** + * INTERNAL: Do not use. + */ TOtherAvailabilitySpec(Raw::OtherAvailabilitySpec id) { constructOtherAvailabilitySpec(id) } or + /** + * INTERNAL: Do not use. + */ TPlatformVersionAvailabilitySpec(Raw::PlatformVersionAvailabilitySpec id) { constructPlatformVersionAvailabilitySpec(id) } or + /** + * INTERNAL: Do not use. + */ TUnknownFile() or + /** + * INTERNAL: Do not use. + */ TUnknownLocation() or + /** + * INTERNAL: Do not use. + */ TUnspecifiedElement(Raw::UnspecifiedElement id) { constructUnspecifiedElement(id) } or + /** + * INTERNAL: Do not use. + */ TAccessorDecl(Raw::AccessorDecl id) { constructAccessorDecl(id) } or + /** + * INTERNAL: Do not use. + */ TAssociatedTypeDecl(Raw::AssociatedTypeDecl id) { constructAssociatedTypeDecl(id) } or + /** + * INTERNAL: Do not use. + */ TCapturedDecl(Raw::CapturedDecl id) { constructCapturedDecl(id) } or + /** + * INTERNAL: Do not use. + */ TClassDecl(Raw::ClassDecl id) { constructClassDecl(id) } or + /** + * INTERNAL: Do not use. + */ TConcreteFuncDecl(Raw::ConcreteFuncDecl id) { constructConcreteFuncDecl(id) } or + /** + * INTERNAL: Do not use. + */ TConcreteVarDecl(Raw::ConcreteVarDecl id) { constructConcreteVarDecl(id) } or + /** + * INTERNAL: Do not use. + */ TConstructorDecl(Raw::ConstructorDecl id) { constructConstructorDecl(id) } or + /** + * INTERNAL: Do not use. + */ TDestructorDecl(Raw::DestructorDecl id) { constructDestructorDecl(id) } or + /** + * INTERNAL: Do not use. + */ TEnumCaseDecl(Raw::EnumCaseDecl id) { constructEnumCaseDecl(id) } or + /** + * INTERNAL: Do not use. + */ TEnumDecl(Raw::EnumDecl id) { constructEnumDecl(id) } or + /** + * INTERNAL: Do not use. + */ TEnumElementDecl(Raw::EnumElementDecl id) { constructEnumElementDecl(id) } or + /** + * INTERNAL: Do not use. + */ TExtensionDecl(Raw::ExtensionDecl id) { constructExtensionDecl(id) } or + /** + * INTERNAL: Do not use. + */ TGenericTypeParamDecl(Raw::GenericTypeParamDecl id) { constructGenericTypeParamDecl(id) } or + /** + * INTERNAL: Do not use. + */ TIfConfigDecl(Raw::IfConfigDecl id) { constructIfConfigDecl(id) } or + /** + * INTERNAL: Do not use. + */ TImportDecl(Raw::ImportDecl id) { constructImportDecl(id) } or + /** + * INTERNAL: Do not use. + */ TInfixOperatorDecl(Raw::InfixOperatorDecl id) { constructInfixOperatorDecl(id) } or + /** + * INTERNAL: Do not use. + */ TMissingMemberDecl(Raw::MissingMemberDecl id) { constructMissingMemberDecl(id) } or + /** + * INTERNAL: Do not use. + */ TModuleDecl(Raw::ModuleDecl id) { constructModuleDecl(id) } or + /** + * INTERNAL: Do not use. + */ TOpaqueTypeDecl(Raw::OpaqueTypeDecl id) { constructOpaqueTypeDecl(id) } or + /** + * INTERNAL: Do not use. + */ TParamDecl(Raw::ParamDecl id) { constructParamDecl(id) } or + /** + * INTERNAL: Do not use. + */ TPatternBindingDecl(Raw::PatternBindingDecl id) { constructPatternBindingDecl(id) } or + /** + * INTERNAL: Do not use. + */ TPostfixOperatorDecl(Raw::PostfixOperatorDecl id) { constructPostfixOperatorDecl(id) } or + /** + * INTERNAL: Do not use. + */ TPoundDiagnosticDecl(Raw::PoundDiagnosticDecl id) { constructPoundDiagnosticDecl(id) } or + /** + * INTERNAL: Do not use. + */ TPrecedenceGroupDecl(Raw::PrecedenceGroupDecl id) { constructPrecedenceGroupDecl(id) } or + /** + * INTERNAL: Do not use. + */ TPrefixOperatorDecl(Raw::PrefixOperatorDecl id) { constructPrefixOperatorDecl(id) } or + /** + * INTERNAL: Do not use. + */ TProtocolDecl(Raw::ProtocolDecl id) { constructProtocolDecl(id) } or + /** + * INTERNAL: Do not use. + */ TStructDecl(Raw::StructDecl id) { constructStructDecl(id) } or + /** + * INTERNAL: Do not use. + */ TSubscriptDecl(Raw::SubscriptDecl id) { constructSubscriptDecl(id) } or + /** + * INTERNAL: Do not use. + */ TTopLevelCodeDecl(Raw::TopLevelCodeDecl id) { constructTopLevelCodeDecl(id) } or + /** + * INTERNAL: Do not use. + */ TTypeAliasDecl(Raw::TypeAliasDecl id) { constructTypeAliasDecl(id) } or + /** + * INTERNAL: Do not use. + */ TAbiSafeConversionExpr(Raw::AbiSafeConversionExpr id) { constructAbiSafeConversionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TAnyHashableErasureExpr(Raw::AnyHashableErasureExpr id) { constructAnyHashableErasureExpr(id) } or + /** + * INTERNAL: Do not use. + */ TAppliedPropertyWrapperExpr(Raw::AppliedPropertyWrapperExpr id) { constructAppliedPropertyWrapperExpr(id) } or + /** + * INTERNAL: Do not use. + */ TArchetypeToSuperExpr(Raw::ArchetypeToSuperExpr id) { constructArchetypeToSuperExpr(id) } or + /** + * INTERNAL: Do not use. + */ TArgument(Raw::Argument id) { constructArgument(id) } or + /** + * INTERNAL: Do not use. + */ TArrayExpr(Raw::ArrayExpr id) { constructArrayExpr(id) } or + /** + * INTERNAL: Do not use. + */ TArrayToPointerExpr(Raw::ArrayToPointerExpr id) { constructArrayToPointerExpr(id) } or + /** + * INTERNAL: Do not use. + */ TAssignExpr(Raw::AssignExpr id) { constructAssignExpr(id) } or + /** + * INTERNAL: Do not use. + */ TAutoClosureExpr(Raw::AutoClosureExpr id) { constructAutoClosureExpr(id) } or + /** + * INTERNAL: Do not use. + */ TAwaitExpr(Raw::AwaitExpr id) { constructAwaitExpr(id) } or + /** + * INTERNAL: Do not use. + */ TBinaryExpr(Raw::BinaryExpr id) { constructBinaryExpr(id) } or + /** + * INTERNAL: Do not use. + */ TBindOptionalExpr(Raw::BindOptionalExpr id) { constructBindOptionalExpr(id) } or + /** + * INTERNAL: Do not use. + */ TBooleanLiteralExpr(Raw::BooleanLiteralExpr id) { constructBooleanLiteralExpr(id) } or + /** + * INTERNAL: Do not use. + */ TBridgeFromObjCExpr(Raw::BridgeFromObjCExpr id) { constructBridgeFromObjCExpr(id) } or + /** + * INTERNAL: Do not use. + */ TBridgeToObjCExpr(Raw::BridgeToObjCExpr id) { constructBridgeToObjCExpr(id) } or + /** + * INTERNAL: Do not use. + */ TCallExpr(Raw::CallExpr id) { constructCallExpr(id) } or + /** + * INTERNAL: Do not use. + */ TCaptureListExpr(Raw::CaptureListExpr id) { constructCaptureListExpr(id) } or + /** + * INTERNAL: Do not use. + */ TClassMetatypeToObjectExpr(Raw::ClassMetatypeToObjectExpr id) { constructClassMetatypeToObjectExpr(id) } or + /** + * INTERNAL: Do not use. + */ TClosureExpr(Raw::ClosureExpr id) { constructClosureExpr(id) } or + /** + * INTERNAL: Do not use. + */ TCoerceExpr(Raw::CoerceExpr id) { constructCoerceExpr(id) } or + /** + * INTERNAL: Do not use. + */ TCollectionUpcastConversionExpr(Raw::CollectionUpcastConversionExpr id) { constructCollectionUpcastConversionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TConditionalBridgeFromObjCExpr(Raw::ConditionalBridgeFromObjCExpr id) { constructConditionalBridgeFromObjCExpr(id) } or + /** + * INTERNAL: Do not use. + */ TConditionalCheckedCastExpr(Raw::ConditionalCheckedCastExpr id) { constructConditionalCheckedCastExpr(id) } or + /** + * INTERNAL: Do not use. + */ TConstructorRefCallExpr(Raw::ConstructorRefCallExpr id) { constructConstructorRefCallExpr(id) } or + /** + * INTERNAL: Do not use. + */ TCovariantFunctionConversionExpr(Raw::CovariantFunctionConversionExpr id) { constructCovariantFunctionConversionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TCovariantReturnConversionExpr(Raw::CovariantReturnConversionExpr id) { constructCovariantReturnConversionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDeclRefExpr(Raw::DeclRefExpr id) { constructDeclRefExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDefaultArgumentExpr(Raw::DefaultArgumentExpr id) { constructDefaultArgumentExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDerivedToBaseExpr(Raw::DerivedToBaseExpr id) { constructDerivedToBaseExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDestructureTupleExpr(Raw::DestructureTupleExpr id) { constructDestructureTupleExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDictionaryExpr(Raw::DictionaryExpr id) { constructDictionaryExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDifferentiableFunctionExpr(Raw::DifferentiableFunctionExpr id) { constructDifferentiableFunctionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDifferentiableFunctionExtractOriginalExpr(Raw::DifferentiableFunctionExtractOriginalExpr id) { constructDifferentiableFunctionExtractOriginalExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDiscardAssignmentExpr(Raw::DiscardAssignmentExpr id) { constructDiscardAssignmentExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDotSelfExpr(Raw::DotSelfExpr id) { constructDotSelfExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDotSyntaxBaseIgnoredExpr(Raw::DotSyntaxBaseIgnoredExpr id) { constructDotSyntaxBaseIgnoredExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDotSyntaxCallExpr(Raw::DotSyntaxCallExpr id) { constructDotSyntaxCallExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDynamicMemberRefExpr(Raw::DynamicMemberRefExpr id) { constructDynamicMemberRefExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDynamicSubscriptExpr(Raw::DynamicSubscriptExpr id) { constructDynamicSubscriptExpr(id) } or + /** + * INTERNAL: Do not use. + */ TDynamicTypeExpr(Raw::DynamicTypeExpr id) { constructDynamicTypeExpr(id) } or + /** + * INTERNAL: Do not use. + */ TEnumIsCaseExpr(Raw::EnumIsCaseExpr id) { constructEnumIsCaseExpr(id) } or + /** + * INTERNAL: Do not use. + */ TErasureExpr(Raw::ErasureExpr id) { constructErasureExpr(id) } or + /** + * INTERNAL: Do not use. + */ TErrorExpr(Raw::ErrorExpr id) { constructErrorExpr(id) } or + /** + * INTERNAL: Do not use. + */ TExistentialMetatypeToObjectExpr(Raw::ExistentialMetatypeToObjectExpr id) { constructExistentialMetatypeToObjectExpr(id) } or + /** + * INTERNAL: Do not use. + */ TFloatLiteralExpr(Raw::FloatLiteralExpr id) { constructFloatLiteralExpr(id) } or + /** + * INTERNAL: Do not use. + */ TForceTryExpr(Raw::ForceTryExpr id) { constructForceTryExpr(id) } or + /** + * INTERNAL: Do not use. + */ TForceValueExpr(Raw::ForceValueExpr id) { constructForceValueExpr(id) } or + /** + * INTERNAL: Do not use. + */ TForcedCheckedCastExpr(Raw::ForcedCheckedCastExpr id) { constructForcedCheckedCastExpr(id) } or + /** + * INTERNAL: Do not use. + */ TForeignObjectConversionExpr(Raw::ForeignObjectConversionExpr id) { constructForeignObjectConversionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TFunctionConversionExpr(Raw::FunctionConversionExpr id) { constructFunctionConversionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TIfExpr(Raw::IfExpr id) { constructIfExpr(id) } or + /** + * INTERNAL: Do not use. + */ TInOutExpr(Raw::InOutExpr id) { constructInOutExpr(id) } or + /** + * INTERNAL: Do not use. + */ TInOutToPointerExpr(Raw::InOutToPointerExpr id) { constructInOutToPointerExpr(id) } or + /** + * INTERNAL: Do not use. + */ TInjectIntoOptionalExpr(Raw::InjectIntoOptionalExpr id) { constructInjectIntoOptionalExpr(id) } or + /** + * INTERNAL: Do not use. + */ TIntegerLiteralExpr(Raw::IntegerLiteralExpr id) { constructIntegerLiteralExpr(id) } or + /** + * INTERNAL: Do not use. + */ TInterpolatedStringLiteralExpr(Raw::InterpolatedStringLiteralExpr id) { constructInterpolatedStringLiteralExpr(id) } or + /** + * INTERNAL: Do not use. + */ TIsExpr(Raw::IsExpr id) { constructIsExpr(id) } or + /** + * INTERNAL: Do not use. + */ TKeyPathApplicationExpr(Raw::KeyPathApplicationExpr id) { constructKeyPathApplicationExpr(id) } or + /** + * INTERNAL: Do not use. + */ TKeyPathDotExpr(Raw::KeyPathDotExpr id) { constructKeyPathDotExpr(id) } or + /** + * INTERNAL: Do not use. + */ TKeyPathExpr(Raw::KeyPathExpr id) { constructKeyPathExpr(id) } or + /** + * INTERNAL: Do not use. + */ TLazyInitializerExpr(Raw::LazyInitializerExpr id) { constructLazyInitializerExpr(id) } or + /** + * INTERNAL: Do not use. + */ TLinearFunctionExpr(Raw::LinearFunctionExpr id) { constructLinearFunctionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TLinearFunctionExtractOriginalExpr(Raw::LinearFunctionExtractOriginalExpr id) { constructLinearFunctionExtractOriginalExpr(id) } or + /** + * INTERNAL: Do not use. + */ TLinearToDifferentiableFunctionExpr(Raw::LinearToDifferentiableFunctionExpr id) { constructLinearToDifferentiableFunctionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TLoadExpr(Raw::LoadExpr id) { constructLoadExpr(id) } or + /** + * INTERNAL: Do not use. + */ TMagicIdentifierLiteralExpr(Raw::MagicIdentifierLiteralExpr id) { constructMagicIdentifierLiteralExpr(id) } or + /** + * INTERNAL: Do not use. + */ TMakeTemporarilyEscapableExpr(Raw::MakeTemporarilyEscapableExpr id) { constructMakeTemporarilyEscapableExpr(id) } or + /** + * INTERNAL: Do not use. + */ TMemberRefExpr(Raw::MemberRefExpr id) { constructMemberRefExpr(id) } or + /** + * INTERNAL: Do not use. + */ TMetatypeConversionExpr(Raw::MetatypeConversionExpr id) { constructMetatypeConversionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TMethodLookupExpr(Raw::SelfApplyExpr id) { constructMethodLookupExpr(id) } or + /** + * INTERNAL: Do not use. + */ TNilLiteralExpr(Raw::NilLiteralExpr id) { constructNilLiteralExpr(id) } or + /** + * INTERNAL: Do not use. + */ TObjCSelectorExpr(Raw::ObjCSelectorExpr id) { constructObjCSelectorExpr(id) } or + /** + * INTERNAL: Do not use. + */ TObjectLiteralExpr(Raw::ObjectLiteralExpr id) { constructObjectLiteralExpr(id) } or + /** + * INTERNAL: Do not use. + */ TOneWayExpr(Raw::OneWayExpr id) { constructOneWayExpr(id) } or + /** + * INTERNAL: Do not use. + */ TOpaqueValueExpr(Raw::OpaqueValueExpr id) { constructOpaqueValueExpr(id) } or + /** + * INTERNAL: Do not use. + */ TOpenExistentialExpr(Raw::OpenExistentialExpr id) { constructOpenExistentialExpr(id) } or + /** + * INTERNAL: Do not use. + */ TOptionalEvaluationExpr(Raw::OptionalEvaluationExpr id) { constructOptionalEvaluationExpr(id) } or + /** + * INTERNAL: Do not use. + */ TOptionalTryExpr(Raw::OptionalTryExpr id) { constructOptionalTryExpr(id) } or + /** + * INTERNAL: Do not use. + */ TOtherConstructorDeclRefExpr(Raw::OtherConstructorDeclRefExpr id) { constructOtherConstructorDeclRefExpr(id) } or + /** + * INTERNAL: Do not use. + */ TOverloadedDeclRefExpr(Raw::OverloadedDeclRefExpr id) { constructOverloadedDeclRefExpr(id) } or + /** + * INTERNAL: Do not use. + */ TParenExpr(Raw::ParenExpr id) { constructParenExpr(id) } or + /** + * INTERNAL: Do not use. + */ TPointerToPointerExpr(Raw::PointerToPointerExpr id) { constructPointerToPointerExpr(id) } or + /** + * INTERNAL: Do not use. + */ TPostfixUnaryExpr(Raw::PostfixUnaryExpr id) { constructPostfixUnaryExpr(id) } or + /** + * INTERNAL: Do not use. + */ TPrefixUnaryExpr(Raw::PrefixUnaryExpr id) { constructPrefixUnaryExpr(id) } or + /** + * INTERNAL: Do not use. + */ TPropertyWrapperValuePlaceholderExpr(Raw::PropertyWrapperValuePlaceholderExpr id) { constructPropertyWrapperValuePlaceholderExpr(id) } or + /** + * INTERNAL: Do not use. + */ TProtocolMetatypeToObjectExpr(Raw::ProtocolMetatypeToObjectExpr id) { constructProtocolMetatypeToObjectExpr(id) } or + /** + * INTERNAL: Do not use. + */ TRebindSelfInConstructorExpr(Raw::RebindSelfInConstructorExpr id) { constructRebindSelfInConstructorExpr(id) } or + /** + * INTERNAL: Do not use. + */ TRegexLiteralExpr(Raw::RegexLiteralExpr id) { constructRegexLiteralExpr(id) } or + /** + * INTERNAL: Do not use. + */ TSequenceExpr(Raw::SequenceExpr id) { constructSequenceExpr(id) } or + /** + * INTERNAL: Do not use. + */ TStringLiteralExpr(Raw::StringLiteralExpr id) { constructStringLiteralExpr(id) } or + /** + * INTERNAL: Do not use. + */ TStringToPointerExpr(Raw::StringToPointerExpr id) { constructStringToPointerExpr(id) } or + /** + * INTERNAL: Do not use. + */ TSubscriptExpr(Raw::SubscriptExpr id) { constructSubscriptExpr(id) } or + /** + * INTERNAL: Do not use. + */ TSuperRefExpr(Raw::SuperRefExpr id) { constructSuperRefExpr(id) } or + /** + * INTERNAL: Do not use. + */ TTapExpr(Raw::TapExpr id) { constructTapExpr(id) } or + /** + * INTERNAL: Do not use. + */ TTryExpr(Raw::TryExpr id) { constructTryExpr(id) } or + /** + * INTERNAL: Do not use. + */ TTupleElementExpr(Raw::TupleElementExpr id) { constructTupleElementExpr(id) } or + /** + * INTERNAL: Do not use. + */ TTupleExpr(Raw::TupleExpr id) { constructTupleExpr(id) } or + /** + * INTERNAL: Do not use. + */ TTypeExpr(Raw::TypeExpr id) { constructTypeExpr(id) } or + /** + * INTERNAL: Do not use. + */ TUnderlyingToOpaqueExpr(Raw::UnderlyingToOpaqueExpr id) { constructUnderlyingToOpaqueExpr(id) } or + /** + * INTERNAL: Do not use. + */ TUnevaluatedInstanceExpr(Raw::UnevaluatedInstanceExpr id) { constructUnevaluatedInstanceExpr(id) } or + /** + * INTERNAL: Do not use. + */ TUnresolvedDeclRefExpr(Raw::UnresolvedDeclRefExpr id) { constructUnresolvedDeclRefExpr(id) } or + /** + * INTERNAL: Do not use. + */ TUnresolvedDotExpr(Raw::UnresolvedDotExpr id) { constructUnresolvedDotExpr(id) } or + /** + * INTERNAL: Do not use. + */ TUnresolvedMemberChainResultExpr(Raw::UnresolvedMemberChainResultExpr id) { constructUnresolvedMemberChainResultExpr(id) } or + /** + * INTERNAL: Do not use. + */ TUnresolvedMemberExpr(Raw::UnresolvedMemberExpr id) { constructUnresolvedMemberExpr(id) } or + /** + * INTERNAL: Do not use. + */ TUnresolvedPatternExpr(Raw::UnresolvedPatternExpr id) { constructUnresolvedPatternExpr(id) } or + /** + * INTERNAL: Do not use. + */ TUnresolvedSpecializeExpr(Raw::UnresolvedSpecializeExpr id) { constructUnresolvedSpecializeExpr(id) } or + /** + * INTERNAL: Do not use. + */ TUnresolvedTypeConversionExpr(Raw::UnresolvedTypeConversionExpr id) { constructUnresolvedTypeConversionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TVarargExpansionExpr(Raw::VarargExpansionExpr id) { constructVarargExpansionExpr(id) } or + /** + * INTERNAL: Do not use. + */ TAnyPattern(Raw::AnyPattern id) { constructAnyPattern(id) } or + /** + * INTERNAL: Do not use. + */ TBindingPattern(Raw::BindingPattern id) { constructBindingPattern(id) } or + /** + * INTERNAL: Do not use. + */ TBoolPattern(Raw::BoolPattern id) { constructBoolPattern(id) } or + /** + * INTERNAL: Do not use. + */ TEnumElementPattern(Raw::EnumElementPattern id) { constructEnumElementPattern(id) } or + /** + * INTERNAL: Do not use. + */ TExprPattern(Raw::ExprPattern id) { constructExprPattern(id) } or + /** + * INTERNAL: Do not use. + */ TIsPattern(Raw::IsPattern id) { constructIsPattern(id) } or + /** + * INTERNAL: Do not use. + */ TNamedPattern(Raw::NamedPattern id) { constructNamedPattern(id) } or + /** + * INTERNAL: Do not use. + */ TOptionalSomePattern(Raw::OptionalSomePattern id) { constructOptionalSomePattern(id) } or + /** + * INTERNAL: Do not use. + */ TParenPattern(Raw::ParenPattern id) { constructParenPattern(id) } or + /** + * INTERNAL: Do not use. + */ TTuplePattern(Raw::TuplePattern id) { constructTuplePattern(id) } or + /** + * INTERNAL: Do not use. + */ TTypedPattern(Raw::TypedPattern id) { constructTypedPattern(id) } or + /** + * INTERNAL: Do not use. + */ TBraceStmt(Raw::BraceStmt id) { constructBraceStmt(id) } or + /** + * INTERNAL: Do not use. + */ TBreakStmt(Raw::BreakStmt id) { constructBreakStmt(id) } or + /** + * INTERNAL: Do not use. + */ TCaseLabelItem(Raw::CaseLabelItem id) { constructCaseLabelItem(id) } or + /** + * INTERNAL: Do not use. + */ TCaseStmt(Raw::CaseStmt id) { constructCaseStmt(id) } or + /** + * INTERNAL: Do not use. + */ TConditionElement(Raw::ConditionElement id) { constructConditionElement(id) } or + /** + * INTERNAL: Do not use. + */ TContinueStmt(Raw::ContinueStmt id) { constructContinueStmt(id) } or + /** + * INTERNAL: Do not use. + */ TDeferStmt(Raw::DeferStmt id) { constructDeferStmt(id) } or + /** + * INTERNAL: Do not use. + */ TDoCatchStmt(Raw::DoCatchStmt id) { constructDoCatchStmt(id) } or + /** + * INTERNAL: Do not use. + */ TDoStmt(Raw::DoStmt id) { constructDoStmt(id) } or + /** + * INTERNAL: Do not use. + */ TFailStmt(Raw::FailStmt id) { constructFailStmt(id) } or + /** + * INTERNAL: Do not use. + */ TFallthroughStmt(Raw::FallthroughStmt id) { constructFallthroughStmt(id) } or + /** + * INTERNAL: Do not use. + */ TForEachStmt(Raw::ForEachStmt id) { constructForEachStmt(id) } or + /** + * INTERNAL: Do not use. + */ TGuardStmt(Raw::GuardStmt id) { constructGuardStmt(id) } or + /** + * INTERNAL: Do not use. + */ TIfStmt(Raw::IfStmt id) { constructIfStmt(id) } or + /** + * INTERNAL: Do not use. + */ TPoundAssertStmt(Raw::PoundAssertStmt id) { constructPoundAssertStmt(id) } or + /** + * INTERNAL: Do not use. + */ TRepeatWhileStmt(Raw::RepeatWhileStmt id) { constructRepeatWhileStmt(id) } or + /** + * INTERNAL: Do not use. + */ TReturnStmt(Raw::ReturnStmt id) { constructReturnStmt(id) } or + /** + * INTERNAL: Do not use. + */ TStmtCondition(Raw::StmtCondition id) { constructStmtCondition(id) } or + /** + * INTERNAL: Do not use. + */ TSwitchStmt(Raw::SwitchStmt id) { constructSwitchStmt(id) } or + /** + * INTERNAL: Do not use. + */ TThrowStmt(Raw::ThrowStmt id) { constructThrowStmt(id) } or + /** + * INTERNAL: Do not use. + */ TWhileStmt(Raw::WhileStmt id) { constructWhileStmt(id) } or + /** + * INTERNAL: Do not use. + */ TYieldStmt(Raw::YieldStmt id) { constructYieldStmt(id) } or + /** + * INTERNAL: Do not use. + */ TArraySliceType(Raw::ArraySliceType id) { constructArraySliceType(id) } or + /** + * INTERNAL: Do not use. + */ TBoundGenericClassType(Raw::BoundGenericClassType id) { constructBoundGenericClassType(id) } or + /** + * INTERNAL: Do not use. + */ TBoundGenericEnumType(Raw::BoundGenericEnumType id) { constructBoundGenericEnumType(id) } or + /** + * INTERNAL: Do not use. + */ TBoundGenericStructType(Raw::BoundGenericStructType id) { constructBoundGenericStructType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinBridgeObjectType(Raw::BuiltinBridgeObjectType id) { constructBuiltinBridgeObjectType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinDefaultActorStorageType(Raw::BuiltinDefaultActorStorageType id) { constructBuiltinDefaultActorStorageType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinExecutorType(Raw::BuiltinExecutorType id) { constructBuiltinExecutorType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinFloatType(Raw::BuiltinFloatType id) { constructBuiltinFloatType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinIntegerLiteralType(Raw::BuiltinIntegerLiteralType id) { constructBuiltinIntegerLiteralType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinIntegerType(Raw::BuiltinIntegerType id) { constructBuiltinIntegerType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinJobType(Raw::BuiltinJobType id) { constructBuiltinJobType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinNativeObjectType(Raw::BuiltinNativeObjectType id) { constructBuiltinNativeObjectType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinRawPointerType(Raw::BuiltinRawPointerType id) { constructBuiltinRawPointerType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinRawUnsafeContinuationType(Raw::BuiltinRawUnsafeContinuationType id) { constructBuiltinRawUnsafeContinuationType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinUnsafeValueBufferType(Raw::BuiltinUnsafeValueBufferType id) { constructBuiltinUnsafeValueBufferType(id) } or + /** + * INTERNAL: Do not use. + */ TBuiltinVectorType(Raw::BuiltinVectorType id) { constructBuiltinVectorType(id) } or + /** + * INTERNAL: Do not use. + */ TClassType(Raw::ClassType id) { constructClassType(id) } or + /** + * INTERNAL: Do not use. + */ TDependentMemberType(Raw::DependentMemberType id) { constructDependentMemberType(id) } or + /** + * INTERNAL: Do not use. + */ TDictionaryType(Raw::DictionaryType id) { constructDictionaryType(id) } or + /** + * INTERNAL: Do not use. + */ TDynamicSelfType(Raw::DynamicSelfType id) { constructDynamicSelfType(id) } or + /** + * INTERNAL: Do not use. + */ TEnumType(Raw::EnumType id) { constructEnumType(id) } or + /** + * INTERNAL: Do not use. + */ TErrorType(Raw::ErrorType id) { constructErrorType(id) } or + /** + * INTERNAL: Do not use. + */ TExistentialMetatypeType(Raw::ExistentialMetatypeType id) { constructExistentialMetatypeType(id) } or + /** + * INTERNAL: Do not use. + */ TExistentialType(Raw::ExistentialType id) { constructExistentialType(id) } or + /** + * INTERNAL: Do not use. + */ TFunctionType(Raw::FunctionType id) { constructFunctionType(id) } or + /** + * INTERNAL: Do not use. + */ TGenericFunctionType(Raw::GenericFunctionType id) { constructGenericFunctionType(id) } or + /** + * INTERNAL: Do not use. + */ TGenericTypeParamType(Raw::GenericTypeParamType id) { constructGenericTypeParamType(id) } or + /** + * INTERNAL: Do not use. + */ TInOutType(Raw::InOutType id) { constructInOutType(id) } or + /** + * INTERNAL: Do not use. + */ TLValueType(Raw::LValueType id) { constructLValueType(id) } or + /** + * INTERNAL: Do not use. + */ TMetatypeType(Raw::MetatypeType id) { constructMetatypeType(id) } or + /** + * INTERNAL: Do not use. + */ TModuleType(Raw::ModuleType id) { constructModuleType(id) } or + /** + * INTERNAL: Do not use. + */ TOpaqueTypeArchetypeType(Raw::OpaqueTypeArchetypeType id) { constructOpaqueTypeArchetypeType(id) } or + /** + * INTERNAL: Do not use. + */ TOpenedArchetypeType(Raw::OpenedArchetypeType id) { constructOpenedArchetypeType(id) } or + /** + * INTERNAL: Do not use. + */ TOptionalType(Raw::OptionalType id) { constructOptionalType(id) } or + /** + * INTERNAL: Do not use. + */ TParameterizedProtocolType(Raw::ParameterizedProtocolType id) { constructParameterizedProtocolType(id) } or + /** + * INTERNAL: Do not use. + */ TParenType(Raw::ParenType id) { constructParenType(id) } or + /** + * INTERNAL: Do not use. + */ TPrimaryArchetypeType(Raw::PrimaryArchetypeType id) { constructPrimaryArchetypeType(id) } or + /** + * INTERNAL: Do not use. + */ TProtocolCompositionType(Raw::ProtocolCompositionType id) { constructProtocolCompositionType(id) } or + /** + * INTERNAL: Do not use. + */ TProtocolType(Raw::ProtocolType id) { constructProtocolType(id) } or + /** + * INTERNAL: Do not use. + */ TStructType(Raw::StructType id) { constructStructType(id) } or + /** + * INTERNAL: Do not use. + */ TTupleType(Raw::TupleType id) { constructTupleType(id) } or + /** + * INTERNAL: Do not use. + */ TTypeAliasType(Raw::TypeAliasType id) { constructTypeAliasType(id) } or + /** + * INTERNAL: Do not use. + */ TTypeRepr(Raw::TypeRepr id) { constructTypeRepr(id) } or + /** + * INTERNAL: Do not use. + */ TUnboundGenericType(Raw::UnboundGenericType id) { constructUnboundGenericType(id) } or + /** + * INTERNAL: Do not use. + */ TUnmanagedStorageType(Raw::UnmanagedStorageType id) { constructUnmanagedStorageType(id) } or + /** + * INTERNAL: Do not use. + */ TUnownedStorageType(Raw::UnownedStorageType id) { constructUnownedStorageType(id) } or + /** + * INTERNAL: Do not use. + */ TUnresolvedType(Raw::UnresolvedType id) { constructUnresolvedType(id) } or + /** + * INTERNAL: Do not use. + */ TVariadicSequenceType(Raw::VariadicSequenceType id) { constructVariadicSequenceType(id) } or + /** + * INTERNAL: Do not use. + */ TWeakStorageType(Raw::WeakStorageType id) { constructWeakStorageType(id) } + /** + * INTERNAL: Do not use. + */ class TAstNode = TAvailabilityInfo or TAvailabilitySpec or TCaseLabelItem or TConditionElement or TDecl or TExpr or TKeyPathComponent or TPattern or TStmt or TStmtCondition or TTypeRepr; + /** + * INTERNAL: Do not use. + */ class TAvailabilitySpec = TOtherAvailabilitySpec or TPlatformVersionAvailabilitySpec; + /** + * INTERNAL: Do not use. + */ class TCallable = TAbstractClosureExpr or TAbstractFunctionDecl; + /** + * INTERNAL: Do not use. + */ class TErrorElement = TErrorExpr or TErrorType or TOverloadedDeclRefExpr or TUnresolvedDeclRefExpr or TUnresolvedDotExpr or TUnresolvedMemberChainResultExpr or TUnresolvedMemberExpr or TUnresolvedPatternExpr or TUnresolvedSpecializeExpr or TUnresolvedType or TUnresolvedTypeConversionExpr or TUnspecifiedElement; + /** + * INTERNAL: Do not use. + */ class TFile = TDbFile or TUnknownFile; + /** + * INTERNAL: Do not use. + */ class TLocatable = TArgument or TAstNode or TComment or TDiagnostics or TErrorElement; + /** + * INTERNAL: Do not use. + */ class TLocation = TDbLocation or TUnknownLocation; + /** + * INTERNAL: Do not use. + */ class TAbstractFunctionDecl = TConstructorDecl or TDestructorDecl or TFuncDecl; + /** + * INTERNAL: Do not use. + */ class TAbstractStorageDecl = TSubscriptDecl or TVarDecl; + /** + * INTERNAL: Do not use. + */ class TAbstractTypeParamDecl = TAssociatedTypeDecl or TGenericTypeParamDecl; + /** + * INTERNAL: Do not use. + */ class TDecl = TCapturedDecl or TEnumCaseDecl or TExtensionDecl or TIfConfigDecl or TImportDecl or TMissingMemberDecl or TOperatorDecl or TPatternBindingDecl or TPoundDiagnosticDecl or TPrecedenceGroupDecl or TTopLevelCodeDecl or TValueDecl; + /** + * INTERNAL: Do not use. + */ class TFuncDecl = TAccessorDecl or TConcreteFuncDecl; + /** + * INTERNAL: Do not use. + */ class TGenericContext = TAbstractFunctionDecl or TExtensionDecl or TGenericTypeDecl or TSubscriptDecl; + /** + * INTERNAL: Do not use. + */ class TGenericTypeDecl = TNominalTypeDecl or TOpaqueTypeDecl or TTypeAliasDecl; + /** + * INTERNAL: Do not use. + */ class TNominalTypeDecl = TClassDecl or TEnumDecl or TProtocolDecl or TStructDecl; + /** + * INTERNAL: Do not use. + */ class TOperatorDecl = TInfixOperatorDecl or TPostfixOperatorDecl or TPrefixOperatorDecl; + /** + * INTERNAL: Do not use. + */ class TTypeDecl = TAbstractTypeParamDecl or TGenericTypeDecl or TModuleDecl; + /** + * INTERNAL: Do not use. + */ class TValueDecl = TAbstractFunctionDecl or TAbstractStorageDecl or TEnumElementDecl or TTypeDecl; + /** + * INTERNAL: Do not use. + */ class TVarDecl = TConcreteVarDecl or TParamDecl; + /** + * INTERNAL: Do not use. + */ class TAbstractClosureExpr = TAutoClosureExpr or TClosureExpr; + /** + * INTERNAL: Do not use. + */ class TAnyTryExpr = TForceTryExpr or TOptionalTryExpr or TTryExpr; + /** + * INTERNAL: Do not use. + */ class TApplyExpr = TBinaryExpr or TCallExpr or TPostfixUnaryExpr or TPrefixUnaryExpr or TSelfApplyExpr; + /** + * INTERNAL: Do not use. + */ class TBuiltinLiteralExpr = TBooleanLiteralExpr or TMagicIdentifierLiteralExpr or TNumberLiteralExpr or TStringLiteralExpr; + /** + * INTERNAL: Do not use. + */ class TCheckedCastExpr = TConditionalCheckedCastExpr or TForcedCheckedCastExpr or TIsExpr; + /** + * INTERNAL: Do not use. + */ class TCollectionExpr = TArrayExpr or TDictionaryExpr; + /** + * INTERNAL: Do not use. + */ class TDynamicLookupExpr = TDynamicMemberRefExpr or TDynamicSubscriptExpr; + /** + * INTERNAL: Do not use. + */ class TExplicitCastExpr = TCheckedCastExpr or TCoerceExpr; + /** + * INTERNAL: Do not use. + */ class TExpr = TAbstractClosureExpr or TAnyTryExpr or TAppliedPropertyWrapperExpr or TApplyExpr or TAssignExpr or TBindOptionalExpr or TCaptureListExpr or TCollectionExpr or TDeclRefExpr or @@ -390,9 +1177,15 @@ module Synth { TUnresolvedDeclRefExpr or TUnresolvedDotExpr or TUnresolvedMemberExpr or TUnresolvedPatternExpr or TUnresolvedSpecializeExpr or TVarargExpansionExpr; + /** + * INTERNAL: Do not use. + */ class TIdentityExpr = TAwaitExpr or TDotSelfExpr or TParenExpr or TUnresolvedMemberChainResultExpr; + /** + * INTERNAL: Do not use. + */ class TImplicitConversionExpr = TAbiSafeConversionExpr or TAnyHashableErasureExpr or TArchetypeToSuperExpr or TArrayToPointerExpr or TBridgeFromObjCExpr or TBridgeToObjCExpr or @@ -407,350 +1200,715 @@ module Synth { TPointerToPointerExpr or TProtocolMetatypeToObjectExpr or TStringToPointerExpr or TUnderlyingToOpaqueExpr or TUnevaluatedInstanceExpr or TUnresolvedTypeConversionExpr; + /** + * INTERNAL: Do not use. + */ class TLiteralExpr = TBuiltinLiteralExpr or TInterpolatedStringLiteralExpr or TNilLiteralExpr or TObjectLiteralExpr or TRegexLiteralExpr; + /** + * INTERNAL: Do not use. + */ class TLookupExpr = TDynamicLookupExpr or TMemberRefExpr or TMethodLookupExpr or TSubscriptExpr; + /** + * INTERNAL: Do not use. + */ class TNumberLiteralExpr = TFloatLiteralExpr or TIntegerLiteralExpr; + /** + * INTERNAL: Do not use. + */ class TSelfApplyExpr = TConstructorRefCallExpr or TDotSyntaxCallExpr; + /** + * INTERNAL: Do not use. + */ class TPattern = TAnyPattern or TBindingPattern or TBoolPattern or TEnumElementPattern or TExprPattern or TIsPattern or TNamedPattern or TOptionalSomePattern or TParenPattern or TTuplePattern or TTypedPattern; + /** + * INTERNAL: Do not use. + */ class TLabeledConditionalStmt = TGuardStmt or TIfStmt or TWhileStmt; + /** + * INTERNAL: Do not use. + */ class TLabeledStmt = TDoCatchStmt or TDoStmt or TForEachStmt or TLabeledConditionalStmt or TRepeatWhileStmt or TSwitchStmt; + /** + * INTERNAL: Do not use. + */ class TStmt = TBraceStmt or TBreakStmt or TCaseStmt or TContinueStmt or TDeferStmt or TFailStmt or TFallthroughStmt or TLabeledStmt or TPoundAssertStmt or TReturnStmt or TThrowStmt or TYieldStmt; + /** + * INTERNAL: Do not use. + */ class TAnyBuiltinIntegerType = TBuiltinIntegerLiteralType or TBuiltinIntegerType; + /** + * INTERNAL: Do not use. + */ class TAnyFunctionType = TFunctionType or TGenericFunctionType; + /** + * INTERNAL: Do not use. + */ class TAnyGenericType = TNominalOrBoundGenericNominalType or TUnboundGenericType; + /** + * INTERNAL: Do not use. + */ class TAnyMetatypeType = TExistentialMetatypeType or TMetatypeType; + /** + * INTERNAL: Do not use. + */ class TArchetypeType = TOpaqueTypeArchetypeType or TOpenedArchetypeType or TPrimaryArchetypeType; + /** + * INTERNAL: Do not use. + */ class TBoundGenericType = TBoundGenericClassType or TBoundGenericEnumType or TBoundGenericStructType; + /** + * INTERNAL: Do not use. + */ class TBuiltinType = TAnyBuiltinIntegerType or TBuiltinBridgeObjectType or TBuiltinDefaultActorStorageType or TBuiltinExecutorType or TBuiltinFloatType or TBuiltinJobType or TBuiltinNativeObjectType or TBuiltinRawPointerType or TBuiltinRawUnsafeContinuationType or TBuiltinUnsafeValueBufferType or TBuiltinVectorType; + /** + * INTERNAL: Do not use. + */ class TNominalOrBoundGenericNominalType = TBoundGenericType or TNominalType; + /** + * INTERNAL: Do not use. + */ class TNominalType = TClassType or TEnumType or TProtocolType or TStructType; + /** + * INTERNAL: Do not use. + */ class TReferenceStorageType = TUnmanagedStorageType or TUnownedStorageType or TWeakStorageType; + /** + * INTERNAL: Do not use. + */ class TSubstitutableType = TArchetypeType or TGenericTypeParamType; + /** + * INTERNAL: Do not use. + */ class TSugarType = TParenType or TSyntaxSugarType or TTypeAliasType; + /** + * INTERNAL: Do not use. + */ class TSyntaxSugarType = TDictionaryType or TUnarySyntaxSugarType; + /** + * INTERNAL: Do not use. + */ class TType = TAnyFunctionType or TAnyGenericType or TAnyMetatypeType or TBuiltinType or TDependentMemberType or TDynamicSelfType or TErrorType or TExistentialType or TInOutType or TLValueType or TModuleType or TParameterizedProtocolType or TProtocolCompositionType or TReferenceStorageType or TSubstitutableType or TSugarType or TTupleType or TUnresolvedType; + /** + * INTERNAL: Do not use. + */ class TUnarySyntaxSugarType = TArraySliceType or TOptionalType or TVariadicSequenceType; + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TAvailabilityInfo`, if possible. + */ cached TAvailabilityInfo convertAvailabilityInfoFromRaw(Raw::Element e) { result = TAvailabilityInfo(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TComment`, if possible. + */ cached TComment convertCommentFromRaw(Raw::Element e) { result = TComment(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDbFile`, if possible. + */ cached TDbFile convertDbFileFromRaw(Raw::Element e) { result = TDbFile(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDbLocation`, if possible. + */ cached TDbLocation convertDbLocationFromRaw(Raw::Element e) { result = TDbLocation(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDiagnostics`, if possible. + */ cached TDiagnostics convertDiagnosticsFromRaw(Raw::Element e) { result = TDiagnostics(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TKeyPathComponent`, if possible. + */ cached TKeyPathComponent convertKeyPathComponentFromRaw(Raw::Element e) { result = TKeyPathComponent(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOtherAvailabilitySpec`, if possible. + */ cached TOtherAvailabilitySpec convertOtherAvailabilitySpecFromRaw(Raw::Element e) { result = TOtherAvailabilitySpec(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPlatformVersionAvailabilitySpec`, if possible. + */ cached TPlatformVersionAvailabilitySpec convertPlatformVersionAvailabilitySpecFromRaw(Raw::Element e) { result = TPlatformVersionAvailabilitySpec(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnknownFile`, if possible. + */ cached TUnknownFile convertUnknownFileFromRaw(Raw::Element e) { none() } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnknownLocation`, if possible. + */ cached TUnknownLocation convertUnknownLocationFromRaw(Raw::Element e) { none() } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnspecifiedElement`, if possible. + */ cached TUnspecifiedElement convertUnspecifiedElementFromRaw(Raw::Element e) { result = TUnspecifiedElement(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TAccessorDecl`, if possible. + */ cached TAccessorDecl convertAccessorDeclFromRaw(Raw::Element e) { result = TAccessorDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TAssociatedTypeDecl`, if possible. + */ cached TAssociatedTypeDecl convertAssociatedTypeDeclFromRaw(Raw::Element e) { result = TAssociatedTypeDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TCapturedDecl`, if possible. + */ cached TCapturedDecl convertCapturedDeclFromRaw(Raw::Element e) { result = TCapturedDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TClassDecl`, if possible. + */ cached TClassDecl convertClassDeclFromRaw(Raw::Element e) { result = TClassDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TConcreteFuncDecl`, if possible. + */ cached TConcreteFuncDecl convertConcreteFuncDeclFromRaw(Raw::Element e) { result = TConcreteFuncDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TConcreteVarDecl`, if possible. + */ cached TConcreteVarDecl convertConcreteVarDeclFromRaw(Raw::Element e) { result = TConcreteVarDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TConstructorDecl`, if possible. + */ cached TConstructorDecl convertConstructorDeclFromRaw(Raw::Element e) { result = TConstructorDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDestructorDecl`, if possible. + */ cached TDestructorDecl convertDestructorDeclFromRaw(Raw::Element e) { result = TDestructorDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TEnumCaseDecl`, if possible. + */ cached TEnumCaseDecl convertEnumCaseDeclFromRaw(Raw::Element e) { result = TEnumCaseDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TEnumDecl`, if possible. + */ cached TEnumDecl convertEnumDeclFromRaw(Raw::Element e) { result = TEnumDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TEnumElementDecl`, if possible. + */ cached TEnumElementDecl convertEnumElementDeclFromRaw(Raw::Element e) { result = TEnumElementDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TExtensionDecl`, if possible. + */ cached TExtensionDecl convertExtensionDeclFromRaw(Raw::Element e) { result = TExtensionDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TGenericTypeParamDecl`, if possible. + */ cached TGenericTypeParamDecl convertGenericTypeParamDeclFromRaw(Raw::Element e) { result = TGenericTypeParamDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TIfConfigDecl`, if possible. + */ cached TIfConfigDecl convertIfConfigDeclFromRaw(Raw::Element e) { result = TIfConfigDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TImportDecl`, if possible. + */ cached TImportDecl convertImportDeclFromRaw(Raw::Element e) { result = TImportDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TInfixOperatorDecl`, if possible. + */ cached TInfixOperatorDecl convertInfixOperatorDeclFromRaw(Raw::Element e) { result = TInfixOperatorDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TMissingMemberDecl`, if possible. + */ cached TMissingMemberDecl convertMissingMemberDeclFromRaw(Raw::Element e) { result = TMissingMemberDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TModuleDecl`, if possible. + */ cached TModuleDecl convertModuleDeclFromRaw(Raw::Element e) { result = TModuleDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOpaqueTypeDecl`, if possible. + */ cached TOpaqueTypeDecl convertOpaqueTypeDeclFromRaw(Raw::Element e) { result = TOpaqueTypeDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TParamDecl`, if possible. + */ cached TParamDecl convertParamDeclFromRaw(Raw::Element e) { result = TParamDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPatternBindingDecl`, if possible. + */ cached TPatternBindingDecl convertPatternBindingDeclFromRaw(Raw::Element e) { result = TPatternBindingDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPostfixOperatorDecl`, if possible. + */ cached TPostfixOperatorDecl convertPostfixOperatorDeclFromRaw(Raw::Element e) { result = TPostfixOperatorDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPoundDiagnosticDecl`, if possible. + */ cached TPoundDiagnosticDecl convertPoundDiagnosticDeclFromRaw(Raw::Element e) { result = TPoundDiagnosticDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPrecedenceGroupDecl`, if possible. + */ cached TPrecedenceGroupDecl convertPrecedenceGroupDeclFromRaw(Raw::Element e) { result = TPrecedenceGroupDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPrefixOperatorDecl`, if possible. + */ cached TPrefixOperatorDecl convertPrefixOperatorDeclFromRaw(Raw::Element e) { result = TPrefixOperatorDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TProtocolDecl`, if possible. + */ cached TProtocolDecl convertProtocolDeclFromRaw(Raw::Element e) { result = TProtocolDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TStructDecl`, if possible. + */ cached TStructDecl convertStructDeclFromRaw(Raw::Element e) { result = TStructDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TSubscriptDecl`, if possible. + */ cached TSubscriptDecl convertSubscriptDeclFromRaw(Raw::Element e) { result = TSubscriptDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTopLevelCodeDecl`, if possible. + */ cached TTopLevelCodeDecl convertTopLevelCodeDeclFromRaw(Raw::Element e) { result = TTopLevelCodeDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTypeAliasDecl`, if possible. + */ cached TTypeAliasDecl convertTypeAliasDeclFromRaw(Raw::Element e) { result = TTypeAliasDecl(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TAbiSafeConversionExpr`, if possible. + */ cached TAbiSafeConversionExpr convertAbiSafeConversionExprFromRaw(Raw::Element e) { result = TAbiSafeConversionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TAnyHashableErasureExpr`, if possible. + */ cached TAnyHashableErasureExpr convertAnyHashableErasureExprFromRaw(Raw::Element e) { result = TAnyHashableErasureExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TAppliedPropertyWrapperExpr`, if possible. + */ cached TAppliedPropertyWrapperExpr convertAppliedPropertyWrapperExprFromRaw(Raw::Element e) { result = TAppliedPropertyWrapperExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TArchetypeToSuperExpr`, if possible. + */ cached TArchetypeToSuperExpr convertArchetypeToSuperExprFromRaw(Raw::Element e) { result = TArchetypeToSuperExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TArgument`, if possible. + */ cached TArgument convertArgumentFromRaw(Raw::Element e) { result = TArgument(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TArrayExpr`, if possible. + */ cached TArrayExpr convertArrayExprFromRaw(Raw::Element e) { result = TArrayExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TArrayToPointerExpr`, if possible. + */ cached TArrayToPointerExpr convertArrayToPointerExprFromRaw(Raw::Element e) { result = TArrayToPointerExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TAssignExpr`, if possible. + */ cached TAssignExpr convertAssignExprFromRaw(Raw::Element e) { result = TAssignExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TAutoClosureExpr`, if possible. + */ cached TAutoClosureExpr convertAutoClosureExprFromRaw(Raw::Element e) { result = TAutoClosureExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TAwaitExpr`, if possible. + */ cached TAwaitExpr convertAwaitExprFromRaw(Raw::Element e) { result = TAwaitExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBinaryExpr`, if possible. + */ cached TBinaryExpr convertBinaryExprFromRaw(Raw::Element e) { result = TBinaryExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBindOptionalExpr`, if possible. + */ cached TBindOptionalExpr convertBindOptionalExprFromRaw(Raw::Element e) { result = TBindOptionalExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBooleanLiteralExpr`, if possible. + */ cached TBooleanLiteralExpr convertBooleanLiteralExprFromRaw(Raw::Element e) { result = TBooleanLiteralExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBridgeFromObjCExpr`, if possible. + */ cached TBridgeFromObjCExpr convertBridgeFromObjCExprFromRaw(Raw::Element e) { result = TBridgeFromObjCExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBridgeToObjCExpr`, if possible. + */ cached TBridgeToObjCExpr convertBridgeToObjCExprFromRaw(Raw::Element e) { result = TBridgeToObjCExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TCallExpr`, if possible. + */ cached TCallExpr convertCallExprFromRaw(Raw::Element e) { result = TCallExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TCaptureListExpr`, if possible. + */ cached TCaptureListExpr convertCaptureListExprFromRaw(Raw::Element e) { result = TCaptureListExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TClassMetatypeToObjectExpr`, if possible. + */ cached TClassMetatypeToObjectExpr convertClassMetatypeToObjectExprFromRaw(Raw::Element e) { result = TClassMetatypeToObjectExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TClosureExpr`, if possible. + */ cached TClosureExpr convertClosureExprFromRaw(Raw::Element e) { result = TClosureExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TCoerceExpr`, if possible. + */ cached TCoerceExpr convertCoerceExprFromRaw(Raw::Element e) { result = TCoerceExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TCollectionUpcastConversionExpr`, if possible. + */ cached TCollectionUpcastConversionExpr convertCollectionUpcastConversionExprFromRaw(Raw::Element e) { result = TCollectionUpcastConversionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TConditionalBridgeFromObjCExpr`, if possible. + */ cached TConditionalBridgeFromObjCExpr convertConditionalBridgeFromObjCExprFromRaw(Raw::Element e) { result = TConditionalBridgeFromObjCExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TConditionalCheckedCastExpr`, if possible. + */ cached TConditionalCheckedCastExpr convertConditionalCheckedCastExprFromRaw(Raw::Element e) { result = TConditionalCheckedCastExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TConstructorRefCallExpr`, if possible. + */ cached TConstructorRefCallExpr convertConstructorRefCallExprFromRaw(Raw::Element e) { result = TConstructorRefCallExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TCovariantFunctionConversionExpr`, if possible. + */ cached TCovariantFunctionConversionExpr convertCovariantFunctionConversionExprFromRaw(Raw::Element e) { result = TCovariantFunctionConversionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TCovariantReturnConversionExpr`, if possible. + */ cached TCovariantReturnConversionExpr convertCovariantReturnConversionExprFromRaw(Raw::Element e) { result = TCovariantReturnConversionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDeclRefExpr`, if possible. + */ cached TDeclRefExpr convertDeclRefExprFromRaw(Raw::Element e) { result = TDeclRefExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDefaultArgumentExpr`, if possible. + */ cached TDefaultArgumentExpr convertDefaultArgumentExprFromRaw(Raw::Element e) { result = TDefaultArgumentExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDerivedToBaseExpr`, if possible. + */ cached TDerivedToBaseExpr convertDerivedToBaseExprFromRaw(Raw::Element e) { result = TDerivedToBaseExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDestructureTupleExpr`, if possible. + */ cached TDestructureTupleExpr convertDestructureTupleExprFromRaw(Raw::Element e) { result = TDestructureTupleExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDictionaryExpr`, if possible. + */ cached TDictionaryExpr convertDictionaryExprFromRaw(Raw::Element e) { result = TDictionaryExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDifferentiableFunctionExpr`, if possible. + */ cached TDifferentiableFunctionExpr convertDifferentiableFunctionExprFromRaw(Raw::Element e) { result = TDifferentiableFunctionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDifferentiableFunctionExtractOriginalExpr`, if possible. + */ cached TDifferentiableFunctionExtractOriginalExpr convertDifferentiableFunctionExtractOriginalExprFromRaw( Raw::Element e @@ -758,130 +1916,254 @@ module Synth { result = TDifferentiableFunctionExtractOriginalExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDiscardAssignmentExpr`, if possible. + */ cached TDiscardAssignmentExpr convertDiscardAssignmentExprFromRaw(Raw::Element e) { result = TDiscardAssignmentExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDotSelfExpr`, if possible. + */ cached TDotSelfExpr convertDotSelfExprFromRaw(Raw::Element e) { result = TDotSelfExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDotSyntaxBaseIgnoredExpr`, if possible. + */ cached TDotSyntaxBaseIgnoredExpr convertDotSyntaxBaseIgnoredExprFromRaw(Raw::Element e) { result = TDotSyntaxBaseIgnoredExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDotSyntaxCallExpr`, if possible. + */ cached TDotSyntaxCallExpr convertDotSyntaxCallExprFromRaw(Raw::Element e) { result = TDotSyntaxCallExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDynamicMemberRefExpr`, if possible. + */ cached TDynamicMemberRefExpr convertDynamicMemberRefExprFromRaw(Raw::Element e) { result = TDynamicMemberRefExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDynamicSubscriptExpr`, if possible. + */ cached TDynamicSubscriptExpr convertDynamicSubscriptExprFromRaw(Raw::Element e) { result = TDynamicSubscriptExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDynamicTypeExpr`, if possible. + */ cached TDynamicTypeExpr convertDynamicTypeExprFromRaw(Raw::Element e) { result = TDynamicTypeExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TEnumIsCaseExpr`, if possible. + */ cached TEnumIsCaseExpr convertEnumIsCaseExprFromRaw(Raw::Element e) { result = TEnumIsCaseExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TErasureExpr`, if possible. + */ cached TErasureExpr convertErasureExprFromRaw(Raw::Element e) { result = TErasureExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TErrorExpr`, if possible. + */ cached TErrorExpr convertErrorExprFromRaw(Raw::Element e) { result = TErrorExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TExistentialMetatypeToObjectExpr`, if possible. + */ cached TExistentialMetatypeToObjectExpr convertExistentialMetatypeToObjectExprFromRaw(Raw::Element e) { result = TExistentialMetatypeToObjectExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TFloatLiteralExpr`, if possible. + */ cached TFloatLiteralExpr convertFloatLiteralExprFromRaw(Raw::Element e) { result = TFloatLiteralExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TForceTryExpr`, if possible. + */ cached TForceTryExpr convertForceTryExprFromRaw(Raw::Element e) { result = TForceTryExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TForceValueExpr`, if possible. + */ cached TForceValueExpr convertForceValueExprFromRaw(Raw::Element e) { result = TForceValueExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TForcedCheckedCastExpr`, if possible. + */ cached TForcedCheckedCastExpr convertForcedCheckedCastExprFromRaw(Raw::Element e) { result = TForcedCheckedCastExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TForeignObjectConversionExpr`, if possible. + */ cached TForeignObjectConversionExpr convertForeignObjectConversionExprFromRaw(Raw::Element e) { result = TForeignObjectConversionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TFunctionConversionExpr`, if possible. + */ cached TFunctionConversionExpr convertFunctionConversionExprFromRaw(Raw::Element e) { result = TFunctionConversionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TIfExpr`, if possible. + */ cached TIfExpr convertIfExprFromRaw(Raw::Element e) { result = TIfExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TInOutExpr`, if possible. + */ cached TInOutExpr convertInOutExprFromRaw(Raw::Element e) { result = TInOutExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TInOutToPointerExpr`, if possible. + */ cached TInOutToPointerExpr convertInOutToPointerExprFromRaw(Raw::Element e) { result = TInOutToPointerExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TInjectIntoOptionalExpr`, if possible. + */ cached TInjectIntoOptionalExpr convertInjectIntoOptionalExprFromRaw(Raw::Element e) { result = TInjectIntoOptionalExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TIntegerLiteralExpr`, if possible. + */ cached TIntegerLiteralExpr convertIntegerLiteralExprFromRaw(Raw::Element e) { result = TIntegerLiteralExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TInterpolatedStringLiteralExpr`, if possible. + */ cached TInterpolatedStringLiteralExpr convertInterpolatedStringLiteralExprFromRaw(Raw::Element e) { result = TInterpolatedStringLiteralExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TIsExpr`, if possible. + */ cached TIsExpr convertIsExprFromRaw(Raw::Element e) { result = TIsExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TKeyPathApplicationExpr`, if possible. + */ cached TKeyPathApplicationExpr convertKeyPathApplicationExprFromRaw(Raw::Element e) { result = TKeyPathApplicationExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TKeyPathDotExpr`, if possible. + */ cached TKeyPathDotExpr convertKeyPathDotExprFromRaw(Raw::Element e) { result = TKeyPathDotExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TKeyPathExpr`, if possible. + */ cached TKeyPathExpr convertKeyPathExprFromRaw(Raw::Element e) { result = TKeyPathExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TLazyInitializerExpr`, if possible. + */ cached TLazyInitializerExpr convertLazyInitializerExprFromRaw(Raw::Element e) { result = TLazyInitializerExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TLinearFunctionExpr`, if possible. + */ cached TLinearFunctionExpr convertLinearFunctionExprFromRaw(Raw::Element e) { result = TLinearFunctionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TLinearFunctionExtractOriginalExpr`, if possible. + */ cached TLinearFunctionExtractOriginalExpr convertLinearFunctionExtractOriginalExprFromRaw(Raw::Element e) { result = TLinearFunctionExtractOriginalExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TLinearToDifferentiableFunctionExpr`, if possible. + */ cached TLinearToDifferentiableFunctionExpr convertLinearToDifferentiableFunctionExprFromRaw( Raw::Element e @@ -889,84 +2171,168 @@ module Synth { result = TLinearToDifferentiableFunctionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TLoadExpr`, if possible. + */ cached TLoadExpr convertLoadExprFromRaw(Raw::Element e) { result = TLoadExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TMagicIdentifierLiteralExpr`, if possible. + */ cached TMagicIdentifierLiteralExpr convertMagicIdentifierLiteralExprFromRaw(Raw::Element e) { result = TMagicIdentifierLiteralExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TMakeTemporarilyEscapableExpr`, if possible. + */ cached TMakeTemporarilyEscapableExpr convertMakeTemporarilyEscapableExprFromRaw(Raw::Element e) { result = TMakeTemporarilyEscapableExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TMemberRefExpr`, if possible. + */ cached TMemberRefExpr convertMemberRefExprFromRaw(Raw::Element e) { result = TMemberRefExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TMetatypeConversionExpr`, if possible. + */ cached TMetatypeConversionExpr convertMetatypeConversionExprFromRaw(Raw::Element e) { result = TMetatypeConversionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TMethodLookupExpr`, if possible. + */ cached TMethodLookupExpr convertMethodLookupExprFromRaw(Raw::Element e) { result = TMethodLookupExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TNilLiteralExpr`, if possible. + */ cached TNilLiteralExpr convertNilLiteralExprFromRaw(Raw::Element e) { result = TNilLiteralExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TObjCSelectorExpr`, if possible. + */ cached TObjCSelectorExpr convertObjCSelectorExprFromRaw(Raw::Element e) { result = TObjCSelectorExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TObjectLiteralExpr`, if possible. + */ cached TObjectLiteralExpr convertObjectLiteralExprFromRaw(Raw::Element e) { result = TObjectLiteralExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOneWayExpr`, if possible. + */ cached TOneWayExpr convertOneWayExprFromRaw(Raw::Element e) { result = TOneWayExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOpaqueValueExpr`, if possible. + */ cached TOpaqueValueExpr convertOpaqueValueExprFromRaw(Raw::Element e) { result = TOpaqueValueExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOpenExistentialExpr`, if possible. + */ cached TOpenExistentialExpr convertOpenExistentialExprFromRaw(Raw::Element e) { result = TOpenExistentialExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOptionalEvaluationExpr`, if possible. + */ cached TOptionalEvaluationExpr convertOptionalEvaluationExprFromRaw(Raw::Element e) { result = TOptionalEvaluationExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOptionalTryExpr`, if possible. + */ cached TOptionalTryExpr convertOptionalTryExprFromRaw(Raw::Element e) { result = TOptionalTryExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOtherConstructorDeclRefExpr`, if possible. + */ cached TOtherConstructorDeclRefExpr convertOtherConstructorDeclRefExprFromRaw(Raw::Element e) { result = TOtherConstructorDeclRefExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOverloadedDeclRefExpr`, if possible. + */ cached TOverloadedDeclRefExpr convertOverloadedDeclRefExprFromRaw(Raw::Element e) { result = TOverloadedDeclRefExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TParenExpr`, if possible. + */ cached TParenExpr convertParenExprFromRaw(Raw::Element e) { result = TParenExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPointerToPointerExpr`, if possible. + */ cached TPointerToPointerExpr convertPointerToPointerExprFromRaw(Raw::Element e) { result = TPointerToPointerExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPostfixUnaryExpr`, if possible. + */ cached TPostfixUnaryExpr convertPostfixUnaryExprFromRaw(Raw::Element e) { result = TPostfixUnaryExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPrefixUnaryExpr`, if possible. + */ cached TPrefixUnaryExpr convertPrefixUnaryExprFromRaw(Raw::Element e) { result = TPrefixUnaryExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPropertyWrapperValuePlaceholderExpr`, if possible. + */ cached TPropertyWrapperValuePlaceholderExpr convertPropertyWrapperValuePlaceholderExprFromRaw( Raw::Element e @@ -974,405 +2340,829 @@ module Synth { result = TPropertyWrapperValuePlaceholderExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TProtocolMetatypeToObjectExpr`, if possible. + */ cached TProtocolMetatypeToObjectExpr convertProtocolMetatypeToObjectExprFromRaw(Raw::Element e) { result = TProtocolMetatypeToObjectExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TRebindSelfInConstructorExpr`, if possible. + */ cached TRebindSelfInConstructorExpr convertRebindSelfInConstructorExprFromRaw(Raw::Element e) { result = TRebindSelfInConstructorExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TRegexLiteralExpr`, if possible. + */ cached TRegexLiteralExpr convertRegexLiteralExprFromRaw(Raw::Element e) { result = TRegexLiteralExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TSequenceExpr`, if possible. + */ cached TSequenceExpr convertSequenceExprFromRaw(Raw::Element e) { result = TSequenceExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TStringLiteralExpr`, if possible. + */ cached TStringLiteralExpr convertStringLiteralExprFromRaw(Raw::Element e) { result = TStringLiteralExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TStringToPointerExpr`, if possible. + */ cached TStringToPointerExpr convertStringToPointerExprFromRaw(Raw::Element e) { result = TStringToPointerExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TSubscriptExpr`, if possible. + */ cached TSubscriptExpr convertSubscriptExprFromRaw(Raw::Element e) { result = TSubscriptExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TSuperRefExpr`, if possible. + */ cached TSuperRefExpr convertSuperRefExprFromRaw(Raw::Element e) { result = TSuperRefExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTapExpr`, if possible. + */ cached TTapExpr convertTapExprFromRaw(Raw::Element e) { result = TTapExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTryExpr`, if possible. + */ cached TTryExpr convertTryExprFromRaw(Raw::Element e) { result = TTryExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTupleElementExpr`, if possible. + */ cached TTupleElementExpr convertTupleElementExprFromRaw(Raw::Element e) { result = TTupleElementExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTupleExpr`, if possible. + */ cached TTupleExpr convertTupleExprFromRaw(Raw::Element e) { result = TTupleExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTypeExpr`, if possible. + */ cached TTypeExpr convertTypeExprFromRaw(Raw::Element e) { result = TTypeExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnderlyingToOpaqueExpr`, if possible. + */ cached TUnderlyingToOpaqueExpr convertUnderlyingToOpaqueExprFromRaw(Raw::Element e) { result = TUnderlyingToOpaqueExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnevaluatedInstanceExpr`, if possible. + */ cached TUnevaluatedInstanceExpr convertUnevaluatedInstanceExprFromRaw(Raw::Element e) { result = TUnevaluatedInstanceExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnresolvedDeclRefExpr`, if possible. + */ cached TUnresolvedDeclRefExpr convertUnresolvedDeclRefExprFromRaw(Raw::Element e) { result = TUnresolvedDeclRefExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnresolvedDotExpr`, if possible. + */ cached TUnresolvedDotExpr convertUnresolvedDotExprFromRaw(Raw::Element e) { result = TUnresolvedDotExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnresolvedMemberChainResultExpr`, if possible. + */ cached TUnresolvedMemberChainResultExpr convertUnresolvedMemberChainResultExprFromRaw(Raw::Element e) { result = TUnresolvedMemberChainResultExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnresolvedMemberExpr`, if possible. + */ cached TUnresolvedMemberExpr convertUnresolvedMemberExprFromRaw(Raw::Element e) { result = TUnresolvedMemberExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnresolvedPatternExpr`, if possible. + */ cached TUnresolvedPatternExpr convertUnresolvedPatternExprFromRaw(Raw::Element e) { result = TUnresolvedPatternExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnresolvedSpecializeExpr`, if possible. + */ cached TUnresolvedSpecializeExpr convertUnresolvedSpecializeExprFromRaw(Raw::Element e) { result = TUnresolvedSpecializeExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnresolvedTypeConversionExpr`, if possible. + */ cached TUnresolvedTypeConversionExpr convertUnresolvedTypeConversionExprFromRaw(Raw::Element e) { result = TUnresolvedTypeConversionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TVarargExpansionExpr`, if possible. + */ cached TVarargExpansionExpr convertVarargExpansionExprFromRaw(Raw::Element e) { result = TVarargExpansionExpr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TAnyPattern`, if possible. + */ cached TAnyPattern convertAnyPatternFromRaw(Raw::Element e) { result = TAnyPattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBindingPattern`, if possible. + */ cached TBindingPattern convertBindingPatternFromRaw(Raw::Element e) { result = TBindingPattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBoolPattern`, if possible. + */ cached TBoolPattern convertBoolPatternFromRaw(Raw::Element e) { result = TBoolPattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TEnumElementPattern`, if possible. + */ cached TEnumElementPattern convertEnumElementPatternFromRaw(Raw::Element e) { result = TEnumElementPattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TExprPattern`, if possible. + */ cached TExprPattern convertExprPatternFromRaw(Raw::Element e) { result = TExprPattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TIsPattern`, if possible. + */ cached TIsPattern convertIsPatternFromRaw(Raw::Element e) { result = TIsPattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TNamedPattern`, if possible. + */ cached TNamedPattern convertNamedPatternFromRaw(Raw::Element e) { result = TNamedPattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOptionalSomePattern`, if possible. + */ cached TOptionalSomePattern convertOptionalSomePatternFromRaw(Raw::Element e) { result = TOptionalSomePattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TParenPattern`, if possible. + */ cached TParenPattern convertParenPatternFromRaw(Raw::Element e) { result = TParenPattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTuplePattern`, if possible. + */ cached TTuplePattern convertTuplePatternFromRaw(Raw::Element e) { result = TTuplePattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTypedPattern`, if possible. + */ cached TTypedPattern convertTypedPatternFromRaw(Raw::Element e) { result = TTypedPattern(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBraceStmt`, if possible. + */ cached TBraceStmt convertBraceStmtFromRaw(Raw::Element e) { result = TBraceStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBreakStmt`, if possible. + */ cached TBreakStmt convertBreakStmtFromRaw(Raw::Element e) { result = TBreakStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TCaseLabelItem`, if possible. + */ cached TCaseLabelItem convertCaseLabelItemFromRaw(Raw::Element e) { result = TCaseLabelItem(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TCaseStmt`, if possible. + */ cached TCaseStmt convertCaseStmtFromRaw(Raw::Element e) { result = TCaseStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TConditionElement`, if possible. + */ cached TConditionElement convertConditionElementFromRaw(Raw::Element e) { result = TConditionElement(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TContinueStmt`, if possible. + */ cached TContinueStmt convertContinueStmtFromRaw(Raw::Element e) { result = TContinueStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDeferStmt`, if possible. + */ cached TDeferStmt convertDeferStmtFromRaw(Raw::Element e) { result = TDeferStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDoCatchStmt`, if possible. + */ cached TDoCatchStmt convertDoCatchStmtFromRaw(Raw::Element e) { result = TDoCatchStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDoStmt`, if possible. + */ cached TDoStmt convertDoStmtFromRaw(Raw::Element e) { result = TDoStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TFailStmt`, if possible. + */ cached TFailStmt convertFailStmtFromRaw(Raw::Element e) { result = TFailStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TFallthroughStmt`, if possible. + */ cached TFallthroughStmt convertFallthroughStmtFromRaw(Raw::Element e) { result = TFallthroughStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TForEachStmt`, if possible. + */ cached TForEachStmt convertForEachStmtFromRaw(Raw::Element e) { result = TForEachStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TGuardStmt`, if possible. + */ cached TGuardStmt convertGuardStmtFromRaw(Raw::Element e) { result = TGuardStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TIfStmt`, if possible. + */ cached TIfStmt convertIfStmtFromRaw(Raw::Element e) { result = TIfStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPoundAssertStmt`, if possible. + */ cached TPoundAssertStmt convertPoundAssertStmtFromRaw(Raw::Element e) { result = TPoundAssertStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TRepeatWhileStmt`, if possible. + */ cached TRepeatWhileStmt convertRepeatWhileStmtFromRaw(Raw::Element e) { result = TRepeatWhileStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TReturnStmt`, if possible. + */ cached TReturnStmt convertReturnStmtFromRaw(Raw::Element e) { result = TReturnStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TStmtCondition`, if possible. + */ cached TStmtCondition convertStmtConditionFromRaw(Raw::Element e) { result = TStmtCondition(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TSwitchStmt`, if possible. + */ cached TSwitchStmt convertSwitchStmtFromRaw(Raw::Element e) { result = TSwitchStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TThrowStmt`, if possible. + */ cached TThrowStmt convertThrowStmtFromRaw(Raw::Element e) { result = TThrowStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TWhileStmt`, if possible. + */ cached TWhileStmt convertWhileStmtFromRaw(Raw::Element e) { result = TWhileStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TYieldStmt`, if possible. + */ cached TYieldStmt convertYieldStmtFromRaw(Raw::Element e) { result = TYieldStmt(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TArraySliceType`, if possible. + */ cached TArraySliceType convertArraySliceTypeFromRaw(Raw::Element e) { result = TArraySliceType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBoundGenericClassType`, if possible. + */ cached TBoundGenericClassType convertBoundGenericClassTypeFromRaw(Raw::Element e) { result = TBoundGenericClassType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBoundGenericEnumType`, if possible. + */ cached TBoundGenericEnumType convertBoundGenericEnumTypeFromRaw(Raw::Element e) { result = TBoundGenericEnumType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBoundGenericStructType`, if possible. + */ cached TBoundGenericStructType convertBoundGenericStructTypeFromRaw(Raw::Element e) { result = TBoundGenericStructType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinBridgeObjectType`, if possible. + */ cached TBuiltinBridgeObjectType convertBuiltinBridgeObjectTypeFromRaw(Raw::Element e) { result = TBuiltinBridgeObjectType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinDefaultActorStorageType`, if possible. + */ cached TBuiltinDefaultActorStorageType convertBuiltinDefaultActorStorageTypeFromRaw(Raw::Element e) { result = TBuiltinDefaultActorStorageType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinExecutorType`, if possible. + */ cached TBuiltinExecutorType convertBuiltinExecutorTypeFromRaw(Raw::Element e) { result = TBuiltinExecutorType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinFloatType`, if possible. + */ cached TBuiltinFloatType convertBuiltinFloatTypeFromRaw(Raw::Element e) { result = TBuiltinFloatType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinIntegerLiteralType`, if possible. + */ cached TBuiltinIntegerLiteralType convertBuiltinIntegerLiteralTypeFromRaw(Raw::Element e) { result = TBuiltinIntegerLiteralType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinIntegerType`, if possible. + */ cached TBuiltinIntegerType convertBuiltinIntegerTypeFromRaw(Raw::Element e) { result = TBuiltinIntegerType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinJobType`, if possible. + */ cached TBuiltinJobType convertBuiltinJobTypeFromRaw(Raw::Element e) { result = TBuiltinJobType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinNativeObjectType`, if possible. + */ cached TBuiltinNativeObjectType convertBuiltinNativeObjectTypeFromRaw(Raw::Element e) { result = TBuiltinNativeObjectType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinRawPointerType`, if possible. + */ cached TBuiltinRawPointerType convertBuiltinRawPointerTypeFromRaw(Raw::Element e) { result = TBuiltinRawPointerType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinRawUnsafeContinuationType`, if possible. + */ cached TBuiltinRawUnsafeContinuationType convertBuiltinRawUnsafeContinuationTypeFromRaw(Raw::Element e) { result = TBuiltinRawUnsafeContinuationType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinUnsafeValueBufferType`, if possible. + */ cached TBuiltinUnsafeValueBufferType convertBuiltinUnsafeValueBufferTypeFromRaw(Raw::Element e) { result = TBuiltinUnsafeValueBufferType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TBuiltinVectorType`, if possible. + */ cached TBuiltinVectorType convertBuiltinVectorTypeFromRaw(Raw::Element e) { result = TBuiltinVectorType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TClassType`, if possible. + */ cached TClassType convertClassTypeFromRaw(Raw::Element e) { result = TClassType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDependentMemberType`, if possible. + */ cached TDependentMemberType convertDependentMemberTypeFromRaw(Raw::Element e) { result = TDependentMemberType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDictionaryType`, if possible. + */ cached TDictionaryType convertDictionaryTypeFromRaw(Raw::Element e) { result = TDictionaryType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TDynamicSelfType`, if possible. + */ cached TDynamicSelfType convertDynamicSelfTypeFromRaw(Raw::Element e) { result = TDynamicSelfType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TEnumType`, if possible. + */ cached TEnumType convertEnumTypeFromRaw(Raw::Element e) { result = TEnumType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TErrorType`, if possible. + */ cached TErrorType convertErrorTypeFromRaw(Raw::Element e) { result = TErrorType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TExistentialMetatypeType`, if possible. + */ cached TExistentialMetatypeType convertExistentialMetatypeTypeFromRaw(Raw::Element e) { result = TExistentialMetatypeType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TExistentialType`, if possible. + */ cached TExistentialType convertExistentialTypeFromRaw(Raw::Element e) { result = TExistentialType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TFunctionType`, if possible. + */ cached TFunctionType convertFunctionTypeFromRaw(Raw::Element e) { result = TFunctionType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TGenericFunctionType`, if possible. + */ cached TGenericFunctionType convertGenericFunctionTypeFromRaw(Raw::Element e) { result = TGenericFunctionType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TGenericTypeParamType`, if possible. + */ cached TGenericTypeParamType convertGenericTypeParamTypeFromRaw(Raw::Element e) { result = TGenericTypeParamType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TInOutType`, if possible. + */ cached TInOutType convertInOutTypeFromRaw(Raw::Element e) { result = TInOutType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TLValueType`, if possible. + */ cached TLValueType convertLValueTypeFromRaw(Raw::Element e) { result = TLValueType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TMetatypeType`, if possible. + */ cached TMetatypeType convertMetatypeTypeFromRaw(Raw::Element e) { result = TMetatypeType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TModuleType`, if possible. + */ cached TModuleType convertModuleTypeFromRaw(Raw::Element e) { result = TModuleType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOpaqueTypeArchetypeType`, if possible. + */ cached TOpaqueTypeArchetypeType convertOpaqueTypeArchetypeTypeFromRaw(Raw::Element e) { result = TOpaqueTypeArchetypeType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOpenedArchetypeType`, if possible. + */ cached TOpenedArchetypeType convertOpenedArchetypeTypeFromRaw(Raw::Element e) { result = TOpenedArchetypeType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TOptionalType`, if possible. + */ cached TOptionalType convertOptionalTypeFromRaw(Raw::Element e) { result = TOptionalType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TParameterizedProtocolType`, if possible. + */ cached TParameterizedProtocolType convertParameterizedProtocolTypeFromRaw(Raw::Element e) { result = TParameterizedProtocolType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TParenType`, if possible. + */ cached TParenType convertParenTypeFromRaw(Raw::Element e) { result = TParenType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TPrimaryArchetypeType`, if possible. + */ cached TPrimaryArchetypeType convertPrimaryArchetypeTypeFromRaw(Raw::Element e) { result = TPrimaryArchetypeType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TProtocolCompositionType`, if possible. + */ cached TProtocolCompositionType convertProtocolCompositionTypeFromRaw(Raw::Element e) { result = TProtocolCompositionType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TProtocolType`, if possible. + */ cached TProtocolType convertProtocolTypeFromRaw(Raw::Element e) { result = TProtocolType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TStructType`, if possible. + */ cached TStructType convertStructTypeFromRaw(Raw::Element e) { result = TStructType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTupleType`, if possible. + */ cached TTupleType convertTupleTypeFromRaw(Raw::Element e) { result = TTupleType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTypeAliasType`, if possible. + */ cached TTypeAliasType convertTypeAliasTypeFromRaw(Raw::Element e) { result = TTypeAliasType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TTypeRepr`, if possible. + */ cached TTypeRepr convertTypeReprFromRaw(Raw::Element e) { result = TTypeRepr(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnboundGenericType`, if possible. + */ cached TUnboundGenericType convertUnboundGenericTypeFromRaw(Raw::Element e) { result = TUnboundGenericType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnmanagedStorageType`, if possible. + */ cached TUnmanagedStorageType convertUnmanagedStorageTypeFromRaw(Raw::Element e) { result = TUnmanagedStorageType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnownedStorageType`, if possible. + */ cached TUnownedStorageType convertUnownedStorageTypeFromRaw(Raw::Element e) { result = TUnownedStorageType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TUnresolvedType`, if possible. + */ cached TUnresolvedType convertUnresolvedTypeFromRaw(Raw::Element e) { result = TUnresolvedType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TVariadicSequenceType`, if possible. + */ cached TVariadicSequenceType convertVariadicSequenceTypeFromRaw(Raw::Element e) { result = TVariadicSequenceType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw element to a synthesized `TWeakStorageType`, if possible. + */ cached TWeakStorageType convertWeakStorageTypeFromRaw(Raw::Element e) { result = TWeakStorageType(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAstNode`, if possible. + */ cached TAstNode convertAstNodeFromRaw(Raw::Element e) { result = convertAvailabilityInfoFromRaw(e) @@ -1398,6 +3188,10 @@ module Synth { result = convertTypeReprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAvailabilitySpec`, if possible. + */ cached TAvailabilitySpec convertAvailabilitySpecFromRaw(Raw::Element e) { result = convertOtherAvailabilitySpecFromRaw(e) @@ -1405,6 +3199,10 @@ module Synth { result = convertPlatformVersionAvailabilitySpecFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TCallable`, if possible. + */ cached TCallable convertCallableFromRaw(Raw::Element e) { result = convertAbstractClosureExprFromRaw(e) @@ -1412,6 +3210,10 @@ module Synth { result = convertAbstractFunctionDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TElement`, if possible. + */ cached TElement convertElementFromRaw(Raw::Element e) { result = convertCallableFromRaw(e) @@ -1427,6 +3229,10 @@ module Synth { result = convertTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TErrorElement`, if possible. + */ cached TErrorElement convertErrorElementFromRaw(Raw::Element e) { result = convertErrorExprFromRaw(e) @@ -1454,6 +3260,10 @@ module Synth { result = convertUnspecifiedElementFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TFile`, if possible. + */ cached TFile convertFileFromRaw(Raw::Element e) { result = convertDbFileFromRaw(e) @@ -1461,6 +3271,10 @@ module Synth { result = convertUnknownFileFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TLocatable`, if possible. + */ cached TLocatable convertLocatableFromRaw(Raw::Element e) { result = convertArgumentFromRaw(e) @@ -1474,6 +3288,10 @@ module Synth { result = convertErrorElementFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TLocation`, if possible. + */ cached TLocation convertLocationFromRaw(Raw::Element e) { result = convertDbLocationFromRaw(e) @@ -1481,6 +3299,10 @@ module Synth { result = convertUnknownLocationFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAbstractFunctionDecl`, if possible. + */ cached TAbstractFunctionDecl convertAbstractFunctionDeclFromRaw(Raw::Element e) { result = convertConstructorDeclFromRaw(e) @@ -1490,6 +3312,10 @@ module Synth { result = convertFuncDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAbstractStorageDecl`, if possible. + */ cached TAbstractStorageDecl convertAbstractStorageDeclFromRaw(Raw::Element e) { result = convertSubscriptDeclFromRaw(e) @@ -1497,6 +3323,10 @@ module Synth { result = convertVarDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAbstractTypeParamDecl`, if possible. + */ cached TAbstractTypeParamDecl convertAbstractTypeParamDeclFromRaw(Raw::Element e) { result = convertAssociatedTypeDeclFromRaw(e) @@ -1504,6 +3334,10 @@ module Synth { result = convertGenericTypeParamDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TDecl`, if possible. + */ cached TDecl convertDeclFromRaw(Raw::Element e) { result = convertCapturedDeclFromRaw(e) @@ -1531,6 +3365,10 @@ module Synth { result = convertValueDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TFuncDecl`, if possible. + */ cached TFuncDecl convertFuncDeclFromRaw(Raw::Element e) { result = convertAccessorDeclFromRaw(e) @@ -1538,6 +3376,10 @@ module Synth { result = convertConcreteFuncDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TGenericContext`, if possible. + */ cached TGenericContext convertGenericContextFromRaw(Raw::Element e) { result = convertAbstractFunctionDeclFromRaw(e) @@ -1549,6 +3391,10 @@ module Synth { result = convertSubscriptDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TGenericTypeDecl`, if possible. + */ cached TGenericTypeDecl convertGenericTypeDeclFromRaw(Raw::Element e) { result = convertNominalTypeDeclFromRaw(e) @@ -1558,6 +3404,10 @@ module Synth { result = convertTypeAliasDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TNominalTypeDecl`, if possible. + */ cached TNominalTypeDecl convertNominalTypeDeclFromRaw(Raw::Element e) { result = convertClassDeclFromRaw(e) @@ -1569,6 +3419,10 @@ module Synth { result = convertStructDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TOperatorDecl`, if possible. + */ cached TOperatorDecl convertOperatorDeclFromRaw(Raw::Element e) { result = convertInfixOperatorDeclFromRaw(e) @@ -1578,6 +3432,10 @@ module Synth { result = convertPrefixOperatorDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TTypeDecl`, if possible. + */ cached TTypeDecl convertTypeDeclFromRaw(Raw::Element e) { result = convertAbstractTypeParamDeclFromRaw(e) @@ -1587,6 +3445,10 @@ module Synth { result = convertModuleDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TValueDecl`, if possible. + */ cached TValueDecl convertValueDeclFromRaw(Raw::Element e) { result = convertAbstractFunctionDeclFromRaw(e) @@ -1598,6 +3460,10 @@ module Synth { result = convertTypeDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TVarDecl`, if possible. + */ cached TVarDecl convertVarDeclFromRaw(Raw::Element e) { result = convertConcreteVarDeclFromRaw(e) @@ -1605,6 +3471,10 @@ module Synth { result = convertParamDeclFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAbstractClosureExpr`, if possible. + */ cached TAbstractClosureExpr convertAbstractClosureExprFromRaw(Raw::Element e) { result = convertAutoClosureExprFromRaw(e) @@ -1612,6 +3482,10 @@ module Synth { result = convertClosureExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAnyTryExpr`, if possible. + */ cached TAnyTryExpr convertAnyTryExprFromRaw(Raw::Element e) { result = convertForceTryExprFromRaw(e) @@ -1621,6 +3495,10 @@ module Synth { result = convertTryExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TApplyExpr`, if possible. + */ cached TApplyExpr convertApplyExprFromRaw(Raw::Element e) { result = convertBinaryExprFromRaw(e) @@ -1634,6 +3512,10 @@ module Synth { result = convertSelfApplyExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TBuiltinLiteralExpr`, if possible. + */ cached TBuiltinLiteralExpr convertBuiltinLiteralExprFromRaw(Raw::Element e) { result = convertBooleanLiteralExprFromRaw(e) @@ -1645,6 +3527,10 @@ module Synth { result = convertStringLiteralExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TCheckedCastExpr`, if possible. + */ cached TCheckedCastExpr convertCheckedCastExprFromRaw(Raw::Element e) { result = convertConditionalCheckedCastExprFromRaw(e) @@ -1654,6 +3540,10 @@ module Synth { result = convertIsExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TCollectionExpr`, if possible. + */ cached TCollectionExpr convertCollectionExprFromRaw(Raw::Element e) { result = convertArrayExprFromRaw(e) @@ -1661,6 +3551,10 @@ module Synth { result = convertDictionaryExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TDynamicLookupExpr`, if possible. + */ cached TDynamicLookupExpr convertDynamicLookupExprFromRaw(Raw::Element e) { result = convertDynamicMemberRefExprFromRaw(e) @@ -1668,6 +3562,10 @@ module Synth { result = convertDynamicSubscriptExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TExplicitCastExpr`, if possible. + */ cached TExplicitCastExpr convertExplicitCastExprFromRaw(Raw::Element e) { result = convertCheckedCastExprFromRaw(e) @@ -1675,6 +3573,10 @@ module Synth { result = convertCoerceExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TExpr`, if possible. + */ cached TExpr convertExprFromRaw(Raw::Element e) { result = convertAbstractClosureExprFromRaw(e) @@ -1776,6 +3678,10 @@ module Synth { result = convertVarargExpansionExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TIdentityExpr`, if possible. + */ cached TIdentityExpr convertIdentityExprFromRaw(Raw::Element e) { result = convertAwaitExprFromRaw(e) @@ -1787,6 +3693,10 @@ module Synth { result = convertUnresolvedMemberChainResultExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TImplicitConversionExpr`, if possible. + */ cached TImplicitConversionExpr convertImplicitConversionExprFromRaw(Raw::Element e) { result = convertAbiSafeConversionExprFromRaw(e) @@ -1854,6 +3764,10 @@ module Synth { result = convertUnresolvedTypeConversionExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TLiteralExpr`, if possible. + */ cached TLiteralExpr convertLiteralExprFromRaw(Raw::Element e) { result = convertBuiltinLiteralExprFromRaw(e) @@ -1867,6 +3781,10 @@ module Synth { result = convertRegexLiteralExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TLookupExpr`, if possible. + */ cached TLookupExpr convertLookupExprFromRaw(Raw::Element e) { result = convertDynamicLookupExprFromRaw(e) @@ -1878,6 +3796,10 @@ module Synth { result = convertSubscriptExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TNumberLiteralExpr`, if possible. + */ cached TNumberLiteralExpr convertNumberLiteralExprFromRaw(Raw::Element e) { result = convertFloatLiteralExprFromRaw(e) @@ -1885,6 +3807,10 @@ module Synth { result = convertIntegerLiteralExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TSelfApplyExpr`, if possible. + */ cached TSelfApplyExpr convertSelfApplyExprFromRaw(Raw::Element e) { result = convertConstructorRefCallExprFromRaw(e) @@ -1892,6 +3818,10 @@ module Synth { result = convertDotSyntaxCallExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TPattern`, if possible. + */ cached TPattern convertPatternFromRaw(Raw::Element e) { result = convertAnyPatternFromRaw(e) @@ -1917,6 +3847,10 @@ module Synth { result = convertTypedPatternFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TLabeledConditionalStmt`, if possible. + */ cached TLabeledConditionalStmt convertLabeledConditionalStmtFromRaw(Raw::Element e) { result = convertGuardStmtFromRaw(e) @@ -1926,6 +3860,10 @@ module Synth { result = convertWhileStmtFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TLabeledStmt`, if possible. + */ cached TLabeledStmt convertLabeledStmtFromRaw(Raw::Element e) { result = convertDoCatchStmtFromRaw(e) @@ -1941,6 +3879,10 @@ module Synth { result = convertSwitchStmtFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TStmt`, if possible. + */ cached TStmt convertStmtFromRaw(Raw::Element e) { result = convertBraceStmtFromRaw(e) @@ -1968,6 +3910,10 @@ module Synth { result = convertYieldStmtFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAnyBuiltinIntegerType`, if possible. + */ cached TAnyBuiltinIntegerType convertAnyBuiltinIntegerTypeFromRaw(Raw::Element e) { result = convertBuiltinIntegerLiteralTypeFromRaw(e) @@ -1975,6 +3921,10 @@ module Synth { result = convertBuiltinIntegerTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAnyFunctionType`, if possible. + */ cached TAnyFunctionType convertAnyFunctionTypeFromRaw(Raw::Element e) { result = convertFunctionTypeFromRaw(e) @@ -1982,6 +3932,10 @@ module Synth { result = convertGenericFunctionTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAnyGenericType`, if possible. + */ cached TAnyGenericType convertAnyGenericTypeFromRaw(Raw::Element e) { result = convertNominalOrBoundGenericNominalTypeFromRaw(e) @@ -1989,6 +3943,10 @@ module Synth { result = convertUnboundGenericTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TAnyMetatypeType`, if possible. + */ cached TAnyMetatypeType convertAnyMetatypeTypeFromRaw(Raw::Element e) { result = convertExistentialMetatypeTypeFromRaw(e) @@ -1996,6 +3954,10 @@ module Synth { result = convertMetatypeTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TArchetypeType`, if possible. + */ cached TArchetypeType convertArchetypeTypeFromRaw(Raw::Element e) { result = convertOpaqueTypeArchetypeTypeFromRaw(e) @@ -2005,6 +3967,10 @@ module Synth { result = convertPrimaryArchetypeTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TBoundGenericType`, if possible. + */ cached TBoundGenericType convertBoundGenericTypeFromRaw(Raw::Element e) { result = convertBoundGenericClassTypeFromRaw(e) @@ -2014,6 +3980,10 @@ module Synth { result = convertBoundGenericStructTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TBuiltinType`, if possible. + */ cached TBuiltinType convertBuiltinTypeFromRaw(Raw::Element e) { result = convertAnyBuiltinIntegerTypeFromRaw(e) @@ -2039,6 +4009,10 @@ module Synth { result = convertBuiltinVectorTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TNominalOrBoundGenericNominalType`, if possible. + */ cached TNominalOrBoundGenericNominalType convertNominalOrBoundGenericNominalTypeFromRaw(Raw::Element e) { result = convertBoundGenericTypeFromRaw(e) @@ -2046,6 +4020,10 @@ module Synth { result = convertNominalTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TNominalType`, if possible. + */ cached TNominalType convertNominalTypeFromRaw(Raw::Element e) { result = convertClassTypeFromRaw(e) @@ -2057,6 +4035,10 @@ module Synth { result = convertStructTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TReferenceStorageType`, if possible. + */ cached TReferenceStorageType convertReferenceStorageTypeFromRaw(Raw::Element e) { result = convertUnmanagedStorageTypeFromRaw(e) @@ -2066,6 +4048,10 @@ module Synth { result = convertWeakStorageTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TSubstitutableType`, if possible. + */ cached TSubstitutableType convertSubstitutableTypeFromRaw(Raw::Element e) { result = convertArchetypeTypeFromRaw(e) @@ -2073,6 +4059,10 @@ module Synth { result = convertGenericTypeParamTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TSugarType`, if possible. + */ cached TSugarType convertSugarTypeFromRaw(Raw::Element e) { result = convertParenTypeFromRaw(e) @@ -2082,6 +4072,10 @@ module Synth { result = convertTypeAliasTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TSyntaxSugarType`, if possible. + */ cached TSyntaxSugarType convertSyntaxSugarTypeFromRaw(Raw::Element e) { result = convertDictionaryTypeFromRaw(e) @@ -2089,6 +4083,10 @@ module Synth { result = convertUnarySyntaxSugarTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TType`, if possible. + */ cached TType convertTypeFromRaw(Raw::Element e) { result = convertAnyFunctionTypeFromRaw(e) @@ -2128,6 +4126,10 @@ module Synth { result = convertUnresolvedTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TUnarySyntaxSugarType`, if possible. + */ cached TUnarySyntaxSugarType convertUnarySyntaxSugarTypeFromRaw(Raw::Element e) { result = convertArraySliceTypeFromRaw(e) @@ -2137,285 +4139,581 @@ module Synth { result = convertVariadicSequenceTypeFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAvailabilityInfo` to a raw DB element, if possible. + */ cached Raw::Element convertAvailabilityInfoToRaw(TAvailabilityInfo e) { e = TAvailabilityInfo(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TComment` to a raw DB element, if possible. + */ cached Raw::Element convertCommentToRaw(TComment e) { e = TComment(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDbFile` to a raw DB element, if possible. + */ cached Raw::Element convertDbFileToRaw(TDbFile e) { e = TDbFile(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDbLocation` to a raw DB element, if possible. + */ cached Raw::Element convertDbLocationToRaw(TDbLocation e) { e = TDbLocation(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDiagnostics` to a raw DB element, if possible. + */ cached Raw::Element convertDiagnosticsToRaw(TDiagnostics e) { e = TDiagnostics(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TKeyPathComponent` to a raw DB element, if possible. + */ cached Raw::Element convertKeyPathComponentToRaw(TKeyPathComponent e) { e = TKeyPathComponent(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOtherAvailabilitySpec` to a raw DB element, if possible. + */ cached Raw::Element convertOtherAvailabilitySpecToRaw(TOtherAvailabilitySpec e) { e = TOtherAvailabilitySpec(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPlatformVersionAvailabilitySpec` to a raw DB element, if possible. + */ cached Raw::Element convertPlatformVersionAvailabilitySpecToRaw(TPlatformVersionAvailabilitySpec e) { e = TPlatformVersionAvailabilitySpec(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnknownFile` to a raw DB element, if possible. + */ cached Raw::Element convertUnknownFileToRaw(TUnknownFile e) { none() } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnknownLocation` to a raw DB element, if possible. + */ cached Raw::Element convertUnknownLocationToRaw(TUnknownLocation e) { none() } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnspecifiedElement` to a raw DB element, if possible. + */ cached Raw::Element convertUnspecifiedElementToRaw(TUnspecifiedElement e) { e = TUnspecifiedElement(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAccessorDecl` to a raw DB element, if possible. + */ cached Raw::Element convertAccessorDeclToRaw(TAccessorDecl e) { e = TAccessorDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAssociatedTypeDecl` to a raw DB element, if possible. + */ cached Raw::Element convertAssociatedTypeDeclToRaw(TAssociatedTypeDecl e) { e = TAssociatedTypeDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCapturedDecl` to a raw DB element, if possible. + */ cached Raw::Element convertCapturedDeclToRaw(TCapturedDecl e) { e = TCapturedDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TClassDecl` to a raw DB element, if possible. + */ cached Raw::Element convertClassDeclToRaw(TClassDecl e) { e = TClassDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TConcreteFuncDecl` to a raw DB element, if possible. + */ cached Raw::Element convertConcreteFuncDeclToRaw(TConcreteFuncDecl e) { e = TConcreteFuncDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TConcreteVarDecl` to a raw DB element, if possible. + */ cached Raw::Element convertConcreteVarDeclToRaw(TConcreteVarDecl e) { e = TConcreteVarDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TConstructorDecl` to a raw DB element, if possible. + */ cached Raw::Element convertConstructorDeclToRaw(TConstructorDecl e) { e = TConstructorDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDestructorDecl` to a raw DB element, if possible. + */ cached Raw::Element convertDestructorDeclToRaw(TDestructorDecl e) { e = TDestructorDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TEnumCaseDecl` to a raw DB element, if possible. + */ cached Raw::Element convertEnumCaseDeclToRaw(TEnumCaseDecl e) { e = TEnumCaseDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TEnumDecl` to a raw DB element, if possible. + */ cached Raw::Element convertEnumDeclToRaw(TEnumDecl e) { e = TEnumDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TEnumElementDecl` to a raw DB element, if possible. + */ cached Raw::Element convertEnumElementDeclToRaw(TEnumElementDecl e) { e = TEnumElementDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TExtensionDecl` to a raw DB element, if possible. + */ cached Raw::Element convertExtensionDeclToRaw(TExtensionDecl e) { e = TExtensionDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TGenericTypeParamDecl` to a raw DB element, if possible. + */ cached Raw::Element convertGenericTypeParamDeclToRaw(TGenericTypeParamDecl e) { e = TGenericTypeParamDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TIfConfigDecl` to a raw DB element, if possible. + */ cached Raw::Element convertIfConfigDeclToRaw(TIfConfigDecl e) { e = TIfConfigDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TImportDecl` to a raw DB element, if possible. + */ cached Raw::Element convertImportDeclToRaw(TImportDecl e) { e = TImportDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TInfixOperatorDecl` to a raw DB element, if possible. + */ cached Raw::Element convertInfixOperatorDeclToRaw(TInfixOperatorDecl e) { e = TInfixOperatorDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TMissingMemberDecl` to a raw DB element, if possible. + */ cached Raw::Element convertMissingMemberDeclToRaw(TMissingMemberDecl e) { e = TMissingMemberDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TModuleDecl` to a raw DB element, if possible. + */ cached Raw::Element convertModuleDeclToRaw(TModuleDecl e) { e = TModuleDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOpaqueTypeDecl` to a raw DB element, if possible. + */ cached Raw::Element convertOpaqueTypeDeclToRaw(TOpaqueTypeDecl e) { e = TOpaqueTypeDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TParamDecl` to a raw DB element, if possible. + */ cached Raw::Element convertParamDeclToRaw(TParamDecl e) { e = TParamDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPatternBindingDecl` to a raw DB element, if possible. + */ cached Raw::Element convertPatternBindingDeclToRaw(TPatternBindingDecl e) { e = TPatternBindingDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPostfixOperatorDecl` to a raw DB element, if possible. + */ cached Raw::Element convertPostfixOperatorDeclToRaw(TPostfixOperatorDecl e) { e = TPostfixOperatorDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPoundDiagnosticDecl` to a raw DB element, if possible. + */ cached Raw::Element convertPoundDiagnosticDeclToRaw(TPoundDiagnosticDecl e) { e = TPoundDiagnosticDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPrecedenceGroupDecl` to a raw DB element, if possible. + */ cached Raw::Element convertPrecedenceGroupDeclToRaw(TPrecedenceGroupDecl e) { e = TPrecedenceGroupDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPrefixOperatorDecl` to a raw DB element, if possible. + */ cached Raw::Element convertPrefixOperatorDeclToRaw(TPrefixOperatorDecl e) { e = TPrefixOperatorDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TProtocolDecl` to a raw DB element, if possible. + */ cached Raw::Element convertProtocolDeclToRaw(TProtocolDecl e) { e = TProtocolDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TStructDecl` to a raw DB element, if possible. + */ cached Raw::Element convertStructDeclToRaw(TStructDecl e) { e = TStructDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TSubscriptDecl` to a raw DB element, if possible. + */ cached Raw::Element convertSubscriptDeclToRaw(TSubscriptDecl e) { e = TSubscriptDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTopLevelCodeDecl` to a raw DB element, if possible. + */ cached Raw::Element convertTopLevelCodeDeclToRaw(TTopLevelCodeDecl e) { e = TTopLevelCodeDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTypeAliasDecl` to a raw DB element, if possible. + */ cached Raw::Element convertTypeAliasDeclToRaw(TTypeAliasDecl e) { e = TTypeAliasDecl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAbiSafeConversionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertAbiSafeConversionExprToRaw(TAbiSafeConversionExpr e) { e = TAbiSafeConversionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAnyHashableErasureExpr` to a raw DB element, if possible. + */ cached Raw::Element convertAnyHashableErasureExprToRaw(TAnyHashableErasureExpr e) { e = TAnyHashableErasureExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAppliedPropertyWrapperExpr` to a raw DB element, if possible. + */ cached Raw::Element convertAppliedPropertyWrapperExprToRaw(TAppliedPropertyWrapperExpr e) { e = TAppliedPropertyWrapperExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TArchetypeToSuperExpr` to a raw DB element, if possible. + */ cached Raw::Element convertArchetypeToSuperExprToRaw(TArchetypeToSuperExpr e) { e = TArchetypeToSuperExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TArgument` to a raw DB element, if possible. + */ cached Raw::Element convertArgumentToRaw(TArgument e) { e = TArgument(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TArrayExpr` to a raw DB element, if possible. + */ cached Raw::Element convertArrayExprToRaw(TArrayExpr e) { e = TArrayExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TArrayToPointerExpr` to a raw DB element, if possible. + */ cached Raw::Element convertArrayToPointerExprToRaw(TArrayToPointerExpr e) { e = TArrayToPointerExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAssignExpr` to a raw DB element, if possible. + */ cached Raw::Element convertAssignExprToRaw(TAssignExpr e) { e = TAssignExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAutoClosureExpr` to a raw DB element, if possible. + */ cached Raw::Element convertAutoClosureExprToRaw(TAutoClosureExpr e) { e = TAutoClosureExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAwaitExpr` to a raw DB element, if possible. + */ cached Raw::Element convertAwaitExprToRaw(TAwaitExpr e) { e = TAwaitExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBinaryExpr` to a raw DB element, if possible. + */ cached Raw::Element convertBinaryExprToRaw(TBinaryExpr e) { e = TBinaryExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBindOptionalExpr` to a raw DB element, if possible. + */ cached Raw::Element convertBindOptionalExprToRaw(TBindOptionalExpr e) { e = TBindOptionalExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBooleanLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertBooleanLiteralExprToRaw(TBooleanLiteralExpr e) { e = TBooleanLiteralExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBridgeFromObjCExpr` to a raw DB element, if possible. + */ cached Raw::Element convertBridgeFromObjCExprToRaw(TBridgeFromObjCExpr e) { e = TBridgeFromObjCExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBridgeToObjCExpr` to a raw DB element, if possible. + */ cached Raw::Element convertBridgeToObjCExprToRaw(TBridgeToObjCExpr e) { e = TBridgeToObjCExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCallExpr` to a raw DB element, if possible. + */ cached Raw::Element convertCallExprToRaw(TCallExpr e) { e = TCallExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCaptureListExpr` to a raw DB element, if possible. + */ cached Raw::Element convertCaptureListExprToRaw(TCaptureListExpr e) { e = TCaptureListExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TClassMetatypeToObjectExpr` to a raw DB element, if possible. + */ cached Raw::Element convertClassMetatypeToObjectExprToRaw(TClassMetatypeToObjectExpr e) { e = TClassMetatypeToObjectExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TClosureExpr` to a raw DB element, if possible. + */ cached Raw::Element convertClosureExprToRaw(TClosureExpr e) { e = TClosureExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCoerceExpr` to a raw DB element, if possible. + */ cached Raw::Element convertCoerceExprToRaw(TCoerceExpr e) { e = TCoerceExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCollectionUpcastConversionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertCollectionUpcastConversionExprToRaw(TCollectionUpcastConversionExpr e) { e = TCollectionUpcastConversionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TConditionalBridgeFromObjCExpr` to a raw DB element, if possible. + */ cached Raw::Element convertConditionalBridgeFromObjCExprToRaw(TConditionalBridgeFromObjCExpr e) { e = TConditionalBridgeFromObjCExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TConditionalCheckedCastExpr` to a raw DB element, if possible. + */ cached Raw::Element convertConditionalCheckedCastExprToRaw(TConditionalCheckedCastExpr e) { e = TConditionalCheckedCastExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TConstructorRefCallExpr` to a raw DB element, if possible. + */ cached Raw::Element convertConstructorRefCallExprToRaw(TConstructorRefCallExpr e) { e = TConstructorRefCallExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCovariantFunctionConversionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertCovariantFunctionConversionExprToRaw(TCovariantFunctionConversionExpr e) { e = TCovariantFunctionConversionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCovariantReturnConversionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertCovariantReturnConversionExprToRaw(TCovariantReturnConversionExpr e) { e = TCovariantReturnConversionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDeclRefExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDeclRefExprToRaw(TDeclRefExpr e) { e = TDeclRefExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDefaultArgumentExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDefaultArgumentExprToRaw(TDefaultArgumentExpr e) { e = TDefaultArgumentExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDerivedToBaseExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDerivedToBaseExprToRaw(TDerivedToBaseExpr e) { e = TDerivedToBaseExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDestructureTupleExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDestructureTupleExprToRaw(TDestructureTupleExpr e) { e = TDestructureTupleExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDictionaryExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDictionaryExprToRaw(TDictionaryExpr e) { e = TDictionaryExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDifferentiableFunctionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDifferentiableFunctionExprToRaw(TDifferentiableFunctionExpr e) { e = TDifferentiableFunctionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDifferentiableFunctionExtractOriginalExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDifferentiableFunctionExtractOriginalExprToRaw( TDifferentiableFunctionExtractOriginalExpr e @@ -2423,213 +4721,421 @@ module Synth { e = TDifferentiableFunctionExtractOriginalExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDiscardAssignmentExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDiscardAssignmentExprToRaw(TDiscardAssignmentExpr e) { e = TDiscardAssignmentExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDotSelfExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDotSelfExprToRaw(TDotSelfExpr e) { e = TDotSelfExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDotSyntaxBaseIgnoredExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDotSyntaxBaseIgnoredExprToRaw(TDotSyntaxBaseIgnoredExpr e) { e = TDotSyntaxBaseIgnoredExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDotSyntaxCallExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDotSyntaxCallExprToRaw(TDotSyntaxCallExpr e) { e = TDotSyntaxCallExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDynamicMemberRefExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDynamicMemberRefExprToRaw(TDynamicMemberRefExpr e) { e = TDynamicMemberRefExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDynamicSubscriptExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDynamicSubscriptExprToRaw(TDynamicSubscriptExpr e) { e = TDynamicSubscriptExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDynamicTypeExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDynamicTypeExprToRaw(TDynamicTypeExpr e) { e = TDynamicTypeExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TEnumIsCaseExpr` to a raw DB element, if possible. + */ cached Raw::Element convertEnumIsCaseExprToRaw(TEnumIsCaseExpr e) { e = TEnumIsCaseExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TErasureExpr` to a raw DB element, if possible. + */ cached Raw::Element convertErasureExprToRaw(TErasureExpr e) { e = TErasureExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TErrorExpr` to a raw DB element, if possible. + */ cached Raw::Element convertErrorExprToRaw(TErrorExpr e) { e = TErrorExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TExistentialMetatypeToObjectExpr` to a raw DB element, if possible. + */ cached Raw::Element convertExistentialMetatypeToObjectExprToRaw(TExistentialMetatypeToObjectExpr e) { e = TExistentialMetatypeToObjectExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TFloatLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertFloatLiteralExprToRaw(TFloatLiteralExpr e) { e = TFloatLiteralExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TForceTryExpr` to a raw DB element, if possible. + */ cached Raw::Element convertForceTryExprToRaw(TForceTryExpr e) { e = TForceTryExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TForceValueExpr` to a raw DB element, if possible. + */ cached Raw::Element convertForceValueExprToRaw(TForceValueExpr e) { e = TForceValueExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TForcedCheckedCastExpr` to a raw DB element, if possible. + */ cached Raw::Element convertForcedCheckedCastExprToRaw(TForcedCheckedCastExpr e) { e = TForcedCheckedCastExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TForeignObjectConversionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertForeignObjectConversionExprToRaw(TForeignObjectConversionExpr e) { e = TForeignObjectConversionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TFunctionConversionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertFunctionConversionExprToRaw(TFunctionConversionExpr e) { e = TFunctionConversionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TIfExpr` to a raw DB element, if possible. + */ cached Raw::Element convertIfExprToRaw(TIfExpr e) { e = TIfExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TInOutExpr` to a raw DB element, if possible. + */ cached Raw::Element convertInOutExprToRaw(TInOutExpr e) { e = TInOutExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TInOutToPointerExpr` to a raw DB element, if possible. + */ cached Raw::Element convertInOutToPointerExprToRaw(TInOutToPointerExpr e) { e = TInOutToPointerExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TInjectIntoOptionalExpr` to a raw DB element, if possible. + */ cached Raw::Element convertInjectIntoOptionalExprToRaw(TInjectIntoOptionalExpr e) { e = TInjectIntoOptionalExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TIntegerLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertIntegerLiteralExprToRaw(TIntegerLiteralExpr e) { e = TIntegerLiteralExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TInterpolatedStringLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertInterpolatedStringLiteralExprToRaw(TInterpolatedStringLiteralExpr e) { e = TInterpolatedStringLiteralExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TIsExpr` to a raw DB element, if possible. + */ cached Raw::Element convertIsExprToRaw(TIsExpr e) { e = TIsExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TKeyPathApplicationExpr` to a raw DB element, if possible. + */ cached Raw::Element convertKeyPathApplicationExprToRaw(TKeyPathApplicationExpr e) { e = TKeyPathApplicationExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TKeyPathDotExpr` to a raw DB element, if possible. + */ cached Raw::Element convertKeyPathDotExprToRaw(TKeyPathDotExpr e) { e = TKeyPathDotExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TKeyPathExpr` to a raw DB element, if possible. + */ cached Raw::Element convertKeyPathExprToRaw(TKeyPathExpr e) { e = TKeyPathExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLazyInitializerExpr` to a raw DB element, if possible. + */ cached Raw::Element convertLazyInitializerExprToRaw(TLazyInitializerExpr e) { e = TLazyInitializerExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLinearFunctionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertLinearFunctionExprToRaw(TLinearFunctionExpr e) { e = TLinearFunctionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLinearFunctionExtractOriginalExpr` to a raw DB element, if possible. + */ cached Raw::Element convertLinearFunctionExtractOriginalExprToRaw(TLinearFunctionExtractOriginalExpr e) { e = TLinearFunctionExtractOriginalExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLinearToDifferentiableFunctionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertLinearToDifferentiableFunctionExprToRaw(TLinearToDifferentiableFunctionExpr e) { e = TLinearToDifferentiableFunctionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLoadExpr` to a raw DB element, if possible. + */ cached Raw::Element convertLoadExprToRaw(TLoadExpr e) { e = TLoadExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TMagicIdentifierLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertMagicIdentifierLiteralExprToRaw(TMagicIdentifierLiteralExpr e) { e = TMagicIdentifierLiteralExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TMakeTemporarilyEscapableExpr` to a raw DB element, if possible. + */ cached Raw::Element convertMakeTemporarilyEscapableExprToRaw(TMakeTemporarilyEscapableExpr e) { e = TMakeTemporarilyEscapableExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TMemberRefExpr` to a raw DB element, if possible. + */ cached Raw::Element convertMemberRefExprToRaw(TMemberRefExpr e) { e = TMemberRefExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TMetatypeConversionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertMetatypeConversionExprToRaw(TMetatypeConversionExpr e) { e = TMetatypeConversionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TMethodLookupExpr` to a raw DB element, if possible. + */ cached Raw::Element convertMethodLookupExprToRaw(TMethodLookupExpr e) { e = TMethodLookupExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TNilLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertNilLiteralExprToRaw(TNilLiteralExpr e) { e = TNilLiteralExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TObjCSelectorExpr` to a raw DB element, if possible. + */ cached Raw::Element convertObjCSelectorExprToRaw(TObjCSelectorExpr e) { e = TObjCSelectorExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TObjectLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertObjectLiteralExprToRaw(TObjectLiteralExpr e) { e = TObjectLiteralExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOneWayExpr` to a raw DB element, if possible. + */ cached Raw::Element convertOneWayExprToRaw(TOneWayExpr e) { e = TOneWayExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOpaqueValueExpr` to a raw DB element, if possible. + */ cached Raw::Element convertOpaqueValueExprToRaw(TOpaqueValueExpr e) { e = TOpaqueValueExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOpenExistentialExpr` to a raw DB element, if possible. + */ cached Raw::Element convertOpenExistentialExprToRaw(TOpenExistentialExpr e) { e = TOpenExistentialExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOptionalEvaluationExpr` to a raw DB element, if possible. + */ cached Raw::Element convertOptionalEvaluationExprToRaw(TOptionalEvaluationExpr e) { e = TOptionalEvaluationExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOptionalTryExpr` to a raw DB element, if possible. + */ cached Raw::Element convertOptionalTryExprToRaw(TOptionalTryExpr e) { e = TOptionalTryExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOtherConstructorDeclRefExpr` to a raw DB element, if possible. + */ cached Raw::Element convertOtherConstructorDeclRefExprToRaw(TOtherConstructorDeclRefExpr e) { e = TOtherConstructorDeclRefExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOverloadedDeclRefExpr` to a raw DB element, if possible. + */ cached Raw::Element convertOverloadedDeclRefExprToRaw(TOverloadedDeclRefExpr e) { e = TOverloadedDeclRefExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TParenExpr` to a raw DB element, if possible. + */ cached Raw::Element convertParenExprToRaw(TParenExpr e) { e = TParenExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPointerToPointerExpr` to a raw DB element, if possible. + */ cached Raw::Element convertPointerToPointerExprToRaw(TPointerToPointerExpr e) { e = TPointerToPointerExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPostfixUnaryExpr` to a raw DB element, if possible. + */ cached Raw::Element convertPostfixUnaryExprToRaw(TPostfixUnaryExpr e) { e = TPostfixUnaryExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPrefixUnaryExpr` to a raw DB element, if possible. + */ cached Raw::Element convertPrefixUnaryExprToRaw(TPrefixUnaryExpr e) { e = TPrefixUnaryExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPropertyWrapperValuePlaceholderExpr` to a raw DB element, if possible. + */ cached Raw::Element convertPropertyWrapperValuePlaceholderExprToRaw( TPropertyWrapperValuePlaceholderExpr e @@ -2637,405 +5143,829 @@ module Synth { e = TPropertyWrapperValuePlaceholderExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TProtocolMetatypeToObjectExpr` to a raw DB element, if possible. + */ cached Raw::Element convertProtocolMetatypeToObjectExprToRaw(TProtocolMetatypeToObjectExpr e) { e = TProtocolMetatypeToObjectExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TRebindSelfInConstructorExpr` to a raw DB element, if possible. + */ cached Raw::Element convertRebindSelfInConstructorExprToRaw(TRebindSelfInConstructorExpr e) { e = TRebindSelfInConstructorExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TRegexLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertRegexLiteralExprToRaw(TRegexLiteralExpr e) { e = TRegexLiteralExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TSequenceExpr` to a raw DB element, if possible. + */ cached Raw::Element convertSequenceExprToRaw(TSequenceExpr e) { e = TSequenceExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TStringLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertStringLiteralExprToRaw(TStringLiteralExpr e) { e = TStringLiteralExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TStringToPointerExpr` to a raw DB element, if possible. + */ cached Raw::Element convertStringToPointerExprToRaw(TStringToPointerExpr e) { e = TStringToPointerExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TSubscriptExpr` to a raw DB element, if possible. + */ cached Raw::Element convertSubscriptExprToRaw(TSubscriptExpr e) { e = TSubscriptExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TSuperRefExpr` to a raw DB element, if possible. + */ cached Raw::Element convertSuperRefExprToRaw(TSuperRefExpr e) { e = TSuperRefExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTapExpr` to a raw DB element, if possible. + */ cached Raw::Element convertTapExprToRaw(TTapExpr e) { e = TTapExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTryExpr` to a raw DB element, if possible. + */ cached Raw::Element convertTryExprToRaw(TTryExpr e) { e = TTryExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTupleElementExpr` to a raw DB element, if possible. + */ cached Raw::Element convertTupleElementExprToRaw(TTupleElementExpr e) { e = TTupleElementExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTupleExpr` to a raw DB element, if possible. + */ cached Raw::Element convertTupleExprToRaw(TTupleExpr e) { e = TTupleExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTypeExpr` to a raw DB element, if possible. + */ cached Raw::Element convertTypeExprToRaw(TTypeExpr e) { e = TTypeExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnderlyingToOpaqueExpr` to a raw DB element, if possible. + */ cached Raw::Element convertUnderlyingToOpaqueExprToRaw(TUnderlyingToOpaqueExpr e) { e = TUnderlyingToOpaqueExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnevaluatedInstanceExpr` to a raw DB element, if possible. + */ cached Raw::Element convertUnevaluatedInstanceExprToRaw(TUnevaluatedInstanceExpr e) { e = TUnevaluatedInstanceExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnresolvedDeclRefExpr` to a raw DB element, if possible. + */ cached Raw::Element convertUnresolvedDeclRefExprToRaw(TUnresolvedDeclRefExpr e) { e = TUnresolvedDeclRefExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnresolvedDotExpr` to a raw DB element, if possible. + */ cached Raw::Element convertUnresolvedDotExprToRaw(TUnresolvedDotExpr e) { e = TUnresolvedDotExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnresolvedMemberChainResultExpr` to a raw DB element, if possible. + */ cached Raw::Element convertUnresolvedMemberChainResultExprToRaw(TUnresolvedMemberChainResultExpr e) { e = TUnresolvedMemberChainResultExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnresolvedMemberExpr` to a raw DB element, if possible. + */ cached Raw::Element convertUnresolvedMemberExprToRaw(TUnresolvedMemberExpr e) { e = TUnresolvedMemberExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnresolvedPatternExpr` to a raw DB element, if possible. + */ cached Raw::Element convertUnresolvedPatternExprToRaw(TUnresolvedPatternExpr e) { e = TUnresolvedPatternExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnresolvedSpecializeExpr` to a raw DB element, if possible. + */ cached Raw::Element convertUnresolvedSpecializeExprToRaw(TUnresolvedSpecializeExpr e) { e = TUnresolvedSpecializeExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnresolvedTypeConversionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertUnresolvedTypeConversionExprToRaw(TUnresolvedTypeConversionExpr e) { e = TUnresolvedTypeConversionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TVarargExpansionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertVarargExpansionExprToRaw(TVarargExpansionExpr e) { e = TVarargExpansionExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAnyPattern` to a raw DB element, if possible. + */ cached Raw::Element convertAnyPatternToRaw(TAnyPattern e) { e = TAnyPattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBindingPattern` to a raw DB element, if possible. + */ cached Raw::Element convertBindingPatternToRaw(TBindingPattern e) { e = TBindingPattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBoolPattern` to a raw DB element, if possible. + */ cached Raw::Element convertBoolPatternToRaw(TBoolPattern e) { e = TBoolPattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TEnumElementPattern` to a raw DB element, if possible. + */ cached Raw::Element convertEnumElementPatternToRaw(TEnumElementPattern e) { e = TEnumElementPattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TExprPattern` to a raw DB element, if possible. + */ cached Raw::Element convertExprPatternToRaw(TExprPattern e) { e = TExprPattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TIsPattern` to a raw DB element, if possible. + */ cached Raw::Element convertIsPatternToRaw(TIsPattern e) { e = TIsPattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TNamedPattern` to a raw DB element, if possible. + */ cached Raw::Element convertNamedPatternToRaw(TNamedPattern e) { e = TNamedPattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOptionalSomePattern` to a raw DB element, if possible. + */ cached Raw::Element convertOptionalSomePatternToRaw(TOptionalSomePattern e) { e = TOptionalSomePattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TParenPattern` to a raw DB element, if possible. + */ cached Raw::Element convertParenPatternToRaw(TParenPattern e) { e = TParenPattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTuplePattern` to a raw DB element, if possible. + */ cached Raw::Element convertTuplePatternToRaw(TTuplePattern e) { e = TTuplePattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTypedPattern` to a raw DB element, if possible. + */ cached Raw::Element convertTypedPatternToRaw(TTypedPattern e) { e = TTypedPattern(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBraceStmt` to a raw DB element, if possible. + */ cached Raw::Element convertBraceStmtToRaw(TBraceStmt e) { e = TBraceStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBreakStmt` to a raw DB element, if possible. + */ cached Raw::Element convertBreakStmtToRaw(TBreakStmt e) { e = TBreakStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCaseLabelItem` to a raw DB element, if possible. + */ cached Raw::Element convertCaseLabelItemToRaw(TCaseLabelItem e) { e = TCaseLabelItem(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCaseStmt` to a raw DB element, if possible. + */ cached Raw::Element convertCaseStmtToRaw(TCaseStmt e) { e = TCaseStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TConditionElement` to a raw DB element, if possible. + */ cached Raw::Element convertConditionElementToRaw(TConditionElement e) { e = TConditionElement(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TContinueStmt` to a raw DB element, if possible. + */ cached Raw::Element convertContinueStmtToRaw(TContinueStmt e) { e = TContinueStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDeferStmt` to a raw DB element, if possible. + */ cached Raw::Element convertDeferStmtToRaw(TDeferStmt e) { e = TDeferStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDoCatchStmt` to a raw DB element, if possible. + */ cached Raw::Element convertDoCatchStmtToRaw(TDoCatchStmt e) { e = TDoCatchStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDoStmt` to a raw DB element, if possible. + */ cached Raw::Element convertDoStmtToRaw(TDoStmt e) { e = TDoStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TFailStmt` to a raw DB element, if possible. + */ cached Raw::Element convertFailStmtToRaw(TFailStmt e) { e = TFailStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TFallthroughStmt` to a raw DB element, if possible. + */ cached Raw::Element convertFallthroughStmtToRaw(TFallthroughStmt e) { e = TFallthroughStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TForEachStmt` to a raw DB element, if possible. + */ cached Raw::Element convertForEachStmtToRaw(TForEachStmt e) { e = TForEachStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TGuardStmt` to a raw DB element, if possible. + */ cached Raw::Element convertGuardStmtToRaw(TGuardStmt e) { e = TGuardStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TIfStmt` to a raw DB element, if possible. + */ cached Raw::Element convertIfStmtToRaw(TIfStmt e) { e = TIfStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPoundAssertStmt` to a raw DB element, if possible. + */ cached Raw::Element convertPoundAssertStmtToRaw(TPoundAssertStmt e) { e = TPoundAssertStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TRepeatWhileStmt` to a raw DB element, if possible. + */ cached Raw::Element convertRepeatWhileStmtToRaw(TRepeatWhileStmt e) { e = TRepeatWhileStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TReturnStmt` to a raw DB element, if possible. + */ cached Raw::Element convertReturnStmtToRaw(TReturnStmt e) { e = TReturnStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TStmtCondition` to a raw DB element, if possible. + */ cached Raw::Element convertStmtConditionToRaw(TStmtCondition e) { e = TStmtCondition(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TSwitchStmt` to a raw DB element, if possible. + */ cached Raw::Element convertSwitchStmtToRaw(TSwitchStmt e) { e = TSwitchStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TThrowStmt` to a raw DB element, if possible. + */ cached Raw::Element convertThrowStmtToRaw(TThrowStmt e) { e = TThrowStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TWhileStmt` to a raw DB element, if possible. + */ cached Raw::Element convertWhileStmtToRaw(TWhileStmt e) { e = TWhileStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TYieldStmt` to a raw DB element, if possible. + */ cached Raw::Element convertYieldStmtToRaw(TYieldStmt e) { e = TYieldStmt(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TArraySliceType` to a raw DB element, if possible. + */ cached Raw::Element convertArraySliceTypeToRaw(TArraySliceType e) { e = TArraySliceType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBoundGenericClassType` to a raw DB element, if possible. + */ cached Raw::Element convertBoundGenericClassTypeToRaw(TBoundGenericClassType e) { e = TBoundGenericClassType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBoundGenericEnumType` to a raw DB element, if possible. + */ cached Raw::Element convertBoundGenericEnumTypeToRaw(TBoundGenericEnumType e) { e = TBoundGenericEnumType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBoundGenericStructType` to a raw DB element, if possible. + */ cached Raw::Element convertBoundGenericStructTypeToRaw(TBoundGenericStructType e) { e = TBoundGenericStructType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinBridgeObjectType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinBridgeObjectTypeToRaw(TBuiltinBridgeObjectType e) { e = TBuiltinBridgeObjectType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinDefaultActorStorageType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinDefaultActorStorageTypeToRaw(TBuiltinDefaultActorStorageType e) { e = TBuiltinDefaultActorStorageType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinExecutorType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinExecutorTypeToRaw(TBuiltinExecutorType e) { e = TBuiltinExecutorType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinFloatType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinFloatTypeToRaw(TBuiltinFloatType e) { e = TBuiltinFloatType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinIntegerLiteralType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinIntegerLiteralTypeToRaw(TBuiltinIntegerLiteralType e) { e = TBuiltinIntegerLiteralType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinIntegerType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinIntegerTypeToRaw(TBuiltinIntegerType e) { e = TBuiltinIntegerType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinJobType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinJobTypeToRaw(TBuiltinJobType e) { e = TBuiltinJobType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinNativeObjectType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinNativeObjectTypeToRaw(TBuiltinNativeObjectType e) { e = TBuiltinNativeObjectType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinRawPointerType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinRawPointerTypeToRaw(TBuiltinRawPointerType e) { e = TBuiltinRawPointerType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinRawUnsafeContinuationType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinRawUnsafeContinuationTypeToRaw(TBuiltinRawUnsafeContinuationType e) { e = TBuiltinRawUnsafeContinuationType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinUnsafeValueBufferType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinUnsafeValueBufferTypeToRaw(TBuiltinUnsafeValueBufferType e) { e = TBuiltinUnsafeValueBufferType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinVectorType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinVectorTypeToRaw(TBuiltinVectorType e) { e = TBuiltinVectorType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TClassType` to a raw DB element, if possible. + */ cached Raw::Element convertClassTypeToRaw(TClassType e) { e = TClassType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDependentMemberType` to a raw DB element, if possible. + */ cached Raw::Element convertDependentMemberTypeToRaw(TDependentMemberType e) { e = TDependentMemberType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDictionaryType` to a raw DB element, if possible. + */ cached Raw::Element convertDictionaryTypeToRaw(TDictionaryType e) { e = TDictionaryType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDynamicSelfType` to a raw DB element, if possible. + */ cached Raw::Element convertDynamicSelfTypeToRaw(TDynamicSelfType e) { e = TDynamicSelfType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TEnumType` to a raw DB element, if possible. + */ cached Raw::Element convertEnumTypeToRaw(TEnumType e) { e = TEnumType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TErrorType` to a raw DB element, if possible. + */ cached Raw::Element convertErrorTypeToRaw(TErrorType e) { e = TErrorType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TExistentialMetatypeType` to a raw DB element, if possible. + */ cached Raw::Element convertExistentialMetatypeTypeToRaw(TExistentialMetatypeType e) { e = TExistentialMetatypeType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TExistentialType` to a raw DB element, if possible. + */ cached Raw::Element convertExistentialTypeToRaw(TExistentialType e) { e = TExistentialType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TFunctionType` to a raw DB element, if possible. + */ cached Raw::Element convertFunctionTypeToRaw(TFunctionType e) { e = TFunctionType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TGenericFunctionType` to a raw DB element, if possible. + */ cached Raw::Element convertGenericFunctionTypeToRaw(TGenericFunctionType e) { e = TGenericFunctionType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TGenericTypeParamType` to a raw DB element, if possible. + */ cached Raw::Element convertGenericTypeParamTypeToRaw(TGenericTypeParamType e) { e = TGenericTypeParamType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TInOutType` to a raw DB element, if possible. + */ cached Raw::Element convertInOutTypeToRaw(TInOutType e) { e = TInOutType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLValueType` to a raw DB element, if possible. + */ cached Raw::Element convertLValueTypeToRaw(TLValueType e) { e = TLValueType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TMetatypeType` to a raw DB element, if possible. + */ cached Raw::Element convertMetatypeTypeToRaw(TMetatypeType e) { e = TMetatypeType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TModuleType` to a raw DB element, if possible. + */ cached Raw::Element convertModuleTypeToRaw(TModuleType e) { e = TModuleType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOpaqueTypeArchetypeType` to a raw DB element, if possible. + */ cached Raw::Element convertOpaqueTypeArchetypeTypeToRaw(TOpaqueTypeArchetypeType e) { e = TOpaqueTypeArchetypeType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOpenedArchetypeType` to a raw DB element, if possible. + */ cached Raw::Element convertOpenedArchetypeTypeToRaw(TOpenedArchetypeType e) { e = TOpenedArchetypeType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOptionalType` to a raw DB element, if possible. + */ cached Raw::Element convertOptionalTypeToRaw(TOptionalType e) { e = TOptionalType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TParameterizedProtocolType` to a raw DB element, if possible. + */ cached Raw::Element convertParameterizedProtocolTypeToRaw(TParameterizedProtocolType e) { e = TParameterizedProtocolType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TParenType` to a raw DB element, if possible. + */ cached Raw::Element convertParenTypeToRaw(TParenType e) { e = TParenType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPrimaryArchetypeType` to a raw DB element, if possible. + */ cached Raw::Element convertPrimaryArchetypeTypeToRaw(TPrimaryArchetypeType e) { e = TPrimaryArchetypeType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TProtocolCompositionType` to a raw DB element, if possible. + */ cached Raw::Element convertProtocolCompositionTypeToRaw(TProtocolCompositionType e) { e = TProtocolCompositionType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TProtocolType` to a raw DB element, if possible. + */ cached Raw::Element convertProtocolTypeToRaw(TProtocolType e) { e = TProtocolType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TStructType` to a raw DB element, if possible. + */ cached Raw::Element convertStructTypeToRaw(TStructType e) { e = TStructType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTupleType` to a raw DB element, if possible. + */ cached Raw::Element convertTupleTypeToRaw(TTupleType e) { e = TTupleType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTypeAliasType` to a raw DB element, if possible. + */ cached Raw::Element convertTypeAliasTypeToRaw(TTypeAliasType e) { e = TTypeAliasType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTypeRepr` to a raw DB element, if possible. + */ cached Raw::Element convertTypeReprToRaw(TTypeRepr e) { e = TTypeRepr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnboundGenericType` to a raw DB element, if possible. + */ cached Raw::Element convertUnboundGenericTypeToRaw(TUnboundGenericType e) { e = TUnboundGenericType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnmanagedStorageType` to a raw DB element, if possible. + */ cached Raw::Element convertUnmanagedStorageTypeToRaw(TUnmanagedStorageType e) { e = TUnmanagedStorageType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnownedStorageType` to a raw DB element, if possible. + */ cached Raw::Element convertUnownedStorageTypeToRaw(TUnownedStorageType e) { e = TUnownedStorageType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnresolvedType` to a raw DB element, if possible. + */ cached Raw::Element convertUnresolvedTypeToRaw(TUnresolvedType e) { e = TUnresolvedType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TVariadicSequenceType` to a raw DB element, if possible. + */ cached Raw::Element convertVariadicSequenceTypeToRaw(TVariadicSequenceType e) { e = TVariadicSequenceType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TWeakStorageType` to a raw DB element, if possible. + */ cached Raw::Element convertWeakStorageTypeToRaw(TWeakStorageType e) { e = TWeakStorageType(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAstNode` to a raw DB element, if possible. + */ cached Raw::Element convertAstNodeToRaw(TAstNode e) { result = convertAvailabilityInfoToRaw(e) @@ -3061,6 +5991,10 @@ module Synth { result = convertTypeReprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAvailabilitySpec` to a raw DB element, if possible. + */ cached Raw::Element convertAvailabilitySpecToRaw(TAvailabilitySpec e) { result = convertOtherAvailabilitySpecToRaw(e) @@ -3068,6 +6002,10 @@ module Synth { result = convertPlatformVersionAvailabilitySpecToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCallable` to a raw DB element, if possible. + */ cached Raw::Element convertCallableToRaw(TCallable e) { result = convertAbstractClosureExprToRaw(e) @@ -3075,6 +6013,10 @@ module Synth { result = convertAbstractFunctionDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TElement` to a raw DB element, if possible. + */ cached Raw::Element convertElementToRaw(TElement e) { result = convertCallableToRaw(e) @@ -3090,6 +6032,10 @@ module Synth { result = convertTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TErrorElement` to a raw DB element, if possible. + */ cached Raw::Element convertErrorElementToRaw(TErrorElement e) { result = convertErrorExprToRaw(e) @@ -3117,6 +6063,10 @@ module Synth { result = convertUnspecifiedElementToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TFile` to a raw DB element, if possible. + */ cached Raw::Element convertFileToRaw(TFile e) { result = convertDbFileToRaw(e) @@ -3124,6 +6074,10 @@ module Synth { result = convertUnknownFileToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLocatable` to a raw DB element, if possible. + */ cached Raw::Element convertLocatableToRaw(TLocatable e) { result = convertArgumentToRaw(e) @@ -3137,6 +6091,10 @@ module Synth { result = convertErrorElementToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLocation` to a raw DB element, if possible. + */ cached Raw::Element convertLocationToRaw(TLocation e) { result = convertDbLocationToRaw(e) @@ -3144,6 +6102,10 @@ module Synth { result = convertUnknownLocationToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAbstractFunctionDecl` to a raw DB element, if possible. + */ cached Raw::Element convertAbstractFunctionDeclToRaw(TAbstractFunctionDecl e) { result = convertConstructorDeclToRaw(e) @@ -3153,6 +6115,10 @@ module Synth { result = convertFuncDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAbstractStorageDecl` to a raw DB element, if possible. + */ cached Raw::Element convertAbstractStorageDeclToRaw(TAbstractStorageDecl e) { result = convertSubscriptDeclToRaw(e) @@ -3160,6 +6126,10 @@ module Synth { result = convertVarDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAbstractTypeParamDecl` to a raw DB element, if possible. + */ cached Raw::Element convertAbstractTypeParamDeclToRaw(TAbstractTypeParamDecl e) { result = convertAssociatedTypeDeclToRaw(e) @@ -3167,6 +6137,10 @@ module Synth { result = convertGenericTypeParamDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDecl` to a raw DB element, if possible. + */ cached Raw::Element convertDeclToRaw(TDecl e) { result = convertCapturedDeclToRaw(e) @@ -3194,6 +6168,10 @@ module Synth { result = convertValueDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TFuncDecl` to a raw DB element, if possible. + */ cached Raw::Element convertFuncDeclToRaw(TFuncDecl e) { result = convertAccessorDeclToRaw(e) @@ -3201,6 +6179,10 @@ module Synth { result = convertConcreteFuncDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TGenericContext` to a raw DB element, if possible. + */ cached Raw::Element convertGenericContextToRaw(TGenericContext e) { result = convertAbstractFunctionDeclToRaw(e) @@ -3212,6 +6194,10 @@ module Synth { result = convertSubscriptDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TGenericTypeDecl` to a raw DB element, if possible. + */ cached Raw::Element convertGenericTypeDeclToRaw(TGenericTypeDecl e) { result = convertNominalTypeDeclToRaw(e) @@ -3221,6 +6207,10 @@ module Synth { result = convertTypeAliasDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TNominalTypeDecl` to a raw DB element, if possible. + */ cached Raw::Element convertNominalTypeDeclToRaw(TNominalTypeDecl e) { result = convertClassDeclToRaw(e) @@ -3232,6 +6222,10 @@ module Synth { result = convertStructDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TOperatorDecl` to a raw DB element, if possible. + */ cached Raw::Element convertOperatorDeclToRaw(TOperatorDecl e) { result = convertInfixOperatorDeclToRaw(e) @@ -3241,6 +6235,10 @@ module Synth { result = convertPrefixOperatorDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTypeDecl` to a raw DB element, if possible. + */ cached Raw::Element convertTypeDeclToRaw(TTypeDecl e) { result = convertAbstractTypeParamDeclToRaw(e) @@ -3250,6 +6248,10 @@ module Synth { result = convertModuleDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TValueDecl` to a raw DB element, if possible. + */ cached Raw::Element convertValueDeclToRaw(TValueDecl e) { result = convertAbstractFunctionDeclToRaw(e) @@ -3261,6 +6263,10 @@ module Synth { result = convertTypeDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TVarDecl` to a raw DB element, if possible. + */ cached Raw::Element convertVarDeclToRaw(TVarDecl e) { result = convertConcreteVarDeclToRaw(e) @@ -3268,6 +6274,10 @@ module Synth { result = convertParamDeclToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAbstractClosureExpr` to a raw DB element, if possible. + */ cached Raw::Element convertAbstractClosureExprToRaw(TAbstractClosureExpr e) { result = convertAutoClosureExprToRaw(e) @@ -3275,6 +6285,10 @@ module Synth { result = convertClosureExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAnyTryExpr` to a raw DB element, if possible. + */ cached Raw::Element convertAnyTryExprToRaw(TAnyTryExpr e) { result = convertForceTryExprToRaw(e) @@ -3284,6 +6298,10 @@ module Synth { result = convertTryExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TApplyExpr` to a raw DB element, if possible. + */ cached Raw::Element convertApplyExprToRaw(TApplyExpr e) { result = convertBinaryExprToRaw(e) @@ -3297,6 +6315,10 @@ module Synth { result = convertSelfApplyExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinLiteralExprToRaw(TBuiltinLiteralExpr e) { result = convertBooleanLiteralExprToRaw(e) @@ -3308,6 +6330,10 @@ module Synth { result = convertStringLiteralExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCheckedCastExpr` to a raw DB element, if possible. + */ cached Raw::Element convertCheckedCastExprToRaw(TCheckedCastExpr e) { result = convertConditionalCheckedCastExprToRaw(e) @@ -3317,6 +6343,10 @@ module Synth { result = convertIsExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCollectionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertCollectionExprToRaw(TCollectionExpr e) { result = convertArrayExprToRaw(e) @@ -3324,6 +6354,10 @@ module Synth { result = convertDictionaryExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDynamicLookupExpr` to a raw DB element, if possible. + */ cached Raw::Element convertDynamicLookupExprToRaw(TDynamicLookupExpr e) { result = convertDynamicMemberRefExprToRaw(e) @@ -3331,6 +6365,10 @@ module Synth { result = convertDynamicSubscriptExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TExplicitCastExpr` to a raw DB element, if possible. + */ cached Raw::Element convertExplicitCastExprToRaw(TExplicitCastExpr e) { result = convertCheckedCastExprToRaw(e) @@ -3338,6 +6376,10 @@ module Synth { result = convertCoerceExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TExpr` to a raw DB element, if possible. + */ cached Raw::Element convertExprToRaw(TExpr e) { result = convertAbstractClosureExprToRaw(e) @@ -3439,6 +6481,10 @@ module Synth { result = convertVarargExpansionExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TIdentityExpr` to a raw DB element, if possible. + */ cached Raw::Element convertIdentityExprToRaw(TIdentityExpr e) { result = convertAwaitExprToRaw(e) @@ -3450,6 +6496,10 @@ module Synth { result = convertUnresolvedMemberChainResultExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TImplicitConversionExpr` to a raw DB element, if possible. + */ cached Raw::Element convertImplicitConversionExprToRaw(TImplicitConversionExpr e) { result = convertAbiSafeConversionExprToRaw(e) @@ -3517,6 +6567,10 @@ module Synth { result = convertUnresolvedTypeConversionExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertLiteralExprToRaw(TLiteralExpr e) { result = convertBuiltinLiteralExprToRaw(e) @@ -3530,6 +6584,10 @@ module Synth { result = convertRegexLiteralExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLookupExpr` to a raw DB element, if possible. + */ cached Raw::Element convertLookupExprToRaw(TLookupExpr e) { result = convertDynamicLookupExprToRaw(e) @@ -3541,6 +6599,10 @@ module Synth { result = convertSubscriptExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TNumberLiteralExpr` to a raw DB element, if possible. + */ cached Raw::Element convertNumberLiteralExprToRaw(TNumberLiteralExpr e) { result = convertFloatLiteralExprToRaw(e) @@ -3548,6 +6610,10 @@ module Synth { result = convertIntegerLiteralExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TSelfApplyExpr` to a raw DB element, if possible. + */ cached Raw::Element convertSelfApplyExprToRaw(TSelfApplyExpr e) { result = convertConstructorRefCallExprToRaw(e) @@ -3555,6 +6621,10 @@ module Synth { result = convertDotSyntaxCallExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPattern` to a raw DB element, if possible. + */ cached Raw::Element convertPatternToRaw(TPattern e) { result = convertAnyPatternToRaw(e) @@ -3580,6 +6650,10 @@ module Synth { result = convertTypedPatternToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLabeledConditionalStmt` to a raw DB element, if possible. + */ cached Raw::Element convertLabeledConditionalStmtToRaw(TLabeledConditionalStmt e) { result = convertGuardStmtToRaw(e) @@ -3589,6 +6663,10 @@ module Synth { result = convertWhileStmtToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLabeledStmt` to a raw DB element, if possible. + */ cached Raw::Element convertLabeledStmtToRaw(TLabeledStmt e) { result = convertDoCatchStmtToRaw(e) @@ -3604,6 +6682,10 @@ module Synth { result = convertSwitchStmtToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TStmt` to a raw DB element, if possible. + */ cached Raw::Element convertStmtToRaw(TStmt e) { result = convertBraceStmtToRaw(e) @@ -3631,6 +6713,10 @@ module Synth { result = convertYieldStmtToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAnyBuiltinIntegerType` to a raw DB element, if possible. + */ cached Raw::Element convertAnyBuiltinIntegerTypeToRaw(TAnyBuiltinIntegerType e) { result = convertBuiltinIntegerLiteralTypeToRaw(e) @@ -3638,6 +6724,10 @@ module Synth { result = convertBuiltinIntegerTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAnyFunctionType` to a raw DB element, if possible. + */ cached Raw::Element convertAnyFunctionTypeToRaw(TAnyFunctionType e) { result = convertFunctionTypeToRaw(e) @@ -3645,6 +6735,10 @@ module Synth { result = convertGenericFunctionTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAnyGenericType` to a raw DB element, if possible. + */ cached Raw::Element convertAnyGenericTypeToRaw(TAnyGenericType e) { result = convertNominalOrBoundGenericNominalTypeToRaw(e) @@ -3652,6 +6746,10 @@ module Synth { result = convertUnboundGenericTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TAnyMetatypeType` to a raw DB element, if possible. + */ cached Raw::Element convertAnyMetatypeTypeToRaw(TAnyMetatypeType e) { result = convertExistentialMetatypeTypeToRaw(e) @@ -3659,6 +6757,10 @@ module Synth { result = convertMetatypeTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TArchetypeType` to a raw DB element, if possible. + */ cached Raw::Element convertArchetypeTypeToRaw(TArchetypeType e) { result = convertOpaqueTypeArchetypeTypeToRaw(e) @@ -3668,6 +6770,10 @@ module Synth { result = convertPrimaryArchetypeTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBoundGenericType` to a raw DB element, if possible. + */ cached Raw::Element convertBoundGenericTypeToRaw(TBoundGenericType e) { result = convertBoundGenericClassTypeToRaw(e) @@ -3677,6 +6783,10 @@ module Synth { result = convertBoundGenericStructTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TBuiltinType` to a raw DB element, if possible. + */ cached Raw::Element convertBuiltinTypeToRaw(TBuiltinType e) { result = convertAnyBuiltinIntegerTypeToRaw(e) @@ -3702,6 +6812,10 @@ module Synth { result = convertBuiltinVectorTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TNominalOrBoundGenericNominalType` to a raw DB element, if possible. + */ cached Raw::Element convertNominalOrBoundGenericNominalTypeToRaw(TNominalOrBoundGenericNominalType e) { result = convertBoundGenericTypeToRaw(e) @@ -3709,6 +6823,10 @@ module Synth { result = convertNominalTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TNominalType` to a raw DB element, if possible. + */ cached Raw::Element convertNominalTypeToRaw(TNominalType e) { result = convertClassTypeToRaw(e) @@ -3720,6 +6838,10 @@ module Synth { result = convertStructTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TReferenceStorageType` to a raw DB element, if possible. + */ cached Raw::Element convertReferenceStorageTypeToRaw(TReferenceStorageType e) { result = convertUnmanagedStorageTypeToRaw(e) @@ -3729,6 +6851,10 @@ module Synth { result = convertWeakStorageTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TSubstitutableType` to a raw DB element, if possible. + */ cached Raw::Element convertSubstitutableTypeToRaw(TSubstitutableType e) { result = convertArchetypeTypeToRaw(e) @@ -3736,6 +6862,10 @@ module Synth { result = convertGenericTypeParamTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TSugarType` to a raw DB element, if possible. + */ cached Raw::Element convertSugarTypeToRaw(TSugarType e) { result = convertParenTypeToRaw(e) @@ -3745,6 +6875,10 @@ module Synth { result = convertTypeAliasTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TSyntaxSugarType` to a raw DB element, if possible. + */ cached Raw::Element convertSyntaxSugarTypeToRaw(TSyntaxSugarType e) { result = convertDictionaryTypeToRaw(e) @@ -3752,6 +6886,10 @@ module Synth { result = convertUnarySyntaxSugarTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TType` to a raw DB element, if possible. + */ cached Raw::Element convertTypeToRaw(TType e) { result = convertAnyFunctionTypeToRaw(e) @@ -3791,6 +6929,10 @@ module Synth { result = convertUnresolvedTypeToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnarySyntaxSugarType` to a raw DB element, if possible. + */ cached Raw::Element convertUnarySyntaxSugarTypeToRaw(TUnarySyntaxSugarType e) { result = convertArraySliceTypeToRaw(e) diff --git a/swift/ql/lib/codeql/swift/security/CleartextLoggingQuery.qll b/swift/ql/lib/codeql/swift/security/CleartextLoggingQuery.qll index 12343c02d86..0156a13e7d5 100644 --- a/swift/ql/lib/codeql/swift/security/CleartextLoggingQuery.qll +++ b/swift/ql/lib/codeql/swift/security/CleartextLoggingQuery.qll @@ -9,28 +9,6 @@ private import codeql.swift.dataflow.TaintTracking private import codeql.swift.security.CleartextLoggingExtensions private import codeql.swift.security.SensitiveExprs -/** - * A taint-tracking configuration for cleartext logging of sensitive data vulnerabilities. - */ -deprecated class CleartextLoggingConfiguration extends TaintTracking::Configuration { - CleartextLoggingConfiguration() { this = "CleartextLoggingConfiguration" } - - override predicate isSource(DataFlow::Node source) { source.asExpr() instanceof SensitiveExpr } - - override predicate isSink(DataFlow::Node sink) { sink instanceof CleartextLoggingSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof CleartextLoggingSanitizer - } - - // Disregard paths that contain other paths. This helps with performance. - override predicate isSanitizerIn(DataFlow::Node node) { this.isSource(node) } - - override predicate isAdditionalTaintStep(DataFlow::Node n1, DataFlow::Node n2) { - any(CleartextLoggingAdditionalTaintStep s).step(n1, n2) - } -} - /** * A taint-tracking configuration for cleartext logging of sensitive data vulnerabilities. */ diff --git a/swift/ql/lib/codeql/swift/security/CleartextStorageDatabaseQuery.qll b/swift/ql/lib/codeql/swift/security/CleartextStorageDatabaseQuery.qll index 715a9159931..ebce5b28d0c 100644 --- a/swift/ql/lib/codeql/swift/security/CleartextStorageDatabaseQuery.qll +++ b/swift/ql/lib/codeql/swift/security/CleartextStorageDatabaseQuery.qll @@ -13,47 +13,7 @@ import codeql.swift.security.CleartextStorageDatabaseExtensions * A taint configuration from sensitive information to expressions that are * transmitted over a network. */ -deprecated class CleartextStorageConfig extends TaintTracking::Configuration { - CleartextStorageConfig() { this = "CleartextStorageConfig" } - - override predicate isSource(DataFlow::Node node) { node.asExpr() instanceof SensitiveExpr } - - override predicate isSink(DataFlow::Node node) { node instanceof CleartextStorageDatabaseSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof CleartextStorageDatabaseSanitizer - } - - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { - any(CleartextStorageDatabaseAdditionalTaintStep s).step(nodeFrom, nodeTo) - } - - override predicate isSanitizerIn(DataFlow::Node node) { - // make sources barriers so that we only report the closest instance - isSource(node) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - // flow out from fields of an `NSManagedObject` or `RealmSwiftObject` at the sink, - // for example in `realmObj.data = sensitive`. - isSink(node) and - exists(NominalTypeDecl d, Decl cx | - d.getType().getABaseType*().getUnderlyingType().getName() = - ["NSManagedObject", "RealmSwiftObject"] and - cx.asNominalTypeDecl() = d and - c.getAReadContent().(DataFlow::Content::FieldContent).getField() = cx.getAMember() - ) - or - // any default implicit reads - super.allowImplicitRead(node, c) - } -} - -/** - * A taint configuration from sensitive information to expressions that are - * transmitted over a network. - */ -module CleartextStorageConfig implements DataFlow::ConfigSig { +module CleartextStorageDatabaseConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node node) { node.asExpr() instanceof SensitiveExpr } predicate isSink(DataFlow::Node node) { node instanceof CleartextStorageDatabaseSink } @@ -88,4 +48,4 @@ module CleartextStorageConfig implements DataFlow::ConfigSig { * Detect taint flow of sensitive information to expressions that are * transmitted over a network. */ -module CleartextStorageFlow = TaintTracking::Global; +module CleartextStorageDatabaseFlow = TaintTracking::Global; diff --git a/swift/ql/lib/codeql/swift/security/CleartextStoragePreferencesQuery.qll b/swift/ql/lib/codeql/swift/security/CleartextStoragePreferencesQuery.qll index b84c58fe8cb..b24ed763908 100644 --- a/swift/ql/lib/codeql/swift/security/CleartextStoragePreferencesQuery.qll +++ b/swift/ql/lib/codeql/swift/security/CleartextStoragePreferencesQuery.qll @@ -13,32 +13,7 @@ import codeql.swift.security.CleartextStoragePreferencesExtensions * A taint configuration from sensitive information to expressions that are * stored as preferences. */ -deprecated class CleartextStorageConfig extends TaintTracking::Configuration { - CleartextStorageConfig() { this = "CleartextStorageConfig" } - - override predicate isSource(DataFlow::Node node) { node.asExpr() instanceof SensitiveExpr } - - override predicate isSink(DataFlow::Node node) { node instanceof CleartextStoragePreferencesSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof CleartextStoragePreferencesSanitizer - } - - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { - any(CleartextStoragePreferencesAdditionalTaintStep s).step(nodeFrom, nodeTo) - } - - override predicate isSanitizerIn(DataFlow::Node node) { - // make sources barriers so that we only report the closest instance - this.isSource(node) - } -} - -/** - * A taint configuration from sensitive information to expressions that are - * stored as preferences. - */ -module CleartextStorageConfig implements DataFlow::ConfigSig { +module CleartextStoragePreferencesConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node node) { node.asExpr() instanceof SensitiveExpr } predicate isSink(DataFlow::Node node) { node instanceof CleartextStoragePreferencesSink } @@ -61,4 +36,4 @@ module CleartextStorageConfig implements DataFlow::ConfigSig { * Detect taint flow of sensitive information to expressions that are stored * as preferences. */ -module CleartextStorageFlow = TaintTracking::Global; +module CleartextStoragePreferencesFlow = TaintTracking::Global; diff --git a/swift/ql/lib/codeql/swift/security/CleartextTransmissionQuery.qll b/swift/ql/lib/codeql/swift/security/CleartextTransmissionQuery.qll index e2e3a64583f..e37c41c4235 100644 --- a/swift/ql/lib/codeql/swift/security/CleartextTransmissionQuery.qll +++ b/swift/ql/lib/codeql/swift/security/CleartextTransmissionQuery.qll @@ -9,31 +9,6 @@ import codeql.swift.dataflow.DataFlow import codeql.swift.dataflow.TaintTracking import codeql.swift.security.CleartextTransmissionExtensions -/** - * A taint configuration from sensitive information to expressions that are - * transmitted over a network. - */ -deprecated class CleartextTransmissionConfig extends TaintTracking::Configuration { - CleartextTransmissionConfig() { this = "CleartextTransmissionConfig" } - - override predicate isSource(DataFlow::Node node) { node.asExpr() instanceof SensitiveExpr } - - override predicate isSink(DataFlow::Node node) { node instanceof CleartextTransmissionSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof CleartextTransmissionSanitizer - } - - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { - any(CleartextTransmissionAdditionalTaintStep s).step(nodeFrom, nodeTo) - } - - override predicate isSanitizerIn(DataFlow::Node node) { - // make sources barriers so that we only report the closest instance - isSource(node) - } -} - /** * A taint configuration from sensitive information to expressions that are * transmitted over a network. diff --git a/swift/ql/lib/codeql/swift/security/HardcodedEncryptionKeyExtensions.qll b/swift/ql/lib/codeql/swift/security/HardcodedEncryptionKeyExtensions.qll index 344f17bcf96..bee8a0db54d 100644 --- a/swift/ql/lib/codeql/swift/security/HardcodedEncryptionKeyExtensions.qll +++ b/swift/ql/lib/codeql/swift/security/HardcodedEncryptionKeyExtensions.qll @@ -57,11 +57,24 @@ private class RnCryptorEncryptionKeySink extends HardcodedEncryptionKeySink { ] and c.getAMember() = f and call.getStaticTarget() = f and - call.getArgumentWithLabel(["encryptionKey", "withEncryptionKey"]).getExpr() = this.asExpr() + call.getArgumentWithLabel(["encryptionKey", "withEncryptionKey", "hmacKey"]).getExpr() = + this.asExpr() ) } } +private class EncryptionKeySinks extends SinkModelCsv { + override predicate row(string row) { + row = + [ + // Realm database library. + ";Realm.Configuration;true;init(fileURL:inMemoryIdentifier:syncConfiguration:encryptionKey:readOnly:schemaVersion:migrationBlock:deleteRealmIfMigrationNeeded:shouldCompactOnLaunch:objectTypes:);;;Argument[3];encryption-key", + ";Realm.Configuration;true;init(fileURL:inMemoryIdentifier:syncConfiguration:encryptionKey:readOnly:schemaVersion:migrationBlock:deleteRealmIfMigrationNeeded:shouldCompactOnLaunch:objectTypes:seedFilePath:);;;Argument[3];encryption-key", + ";Realm.Configuration;true;encryptionKey;;;;encryption-key", + ] + } +} + /** * A sink defined in a CSV model. */ diff --git a/swift/ql/lib/codeql/swift/security/InsecureTLSQuery.qll b/swift/ql/lib/codeql/swift/security/InsecureTLSQuery.qll index c3caab7dd20..854d4b0fb14 100644 --- a/swift/ql/lib/codeql/swift/security/InsecureTLSQuery.qll +++ b/swift/ql/lib/codeql/swift/security/InsecureTLSQuery.qll @@ -6,7 +6,6 @@ import swift import codeql.swift.dataflow.DataFlow import codeql.swift.dataflow.TaintTracking -import codeql.swift.dataflow.FlowSources import codeql.swift.security.InsecureTLSExtensions /** diff --git a/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll b/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll index 4a78cfbf867..0b7962c05c1 100644 --- a/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll +++ b/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll @@ -127,7 +127,13 @@ private class PathInjectionSinks extends SinkModelCsv { ";DatabasePool;true;init(path:configuration:);;;Argument[0];path-injection", ";DatabaseQueue;true;init(path:configuration:);;;Argument[0];path-injection", ";DatabaseSnapshotPool;true;init(path:configuration:);;;Argument[0];path-injection", - ";SerializedDatabase;true;init(path:configuration:defaultLabel:purpose:);;;Argument[0];path-injection" + ";SerializedDatabase;true;init(path:configuration:defaultLabel:purpose:);;;Argument[0];path-injection", + // Realm + ";Realm.Configuration;true;init(fileURL:inMemoryIdentifier:syncConfiguration:encryptionKey:readOnly:schemaVersion:migrationBlock:deleteRealmIfMigrationNeeded:shouldCompactOnLaunch:objectTypes:);;;Argument[0];path-injection", + ";Realm.Configuration;true;init(fileURL:inMemoryIdentifier:syncConfiguration:encryptionKey:readOnly:schemaVersion:migrationBlock:deleteRealmIfMigrationNeeded:shouldCompactOnLaunch:objectTypes:seedFilePath:);;;Argument[0];path-injection", + ";Realm.Configuration;true;init(fileURL:inMemoryIdentifier:syncConfiguration:encryptionKey:readOnly:schemaVersion:migrationBlock:deleteRealmIfMigrationNeeded:shouldCompactOnLaunch:objectTypes:seedFilePath:);;;Argument[10];path-injection", + ";Realm.Configuration;true;fileURL;;;;path-injection", + ";Realm.Configuration;true;seedFilePath;;;;path-injection", ] } } diff --git a/swift/ql/lib/codeql/swift/security/PathInjectionQuery.qll b/swift/ql/lib/codeql/swift/security/PathInjectionQuery.qll index 6aee15c16d5..472ee5b9120 100644 --- a/swift/ql/lib/codeql/swift/security/PathInjectionQuery.qll +++ b/swift/ql/lib/codeql/swift/security/PathInjectionQuery.qll @@ -10,25 +10,6 @@ private import codeql.swift.dataflow.FlowSources private import codeql.swift.dataflow.TaintTracking private import codeql.swift.security.PathInjectionExtensions -/** - * A taint-tracking configuration for path injection vulnerabilities. - */ -deprecated class PathInjectionConfiguration extends TaintTracking::Configuration { - PathInjectionConfiguration() { this = "PathInjectionConfiguration" } - - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof PathInjectionSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof PathInjectionSanitizer - } - - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { - any(PathInjectionAdditionalTaintStep s).step(node1, node2) - } -} - /** * A taint-tracking configuration for path injection vulnerabilities. */ diff --git a/swift/ql/lib/codeql/swift/security/PredicateInjectionQuery.qll b/swift/ql/lib/codeql/swift/security/PredicateInjectionQuery.qll index 3432feb7a74..a7123bd0e70 100644 --- a/swift/ql/lib/codeql/swift/security/PredicateInjectionQuery.qll +++ b/swift/ql/lib/codeql/swift/security/PredicateInjectionQuery.qll @@ -9,30 +9,11 @@ private import codeql.swift.dataflow.FlowSources private import codeql.swift.dataflow.TaintTracking private import codeql.swift.security.PredicateInjectionExtensions -/** - * A taint-tracking configuration for predicate injection vulnerabilities. - */ -deprecated class PredicateInjectionConf extends TaintTracking::Configuration { - PredicateInjectionConf() { this = "PredicateInjectionConf" } - - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof PredicateInjectionSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof PredicateInjectionSanitizer - } - - override predicate isAdditionalTaintStep(DataFlow::Node n1, DataFlow::Node n2) { - any(PredicateInjectionAdditionalTaintStep s).step(n1, n2) - } -} - /** * A taint-tracking configuration for predicate injection vulnerabilities. */ module PredicateInjectionConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } + predicate isSource(DataFlow::Node source) { source instanceof FlowSource } predicate isSink(DataFlow::Node sink) { sink instanceof PredicateInjectionSink } diff --git a/swift/ql/lib/codeql/swift/security/SqlInjectionQuery.qll b/swift/ql/lib/codeql/swift/security/SqlInjectionQuery.qll index c09ce04ff6e..f8987eca65a 100644 --- a/swift/ql/lib/codeql/swift/security/SqlInjectionQuery.qll +++ b/swift/ql/lib/codeql/swift/security/SqlInjectionQuery.qll @@ -10,25 +10,6 @@ import codeql.swift.dataflow.TaintTracking import codeql.swift.dataflow.FlowSources import codeql.swift.security.SqlInjectionExtensions -/** - * A taint configuration for tainted data that reaches a SQL sink. - */ -deprecated class SqlInjectionConfig extends TaintTracking::Configuration { - SqlInjectionConfig() { this = "SqlInjectionConfig" } - - override predicate isSource(DataFlow::Node node) { node instanceof FlowSource } - - override predicate isSink(DataFlow::Node node) { node instanceof SqlInjectionSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof SqlInjectionSanitizer - } - - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { - any(SqlInjectionAdditionalTaintStep s).step(nodeFrom, nodeTo) - } -} - /** * A taint configuration for tainted data that reaches a SQL sink. */ diff --git a/swift/ql/lib/codeql/swift/security/UncontrolledFormatStringQuery.qll b/swift/ql/lib/codeql/swift/security/UncontrolledFormatStringQuery.qll index 12215eeead6..19e9e646e1d 100644 --- a/swift/ql/lib/codeql/swift/security/UncontrolledFormatStringQuery.qll +++ b/swift/ql/lib/codeql/swift/security/UncontrolledFormatStringQuery.qll @@ -10,25 +10,6 @@ import codeql.swift.dataflow.TaintTracking import codeql.swift.dataflow.FlowSources import codeql.swift.security.UncontrolledFormatStringExtensions -/** - * A taint configuration for tainted data that reaches a format string. - */ -deprecated class TaintedFormatConfiguration extends TaintTracking::Configuration { - TaintedFormatConfiguration() { this = "TaintedFormatConfiguration" } - - override predicate isSource(DataFlow::Node node) { node instanceof FlowSource } - - override predicate isSink(DataFlow::Node node) { node instanceof UncontrolledFormatStringSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof UncontrolledFormatStringSanitizer - } - - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { - any(UncontrolledFormatStringAdditionalTaintStep s).step(nodeFrom, nodeTo) - } -} - /** * A taint configuration for tainted data that reaches a format string. */ diff --git a/swift/ql/lib/codeql/swift/security/UnsafeJsEvalQuery.qll b/swift/ql/lib/codeql/swift/security/UnsafeJsEvalQuery.qll index 91308deca4a..52350ec3bf2 100644 --- a/swift/ql/lib/codeql/swift/security/UnsafeJsEvalQuery.qll +++ b/swift/ql/lib/codeql/swift/security/UnsafeJsEvalQuery.qll @@ -9,25 +9,6 @@ import codeql.swift.dataflow.TaintTracking import codeql.swift.dataflow.FlowSources import codeql.swift.security.UnsafeJsEvalExtensions -/** - * A taint configuration from taint sources to sinks for this query. - */ -deprecated class UnsafeJsEvalConfig extends TaintTracking::Configuration { - UnsafeJsEvalConfig() { this = "UnsafeJsEvalConfig" } - - override predicate isSource(DataFlow::Node node) { node instanceof FlowSource } - - override predicate isSink(DataFlow::Node node) { node instanceof UnsafeJsEvalSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof UnsafeJsEvalSanitizer - } - - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { - any(UnsafeJsEvalAdditionalTaintStep s).step(nodeFrom, nodeTo) - } -} - /** * A taint configuration from taint sources to sinks for this query. */ diff --git a/swift/ql/lib/codeql/swift/security/UnsafeWebViewFetchQuery.qll b/swift/ql/lib/codeql/swift/security/UnsafeWebViewFetchQuery.qll index 216fb52e0af..4c6cf3b06e9 100644 --- a/swift/ql/lib/codeql/swift/security/UnsafeWebViewFetchQuery.qll +++ b/swift/ql/lib/codeql/swift/security/UnsafeWebViewFetchQuery.qll @@ -9,31 +9,6 @@ import codeql.swift.dataflow.TaintTracking import codeql.swift.dataflow.FlowSources import codeql.swift.security.UnsafeWebViewFetchExtensions -/** - * A taint configuration from taint sources to sinks (and `baseURL` arguments) - * for this query. - */ -deprecated class UnsafeWebViewFetchConfig extends TaintTracking::Configuration { - UnsafeWebViewFetchConfig() { this = "UnsafeWebViewFetchConfig" } - - override predicate isSource(DataFlow::Node node) { node instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node node) { - exists(UnsafeWebViewFetchSink sink | - node = sink or - node.asExpr() = sink.getBaseUrl() - ) - } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer instanceof UnsafeWebViewFetchSanitizer - } - - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { - any(UnsafeWebViewFetchAdditionalTaintStep s).step(nodeFrom, nodeTo) - } -} - /** * A taint configuration from taint sources to sinks (and `baseURL` arguments) * for this query. diff --git a/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingExtensions.qll b/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingExtensions.qll index e62aa7821c6..e1ee36b05c4 100755 --- a/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingExtensions.qll +++ b/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingExtensions.qll @@ -46,6 +46,21 @@ private class WeakHashingSinks extends SinkModelCsv { ";Insecure.SHA1;true;hash(data:);;;Argument[0];weak-hash-input-SHA1", ";Insecure.SHA1;true;update(data:);;;Argument[0];weak-hash-input-SHA1", ";Insecure.SHA1;true;update(bufferPointer:);;;Argument[0];weak-hash-input-SHA1", + // CryptoSwift + ";MD5;true;calculate(for:);;;Argument[0];weak-hash-input-MD5", + ";MD5;true;callAsFunction(_:);;;Argument[0];weak-hash-input-MD5", + ";MD5;true;update(withBytes:isLast:);;;Argument[0];weak-hash-input-MD5", + ";SHA1;true;calculate(for:);;;Argument[0];weak-hash-input-SHA1", + ";SHA1;true;callAsFunction(_:);;;Argument[0];weak-hash-input-SHA1", + ";SHA1;true;update(withBytes:isLast:);;;Argument[0];weak-hash-input-SHA1", + ";Digest;true;md5(_:);;;Argument[0];weak-hash-input-MD5", + ";Digest;true;sha1(_:);;;Argument[0];weak-hash-input-SHA1", + ";Array;true;md5();;;Argument[-1];weak-hash-input-MD5", + ";Array;true;sha1();;;Argument[-1];weak-hash-input-SHA1", + ";Data;true;md5();;;Argument[-1];weak-hash-input-MD5", + ";Data;true;sha1();;;Argument[-1];weak-hash-input-SHA1", + ";String;true;md5();;;Argument[-1];weak-hash-input-MD5", + ";String;true;sha1();;;Argument[-1];weak-hash-input-SHA1", ] } } diff --git a/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingQuery.qll b/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingQuery.qll index fa4a9a65f0e..c751f4cd6a7 100755 --- a/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingQuery.qll +++ b/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingQuery.qll @@ -20,6 +20,16 @@ module WeakHashingConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node node) { node instanceof WeakSensitiveDataHashingSanitizer } + predicate isBarrierIn(DataFlow::Node node) { + // make sources barriers so that we only report the closest instance + isSource(node) + } + + predicate isBarrierOut(DataFlow::Node node) { + // make sinks barriers so that we only report the closest instance + isSink(node) + } + predicate isAdditionalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { any(WeakSensitiveDataHashingAdditionalTaintStep s).step(nodeFrom, nodeTo) } diff --git a/swift/ql/lib/codeql/swift/security/XXEQuery.qll b/swift/ql/lib/codeql/swift/security/XXEQuery.qll index 1d7bb4bce3d..7f6fe9580f9 100644 --- a/swift/ql/lib/codeql/swift/security/XXEQuery.qll +++ b/swift/ql/lib/codeql/swift/security/XXEQuery.qll @@ -9,23 +9,6 @@ import codeql.swift.dataflow.FlowSources import codeql.swift.dataflow.TaintTracking import codeql.swift.security.XXEExtensions -/** - * A taint-tracking configuration for XML external entities (XXE) vulnerabilities. - */ -deprecated class XxeConfiguration extends TaintTracking::Configuration { - XxeConfiguration() { this = "XxeConfiguration" } - - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof XxeSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { sanitizer instanceof XxeSanitizer } - - override predicate isAdditionalTaintStep(DataFlow::Node n1, DataFlow::Node n2) { - any(XxeAdditionalTaintStep s).step(n1, n2) - } -} - /** * A taint-tracking configuration for XML external entities (XXE) vulnerabilities. */ diff --git a/swift/ql/src/queries.xml b/swift/ql/src/queries.xml deleted file mode 100644 index 64264df2d36..00000000000 --- a/swift/ql/src/queries.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/swift/ql/src/queries/Security/CWE-079/UnsafeWebViewFetch.qhelp b/swift/ql/src/queries/Security/CWE-079/UnsafeWebViewFetch.qhelp index 1d61dbe9e92..2efd5d35d5f 100644 --- a/swift/ql/src/queries/Security/CWE-079/UnsafeWebViewFetch.qhelp +++ b/swift/ql/src/queries/Security/CWE-079/UnsafeWebViewFetch.qhelp @@ -3,7 +3,8 @@ "qhelp.dtd"> -

    Fetching data in a WebView without restricting the base URL may allow an attacker to access sensitive local data, for example using file://. Data can then be extracted from the software using the URL of a machine under the attackers control. More generally, an attacker may use a URL under their control as part of a cross-site scripting attack.

    + +

    Fetching data in a web view without restricting the base URL may allow an attacker to access sensitive local data, for example using file://. Data can then be extracted from the software using the URL of a machine under the attacker's control. More generally, an attacker may use a URL under their control as part of a cross-site scripting attack.

    @@ -25,7 +26,7 @@
  • - iOS Bug Hunting - Web View XSS + iOS Bug Hunting - Web View XSS.
  • diff --git a/swift/ql/src/queries/Security/CWE-094/UnsafeJsEval.ql b/swift/ql/src/queries/Security/CWE-094/UnsafeJsEval.ql index 9daf1829141..8bfdbba02fa 100644 --- a/swift/ql/src/queries/Security/CWE-094/UnsafeJsEval.ql +++ b/swift/ql/src/queries/Security/CWE-094/UnsafeJsEval.ql @@ -4,7 +4,7 @@ * @kind path-problem * @problem.severity warning * @security-severity 9.3 - * @precision high + * @precision medium * @id swift/unsafe-js-eval * @tags security * external/cwe/cwe-094 diff --git a/swift/ql/src/queries/Security/CWE-311/CleartextStorageDatabase.ql b/swift/ql/src/queries/Security/CWE-311/CleartextStorageDatabase.ql index cffe27f3a7d..9b4bf3ad421 100644 --- a/swift/ql/src/queries/Security/CWE-311/CleartextStorageDatabase.ql +++ b/swift/ql/src/queries/Security/CWE-311/CleartextStorageDatabase.ql @@ -5,7 +5,7 @@ * @kind path-problem * @problem.severity warning * @security-severity 7.5 - * @precision medium + * @precision high * @id swift/cleartext-storage-database * @tags security * external/cwe/cwe-312 @@ -14,7 +14,7 @@ import swift import codeql.swift.dataflow.DataFlow import codeql.swift.security.CleartextStorageDatabaseQuery -import CleartextStorageFlow::PathGraph +import CleartextStorageDatabaseFlow::PathGraph /** * Gets a prettier node to use in the results. @@ -27,10 +27,10 @@ DataFlow::Node cleanupNode(DataFlow::Node n) { } from - CleartextStorageFlow::PathNode sourceNode, CleartextStorageFlow::PathNode sinkNode, - DataFlow::Node cleanSink + CleartextStorageDatabaseFlow::PathNode sourceNode, + CleartextStorageDatabaseFlow::PathNode sinkNode, DataFlow::Node cleanSink where - CleartextStorageFlow::flowPath(sourceNode, sinkNode) and + CleartextStorageDatabaseFlow::flowPath(sourceNode, sinkNode) and cleanSink = cleanupNode(sinkNode.getNode()) select cleanSink, sourceNode, sinkNode, "This operation stores '" + cleanSink.toString() + diff --git a/swift/ql/src/queries/Security/CWE-312/CleartextStoragePreferences.ql b/swift/ql/src/queries/Security/CWE-312/CleartextStoragePreferences.ql index 0f2b3f0b71b..7e764e3665b 100644 --- a/swift/ql/src/queries/Security/CWE-312/CleartextStoragePreferences.ql +++ b/swift/ql/src/queries/Security/CWE-312/CleartextStoragePreferences.ql @@ -4,7 +4,7 @@ * @kind path-problem * @problem.severity warning * @security-severity 7.5 - * @precision medium + * @precision high * @id swift/cleartext-storage-preferences * @tags security * external/cwe/cwe-312 @@ -13,7 +13,7 @@ import swift import codeql.swift.dataflow.DataFlow import codeql.swift.security.CleartextStoragePreferencesQuery -import CleartextStorageFlow::PathGraph +import CleartextStoragePreferencesFlow::PathGraph /** * Gets a prettier node to use in the results. @@ -26,10 +26,10 @@ DataFlow::Node cleanupNode(DataFlow::Node n) { } from - CleartextStorageFlow::PathNode sourceNode, CleartextStorageFlow::PathNode sinkNode, - DataFlow::Node cleanSink + CleartextStoragePreferencesFlow::PathNode sourceNode, + CleartextStoragePreferencesFlow::PathNode sinkNode, DataFlow::Node cleanSink where - CleartextStorageFlow::flowPath(sourceNode, sinkNode) and + CleartextStoragePreferencesFlow::flowPath(sourceNode, sinkNode) and cleanSink = cleanupNode(sinkNode.getNode()) select cleanSink, sourceNode, sinkNode, "This operation stores '" + cleanSink.toString() + "' in " + diff --git a/swift/ql/test/extractor-tests/declarations/all.expected b/swift/ql/test/extractor-tests/declarations/all.expected index f892820f41e..44c5650fad1 100644 --- a/swift/ql/test/extractor-tests/declarations/all.expected +++ b/swift/ql/test/extractor-tests/declarations/all.expected @@ -231,7 +231,7 @@ | declarations.swift:132:5:132:15 | willSet | | | declarations.swift:134:5:134:5 | self | | | declarations.swift:134:5:134:14 | didSet | | -| declarations.swift:138:1:142:1 | extension | | +| declarations.swift:138:1:142:1 | extension of Int | | | declarations.swift:139:3:141:3 | id() | | | declarations.swift:139:8:139:8 | self | | | declarations.swift:144:1:144:7 | { ... } | | diff --git a/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/CapturedDecl.expected b/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/CapturedDecl.expected index d68a9638610..371312cb6cb 100644 --- a/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/CapturedDecl.expected +++ b/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/CapturedDecl.expected @@ -1,5 +1,41 @@ | closures.swift:8:12:8:12 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:7:6:7:6 | x | isDirect: | yes | isEscaping: | no | | closures.swift:9:12:9:12 | y | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:6:7:6:7 | y | isDirect: | yes | isEscaping: | no | +| closures.swift:16:3:16:3 | escape | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:12:5:12:5 | escape | isDirect: | yes | isEscaping: | yes | | closures.swift:17:5:17:5 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:15:7:15:7 | x | isDirect: | yes | isEscaping: | yes | -| closures.swift:20:3:20:3 | escape | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:12:5:12:5 | escape | isDirect: | yes | isEscaping: | yes | -| closures.swift:25:3:25:3 | escape | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:12:5:12:5 | escape | isDirect: | yes | isEscaping: | yes | +| closures.swift:24:3:24:3 | escape | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:12:5:12:5 | escape | isDirect: | yes | isEscaping: | yes | +| closures.swift:31:11:31:11 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:29:7:29:7 | x | isDirect: | no | isEscaping: | no | +| closures.swift:32:14:32:14 | f | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:28:7:28:7 | f | isDirect: | no | isEscaping: | no | +| closures.swift:32:14:32:14 | f | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:28:7:28:7 | f | isDirect: | yes | isEscaping: | no | +| closures.swift:32:17:32:17 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:29:7:29:7 | x | isDirect: | yes | isEscaping: | no | +| closures.swift:39:20:39:20 | callback | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:36:21:36:58 | callback | isDirect: | yes | isEscaping: | yes | +| closures.swift:42:35:42:35 | wrapper(_:) | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:38:5:40:5 | wrapper(_:) | isDirect: | no | isEscaping: | yes | +| closures.swift:52:18:52:18 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:51:7:51:7 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:54:13:54:13 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:51:7:51:7 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:61:18:61:18 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:60:7:60:7 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:63:13:63:13 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:60:7:60:7 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:71:3:71:3 | g | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:68:5:68:5 | g | isDirect: | yes | isEscaping: | yes | +| closures.swift:71:14:71:14 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:70:7:70:7 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:73:13:73:13 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:70:7:70:7 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:85:7:85:7 | y | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:79:7:79:7 | y | isDirect: | no | isEscaping: | yes | +| closures.swift:85:7:85:7 | y | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:79:7:79:7 | y | isDirect: | yes | isEscaping: | yes | +| closures.swift:85:18:85:18 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:82:9:82:9 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:88:9:88:9 | b() | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:92:5:98:5 | b() | isDirect: | no | isEscaping: | yes | +| closures.swift:93:7:93:7 | y | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:79:7:79:7 | y | isDirect: | yes | isEscaping: | yes | +| closures.swift:93:20:93:20 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:82:9:82:9 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:96:9:96:9 | a() | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:84:5:90:5 | a() | isDirect: | no | isEscaping: | yes | +| closures.swift:111:15:111:15 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:110:9:110:9 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:111:27:111:27 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:110:9:110:9 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:115:5:115:5 | incrX | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:109:8:109:8 | incrX | isDirect: | yes | isEscaping: | yes | +| closures.swift:130:25:130:25 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:128:7:128:7 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:133:20:133:20 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:128:7:128:7 | x | isDirect: | no | isEscaping: | yes | +| closures.swift:133:20:133:20 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:128:7:128:7 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:133:24:133:24 | y | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:132:22:132:22 | y | isDirect: | yes | isEscaping: | yes | +| closures.swift:151:21:151:21 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:149:10:149:15 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:154:16:154:16 | g(_:) | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:158:3:165:3 | g(_:) | isDirect: | no | isEscaping: | yes | +| closures.swift:155:21:155:21 | next | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:154:9:154:9 | next | isDirect: | yes | isEscaping: | yes | +| closures.swift:155:34:155:34 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:149:10:149:15 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:160:21:160:21 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:158:10:158:15 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:163:16:163:16 | f(_:) | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:149:3:156:3 | f(_:) | isDirect: | no | isEscaping: | yes | +| closures.swift:164:21:164:21 | next | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:163:9:163:9 | next | isDirect: | yes | isEscaping: | yes | +| closures.swift:164:36:164:36 | x | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:158:10:158:15 | x | isDirect: | yes | isEscaping: | yes | +| closures.swift:195:3:195:3 | g | getModule: | file://:0:0:0:0 | closures | getNumberOfMembers: | 0 | getDecl: | closures.swift:68:5:68:5 | g | isDirect: | yes | isEscaping: | yes | diff --git a/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/PrintAst.expected b/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/PrintAst.expected index e9acb1582e3..601aa9212e3 100644 --- a/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/PrintAst.expected +++ b/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/PrintAst.expected @@ -1,10 +1,10 @@ closures.swift: -# 1| [ConcreteFuncDecl] bar() +# 1| [ConcreteFuncDecl] hello() # 1| InterfaceType = () -> String # 1| getBody(): [BraceStmt] { ... } # 2| getElement(0): [ReturnStmt] return ... # 2| getResult(): [StringLiteralExpr] Hello world! -# 5| [ConcreteFuncDecl] foo() +# 5| [ConcreteFuncDecl] captureList() # 5| InterfaceType = () -> () # 5| getBody(): [BraceStmt] { ... } # 6| getElement(0): [PatternBindingDecl] var ... = ... @@ -15,8 +15,8 @@ closures.swift: # 7| getElement(2): [CallExpr] call to ... # 7| getFunction(): [CaptureListExpr] { ... } # 7| getBindingDecl(0): [PatternBindingDecl] var ... = ... -# 7| getInit(0): [CallExpr] call to bar() -# 7| getFunction(): [DeclRefExpr] bar() +# 7| getInit(0): [CallExpr] call to hello() +# 7| getFunction(): [DeclRefExpr] hello() # 7| getPattern(0): [NamedPattern] x # 7| getClosureBody(): [ClosureExpr] { ... } # 7| getBody(): [BraceStmt] { ... } @@ -55,7 +55,7 @@ closures.swift: # 12| getTypeRepr(): [TypeRepr] (() -> ())? # 12| [ConcreteVarDecl] escape # 12| Type = (() -> ())? -# 14| [ConcreteFuncDecl] baz() +# 14| [ConcreteFuncDecl] setEscape() # 14| InterfaceType = () -> () # 14| getBody(): [BraceStmt] { ... } # 15| getElement(0): [PatternBindingDecl] var ... = ... @@ -63,46 +63,1131 @@ closures.swift: # 15| getPattern(0): [NamedPattern] x # 15| getElement(1): [ConcreteVarDecl] x # 15| Type = Int -# 16| getElement(2): [ConcreteFuncDecl] quux() -# 16| InterfaceType = () -> () -# 16| getBody(): [BraceStmt] { ... } -# 17| getElement(0): [BinaryExpr] ... .+=(_:_:) ... -# 17| getFunction(): [MethodLookupExpr] .+=(_:_:) -# 17| getBase(): [TypeExpr] Int.Type -# 17| getTypeRepr(): [TypeRepr] Int -# 17| getMethodRef(): [DeclRefExpr] +=(_:_:) -# 17| getArgument(0): [Argument] : &... -# 17| getExpr(): [InOutExpr] &... -# 17| getSubExpr(): [DeclRefExpr] x -# 17| getArgument(1): [Argument] : 1 -# 17| getExpr(): [IntegerLiteralExpr] 1 -# 18| getElement(1): [CallExpr] call to print(_:separator:terminator:) -# 18| getFunction(): [DeclRefExpr] print(_:separator:terminator:) -# 18| getArgument(0): [Argument] : [...] -# 18| getExpr(): [VarargExpansionExpr] [...] -# 18| getSubExpr(): [ArrayExpr] [...] -# 18| getElement(0): [DeclRefExpr] x -# 18| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... -# 18| getImmediateSubExpr(): [LoadExpr] (Int) ... -# 18| getArgument(1): [Argument] separator: default separator -# 18| getExpr(): [DefaultArgumentExpr] default separator -# 18| getArgument(2): [Argument] terminator: default terminator -# 18| getExpr(): [DefaultArgumentExpr] default terminator -# 17| getCapture(0): [CapturedDecl] x -# 20| getElement(3): [AssignExpr] ... = ... -# 20| getDest(): [DeclRefExpr] escape -# 20| getSource(): [DeclRefExpr] quux() -# 20| getSource().getFullyConverted(): [InjectIntoOptionalExpr] ((() -> ())?) ... -# 20| getCapture(0): [CapturedDecl] escape -# 23| [ConcreteFuncDecl] callEscape() -# 23| InterfaceType = () -> () -# 23| getBody(): [BraceStmt] { ... } -# 24| getElement(0): [CallExpr] call to baz() -# 24| getFunction(): [DeclRefExpr] baz() -# 25| getElement(1): [OptionalEvaluationExpr] OptionalEvaluationExpr -# 25| getSubExpr(): [CallExpr] call to ... -# 25| getFunction(): [BindOptionalExpr] ...? -# 25| getSubExpr(): [DeclRefExpr] escape -# 25| getFunction().getFullyConverted(): [LoadExpr] ((() -> ())) ... -# 25| getSubExpr().getFullyConverted(): [InjectIntoOptionalExpr] (()?) ... -# 25| getCapture(0): [CapturedDecl] escape +# 16| getElement(2): [AssignExpr] ... = ... +# 16| getDest(): [DeclRefExpr] escape +# 16| getSource(): [ClosureExpr] { ... } +# 16| getBody(): [BraceStmt] { ... } +# 17| getElement(0): [BinaryExpr] ... .+=(_:_:) ... +# 17| getFunction(): [MethodLookupExpr] .+=(_:_:) +# 17| getBase(): [TypeExpr] Int.Type +# 17| getTypeRepr(): [TypeRepr] Int +# 17| getMethodRef(): [DeclRefExpr] +=(_:_:) +# 17| getArgument(0): [Argument] : &... +# 17| getExpr(): [InOutExpr] &... +# 17| getSubExpr(): [DeclRefExpr] x +# 17| getArgument(1): [Argument] : 1 +# 17| getExpr(): [IntegerLiteralExpr] 1 +# 18| getElement(1): [CallExpr] call to print(_:separator:terminator:) +# 18| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 18| getArgument(0): [Argument] : [...] +# 18| getExpr(): [VarargExpansionExpr] [...] +# 18| getSubExpr(): [ArrayExpr] [...] +# 18| getElement(0): [DeclRefExpr] x +# 18| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 18| getImmediateSubExpr(): [LoadExpr] (Int) ... +# 18| getArgument(1): [Argument] separator: default separator +# 18| getExpr(): [DefaultArgumentExpr] default separator +# 18| getArgument(2): [Argument] terminator: default terminator +# 18| getExpr(): [DefaultArgumentExpr] default terminator +# 17| getCapture(0): [CapturedDecl] x +# 16| getSource().getFullyConverted(): [InjectIntoOptionalExpr] ((() -> ())?) ... +# 16| getCapture(0): [CapturedDecl] escape +# 22| [ConcreteFuncDecl] callEscape() +# 22| InterfaceType = () -> () +# 22| getBody(): [BraceStmt] { ... } +# 23| getElement(0): [CallExpr] call to setEscape() +# 23| getFunction(): [DeclRefExpr] setEscape() +# 24| getElement(1): [OptionalEvaluationExpr] OptionalEvaluationExpr +# 24| getSubExpr(): [CallExpr] call to ... +# 24| getFunction(): [BindOptionalExpr] ...? +# 24| getSubExpr(): [DeclRefExpr] escape +# 24| getFunction().getFullyConverted(): [LoadExpr] ((() -> ())) ... +# 24| getSubExpr().getFullyConverted(): [InjectIntoOptionalExpr] (()?) ... +# 24| getCapture(0): [CapturedDecl] escape +# 27| [ConcreteFuncDecl] logical() +# 27| InterfaceType = () -> Bool +# 27| getBody(): [BraceStmt] { ... } +# 28| getElement(0): [PatternBindingDecl] var ... = ... +# 28| getInit(0): [ClosureExpr] { ... } +# 28| getParam(0): [ParamDecl] x +# 28| Type = Int +# 28| getBody(): [BraceStmt] { ... } +# 28| getElement(0): [ReturnStmt] return ... +# 28| getResult(): [BinaryExpr] ... .+(_:_:) ... +# 28| getFunction(): [MethodLookupExpr] .+(_:_:) +# 28| getBase(): [TypeExpr] Int.Type +# 28| getTypeRepr(): [TypeRepr] Int +# 28| getMethodRef(): [DeclRefExpr] +(_:_:) +# 28| getArgument(0): [Argument] : x +# 28| getExpr(): [DeclRefExpr] x +# 28| getArgument(1): [Argument] : 1 +# 28| getExpr(): [IntegerLiteralExpr] 1 +# 28| getInit(0).getFullyConverted(): [InjectIntoOptionalExpr] (((Int) -> Int)?) ... +# 28| getPattern(0): [TypedPattern] ... as ... +# 28| getSubPattern(): [NamedPattern] f +# 28| getTypeRepr(): [TypeRepr] ((Int) -> Int)? +# 28| getElement(1): [ConcreteVarDecl] f +# 28| Type = ((Int) -> Int)? +# 29| getElement(2): [PatternBindingDecl] var ... = ... +# 29| getInit(0): [IntegerLiteralExpr] 42 +# 29| getInit(0).getFullyConverted(): [InjectIntoOptionalExpr] (Int?) ... +# 29| getPattern(0): [TypedPattern] ... as ... +# 29| getSubPattern(): [NamedPattern] x +# 29| getTypeRepr(): [TypeRepr] Int? +# 29| getElement(3): [ConcreteVarDecl] x +# 29| Type = Int? +# 30| getElement(4): [ReturnStmt] return ... +# 30| getResult(): [BinaryExpr] ... .&&(_:_:) ... +# 31| getFunction(): [MethodLookupExpr] .&&(_:_:) +# 31| getBase(): [TypeExpr] Bool.Type +# 31| getTypeRepr(): [TypeRepr] Bool +# 31| getMethodRef(): [DeclRefExpr] &&(_:_:) +# 30| getArgument(0): [Argument] : ... .!=(_:_:) ... +# 30| getExpr(): [BinaryExpr] ... .!=(_:_:) ... +# 30| getFunction(): [MethodLookupExpr] .!=(_:_:) +# 30| getBase(): [TypeExpr] Optional<((Int) -> Int)>.Type +# 30| getTypeRepr(): [TypeRepr] Optional<((Int) -> Int)> +# 30| getMethodRef(): [DeclRefExpr] !=(_:_:) +# 30| getArgument(0): [Argument] : f +# 30| getExpr(): [DeclRefExpr] f +# 30| getArgument(1): [Argument] : nil +# 30| getExpr(): [NilLiteralExpr] nil +# 31| getArgument(1): [Argument] : { ... } +# 31| getExpr(): [AutoClosureExpr] { ... } +# 31| getBody(): [BraceStmt] { ... } +# 31| getElement(0): [ReturnStmt] return ... +# 31| getResult(): [BinaryExpr] ... .&&(_:_:) ... +# 32| getFunction(): [MethodLookupExpr] .&&(_:_:) +# 32| getBase(): [TypeExpr] Bool.Type +# 32| getTypeRepr(): [TypeRepr] Bool +# 32| getMethodRef(): [DeclRefExpr] &&(_:_:) +# 31| getArgument(0): [Argument] : ... .!=(_:_:) ... +# 31| getExpr(): [BinaryExpr] ... .!=(_:_:) ... +# 31| getFunction(): [MethodLookupExpr] .!=(_:_:) +# 31| getBase(): [TypeExpr] Optional.Type +# 31| getTypeRepr(): [TypeRepr] Optional +# 31| getMethodRef(): [DeclRefExpr] !=(_:_:) +# 31| getArgument(0): [Argument] : x +# 31| getExpr(): [DeclRefExpr] x +# 31| getArgument(1): [Argument] : nil +# 31| getExpr(): [NilLiteralExpr] nil +# 32| getArgument(1): [Argument] : { ... } +# 32| getExpr(): [AutoClosureExpr] { ... } +# 32| getBody(): [BraceStmt] { ... } +# 32| getElement(0): [ReturnStmt] return ... +# 32| getResult(): [BinaryExpr] ... .==(_:_:) ... +# 32| getFunction(): [MethodLookupExpr] .==(_:_:) +# 32| getBase(): [TypeExpr] Int.Type +# 32| getTypeRepr(): [TypeRepr] Int +# 32| getMethodRef(): [DeclRefExpr] ==(_:_:) +# 32| getArgument(0): [Argument] : call to ... +# 32| getExpr(): [CallExpr] call to ... +# 32| getFunction(): [ForceValueExpr] ...! +# 32| getSubExpr(): [DeclRefExpr] f +# 32| getArgument(0): [Argument] : ...! +# 32| getExpr(): [ForceValueExpr] ...! +# 32| getSubExpr(): [DeclRefExpr] x +# 32| getArgument(1): [Argument] : 43 +# 32| getExpr(): [IntegerLiteralExpr] 43 +# 32| getCapture(0): [CapturedDecl] f +# 32| getCapture(1): [CapturedDecl] x +# 31| getResult().getFullyConverted(): [ParenExpr] (...) +# 31| getCapture(0): [CapturedDecl] x +# 32| getCapture(1): [CapturedDecl] f +# 35| [ConcreteFuncDecl] asyncTest() +# 35| InterfaceType = () -> () +# 35| getBody(): [BraceStmt] { ... } +# 36| getElement(0): [ConcreteFuncDecl] withCallback(_:) +# 36| InterfaceType = (@escaping (Int) async -> Int) -> () +# 36| getParam(0): [ParamDecl] callback +# 36| Type = (Int) async -> Int +# 36| getBody(): [BraceStmt] { ... } +# 38| getElement(0): [ConcreteFuncDecl] wrapper(_:) +# 38| InterfaceType = @Sendable (Int) async -> Int +# 38| getParam(0): [ParamDecl] x +# 38| Type = Int +# 38| getBody(): [BraceStmt] { ... } +# 39| getElement(0): [ReturnStmt] return ... +# 39| getResult(): [CallExpr] call to ... +# 39| getFunction(): [DeclRefExpr] callback +# 39| getArgument(0): [Argument] : ... .+(_:_:) ... +# 39| getExpr(): [BinaryExpr] ... .+(_:_:) ... +# 39| getFunction(): [MethodLookupExpr] .+(_:_:) +# 39| getBase(): [TypeExpr] Int.Type +# 39| getTypeRepr(): [TypeRepr] Int +# 39| getMethodRef(): [DeclRefExpr] +(_:_:) +# 39| getArgument(0): [Argument] : x +# 39| getExpr(): [DeclRefExpr] x +# 39| getArgument(1): [Argument] : 1 +# 39| getExpr(): [IntegerLiteralExpr] 1 +# 39| getResult().getFullyConverted(): [AwaitExpr] await ... +# 39| getCapture(0): [CapturedDecl] callback +# 41| getElement(1): [CallExpr] call to Task.init(priority:operation:) +# 41| getFunction(): [MethodLookupExpr] Task.init(priority:operation:) +# 41| getBase(): [TypeExpr] Task<(), Never>.Type +# 41| getTypeRepr(): [TypeRepr] Task<(), Never> +# 41| getMethodRef(): [DeclRefExpr] Task.init(priority:operation:) +# 41| getArgument(0): [Argument] priority: default priority +# 41| getExpr(): [DefaultArgumentExpr] default priority +# 41| getArgument(1): [Argument] operation: { ... } +# 41| getExpr(): [ClosureExpr] { ... } +# 41| getBody(): [BraceStmt] { ... } +# 42| getElement(0): [ReturnStmt] return ... +# 42| getResult(): [CallExpr] call to print(_:separator:terminator:) +# 42| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 42| getArgument(0): [Argument] : [...] +# 42| getExpr(): [VarargExpansionExpr] [...] +# 42| getSubExpr(): [ArrayExpr] [...] +# 42| getElement(0): [StringLiteralExpr] asyncTest(): +# 42| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 42| getElement(1): [CallExpr] call to wrapper(_:) +# 42| getFunction(): [DeclRefExpr] wrapper(_:) +# 42| getArgument(0): [Argument] : 40 +# 42| getExpr(): [IntegerLiteralExpr] 40 +# 42| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 42| getImmediateSubExpr(): [AwaitExpr] await ... +# 42| getArgument(1): [Argument] separator: default separator +# 42| getExpr(): [DefaultArgumentExpr] default separator +# 42| getArgument(2): [Argument] terminator: default terminator +# 42| getExpr(): [DefaultArgumentExpr] default terminator +# 42| getCapture(0): [CapturedDecl] wrapper(_:) +# 45| getElement(1): [CallExpr] call to withCallback(_:) +# 45| getFunction(): [DeclRefExpr] withCallback(_:) +# 45| getArgument(0): [Argument] : { ... } +# 45| getExpr(): [ClosureExpr] { ... } +# 45| getParam(0): [ParamDecl] x +# 45| Type = Int +# 45| getBody(): [BraceStmt] { ... } +# 46| getElement(0): [ReturnStmt] return ... +# 46| getResult(): [BinaryExpr] ... .+(_:_:) ... +# 46| getFunction(): [MethodLookupExpr] .+(_:_:) +# 46| getBase(): [TypeExpr] Int.Type +# 46| getTypeRepr(): [TypeRepr] Int +# 46| getMethodRef(): [DeclRefExpr] +(_:_:) +# 46| getArgument(0): [Argument] : x +# 46| getExpr(): [DeclRefExpr] x +# 46| getArgument(1): [Argument] : 1 +# 46| getExpr(): [IntegerLiteralExpr] 1 +# 41| [NilLiteralExpr] nil +# 50| [ConcreteFuncDecl] foo() +# 50| InterfaceType = () -> Int +# 50| getBody(): [BraceStmt] { ... } +# 51| getElement(0): [PatternBindingDecl] var ... = ... +# 51| getInit(0): [IntegerLiteralExpr] 1 +# 51| getPattern(0): [NamedPattern] x +# 51| getElement(1): [ConcreteVarDecl] x +# 51| Type = Int +# 52| getElement(2): [PatternBindingDecl] var ... = ... +# 52| getInit(0): [ClosureExpr] { ... } +# 52| getParam(0): [ParamDecl] y +# 52| Type = Int +# 52| getBody(): [BraceStmt] { ... } +# 52| getElement(0): [ReturnStmt] return ... +# 52| getResult(): [BinaryExpr] ... .+=(_:_:) ... +# 52| getFunction(): [MethodLookupExpr] .+=(_:_:) +# 52| getBase(): [TypeExpr] Int.Type +# 52| getTypeRepr(): [TypeRepr] Int +# 52| getMethodRef(): [DeclRefExpr] +=(_:_:) +# 52| getArgument(0): [Argument] : &... +# 52| getExpr(): [InOutExpr] &... +# 52| getSubExpr(): [DeclRefExpr] x +# 52| getArgument(1): [Argument] : y +# 52| getExpr(): [DeclRefExpr] y +# 52| getCapture(0): [CapturedDecl] x +# 52| getPattern(0): [NamedPattern] f +# 52| getElement(3): [ConcreteVarDecl] f +# 52| Type = (Int) -> () +# 53| getElement(4): [BinaryExpr] ... .+=(_:_:) ... +# 53| getFunction(): [MethodLookupExpr] .+=(_:_:) +# 53| getBase(): [TypeExpr] Int.Type +# 53| getTypeRepr(): [TypeRepr] Int +# 53| getMethodRef(): [DeclRefExpr] +=(_:_:) +# 53| getArgument(0): [Argument] : &... +# 53| getExpr(): [InOutExpr] &... +# 53| getSubExpr(): [DeclRefExpr] x +# 53| getArgument(1): [Argument] : 40 +# 53| getExpr(): [IntegerLiteralExpr] 40 +# 54| getElement(5): [PatternBindingDecl] var ... = ... +# 54| getInit(0): [ClosureExpr] { ... } +# 54| getBody(): [BraceStmt] { ... } +# 54| getElement(0): [ReturnStmt] return ... +# 54| getResult(): [DeclRefExpr] x +# 54| getResult().getFullyConverted(): [LoadExpr] (Int) ... +# 54| getCapture(0): [CapturedDecl] x +# 54| getPattern(0): [NamedPattern] r +# 54| getElement(6): [ConcreteVarDecl] r +# 54| Type = () -> Int +# 55| getElement(7): [CallExpr] call to ... +# 55| getFunction(): [DeclRefExpr] f +# 55| getArgument(0): [Argument] : 1 +# 55| getExpr(): [IntegerLiteralExpr] 1 +# 56| getElement(8): [ReturnStmt] return ... +# 56| getResult(): [CallExpr] call to ... +# 56| getFunction(): [DeclRefExpr] r +# 51| [Comment] // x is a non-escaping capture of f and r +# 51| +# 56| [Comment] // 42 +# 56| +# 59| [ConcreteFuncDecl] bar() +# 59| InterfaceType = () -> () -> Int +# 59| getBody(): [BraceStmt] { ... } +# 60| getElement(0): [PatternBindingDecl] var ... = ... +# 60| getInit(0): [IntegerLiteralExpr] 1 +# 60| getPattern(0): [NamedPattern] x +# 60| getElement(1): [ConcreteVarDecl] x +# 60| Type = Int +# 61| getElement(2): [PatternBindingDecl] var ... = ... +# 61| getInit(0): [ClosureExpr] { ... } +# 61| getParam(0): [ParamDecl] y +# 61| Type = Int +# 61| getBody(): [BraceStmt] { ... } +# 61| getElement(0): [ReturnStmt] return ... +# 61| getResult(): [BinaryExpr] ... .+=(_:_:) ... +# 61| getFunction(): [MethodLookupExpr] .+=(_:_:) +# 61| getBase(): [TypeExpr] Int.Type +# 61| getTypeRepr(): [TypeRepr] Int +# 61| getMethodRef(): [DeclRefExpr] +=(_:_:) +# 61| getArgument(0): [Argument] : &... +# 61| getExpr(): [InOutExpr] &... +# 61| getSubExpr(): [DeclRefExpr] x +# 61| getArgument(1): [Argument] : y +# 61| getExpr(): [DeclRefExpr] y +# 61| getCapture(0): [CapturedDecl] x +# 61| getPattern(0): [NamedPattern] f +# 61| getElement(3): [ConcreteVarDecl] f +# 61| Type = (Int) -> () +# 62| getElement(4): [BinaryExpr] ... .+=(_:_:) ... +# 62| getFunction(): [MethodLookupExpr] .+=(_:_:) +# 62| getBase(): [TypeExpr] Int.Type +# 62| getTypeRepr(): [TypeRepr] Int +# 62| getMethodRef(): [DeclRefExpr] +=(_:_:) +# 62| getArgument(0): [Argument] : &... +# 62| getExpr(): [InOutExpr] &... +# 62| getSubExpr(): [DeclRefExpr] x +# 62| getArgument(1): [Argument] : 40 +# 62| getExpr(): [IntegerLiteralExpr] 40 +# 63| getElement(5): [PatternBindingDecl] var ... = ... +# 63| getInit(0): [ClosureExpr] { ... } +# 63| getBody(): [BraceStmt] { ... } +# 63| getElement(0): [ReturnStmt] return ... +# 63| getResult(): [DeclRefExpr] x +# 63| getResult().getFullyConverted(): [LoadExpr] (Int) ... +# 63| getCapture(0): [CapturedDecl] x +# 63| getPattern(0): [NamedPattern] r +# 63| getElement(6): [ConcreteVarDecl] r +# 63| Type = () -> Int +# 64| getElement(7): [CallExpr] call to ... +# 64| getFunction(): [DeclRefExpr] f +# 64| getArgument(0): [Argument] : 1 +# 64| getExpr(): [IntegerLiteralExpr] 1 +# 65| getElement(8): [ReturnStmt] return ... +# 65| getResult(): [DeclRefExpr] r +# 60| [Comment] // x is a non-escaping capture of f, escaping capture of r +# 60| +# 65| [Comment] // constantly 42 +# 65| +# 68| [TopLevelCodeDecl] { ... } +# 68| getBody(): [BraceStmt] { ... } +# 68| getElement(0): [PatternBindingDecl] var ... = ... +# 68| getInit(0): [NilLiteralExpr] nil +# 68| getPattern(0): [TypedPattern] ... as ... +# 68| getSubPattern(): [NamedPattern] g +# 68| getTypeRepr(): [TypeRepr] ((Int) -> Void)? +# 68| [ConcreteVarDecl] g +# 68| Type = ((Int) -> Void)? +# 69| [ConcreteFuncDecl] baz() +# 69| InterfaceType = () -> () -> Int +# 69| getBody(): [BraceStmt] { ... } +# 70| getElement(0): [PatternBindingDecl] var ... = ... +# 70| getInit(0): [IntegerLiteralExpr] 1 +# 70| getPattern(0): [NamedPattern] x +# 70| getElement(1): [ConcreteVarDecl] x +# 70| Type = Int +# 71| getElement(2): [AssignExpr] ... = ... +# 71| getDest(): [DeclRefExpr] g +# 71| getSource(): [ClosureExpr] { ... } +# 71| getParam(0): [ParamDecl] y +# 71| Type = Int +# 71| getBody(): [BraceStmt] { ... } +# 71| getElement(0): [ReturnStmt] return ... +# 71| getResult(): [BinaryExpr] ... .+=(_:_:) ... +# 71| getFunction(): [MethodLookupExpr] .+=(_:_:) +# 71| getBase(): [TypeExpr] Int.Type +# 71| getTypeRepr(): [TypeRepr] Int +# 71| getMethodRef(): [DeclRefExpr] +=(_:_:) +# 71| getArgument(0): [Argument] : &... +# 71| getExpr(): [InOutExpr] &... +# 71| getSubExpr(): [DeclRefExpr] x +# 71| getArgument(1): [Argument] : y +# 71| getExpr(): [DeclRefExpr] y +# 71| getCapture(0): [CapturedDecl] x +# 71| getSource().getFullyConverted(): [InjectIntoOptionalExpr] (((Int) -> Void)?) ... +# 72| getElement(3): [BinaryExpr] ... .+=(_:_:) ... +# 72| getFunction(): [MethodLookupExpr] .+=(_:_:) +# 72| getBase(): [TypeExpr] Int.Type +# 72| getTypeRepr(): [TypeRepr] Int +# 72| getMethodRef(): [DeclRefExpr] +=(_:_:) +# 72| getArgument(0): [Argument] : &... +# 72| getExpr(): [InOutExpr] &... +# 72| getSubExpr(): [DeclRefExpr] x +# 72| getArgument(1): [Argument] : 40 +# 72| getExpr(): [IntegerLiteralExpr] 40 +# 73| getElement(4): [PatternBindingDecl] var ... = ... +# 73| getInit(0): [ClosureExpr] { ... } +# 73| getBody(): [BraceStmt] { ... } +# 73| getElement(0): [ReturnStmt] return ... +# 73| getResult(): [DeclRefExpr] x +# 73| getResult().getFullyConverted(): [LoadExpr] (Int) ... +# 73| getCapture(0): [CapturedDecl] x +# 73| getPattern(0): [NamedPattern] r +# 73| getElement(5): [ConcreteVarDecl] r +# 73| Type = () -> Int +# 74| getElement(6): [CallExpr] call to ... +# 74| getFunction(): [ForceValueExpr] ...! +# 74| getSubExpr(): [DeclRefExpr] g +# 74| getSubExpr().getFullyConverted(): [LoadExpr] (((Int) -> Void)?) ... +# 74| getArgument(0): [Argument] : 1 +# 74| getExpr(): [IntegerLiteralExpr] 1 +# 75| getElement(7): [ReturnStmt] return ... +# 75| getResult(): [DeclRefExpr] r +# 71| getCapture(0): [CapturedDecl] g +# 70| [Comment] // x is an escaping capture of g and r +# 70| +# 71| [Comment] // closure escapes! +# 71| +# 78| [ConcreteFuncDecl] quux() +# 78| InterfaceType = () -> Int +# 78| getBody(): [BraceStmt] { ... } +# 79| getElement(0): [PatternBindingDecl] var ... = ... +# 79| getInit(0): [IntegerLiteralExpr] 0 +# 79| getPattern(0): [NamedPattern] y +# 79| getElement(1): [ConcreteVarDecl] y +# 79| Type = Int +# 81| getElement(2): [ConcreteFuncDecl] f() +# 81| InterfaceType = () -> () -> Void +# 81| getBody(): [BraceStmt] { ... } +# 82| getElement(0): [PatternBindingDecl] var ... = ... +# 82| getInit(0): [IntegerLiteralExpr] 5 +# 82| getPattern(0): [NamedPattern] x +# 82| getElement(1): [ConcreteVarDecl] x +# 82| Type = Int +# 84| getElement(2): [ConcreteFuncDecl] a() +# 84| InterfaceType = () -> () +# 84| getBody(): [BraceStmt] { ... } +# 85| getElement(0): [AssignExpr] ... = ... +# 85| getDest(): [DeclRefExpr] y +# 85| getSource(): [BinaryExpr] ... .+(_:_:) ... +# 85| getFunction(): [MethodLookupExpr] .+(_:_:) +# 85| getBase(): [TypeExpr] Int.Type +# 85| getTypeRepr(): [TypeRepr] Int +# 85| getMethodRef(): [DeclRefExpr] +(_:_:) +# 85| getArgument(0): [Argument] : ... .*(_:_:) ... +# 85| getExpr(): [BinaryExpr] ... .*(_:_:) ... +# 85| getFunction(): [MethodLookupExpr] .*(_:_:) +# 85| getBase(): [TypeExpr] Int.Type +# 85| getTypeRepr(): [TypeRepr] Int +# 85| getMethodRef(): [DeclRefExpr] *(_:_:) +# 85| getArgument(0): [Argument] : 10 +# 85| getExpr(): [IntegerLiteralExpr] 10 +# 85| getArgument(1): [Argument] : y +# 85| getExpr(): [DeclRefExpr] y +# 85| getExpr().getFullyConverted(): [LoadExpr] (Int) ... +# 85| getArgument(1): [Argument] : x +# 85| getExpr(): [DeclRefExpr] x +# 85| getExpr().getFullyConverted(): [LoadExpr] (Int) ... +# 86| getElement(1): [BinaryExpr] ... .-=(_:_:) ... +# 86| getFunction(): [MethodLookupExpr] .-=(_:_:) +# 86| getBase(): [TypeExpr] Int.Type +# 86| getTypeRepr(): [TypeRepr] Int +# 86| getMethodRef(): [DeclRefExpr] -=(_:_:) +# 86| getArgument(0): [Argument] : &... +# 86| getExpr(): [InOutExpr] &... +# 86| getSubExpr(): [DeclRefExpr] x +# 86| getArgument(1): [Argument] : 1 +# 86| getExpr(): [IntegerLiteralExpr] 1 +# 87| getElement(2): [IfStmt] if ... then { ... } +# 87| getCondition(): [StmtCondition] StmtCondition +# 87| getElement(0): [ConditionElement] ... .>(_:_:) ... +# 87| getBoolean(): [BinaryExpr] ... .>(_:_:) ... +# 87| getFunction(): [MethodLookupExpr] .>(_:_:) +# 87| getBase(): [TypeExpr] Int.Type +# 87| getTypeRepr(): [TypeRepr] Int +# 87| getMethodRef(): [DeclRefExpr] >(_:_:) +# 87| getArgument(0): [Argument] : x +# 87| getExpr(): [DeclRefExpr] x +# 87| getExpr().getFullyConverted(): [LoadExpr] (Int) ... +# 87| getArgument(1): [Argument] : 0 +# 87| getExpr(): [IntegerLiteralExpr] 0 +# 87| getThen(): [BraceStmt] { ... } +# 88| getElement(0): [CallExpr] call to b() +# 88| getFunction(): [DeclRefExpr] b() +# 85| getCapture(0): [CapturedDecl] y +# 85| getCapture(1): [CapturedDecl] x +# 88| getCapture(2): [CapturedDecl] b() +# 92| getElement(3): [ConcreteFuncDecl] b() +# 92| InterfaceType = () -> () +# 92| getBody(): [BraceStmt] { ... } +# 93| getElement(0): [AssignExpr] ... = ... +# 93| getDest(): [DeclRefExpr] y +# 93| getSource(): [BinaryExpr] ... .+(_:_:) ... +# 93| getFunction(): [MethodLookupExpr] .+(_:_:) +# 93| getBase(): [TypeExpr] Int.Type +# 93| getTypeRepr(): [TypeRepr] Int +# 93| getMethodRef(): [DeclRefExpr] +(_:_:) +# 93| getArgument(0): [Argument] : ... .*(_:_:) ... +# 93| getExpr(): [BinaryExpr] ... .*(_:_:) ... +# 93| getFunction(): [MethodLookupExpr] .*(_:_:) +# 93| getBase(): [TypeExpr] Int.Type +# 93| getTypeRepr(): [TypeRepr] Int +# 93| getMethodRef(): [DeclRefExpr] *(_:_:) +# 93| getArgument(0): [Argument] : 10 +# 93| getExpr(): [IntegerLiteralExpr] 10 +# 93| getArgument(1): [Argument] : y +# 93| getExpr(): [DeclRefExpr] y +# 93| getExpr().getFullyConverted(): [LoadExpr] (Int) ... +# 93| getArgument(1): [Argument] : ... .*(_:_:) ... +# 93| getExpr(): [BinaryExpr] ... .*(_:_:) ... +# 93| getFunction(): [MethodLookupExpr] .*(_:_:) +# 93| getBase(): [TypeExpr] Int.Type +# 93| getTypeRepr(): [TypeRepr] Int +# 93| getMethodRef(): [DeclRefExpr] *(_:_:) +# 93| getArgument(0): [Argument] : 2 +# 93| getExpr(): [IntegerLiteralExpr] 2 +# 93| getArgument(1): [Argument] : x +# 93| getExpr(): [DeclRefExpr] x +# 93| getExpr().getFullyConverted(): [LoadExpr] (Int) ... +# 94| getElement(1): [BinaryExpr] ... .-=(_:_:) ... +# 94| getFunction(): [MethodLookupExpr] .-=(_:_:) +# 94| getBase(): [TypeExpr] Int.Type +# 94| getTypeRepr(): [TypeRepr] Int +# 94| getMethodRef(): [DeclRefExpr] -=(_:_:) +# 94| getArgument(0): [Argument] : &... +# 94| getExpr(): [InOutExpr] &... +# 94| getSubExpr(): [DeclRefExpr] x +# 94| getArgument(1): [Argument] : 1 +# 94| getExpr(): [IntegerLiteralExpr] 1 +# 95| getElement(2): [IfStmt] if ... then { ... } +# 95| getCondition(): [StmtCondition] StmtCondition +# 95| getElement(0): [ConditionElement] ... .>(_:_:) ... +# 95| getBoolean(): [BinaryExpr] ... .>(_:_:) ... +# 95| getFunction(): [MethodLookupExpr] .>(_:_:) +# 95| getBase(): [TypeExpr] Int.Type +# 95| getTypeRepr(): [TypeRepr] Int +# 95| getMethodRef(): [DeclRefExpr] >(_:_:) +# 95| getArgument(0): [Argument] : x +# 95| getExpr(): [DeclRefExpr] x +# 95| getExpr().getFullyConverted(): [LoadExpr] (Int) ... +# 95| getArgument(1): [Argument] : 0 +# 95| getExpr(): [IntegerLiteralExpr] 0 +# 95| getThen(): [BraceStmt] { ... } +# 96| getElement(0): [CallExpr] call to a() +# 96| getFunction(): [DeclRefExpr] a() +# 93| getCapture(0): [CapturedDecl] y +# 93| getCapture(1): [CapturedDecl] x +# 96| getCapture(2): [CapturedDecl] a() +# 100| getElement(4): [ReturnStmt] return ... +# 100| getResult(): [DeclRefExpr] a() +# 85| getCapture(0): [CapturedDecl] y +# 103| getElement(3): [PatternBindingDecl] var ... = ... +# 103| getInit(0): [CallExpr] call to f() +# 103| getFunction(): [DeclRefExpr] f() +# 103| getPattern(0): [NamedPattern] a +# 103| getElement(4): [ConcreteVarDecl] a +# 103| Type = () -> Void +# 104| getElement(5): [CallExpr] call to ... +# 104| getFunction(): [DeclRefExpr] a +# 105| getElement(6): [ReturnStmt] return ... +# 105| getResult(): [DeclRefExpr] y +# 105| getResult().getFullyConverted(): [LoadExpr] (Int) ... +# 105| [Comment] // 58341 +# 105| +# 108| [ConcreteFuncDecl] sharedCapture() +# 108| InterfaceType = () -> Int +# 108| getBody(): [BraceStmt] { ... } +# 109| getElement(0): [PatternBindingDecl] var ... = ... +# 109| getInit(0): [CallExpr] call to ... +# 109| getFunction(): [ClosureExpr] { ... } +# 109| getBody(): [BraceStmt] { ... } +# 110| getElement(0): [PatternBindingDecl] var ... = ... +# 110| getInit(0): [IntegerLiteralExpr] 0 +# 110| getPattern(0): [NamedPattern] x +# 110| getElement(1): [ConcreteVarDecl] x +# 110| Type = Int +# 111| getElement(2): [ReturnStmt] return ... +# 111| getResult(): [TupleExpr] (...) +# 111| getElement(0): [ClosureExpr] { ... } +# 111| getBody(): [BraceStmt] { ... } +# 111| getElement(0): [ReturnStmt] return ... +# 111| getResult(): [BinaryExpr] ... .+=(_:_:) ... +# 111| getFunction(): [MethodLookupExpr] .+=(_:_:) +# 111| getBase(): [TypeExpr] Int.Type +# 111| getTypeRepr(): [TypeRepr] Int +# 111| getMethodRef(): [DeclRefExpr] +=(_:_:) +# 111| getArgument(0): [Argument] : &... +# 111| getExpr(): [InOutExpr] &... +# 111| getSubExpr(): [DeclRefExpr] x +# 111| getArgument(1): [Argument] : 1 +# 111| getExpr(): [IntegerLiteralExpr] 1 +# 111| getCapture(0): [CapturedDecl] x +# 111| getElement(1): [ClosureExpr] { ... } +# 111| getBody(): [BraceStmt] { ... } +# 111| getElement(0): [ReturnStmt] return ... +# 111| getResult(): [DeclRefExpr] x +# 111| getResult().getFullyConverted(): [LoadExpr] (Int) ... +# 111| getCapture(0): [CapturedDecl] x +# 109| getPattern(0): [TuplePattern] (...) +# 109| getElement(0): [NamedPattern] incrX +# 109| getElement(1): [NamedPattern] getX +# 109| getElement(1): [ConcreteVarDecl] incrX +# 109| Type = () -> () +# 109| getElement(2): [ConcreteVarDecl] getX +# 109| Type = () -> Int +# 114| getElement(3): [PatternBindingDecl] var ... = ... +# 114| getInit(0): [ClosureExpr] { ... } +# 114| getBody(): [BraceStmt] { ... } +# 115| getElement(0): [CallExpr] call to ... +# 115| getFunction(): [DeclRefExpr] incrX +# 116| getElement(1): [CallExpr] call to ... +# 116| getFunction(): [DeclRefExpr] incrX +# 115| getCapture(0): [CapturedDecl] incrX +# 114| getPattern(0): [NamedPattern] doubleIncrX +# 114| getElement(4): [ConcreteVarDecl] doubleIncrX +# 114| Type = () -> () +# 119| getElement(5): [CallExpr] call to ... +# 119| getFunction(): [DeclRefExpr] doubleIncrX +# 120| getElement(6): [CallExpr] call to ... +# 120| getFunction(): [DeclRefExpr] doubleIncrX +# 121| getElement(7): [ReturnStmt] return ... +# 121| getResult(): [CallExpr] call to ... +# 121| getFunction(): [DeclRefExpr] getX +# 121| [Comment] // 4 +# 121| +# 124| [ConcreteFuncDecl] sink(_:) +# 124| InterfaceType = (Int) -> () +# 124| getParam(0): [ParamDecl] x +# 124| Type = Int +# 124| getBody(): [BraceStmt] { ... } +# 124| getElement(0): [CallExpr] call to print(_:separator:terminator:) +# 124| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 124| getArgument(0): [Argument] : [...] +# 124| getExpr(): [VarargExpansionExpr] [...] +# 124| getSubExpr(): [ArrayExpr] [...] +# 124| getElement(0): [StringLiteralExpr] sink: +# 124| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 124| getElement(1): [DeclRefExpr] x +# 124| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 124| getArgument(1): [Argument] separator: default separator +# 124| getExpr(): [DefaultArgumentExpr] default separator +# 124| getArgument(2): [Argument] terminator: default terminator +# 124| getExpr(): [DefaultArgumentExpr] default terminator +# 125| [ConcreteFuncDecl] source() +# 125| InterfaceType = () -> Int +# 125| getBody(): [BraceStmt] { ... } +# 125| getElement(0): [ReturnStmt] return ... +# 125| getResult(): [IntegerLiteralExpr] -1 +# 127| [ConcreteFuncDecl] sharedCaptureMultipleWriters() +# 127| InterfaceType = () -> () +# 127| getBody(): [BraceStmt] { ... } +# 128| getElement(0): [PatternBindingDecl] var ... = ... +# 128| getInit(0): [IntegerLiteralExpr] 123 +# 128| getPattern(0): [NamedPattern] x +# 128| getElement(1): [ConcreteVarDecl] x +# 128| Type = Int +# 130| getElement(2): [PatternBindingDecl] var ... = ... +# 130| getInit(0): [ClosureExpr] { ... } +# 130| getBody(): [BraceStmt] { ... } +# 130| getElement(0): [ReturnStmt] return ... +# 130| getResult(): [CallExpr] call to sink(_:) +# 130| getFunction(): [DeclRefExpr] sink(_:) +# 130| getArgument(0): [Argument] : x +# 130| getExpr(): [DeclRefExpr] x +# 130| getExpr().getFullyConverted(): [LoadExpr] (Int) ... +# 130| getCapture(0): [CapturedDecl] x +# 130| getPattern(0): [NamedPattern] callSink +# 130| getElement(3): [ConcreteVarDecl] callSink +# 130| Type = () -> () +# 132| getElement(4): [PatternBindingDecl] var ... = ... +# 132| getInit(0): [ClosureExpr] { ... } +# 132| getParam(0): [ParamDecl] y +# 132| Type = Int +# 132| getBody(): [BraceStmt] { ... } +# 133| getElement(0): [PatternBindingDecl] var ... = ... +# 133| getInit(0): [ClosureExpr] { ... } +# 133| getBody(): [BraceStmt] { ... } +# 133| getElement(0): [ReturnStmt] return ... +# 133| getResult(): [AssignExpr] ... = ... +# 133| getDest(): [DeclRefExpr] x +# 133| getSource(): [DeclRefExpr] y +# 133| getCapture(0): [CapturedDecl] x +# 133| getCapture(1): [CapturedDecl] y +# 133| getPattern(0): [NamedPattern] setter +# 133| getElement(1): [ConcreteVarDecl] setter +# 133| Type = () -> () +# 134| getElement(2): [ReturnStmt] return ... +# 134| getResult(): [DeclRefExpr] setter +# 133| getCapture(0): [CapturedDecl] x +# 132| getPattern(0): [NamedPattern] makeSetter +# 132| getElement(5): [ConcreteVarDecl] makeSetter +# 132| Type = (Int) -> () -> () +# 137| getElement(6): [PatternBindingDecl] var ... = ... +# 137| getInit(0): [CallExpr] call to ... +# 137| getFunction(): [DeclRefExpr] makeSetter +# 137| getArgument(0): [Argument] : 42 +# 137| getExpr(): [IntegerLiteralExpr] 42 +# 137| getPattern(0): [NamedPattern] goodSetter +# 137| getElement(7): [ConcreteVarDecl] goodSetter +# 137| Type = () -> () +# 138| getElement(8): [PatternBindingDecl] var ... = ... +# 138| getInit(0): [CallExpr] call to ... +# 138| getFunction(): [DeclRefExpr] makeSetter +# 138| getArgument(0): [Argument] : call to source() +# 138| getExpr(): [CallExpr] call to source() +# 138| getFunction(): [DeclRefExpr] source() +# 138| getPattern(0): [NamedPattern] badSetter +# 138| getElement(9): [ConcreteVarDecl] badSetter +# 138| Type = () -> () +# 140| getElement(10): [CallExpr] call to ... +# 140| getFunction(): [DeclRefExpr] goodSetter +# 141| getElement(11): [CallExpr] call to ... +# 141| getFunction(): [DeclRefExpr] callSink +# 143| getElement(12): [CallExpr] call to ... +# 143| getFunction(): [DeclRefExpr] badSetter +# 144| getElement(13): [CallExpr] call to ... +# 144| getFunction(): [DeclRefExpr] callSink +# 147| [ConcreteFuncDecl] reentrant() +# 147| InterfaceType = () -> Int +# 147| getBody(): [BraceStmt] { ... } +# 149| getElement(0): [ConcreteFuncDecl] f(_:) +# 149| InterfaceType = (Int) -> (Int) -> Int +# 149| getParam(0): [ParamDecl] x +# 149| Type = Int +# 149| getBody(): [BraceStmt] { ... } +# 150| getElement(0): [IfStmt] if ... then { ... } +# 150| getCondition(): [StmtCondition] StmtCondition +# 150| getElement(0): [ConditionElement] ... .==(_:_:) ... +# 150| getBoolean(): [BinaryExpr] ... .==(_:_:) ... +# 150| getFunction(): [MethodLookupExpr] .==(_:_:) +# 150| getBase(): [TypeExpr] Int.Type +# 150| getTypeRepr(): [TypeRepr] Int +# 150| getMethodRef(): [DeclRefExpr] ==(_:_:) +# 150| getArgument(0): [Argument] : x +# 150| getExpr(): [DeclRefExpr] x +# 150| getArgument(1): [Argument] : 0 +# 150| getExpr(): [IntegerLiteralExpr] 0 +# 150| getThen(): [BraceStmt] { ... } +# 151| getElement(0): [ReturnStmt] return ... +# 151| getResult(): [ClosureExpr] { ... } +# 151| getParam(0): [ParamDecl] _ +# 151| Type = Int +# 151| getBody(): [BraceStmt] { ... } +# 151| getElement(0): [ReturnStmt] return ... +# 151| getResult(): [DeclRefExpr] x +# 151| getCapture(0): [CapturedDecl] x +# 154| getElement(1): [PatternBindingDecl] var ... = ... +# 154| getInit(0): [CallExpr] call to g(_:) +# 154| getFunction(): [DeclRefExpr] g(_:) +# 154| getArgument(0): [Argument] : ... .-(_:_:) ... +# 154| getExpr(): [BinaryExpr] ... .-(_:_:) ... +# 154| getFunction(): [MethodLookupExpr] .-(_:_:) +# 154| getBase(): [TypeExpr] Int.Type +# 154| getTypeRepr(): [TypeRepr] Int +# 154| getMethodRef(): [DeclRefExpr] -(_:_:) +# 154| getArgument(0): [Argument] : x +# 154| getExpr(): [DeclRefExpr] x +# 154| getArgument(1): [Argument] : 1 +# 154| getExpr(): [IntegerLiteralExpr] 1 +# 154| getPattern(0): [NamedPattern] next +# 154| getElement(2): [ConcreteVarDecl] next +# 154| Type = (Int) -> Int +# 155| getElement(3): [ReturnStmt] return ... +# 155| getResult(): [ClosureExpr] { ... } +# 155| getParam(0): [ParamDecl] k +# 155| Type = Int +# 155| getBody(): [BraceStmt] { ... } +# 155| getElement(0): [ReturnStmt] return ... +# 155| getResult(): [BinaryExpr] ... .+(_:_:) ... +# 155| getFunction(): [MethodLookupExpr] .+(_:_:) +# 155| getBase(): [TypeExpr] Int.Type +# 155| getTypeRepr(): [TypeRepr] Int +# 155| getMethodRef(): [DeclRefExpr] +(_:_:) +# 155| getArgument(0): [Argument] : ... .*(_:_:) ... +# 155| getExpr(): [BinaryExpr] ... .*(_:_:) ... +# 155| getFunction(): [MethodLookupExpr] .*(_:_:) +# 155| getBase(): [TypeExpr] Int.Type +# 155| getTypeRepr(): [TypeRepr] Int +# 155| getMethodRef(): [DeclRefExpr] *(_:_:) +# 155| getArgument(0): [Argument] : k +# 155| getExpr(): [DeclRefExpr] k +# 155| getArgument(1): [Argument] : call to ... +# 155| getExpr(): [CallExpr] call to ... +# 155| getFunction(): [DeclRefExpr] next +# 155| getArgument(0): [Argument] : ... .*(_:_:) ... +# 155| getExpr(): [BinaryExpr] ... .*(_:_:) ... +# 155| getFunction(): [MethodLookupExpr] .*(_:_:) +# 155| getBase(): [TypeExpr] Int.Type +# 155| getTypeRepr(): [TypeRepr] Int +# 155| getMethodRef(): [DeclRefExpr] *(_:_:) +# 155| getArgument(0): [Argument] : 10 +# 155| getExpr(): [IntegerLiteralExpr] 10 +# 155| getArgument(1): [Argument] : k +# 155| getExpr(): [DeclRefExpr] k +# 155| getArgument(1): [Argument] : x +# 155| getExpr(): [DeclRefExpr] x +# 155| getCapture(0): [CapturedDecl] next +# 155| getCapture(1): [CapturedDecl] x +# 154| getCapture(0): [CapturedDecl] g(_:) +# 158| getElement(1): [ConcreteFuncDecl] g(_:) +# 158| InterfaceType = (Int) -> (Int) -> Int +# 158| getParam(0): [ParamDecl] x +# 158| Type = Int +# 158| getBody(): [BraceStmt] { ... } +# 159| getElement(0): [IfStmt] if ... then { ... } +# 159| getCondition(): [StmtCondition] StmtCondition +# 159| getElement(0): [ConditionElement] ... .==(_:_:) ... +# 159| getBoolean(): [BinaryExpr] ... .==(_:_:) ... +# 159| getFunction(): [MethodLookupExpr] .==(_:_:) +# 159| getBase(): [TypeExpr] Int.Type +# 159| getTypeRepr(): [TypeRepr] Int +# 159| getMethodRef(): [DeclRefExpr] ==(_:_:) +# 159| getArgument(0): [Argument] : x +# 159| getExpr(): [DeclRefExpr] x +# 159| getArgument(1): [Argument] : 0 +# 159| getExpr(): [IntegerLiteralExpr] 0 +# 159| getThen(): [BraceStmt] { ... } +# 160| getElement(0): [ReturnStmt] return ... +# 160| getResult(): [ClosureExpr] { ... } +# 160| getParam(0): [ParamDecl] _ +# 160| Type = Int +# 160| getBody(): [BraceStmt] { ... } +# 160| getElement(0): [ReturnStmt] return ... +# 160| getResult(): [DeclRefExpr] x +# 160| getCapture(0): [CapturedDecl] x +# 163| getElement(1): [PatternBindingDecl] var ... = ... +# 163| getInit(0): [CallExpr] call to f(_:) +# 163| getFunction(): [DeclRefExpr] f(_:) +# 163| getArgument(0): [Argument] : ... .-(_:_:) ... +# 163| getExpr(): [BinaryExpr] ... .-(_:_:) ... +# 163| getFunction(): [MethodLookupExpr] .-(_:_:) +# 163| getBase(): [TypeExpr] Int.Type +# 163| getTypeRepr(): [TypeRepr] Int +# 163| getMethodRef(): [DeclRefExpr] -(_:_:) +# 163| getArgument(0): [Argument] : x +# 163| getExpr(): [DeclRefExpr] x +# 163| getArgument(1): [Argument] : 1 +# 163| getExpr(): [IntegerLiteralExpr] 1 +# 163| getPattern(0): [NamedPattern] next +# 163| getElement(2): [ConcreteVarDecl] next +# 163| Type = (Int) -> Int +# 164| getElement(3): [ReturnStmt] return ... +# 164| getResult(): [ClosureExpr] { ... } +# 164| getParam(0): [ParamDecl] k +# 164| Type = Int +# 164| getBody(): [BraceStmt] { ... } +# 164| getElement(0): [ReturnStmt] return ... +# 164| getResult(): [BinaryExpr] ... .+(_:_:) ... +# 164| getFunction(): [MethodLookupExpr] .+(_:_:) +# 164| getBase(): [TypeExpr] Int.Type +# 164| getTypeRepr(): [TypeRepr] Int +# 164| getMethodRef(): [DeclRefExpr] +(_:_:) +# 164| getArgument(0): [Argument] : ... .*(_:_:) ... +# 164| getExpr(): [BinaryExpr] ... .*(_:_:) ... +# 164| getFunction(): [MethodLookupExpr] .*(_:_:) +# 164| getBase(): [TypeExpr] Int.Type +# 164| getTypeRepr(): [TypeRepr] Int +# 164| getMethodRef(): [DeclRefExpr] *(_:_:) +# 164| getArgument(0): [Argument] : k +# 164| getExpr(): [DeclRefExpr] k +# 164| getArgument(1): [Argument] : call to ... +# 164| getExpr(): [CallExpr] call to ... +# 164| getFunction(): [DeclRefExpr] next +# 164| getArgument(0): [Argument] : ... .*(_:_:) ... +# 164| getExpr(): [BinaryExpr] ... .*(_:_:) ... +# 164| getFunction(): [MethodLookupExpr] .*(_:_:) +# 164| getBase(): [TypeExpr] Int.Type +# 164| getTypeRepr(): [TypeRepr] Int +# 164| getMethodRef(): [DeclRefExpr] *(_:_:) +# 164| getArgument(0): [Argument] : 10 +# 164| getExpr(): [IntegerLiteralExpr] 10 +# 164| getArgument(1): [Argument] : k +# 164| getExpr(): [DeclRefExpr] k +# 164| getArgument(1): [Argument] : ... .*(_:_:) ... +# 164| getExpr(): [BinaryExpr] ... .*(_:_:) ... +# 164| getFunction(): [MethodLookupExpr] .*(_:_:) +# 164| getBase(): [TypeExpr] Int.Type +# 164| getTypeRepr(): [TypeRepr] Int +# 164| getMethodRef(): [DeclRefExpr] *(_:_:) +# 164| getArgument(0): [Argument] : 2 +# 164| getExpr(): [IntegerLiteralExpr] 2 +# 164| getArgument(1): [Argument] : x +# 164| getExpr(): [DeclRefExpr] x +# 164| getCapture(0): [CapturedDecl] next +# 164| getCapture(1): [CapturedDecl] x +# 163| getCapture(0): [CapturedDecl] f(_:) +# 167| getElement(2): [PatternBindingDecl] var ... = ... +# 167| getInit(0): [CallExpr] call to f(_:) +# 167| getFunction(): [DeclRefExpr] f(_:) +# 167| getArgument(0): [Argument] : 5 +# 167| getExpr(): [IntegerLiteralExpr] 5 +# 167| getPattern(0): [NamedPattern] h +# 167| getElement(3): [ConcreteVarDecl] h +# 167| Type = (Int) -> Int +# 169| getElement(4): [PatternBindingDecl] var ... = ... +# 169| getInit(0): [CallExpr] call to ... +# 169| getFunction(): [DeclRefExpr] h +# 169| getArgument(0): [Argument] : 10 +# 169| getExpr(): [IntegerLiteralExpr] 10 +# 169| getPattern(0): [NamedPattern] y +# 169| getElement(5): [ConcreteVarDecl] y +# 169| Type = Int +# 171| getElement(6): [ReturnStmt] return ... +# 171| getResult(): [DeclRefExpr] y +# 171| [Comment] // 10004003085 +# 171| +# 174| [ConcreteFuncDecl] main() +# 174| InterfaceType = () -> () +# 174| getBody(): [BraceStmt] { ... } +# 175| getElement(0): [CallExpr] call to print(_:separator:terminator:) +# 175| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 175| getArgument(0): [Argument] : [...] +# 175| getExpr(): [VarargExpansionExpr] [...] +# 175| getSubExpr(): [ArrayExpr] [...] +# 175| getElement(0): [StringLiteralExpr] captureList(): +# 175| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 175| getArgument(1): [Argument] separator: default separator +# 175| getExpr(): [DefaultArgumentExpr] default separator +# 175| getArgument(2): [Argument] terminator: default terminator +# 175| getExpr(): [DefaultArgumentExpr] default terminator +# 176| getElement(1): [CallExpr] call to captureList() +# 176| getFunction(): [DeclRefExpr] captureList() +# 178| getElement(2): [CallExpr] call to print(_:separator:terminator:) +# 178| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 178| getArgument(0): [Argument] : [...] +# 178| getExpr(): [VarargExpansionExpr] [...] +# 178| getSubExpr(): [ArrayExpr] [...] +# 178| getElement(0): [StringLiteralExpr] callEscape(): +# 178| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 178| getArgument(1): [Argument] separator: default separator +# 178| getExpr(): [DefaultArgumentExpr] default separator +# 178| getArgument(2): [Argument] terminator: default terminator +# 178| getExpr(): [DefaultArgumentExpr] default terminator +# 179| getElement(3): [CallExpr] call to callEscape() +# 179| getFunction(): [DeclRefExpr] callEscape() +# 181| getElement(4): [CallExpr] call to print(_:separator:terminator:) +# 181| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 181| getArgument(0): [Argument] : [...] +# 181| getExpr(): [VarargExpansionExpr] [...] +# 181| getSubExpr(): [ArrayExpr] [...] +# 181| getElement(0): [StringLiteralExpr] logical(): +# 181| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 181| getElement(1): [CallExpr] call to logical() +# 181| getFunction(): [DeclRefExpr] logical() +# 181| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 181| getArgument(1): [Argument] separator: default separator +# 181| getExpr(): [DefaultArgumentExpr] default separator +# 181| getArgument(2): [Argument] terminator: default terminator +# 181| getExpr(): [DefaultArgumentExpr] default terminator +# 183| getElement(5): [CallExpr] call to print(_:separator:terminator:) +# 183| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 183| getArgument(0): [Argument] : [...] +# 183| getExpr(): [VarargExpansionExpr] [...] +# 183| getSubExpr(): [ArrayExpr] [...] +# 183| getElement(0): [StringLiteralExpr] asyncTest(): +# 183| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 183| getArgument(1): [Argument] separator: default separator +# 183| getExpr(): [DefaultArgumentExpr] default separator +# 183| getArgument(2): [Argument] terminator: default terminator +# 183| getExpr(): [DefaultArgumentExpr] default terminator +# 184| getElement(6): [CallExpr] call to asyncTest() +# 184| getFunction(): [DeclRefExpr] asyncTest() +# 186| getElement(7): [CallExpr] call to print(_:separator:terminator:) +# 186| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 186| getArgument(0): [Argument] : [...] +# 186| getExpr(): [VarargExpansionExpr] [...] +# 186| getSubExpr(): [ArrayExpr] [...] +# 186| getElement(0): [StringLiteralExpr] foo(): +# 186| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 186| getElement(1): [CallExpr] call to foo() +# 186| getFunction(): [DeclRefExpr] foo() +# 186| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 186| getArgument(1): [Argument] separator: default separator +# 186| getExpr(): [DefaultArgumentExpr] default separator +# 186| getArgument(2): [Argument] terminator: default terminator +# 186| getExpr(): [DefaultArgumentExpr] default terminator +# 188| getElement(8): [PatternBindingDecl] var ... = ... +# 188| getInit(0): [CallExpr] call to bar() +# 188| getFunction(): [DeclRefExpr] bar() +# 188| getPattern(0): [NamedPattern] a +# 188| getElement(9): [ConcreteVarDecl] a +# 188| Type = () -> Int +# 189| getElement(10): [PatternBindingDecl] var ... = ... +# 189| getInit(0): [CallExpr] call to baz() +# 189| getFunction(): [DeclRefExpr] baz() +# 189| getPattern(0): [NamedPattern] b +# 189| getElement(11): [ConcreteVarDecl] b +# 189| Type = () -> Int +# 191| getElement(12): [CallExpr] call to print(_:separator:terminator:) +# 191| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 191| getArgument(0): [Argument] : [...] +# 191| getExpr(): [VarargExpansionExpr] [...] +# 191| getSubExpr(): [ArrayExpr] [...] +# 191| getElement(0): [StringLiteralExpr] bar(): +# 191| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 191| getElement(1): [CallExpr] call to ... +# 191| getFunction(): [DeclRefExpr] a +# 191| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 191| getElement(2): [CallExpr] call to ... +# 191| getFunction(): [DeclRefExpr] a +# 191| getElement(2).getFullyConverted(): [ErasureExpr] (Any) ... +# 191| getArgument(1): [Argument] separator: default separator +# 191| getExpr(): [DefaultArgumentExpr] default separator +# 191| getArgument(2): [Argument] terminator: default terminator +# 191| getExpr(): [DefaultArgumentExpr] default terminator +# 193| getElement(13): [CallExpr] call to print(_:separator:terminator:) +# 193| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 193| getArgument(0): [Argument] : [...] +# 193| getExpr(): [VarargExpansionExpr] [...] +# 193| getSubExpr(): [ArrayExpr] [...] +# 193| getElement(0): [StringLiteralExpr] baz(): +# 193| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 193| getElement(1): [CallExpr] call to ... +# 193| getFunction(): [DeclRefExpr] b +# 193| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 193| getElement(2): [CallExpr] call to ... +# 193| getFunction(): [DeclRefExpr] b +# 193| getElement(2).getFullyConverted(): [ErasureExpr] (Any) ... +# 193| getArgument(1): [Argument] separator: default separator +# 193| getExpr(): [DefaultArgumentExpr] default separator +# 193| getArgument(2): [Argument] terminator: default terminator +# 193| getExpr(): [DefaultArgumentExpr] default terminator +# 195| getElement(14): [CallExpr] call to ... +# 195| getFunction(): [ForceValueExpr] ...! +# 195| getSubExpr(): [DeclRefExpr] g +# 195| getSubExpr().getFullyConverted(): [LoadExpr] (((Int) -> Void)?) ... +# 195| getArgument(0): [Argument] : 1 +# 195| getExpr(): [IntegerLiteralExpr] 1 +# 196| getElement(15): [CallExpr] call to print(_:separator:terminator:) +# 196| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 196| getArgument(0): [Argument] : [...] +# 196| getExpr(): [VarargExpansionExpr] [...] +# 196| getSubExpr(): [ArrayExpr] [...] +# 196| getElement(0): [StringLiteralExpr] g!(1): +# 196| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 196| getElement(1): [CallExpr] call to ... +# 196| getFunction(): [DeclRefExpr] b +# 196| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 196| getElement(2): [CallExpr] call to ... +# 196| getFunction(): [DeclRefExpr] b +# 196| getElement(2).getFullyConverted(): [ErasureExpr] (Any) ... +# 196| getArgument(1): [Argument] separator: default separator +# 196| getExpr(): [DefaultArgumentExpr] default separator +# 196| getArgument(2): [Argument] terminator: default terminator +# 196| getExpr(): [DefaultArgumentExpr] default terminator +# 198| getElement(16): [CallExpr] call to ... +# 198| getFunction(): [ForceValueExpr] ...! +# 198| getSubExpr(): [DeclRefExpr] g +# 198| getSubExpr().getFullyConverted(): [LoadExpr] (((Int) -> Void)?) ... +# 198| getArgument(0): [Argument] : 1 +# 198| getExpr(): [IntegerLiteralExpr] 1 +# 199| getElement(17): [CallExpr] call to print(_:separator:terminator:) +# 199| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 199| getArgument(0): [Argument] : [...] +# 199| getExpr(): [VarargExpansionExpr] [...] +# 199| getSubExpr(): [ArrayExpr] [...] +# 199| getElement(0): [StringLiteralExpr] g!(1): +# 199| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 199| getElement(1): [CallExpr] call to ... +# 199| getFunction(): [DeclRefExpr] b +# 199| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 199| getElement(2): [CallExpr] call to ... +# 199| getFunction(): [DeclRefExpr] b +# 199| getElement(2).getFullyConverted(): [ErasureExpr] (Any) ... +# 199| getArgument(1): [Argument] separator: default separator +# 199| getExpr(): [DefaultArgumentExpr] default separator +# 199| getArgument(2): [Argument] terminator: default terminator +# 199| getExpr(): [DefaultArgumentExpr] default terminator +# 201| getElement(18): [CallExpr] call to print(_:separator:terminator:) +# 201| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 201| getArgument(0): [Argument] : [...] +# 201| getExpr(): [VarargExpansionExpr] [...] +# 201| getSubExpr(): [ArrayExpr] [...] +# 201| getElement(0): [StringLiteralExpr] quux(): +# 201| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 201| getElement(1): [CallExpr] call to quux() +# 201| getFunction(): [DeclRefExpr] quux() +# 201| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 201| getArgument(1): [Argument] separator: default separator +# 201| getExpr(): [DefaultArgumentExpr] default separator +# 201| getArgument(2): [Argument] terminator: default terminator +# 201| getExpr(): [DefaultArgumentExpr] default terminator +# 203| getElement(19): [CallExpr] call to print(_:separator:terminator:) +# 203| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 203| getArgument(0): [Argument] : [...] +# 203| getExpr(): [VarargExpansionExpr] [...] +# 203| getSubExpr(): [ArrayExpr] [...] +# 203| getElement(0): [StringLiteralExpr] sharedCapture(): +# 203| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 203| getElement(1): [CallExpr] call to sharedCapture() +# 203| getFunction(): [DeclRefExpr] sharedCapture() +# 203| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 203| getArgument(1): [Argument] separator: default separator +# 203| getExpr(): [DefaultArgumentExpr] default separator +# 203| getArgument(2): [Argument] terminator: default terminator +# 203| getExpr(): [DefaultArgumentExpr] default terminator +# 205| getElement(20): [CallExpr] call to print(_:separator:terminator:) +# 205| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 205| getArgument(0): [Argument] : [...] +# 205| getExpr(): [VarargExpansionExpr] [...] +# 205| getSubExpr(): [ArrayExpr] [...] +# 205| getElement(0): [StringLiteralExpr] sharedCaptureMultipleWriters(): +# 205| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 205| getArgument(1): [Argument] separator: default separator +# 205| getExpr(): [DefaultArgumentExpr] default separator +# 205| getArgument(2): [Argument] terminator: default terminator +# 205| getExpr(): [DefaultArgumentExpr] default terminator +# 206| getElement(21): [CallExpr] call to sharedCaptureMultipleWriters() +# 206| getFunction(): [DeclRefExpr] sharedCaptureMultipleWriters() +# 208| getElement(22): [CallExpr] call to print(_:separator:terminator:) +# 208| getFunction(): [DeclRefExpr] print(_:separator:terminator:) +# 208| getArgument(0): [Argument] : [...] +# 208| getExpr(): [VarargExpansionExpr] [...] +# 208| getSubExpr(): [ArrayExpr] [...] +# 208| getElement(0): [StringLiteralExpr] reentrant(): +# 208| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ... +# 208| getElement(1): [CallExpr] call to reentrant() +# 208| getFunction(): [DeclRefExpr] reentrant() +# 208| getElement(1).getFullyConverted(): [ErasureExpr] (Any) ... +# 208| getArgument(1): [Argument] separator: default separator +# 208| getExpr(): [DefaultArgumentExpr] default separator +# 208| getArgument(2): [Argument] terminator: default terminator +# 208| getExpr(): [DefaultArgumentExpr] default terminator +# 195| getCapture(0): [CapturedDecl] g +# 176| [Comment] // Hello world! 123 +# 176| +# 179| [Comment] // 1 +# 179| +# 181| [Comment] // true +# 181| +# 184| [Comment] // 42 +# 184| +# 186| [Comment] // 42 +# 186| +# 191| [Comment] // 42 42 +# 191| +# 193| [Comment] // 42 42 +# 193| +# 196| [Comment] // 43 43 +# 196| +# 199| [Comment] // 44 44 +# 199| +# 201| [Comment] // 58341 +# 201| +# 203| [Comment] // 4 +# 203| +# 206| [Comment] // 42, -1 +# 206| +# 208| [Comment] // 10004003085 +# 208| +# 211| [TopLevelCodeDecl] { ... } +# 211| getBody(): [BraceStmt] { ... } +# 211| getElement(0): [CallExpr] call to main() +# 211| getFunction(): [DeclRefExpr] main() diff --git a/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/closures.swift b/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/closures.swift index 5bb030c469b..1c9e335bc01 100644 --- a/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/closures.swift +++ b/swift/ql/test/extractor-tests/generated/decl/CapturedDecl/closures.swift @@ -1,26 +1,211 @@ -func bar() -> String { +func hello() -> String { return "Hello world!" } -func foo() { +func captureList() { let y = 123 - { [x = bar()] () in + { [x = hello()] () in print(x) print(y) }() } var escape: (() -> ())? = nil -func baz() { +func setEscape() { var x = 0 - func quux() { + escape = { x += 1 print(x) } - escape = quux } func callEscape() { - baz() + setEscape() escape?() } + +func logical() -> Bool { + let f: ((Int) -> Int)? = { x in x + 1 } + let x: Int? = 42 + return f != nil + && (x != nil + && f!(x!) == 43) +} + +func asyncTest() { + func withCallback(_ callback: @escaping (Int) async -> Int) { + @Sendable + func wrapper(_ x: Int) async -> Int { + return await callback(x + 1) + } + Task { + print("asyncTest():", await wrapper(40)) + } + } + withCallback { x in + x + 1 + } +} + +func foo() -> Int { + var x = 1 // x is a non-escaping capture of f and r + let f = { y in x += y } + x += 40 + let r = { x } + f(1) + return r() // 42 +} + +func bar() -> () -> Int { + var x = 1 // x is a non-escaping capture of f, escaping capture of r + let f = { y in x += y } + x += 40 + let r = { x } + f(1) + return r // constantly 42 +} + +var g: ((Int) -> Void)? = nil +func baz() -> () -> Int { + var x = 1 // x is an escaping capture of g and r + g = { y in x += y } // closure escapes! + x += 40 + let r = { x } + g!(1) + return r +} + +func quux() -> Int { + var y = 0 + + func f() -> () -> Void { + var x = 5 + + func a() { + y = 10*y + x + x -= 1 + if x > 0 { + b() + } + } + + func b() { + y = 10*y + 2*x + x -= 1 + if x > 0 { + a() + } + } + + return a + } + + let a = f() + a() + return y // 58341 +} + +func sharedCapture() -> Int { + let (incrX, getX) = { + var x = 0 + return ({ x += 1 }, { x }) + }() + + let doubleIncrX = { + incrX() + incrX() + } + + doubleIncrX() + doubleIncrX() + return getX() // 4 +} + +func sink(_ x: Int) { print("sink:", x) } +func source() -> Int { -1 } + +func sharedCaptureMultipleWriters() { + var x = 123 + + let callSink = { sink(x) } + + let makeSetter = { y in + let setter = { x = y } + return setter + } + + let goodSetter = makeSetter(42) + let badSetter = makeSetter(source()) + + goodSetter() + callSink() + + badSetter() + callSink() +} + +func reentrant() -> Int { + + func f(_ x: Int) -> (Int) -> Int { + if x == 0 { + return { _ in x } + } + + let next = g(x - 1) + return { k in k*next(10*k) + x } + } + + func g(_ x: Int) -> (Int) -> Int { + if x == 0 { + return { _ in x } + } + + let next = f(x - 1) + return { k in k*next(10*k) + 2*x } + } + + let h = f(5) + + let y = h(10) + + return y // 10004003085 +} + +func main() { + print("captureList():") + captureList() // Hello world! 123 + + print("callEscape():") + callEscape() // 1 + + print("logical():", logical()) // true + + print("asyncTest():") + asyncTest() // 42 + + print("foo():", foo()) // 42 + + let a = bar() + let b = baz() + + print("bar():", a(), a()) // 42 42 + + print("baz():", b(), b()) // 42 42 + + g!(1) + print("g!(1):", b(), b()) // 43 43 + + g!(1) + print("g!(1):", b(), b()) // 44 44 + + print("quux():", quux()) // 58341 + + print("sharedCapture():", sharedCapture()) // 4 + + print("sharedCaptureMultipleWriters():") + sharedCaptureMultipleWriters() // 42, -1 + + print("reentrant():", reentrant()) // 10004003085 +} + +main() diff --git a/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl.expected b/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl.expected index d15568a3b6c..bd70109bed0 100644 --- a/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl.expected +++ b/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl.expected @@ -1,4 +1,4 @@ -| extensions.swift:5:1:9:1 | extension | getModule: | file://:0:0:0:0 | extensions | getNumberOfMembers: | 3 | getNumberOfGenericTypeParams: | 0 | getExtendedTypeDecl: | extensions.swift:1:1:1:11 | S | getNumberOfProtocols: | 0 | -| extensions.swift:11:1:15:1 | extension | getModule: | file://:0:0:0:0 | extensions | getNumberOfMembers: | 3 | getNumberOfGenericTypeParams: | 0 | getExtendedTypeDecl: | extensions.swift:3:1:3:10 | C | getNumberOfProtocols: | 0 | -| extensions.swift:21:1:23:1 | extension | getModule: | file://:0:0:0:0 | extensions | getNumberOfMembers: | 1 | getNumberOfGenericTypeParams: | 0 | getExtendedTypeDecl: | extensions.swift:1:1:1:11 | S | getNumberOfProtocols: | 1 | -| extensions.swift:27:1:29:1 | extension | getModule: | file://:0:0:0:0 | extensions | getNumberOfMembers: | 1 | getNumberOfGenericTypeParams: | 0 | getExtendedTypeDecl: | extensions.swift:3:1:3:10 | C | getNumberOfProtocols: | 2 | +| extensions.swift:5:1:9:1 | extension of S | getModule: | file://:0:0:0:0 | extensions | getNumberOfMembers: | 3 | getNumberOfGenericTypeParams: | 0 | getExtendedTypeDecl: | extensions.swift:1:1:1:11 | S | getNumberOfProtocols: | 0 | +| extensions.swift:11:1:15:1 | extension of C | getModule: | file://:0:0:0:0 | extensions | getNumberOfMembers: | 3 | getNumberOfGenericTypeParams: | 0 | getExtendedTypeDecl: | extensions.swift:3:1:3:10 | C | getNumberOfProtocols: | 0 | +| extensions.swift:21:1:23:1 | extension of S | getModule: | file://:0:0:0:0 | extensions | getNumberOfMembers: | 1 | getNumberOfGenericTypeParams: | 0 | getExtendedTypeDecl: | extensions.swift:1:1:1:11 | S | getNumberOfProtocols: | 1 | +| extensions.swift:27:1:29:1 | extension of C | getModule: | file://:0:0:0:0 | extensions | getNumberOfMembers: | 1 | getNumberOfGenericTypeParams: | 0 | getExtendedTypeDecl: | extensions.swift:3:1:3:10 | C | getNumberOfProtocols: | 2 | diff --git a/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl_getMember.expected b/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl_getMember.expected index 2cf6f29af52..0d89d932b42 100644 --- a/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl_getMember.expected +++ b/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl_getMember.expected @@ -1,8 +1,8 @@ -| extensions.swift:5:1:9:1 | extension | 0 | extensions.swift:6:5:6:37 | var ... = ... | -| extensions.swift:5:1:9:1 | extension | 1 | extensions.swift:6:9:6:9 | x | -| extensions.swift:5:1:9:1 | extension | 2 | extensions.swift:8:5:8:17 | foo() | -| extensions.swift:11:1:15:1 | extension | 0 | extensions.swift:12:5:12:38 | var ... = ... | -| extensions.swift:11:1:15:1 | extension | 1 | extensions.swift:12:9:12:9 | y | -| extensions.swift:11:1:15:1 | extension | 2 | extensions.swift:14:5:14:17 | bar() | -| extensions.swift:21:1:23:1 | extension | 0 | extensions.swift:22:5:22:17 | baz() | -| extensions.swift:27:1:29:1 | extension | 0 | extensions.swift:28:5:28:17 | baz() | +| extensions.swift:5:1:9:1 | extension of S | 0 | extensions.swift:6:5:6:37 | var ... = ... | +| extensions.swift:5:1:9:1 | extension of S | 1 | extensions.swift:6:9:6:9 | x | +| extensions.swift:5:1:9:1 | extension of S | 2 | extensions.swift:8:5:8:17 | foo() | +| extensions.swift:11:1:15:1 | extension of C | 0 | extensions.swift:12:5:12:38 | var ... = ... | +| extensions.swift:11:1:15:1 | extension of C | 1 | extensions.swift:12:9:12:9 | y | +| extensions.swift:11:1:15:1 | extension of C | 2 | extensions.swift:14:5:14:17 | bar() | +| extensions.swift:21:1:23:1 | extension of S | 0 | extensions.swift:22:5:22:17 | baz() | +| extensions.swift:27:1:29:1 | extension of C | 0 | extensions.swift:28:5:28:17 | baz() | diff --git a/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl_getProtocol.expected b/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl_getProtocol.expected index cdd2e19cc25..9a8915164b4 100644 --- a/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl_getProtocol.expected +++ b/swift/ql/test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl_getProtocol.expected @@ -1,3 +1,3 @@ -| extensions.swift:21:1:23:1 | extension | 0 | extensions.swift:17:1:19:1 | P1 | -| extensions.swift:27:1:29:1 | extension | 0 | extensions.swift:17:1:19:1 | P1 | -| extensions.swift:27:1:29:1 | extension | 1 | extensions.swift:25:1:25:14 | P2 | +| extensions.swift:21:1:23:1 | extension of S | 0 | extensions.swift:17:1:19:1 | P1 | +| extensions.swift:27:1:29:1 | extension of C | 0 | extensions.swift:17:1:19:1 | P1 | +| extensions.swift:27:1:29:1 | extension of C | 1 | extensions.swift:25:1:25:14 | P2 | diff --git a/swift/ql/test/extractor-tests/generated/type/TupleType/TupleType.expected b/swift/ql/test/extractor-tests/generated/type/TupleType/TupleType.expected index 462de128d02..5d73097ab93 100644 --- a/swift/ql/test/extractor-tests/generated/type/TupleType/TupleType.expected +++ b/swift/ql/test/extractor-tests/generated/type/TupleType/TupleType.expected @@ -1,3 +1,5 @@ +| (Builtin.IntLiteral, Builtin.IntLiteral) | getName: | (Builtin.IntLiteral, Builtin.IntLiteral) | getCanonicalType: | (Builtin.IntLiteral, Builtin.IntLiteral) | getNumberOfTypes: | 2 | +| (Builtin.IntLiteral, Builtin.IntLiteral) | getName: | (Builtin.IntLiteral, Builtin.IntLiteral) | getCanonicalType: | (Builtin.IntLiteral, Builtin.IntLiteral) | getNumberOfTypes: | 2 | | (Int, Int, Int, Int, Int) | getName: | (Int, Int, Int, Int, Int) | getCanonicalType: | (Int, Int, Int, Int, Int) | getNumberOfTypes: | 5 | | (Int, String, Double) | getName: | (Int, String, Double) | getCanonicalType: | (Int, String, Double) | getNumberOfTypes: | 3 | | (Int, s: String, Double) | getName: | (Int, s: String, Double) | getCanonicalType: | (Int, s: String, Double) | getNumberOfTypes: | 3 | diff --git a/swift/ql/test/extractor-tests/generated/type/TupleType/TupleType_getType.expected b/swift/ql/test/extractor-tests/generated/type/TupleType/TupleType_getType.expected index 70bea6c2aa4..926411dedfa 100644 --- a/swift/ql/test/extractor-tests/generated/type/TupleType/TupleType_getType.expected +++ b/swift/ql/test/extractor-tests/generated/type/TupleType/TupleType_getType.expected @@ -1,3 +1,7 @@ +| (Builtin.IntLiteral, Builtin.IntLiteral) | 0 | Builtin.IntLiteral | +| (Builtin.IntLiteral, Builtin.IntLiteral) | 0 | Builtin.IntLiteral | +| (Builtin.IntLiteral, Builtin.IntLiteral) | 1 | Builtin.IntLiteral | +| (Builtin.IntLiteral, Builtin.IntLiteral) | 1 | Builtin.IntLiteral | | (Int, Int, Int, Int, Int) | 0 | Int | | (Int, Int, Int, Int, Int) | 1 | Int | | (Int, Int, Int, Int, Int) | 2 | Int | diff --git a/swift/ql/test/extractor-tests/generated/type/TupleType/tuples_builtin.swift b/swift/ql/test/extractor-tests/generated/type/TupleType/tuples_builtin.swift new file mode 100644 index 00000000000..1b5bb888c5f --- /dev/null +++ b/swift/ql/test/extractor-tests/generated/type/TupleType/tuples_builtin.swift @@ -0,0 +1,2 @@ +//codeql-extractor-options: -parse-stdlib +func f(x : (Builtin.IntLiteral, Builtin.IntLiteral)) {} diff --git a/swift/ql/test/library-tests/ast/PrintAst.expected b/swift/ql/test/library-tests/ast/PrintAst.expected index 162c9e60c4c..a8bf92c277c 100644 --- a/swift/ql/test/library-tests/ast/PrintAst.expected +++ b/swift/ql/test/library-tests/ast/PrintAst.expected @@ -4134,7 +4134,7 @@ declarations.swift: # 90| # 95| [Comment] // Or by adding an access declaration # 95| -# 138| [ExtensionDecl] extension +# 138| [ExtensionDecl] extension of Int # 139| getMember(0): [ConcreteFuncDecl] id() # 139| InterfaceType = (Int) -> () -> Int # 139| getSelfParam(): [ParamDecl] self diff --git a/swift/ql/test/library-tests/controlflow/graph/Cfg.expected b/swift/ql/test/library-tests/controlflow/graph/Cfg.expected index ae67debf690..b62245dbe2a 100644 --- a/swift/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/swift/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -53,6 +53,9 @@ cfg.swift: # 17| exit mightThrow(x:) +# 17| exit mightThrow(x:) (abnormal) +#-----| -> exit mightThrow(x:) + # 17| exit mightThrow(x:) (normal) #-----| -> exit mightThrow(x:) @@ -85,7 +88,7 @@ cfg.swift: #-----| -> ... .>=(_:_:) ... # 19| throw ... -#-----| exception -> exit mightThrow(x:) (normal) +#-----| exception -> exit mightThrow(x:) (abnormal) # 19| MyError.Type #-----| -> (Error) ... @@ -119,7 +122,7 @@ cfg.swift: #-----| -> ... .<=(_:_:) ... # 22| throw ... -#-----| exception -> exit mightThrow(x:) (normal) +#-----| exception -> exit mightThrow(x:) (abnormal) # 22| MyError.Type #-----| -> .+(_:_:) @@ -1724,6 +1727,9 @@ cfg.swift: # 181| exit m1(x:) +# 181| exit m1(x:) (abnormal) +#-----| -> exit m1(x:) + # 181| exit m1(x:) (normal) #-----| -> exit m1(x:) @@ -1790,16 +1796,16 @@ cfg.swift: #-----| true -> { ... } # 185| ... .&&(_:_:) ... -#-----| exception -> exit m1(x:) (normal) +#-----| exception -> exit m1(x:) (abnormal) #-----| false -> [false] ... .&&(_:_:) ... #-----| true -> { ... } # 185| [false] ... .&&(_:_:) ... -#-----| exception -> exit m1(x:) (normal) +#-----| exception -> exit m1(x:) (abnormal) #-----| false -> [false] ... .&&(_:_:) ... # 185| ... .&&(_:_:) ... -#-----| exception -> exit m1(x:) (normal) +#-----| exception -> exit m1(x:) (abnormal) #-----| true -> print(_:separator:terminator:) #-----| false -> print(_:separator:terminator:) @@ -1807,7 +1813,7 @@ cfg.swift: #-----| -> .<=(_:_:) # 185| [false] ... .&&(_:_:) ... -#-----| exception -> exit m1(x:) (normal) +#-----| exception -> exit m1(x:) (abnormal) #-----| false -> print(_:separator:terminator:) # 185| .<=(_:_:) @@ -2285,6 +2291,9 @@ cfg.swift: # 237| exit disjunct(b1:b2:) +# 237| exit disjunct(b1:b2:) (abnormal) +#-----| -> exit disjunct(b1:b2:) + # 237| exit disjunct(b1:b2:) (normal) #-----| -> exit disjunct(b1:b2:) @@ -2311,12 +2320,12 @@ cfg.swift: #-----| false -> { ... } # 238| ... .||(_:_:) ... -#-----| exception -> exit disjunct(b1:b2:) (normal) +#-----| exception -> exit disjunct(b1:b2:) (abnormal) #-----| false -> [false] (...) #-----| true -> [true] (...) # 238| [true] ... .||(_:_:) ... -#-----| exception -> exit disjunct(b1:b2:) (normal) +#-----| exception -> exit disjunct(b1:b2:) (abnormal) #-----| true -> [true] (...) # 238| b2 @@ -5050,6 +5059,9 @@ cfg.swift: # 383| exit doWithoutCatch(x:) +# 383| exit doWithoutCatch(x:) (abnormal) +#-----| -> exit doWithoutCatch(x:) + # 383| exit doWithoutCatch(x:) (normal) #-----| -> exit doWithoutCatch(x:) @@ -5066,7 +5078,7 @@ cfg.swift: #-----| -> 0 # 385| call to mightThrow(x:) -#-----| exception -> exit doWithoutCatch(x:) (normal) +#-----| exception -> exit doWithoutCatch(x:) (abnormal) #-----| -> try ... # 385| 0 @@ -5103,7 +5115,7 @@ cfg.swift: #-----| -> 0 # 387| call to mightThrow(x:) -#-----| exception -> exit doWithoutCatch(x:) (normal) +#-----| exception -> exit doWithoutCatch(x:) (abnormal) #-----| -> try! ... # 387| 0 @@ -5680,12 +5692,6 @@ cfg.swift: # 456| var ... = ... #-----| -> kpGet_b_x -# 456| var ... = ... -#-----| -> kpGet_b_x - -# 456| kpGet_b_x -#-----| -> kpGet_bs_0_x - # 456| kpGet_b_x #-----| -> kpGet_bs_0_x @@ -5693,193 +5699,122 @@ cfg.swift: #-----| match -> #keyPath(...) # 456| #keyPath(...) -#-----| -> var ... = ... +#-----| -> exit #keyPath(...) (normal) # 456| #keyPath(...) #-----| -> var ... = ... -#-----| -> exit #keyPath(...) (normal) # 456| enter #keyPath(...) -#-----| -> #keyPath(...) +#-----| -> KeyPathComponent # 456| exit #keyPath(...) # 456| exit #keyPath(...) (normal) #-----| -> exit #keyPath(...) -# 457| var ... = ... -#-----| -> kpGet_bs_0_x +# 456| KeyPathComponent +#-----| -> KeyPathComponent + +# 456| KeyPathComponent +#-----| -> #keyPath(...) # 457| var ... = ... #-----| -> kpGet_bs_0_x -# 457| var ... = ... -#-----| -> kpGet_bs_0_x - -# 457| kpGet_bs_0_x -#-----| -> kpGet_mayB_force_x - -# 457| kpGet_bs_0_x -#-----| -> kpGet_mayB_force_x - # 457| kpGet_bs_0_x #-----| -> kpGet_mayB_force_x # 457| kpGet_bs_0_x #-----| match -> #keyPath(...) -# 457| kpGet_bs_0_x -#-----| match -> #keyPath(...) - # 457| #keyPath(...) -#-----| -> var ... = ... - -# 457| #keyPath(...) -#-----| -> var ... = ... - -# 457| #keyPath(...) -#-----| -> var ... = ... #-----| -> exit #keyPath(...) (normal) +# 457| #keyPath(...) +#-----| -> var ... = ... + # 457| enter #keyPath(...) -#-----| -> #keyPath(...) +#-----| -> KeyPathComponent # 457| exit #keyPath(...) # 457| exit #keyPath(...) (normal) #-----| -> exit #keyPath(...) -# 458| var ... = ... -#-----| -> kpGet_mayB_force_x +# 457| KeyPathComponent +#-----| -> 0 + +# 457| KeyPathComponent +#-----| -> KeyPathComponent + +# 457| 0 +#-----| -> KeyPathComponent + +# 457| KeyPathComponent +#-----| -> #keyPath(...) # 458| var ... = ... #-----| -> kpGet_mayB_force_x -# 458| var ... = ... -#-----| -> kpGet_mayB_force_x - -# 458| var ... = ... -#-----| -> kpGet_mayB_force_x - -# 458| kpGet_mayB_force_x -#-----| -> kpGet_mayB_x - -# 458| kpGet_mayB_force_x -#-----| -> kpGet_mayB_x - -# 458| kpGet_mayB_force_x -#-----| -> kpGet_mayB_x - # 458| kpGet_mayB_force_x #-----| -> kpGet_mayB_x # 458| kpGet_mayB_force_x #-----| match -> #keyPath(...) -# 458| kpGet_mayB_force_x -#-----| match -> #keyPath(...) - -# 458| kpGet_mayB_force_x -#-----| match -> #keyPath(...) - # 458| #keyPath(...) -#-----| -> var ... = ... - -# 458| #keyPath(...) -#-----| -> var ... = ... - -# 458| #keyPath(...) -#-----| -> var ... = ... - -# 458| #keyPath(...) -#-----| -> var ... = ... #-----| -> exit #keyPath(...) (normal) +# 458| #keyPath(...) +#-----| -> var ... = ... + # 458| enter #keyPath(...) -#-----| -> #keyPath(...) +#-----| -> KeyPathComponent # 458| exit #keyPath(...) # 458| exit #keyPath(...) (normal) #-----| -> exit #keyPath(...) -# 459| var ... = ... -#-----| -> kpGet_mayB_x +# 458| KeyPathComponent +#-----| -> KeyPathComponent + +# 458| KeyPathComponent +#-----| -> KeyPathComponent + +# 458| KeyPathComponent +#-----| -> #keyPath(...) # 459| var ... = ... #-----| -> kpGet_mayB_x -# 459| var ... = ... -#-----| -> kpGet_mayB_x - -# 459| var ... = ... -#-----| -> kpGet_mayB_x - -# 459| var ... = ... -#-----| -> kpGet_mayB_x - -# 459| kpGet_mayB_x -#-----| -> apply_kpGet_b_x - -# 459| kpGet_mayB_x -#-----| -> apply_kpGet_b_x - -# 459| kpGet_mayB_x -#-----| -> apply_kpGet_b_x - -# 459| kpGet_mayB_x -#-----| -> apply_kpGet_b_x - # 459| kpGet_mayB_x #-----| -> apply_kpGet_b_x # 459| kpGet_mayB_x #-----| match -> #keyPath(...) -# 459| kpGet_mayB_x -#-----| match -> #keyPath(...) - -# 459| kpGet_mayB_x -#-----| match -> #keyPath(...) - -# 459| kpGet_mayB_x -#-----| match -> #keyPath(...) - # 459| #keyPath(...) -#-----| -> var ... = ... - -# 459| #keyPath(...) -#-----| -> var ... = ... - -# 459| #keyPath(...) -#-----| -> var ... = ... - -# 459| #keyPath(...) -#-----| -> var ... = ... - -# 459| #keyPath(...) -#-----| -> var ... = ... #-----| -> exit #keyPath(...) (normal) +# 459| #keyPath(...) +#-----| -> var ... = ... + # 459| enter #keyPath(...) -#-----| -> #keyPath(...) +#-----| -> KeyPathComponent # 459| exit #keyPath(...) # 459| exit #keyPath(...) (normal) #-----| -> exit #keyPath(...) -# 461| var ... = ... -#-----| -> apply_kpGet_b_x +# 459| KeyPathComponent +#-----| -> KeyPathComponent -# 461| var ... = ... -#-----| -> apply_kpGet_b_x +# 459| KeyPathComponent +#-----| -> KeyPathComponent -# 461| var ... = ... -#-----| -> apply_kpGet_b_x - -# 461| var ... = ... -#-----| -> apply_kpGet_b_x +# 459| KeyPathComponent # 461| var ... = ... #-----| -> apply_kpGet_b_x @@ -5887,401 +5822,81 @@ cfg.swift: # 461| apply_kpGet_b_x #-----| -> apply_kpGet_bs_0_x -# 461| apply_kpGet_b_x -#-----| -> apply_kpGet_bs_0_x - -# 461| apply_kpGet_b_x -#-----| -> apply_kpGet_bs_0_x - -# 461| apply_kpGet_b_x -#-----| -> apply_kpGet_bs_0_x - -# 461| apply_kpGet_b_x -#-----| -> apply_kpGet_bs_0_x - # 461| apply_kpGet_b_x #-----| match -> a -# 461| apply_kpGet_b_x -#-----| match -> a - -# 461| apply_kpGet_b_x -#-----| match -> a - -# 461| apply_kpGet_b_x -#-----| match -> a - -# 461| apply_kpGet_b_x -#-----| match -> a - -# 461| a -#-----| -> kpGet_b_x - -# 461| a -#-----| -> kpGet_b_x - -# 461| a -#-----| -> kpGet_b_x - -# 461| a -#-----| -> kpGet_b_x - # 461| a #-----| -> kpGet_b_x # 461| \...[...] #-----| -> var ... = ... -# 461| \...[...] -#-----| -> var ... = ... - -# 461| \...[...] -#-----| -> var ... = ... - -# 461| \...[...] -#-----| -> var ... = ... - -# 461| \...[...] -#-----| -> var ... = ... - -# 461| (WritableKeyPath) ... -#-----| -> \...[...] - -# 461| (WritableKeyPath) ... -#-----| -> \...[...] - -# 461| (WritableKeyPath) ... -#-----| -> \...[...] - -# 461| (WritableKeyPath) ... -#-----| -> \...[...] - # 461| (WritableKeyPath) ... #-----| -> \...[...] # 461| kpGet_b_x #-----| -> (WritableKeyPath) ... -# 461| kpGet_b_x -#-----| -> (WritableKeyPath) ... - -# 461| kpGet_b_x -#-----| -> (WritableKeyPath) ... - -# 461| kpGet_b_x -#-----| -> (WritableKeyPath) ... - -# 461| kpGet_b_x -#-----| -> (WritableKeyPath) ... - -# 462| var ... = ... -#-----| -> apply_kpGet_bs_0_x - -# 462| var ... = ... -#-----| -> apply_kpGet_bs_0_x - -# 462| var ... = ... -#-----| -> apply_kpGet_bs_0_x - -# 462| var ... = ... -#-----| -> apply_kpGet_bs_0_x - # 462| var ... = ... #-----| -> apply_kpGet_bs_0_x # 462| apply_kpGet_bs_0_x #-----| -> apply_kpGet_mayB_force_x -# 462| apply_kpGet_bs_0_x -#-----| -> apply_kpGet_mayB_force_x - -# 462| apply_kpGet_bs_0_x -#-----| -> apply_kpGet_mayB_force_x - -# 462| apply_kpGet_bs_0_x -#-----| -> apply_kpGet_mayB_force_x - -# 462| apply_kpGet_bs_0_x -#-----| -> apply_kpGet_mayB_force_x - # 462| apply_kpGet_bs_0_x #-----| match -> a -# 462| apply_kpGet_bs_0_x -#-----| match -> a - -# 462| apply_kpGet_bs_0_x -#-----| match -> a - -# 462| apply_kpGet_bs_0_x -#-----| match -> a - -# 462| apply_kpGet_bs_0_x -#-----| match -> a - -# 462| a -#-----| -> kpGet_bs_0_x - -# 462| a -#-----| -> kpGet_bs_0_x - -# 462| a -#-----| -> kpGet_bs_0_x - -# 462| a -#-----| -> kpGet_bs_0_x - # 462| a #-----| -> kpGet_bs_0_x # 462| \...[...] #-----| -> var ... = ... -# 462| \...[...] -#-----| -> var ... = ... - -# 462| \...[...] -#-----| -> var ... = ... - -# 462| \...[...] -#-----| -> var ... = ... - -# 462| \...[...] -#-----| -> var ... = ... - -# 462| (WritableKeyPath) ... -#-----| -> \...[...] - -# 462| (WritableKeyPath) ... -#-----| -> \...[...] - -# 462| (WritableKeyPath) ... -#-----| -> \...[...] - -# 462| (WritableKeyPath) ... -#-----| -> \...[...] - # 462| (WritableKeyPath) ... #-----| -> \...[...] # 462| kpGet_bs_0_x #-----| -> (WritableKeyPath) ... -# 462| kpGet_bs_0_x -#-----| -> (WritableKeyPath) ... - -# 462| kpGet_bs_0_x -#-----| -> (WritableKeyPath) ... - -# 462| kpGet_bs_0_x -#-----| -> (WritableKeyPath) ... - -# 462| kpGet_bs_0_x -#-----| -> (WritableKeyPath) ... - -# 463| var ... = ... -#-----| -> apply_kpGet_mayB_force_x - -# 463| var ... = ... -#-----| -> apply_kpGet_mayB_force_x - -# 463| var ... = ... -#-----| -> apply_kpGet_mayB_force_x - -# 463| var ... = ... -#-----| -> apply_kpGet_mayB_force_x - # 463| var ... = ... #-----| -> apply_kpGet_mayB_force_x # 463| apply_kpGet_mayB_force_x #-----| -> apply_kpGet_mayB_x -# 463| apply_kpGet_mayB_force_x -#-----| -> apply_kpGet_mayB_x - -# 463| apply_kpGet_mayB_force_x -#-----| -> apply_kpGet_mayB_x - -# 463| apply_kpGet_mayB_force_x -#-----| -> apply_kpGet_mayB_x - -# 463| apply_kpGet_mayB_force_x -#-----| -> apply_kpGet_mayB_x - # 463| apply_kpGet_mayB_force_x #-----| match -> a -# 463| apply_kpGet_mayB_force_x -#-----| match -> a - -# 463| apply_kpGet_mayB_force_x -#-----| match -> a - -# 463| apply_kpGet_mayB_force_x -#-----| match -> a - -# 463| apply_kpGet_mayB_force_x -#-----| match -> a - -# 463| a -#-----| -> kpGet_mayB_force_x - -# 463| a -#-----| -> kpGet_mayB_force_x - -# 463| a -#-----| -> kpGet_mayB_force_x - -# 463| a -#-----| -> kpGet_mayB_force_x - # 463| a #-----| -> kpGet_mayB_force_x # 463| \...[...] #-----| -> var ... = ... -# 463| \...[...] -#-----| -> var ... = ... - -# 463| \...[...] -#-----| -> var ... = ... - -# 463| \...[...] -#-----| -> var ... = ... - -# 463| \...[...] -#-----| -> var ... = ... - -# 463| (WritableKeyPath) ... -#-----| -> \...[...] - -# 463| (WritableKeyPath) ... -#-----| -> \...[...] - -# 463| (WritableKeyPath) ... -#-----| -> \...[...] - -# 463| (WritableKeyPath) ... -#-----| -> \...[...] - # 463| (WritableKeyPath) ... #-----| -> \...[...] # 463| kpGet_mayB_force_x #-----| -> (WritableKeyPath) ... -# 463| kpGet_mayB_force_x -#-----| -> (WritableKeyPath) ... - -# 463| kpGet_mayB_force_x -#-----| -> (WritableKeyPath) ... - -# 463| kpGet_mayB_force_x -#-----| -> (WritableKeyPath) ... - -# 463| kpGet_mayB_force_x -#-----| -> (WritableKeyPath) ... - -# 464| var ... = ... -#-----| -> apply_kpGet_mayB_x - -# 464| var ... = ... -#-----| -> apply_kpGet_mayB_x - -# 464| var ... = ... -#-----| -> apply_kpGet_mayB_x - -# 464| var ... = ... -#-----| -> apply_kpGet_mayB_x - # 464| var ... = ... #-----| -> apply_kpGet_mayB_x # 464| apply_kpGet_mayB_x #-----| -> exit test(a:) (normal) -# 464| apply_kpGet_mayB_x - -# 464| apply_kpGet_mayB_x - -# 464| apply_kpGet_mayB_x - -# 464| apply_kpGet_mayB_x - # 464| apply_kpGet_mayB_x #-----| match -> a -# 464| apply_kpGet_mayB_x -#-----| match -> a - -# 464| apply_kpGet_mayB_x -#-----| match -> a - -# 464| apply_kpGet_mayB_x -#-----| match -> a - -# 464| apply_kpGet_mayB_x -#-----| match -> a - -# 464| a -#-----| -> kpGet_mayB_x - -# 464| a -#-----| -> kpGet_mayB_x - -# 464| a -#-----| -> kpGet_mayB_x - -# 464| a -#-----| -> kpGet_mayB_x - # 464| a #-----| -> kpGet_mayB_x # 464| \...[...] #-----| -> var ... = ... -# 464| \...[...] -#-----| -> var ... = ... - -# 464| \...[...] -#-----| -> var ... = ... - -# 464| \...[...] -#-----| -> var ... = ... - -# 464| \...[...] -#-----| -> var ... = ... - # 464| (KeyPath) ... #-----| -> \...[...] -# 464| (KeyPath) ... -#-----| -> \...[...] - -# 464| (KeyPath) ... -#-----| -> \...[...] - -# 464| (KeyPath) ... -#-----| -> \...[...] - -# 464| (KeyPath) ... -#-----| -> \...[...] - -# 464| kpGet_mayB_x -#-----| -> (KeyPath) ... - -# 464| kpGet_mayB_x -#-----| -> (KeyPath) ... - -# 464| kpGet_mayB_x -#-----| -> (KeyPath) ... - -# 464| kpGet_mayB_x -#-----| -> (KeyPath) ... - # 464| kpGet_mayB_x #-----| -> (KeyPath) ... diff --git a/swift/ql/test/library-tests/controlflow/graph/consistency.expected b/swift/ql/test/library-tests/controlflow/graph/consistency.expected new file mode 100644 index 00000000000..0440ab97c1a --- /dev/null +++ b/swift/ql/test/library-tests/controlflow/graph/consistency.expected @@ -0,0 +1,24 @@ +nonUniqueSetRepresentation +breakInvariant2 +breakInvariant3 +breakInvariant4 +breakInvariant5 +multipleSuccessors +| cfg.swift:33:28:33:28 | ... is ... | no-match | cfg.swift:33:49:33:60 | call to isZero(x:) | +| cfg.swift:33:28:33:28 | ... is ... | no-match | cfg.swift:35:5:37:3 | case ... | +| cfg.swift:144:10:144:10 | =~ ... | no-match | cfg.swift:144:18:144:34 | ... .&&(_:_:) ... | +| cfg.swift:144:10:144:10 | =~ ... | no-match | cfg.swift:146:5:147:14 | case ... | +| cfg.swift:515:6:515:28 | #available | false | cfg.swift:515:42:515:46 | iOS 12 | +| cfg.swift:515:6:515:28 | #available | false | cfg.swift:519:10:519:10 | x | +| file://:0:0:0:0 | $interpolation | successor | cfg.swift:40:11:40:11 | OpaqueValueExpr | +| file://:0:0:0:0 | $interpolation | successor | cfg.swift:40:12:40:12 | .appendLiteral(_:) | +| file://:0:0:0:0 | $interpolation | successor | cfg.swift:263:10:263:10 | OpaqueValueExpr | +| file://:0:0:0:0 | $interpolation | successor | cfg.swift:263:11:263:11 | .appendLiteral(_:) | +simpleAndNormalSuccessors +deadEnd +| cfg.swift:33:49:33:60 | call to isZero(x:) | +| cfg.swift:144:18:144:34 | ... .&&(_:_:) ... | +| file://:0:0:0:0 | ... = ... | +| file://:0:0:0:0 | ... = ... | +nonUniqueSplitKind +nonUniqueListOrder diff --git a/swift/ql/test/library-tests/controlflow/graph/consistency.ql b/swift/ql/test/library-tests/controlflow/graph/consistency.ql new file mode 100644 index 00000000000..36521fa8131 --- /dev/null +++ b/swift/ql/test/library-tests/controlflow/graph/consistency.ql @@ -0,0 +1 @@ +import codeql.swift.controlflow.internal.ControlFlowGraphImplShared::Consistency diff --git a/swift/ql/test/library-tests/dataflow/dataflow/DataFlow.expected b/swift/ql/test/library-tests/dataflow/dataflow/DataFlow.expected index 0eea49ff838..54d23da4b03 100644 --- a/swift/ql/test/library-tests/dataflow/dataflow/DataFlow.expected +++ b/swift/ql/test/library-tests/dataflow/dataflow/DataFlow.expected @@ -1,623 +1,691 @@ edges -| file://:0:0:0:0 | [summary param] this in signum() : | file://:0:0:0:0 | [summary] to write: return (return) in signum() : | -| file://:0:0:0:0 | [summary param] this in signum() [some:0] : | file://:0:0:0:0 | [summary] to write: return (return) in signum() [some:0] : | -| file://:0:0:0:0 | self [a, x] : | file://:0:0:0:0 | .a [x] : | -| file://:0:0:0:0 | self [str] : | file://:0:0:0:0 | .str : | -| file://:0:0:0:0 | self [x, some:0] : | file://:0:0:0:0 | .x [some:0] : | -| file://:0:0:0:0 | self [x] : | file://:0:0:0:0 | .x : | -| file://:0:0:0:0 | value : | file://:0:0:0:0 | [post] self [x] : | -| file://:0:0:0:0 | value [some:0] : | file://:0:0:0:0 | [post] self [x, some:0] : | -| test.swift:6:19:6:26 | call to source() : | test.swift:7:15:7:15 | t1 | -| test.swift:6:19:6:26 | call to source() : | test.swift:9:15:9:15 | t1 | -| test.swift:6:19:6:26 | call to source() : | test.swift:10:15:10:15 | t2 | -| test.swift:25:20:25:27 | call to source() : | test.swift:29:18:29:21 | x : | -| test.swift:26:26:26:33 | call to source() : | test.swift:29:26:29:29 | y : | -| test.swift:29:18:29:21 | x : | test.swift:30:15:30:15 | x | -| test.swift:29:26:29:29 | y : | test.swift:31:15:31:15 | y | -| test.swift:35:12:35:19 | call to source() : | test.swift:39:15:39:29 | call to callee_source() | -| test.swift:43:19:43:26 | call to source() : | test.swift:50:15:50:15 | t | -| test.swift:53:1:56:1 | arg[return] : | test.swift:61:22:61:23 | [post] &... : | -| test.swift:54:11:54:18 | call to source() : | test.swift:53:1:56:1 | arg[return] : | -| test.swift:61:22:61:23 | [post] &... : | test.swift:62:15:62:15 | x | -| test.swift:65:16:65:28 | arg1 : | test.swift:65:1:70:1 | arg2[return] : | -| test.swift:73:18:73:25 | call to source() : | test.swift:75:21:75:22 | &... : | -| test.swift:73:18:73:25 | call to source() : | test.swift:76:15:76:15 | x | -| test.swift:75:21:75:22 | &... : | test.swift:65:16:65:28 | arg1 : | -| test.swift:75:21:75:22 | &... : | test.swift:75:31:75:32 | [post] &... : | -| test.swift:75:31:75:32 | [post] &... : | test.swift:77:15:77:15 | y | -| test.swift:80:1:82:1 | arg[return] : | test.swift:97:39:97:40 | [post] &... : | -| test.swift:81:11:81:18 | call to source() : | test.swift:80:1:82:1 | arg[return] : | -| test.swift:84:1:91:1 | arg[return] : | test.swift:104:40:104:41 | [post] &... : | -| test.swift:86:15:86:22 | call to source() : | test.swift:84:1:91:1 | arg[return] : | -| test.swift:89:15:89:22 | call to source() : | test.swift:84:1:91:1 | arg[return] : | -| test.swift:97:39:97:40 | [post] &... : | test.swift:98:19:98:19 | x | -| test.swift:104:40:104:41 | [post] &... : | test.swift:105:19:105:19 | x | -| test.swift:109:9:109:14 | arg : | test.swift:110:12:110:12 | arg : | -| test.swift:113:14:113:19 | arg : | test.swift:114:19:114:19 | arg : | -| test.swift:113:14:113:19 | arg : | test.swift:114:19:114:19 | arg : | -| test.swift:114:19:114:19 | arg : | test.swift:109:9:109:14 | arg : | -| test.swift:114:19:114:19 | arg : | test.swift:114:12:114:22 | call to ... : | -| test.swift:114:19:114:19 | arg : | test.swift:114:12:114:22 | call to ... : | -| test.swift:114:19:114:19 | arg : | test.swift:123:10:123:13 | i : | -| test.swift:118:18:118:25 | call to source() : | test.swift:119:31:119:31 | x : | -| test.swift:119:18:119:44 | call to forward(arg:lambda:) : | test.swift:120:15:120:15 | y | -| test.swift:119:31:119:31 | x : | test.swift:113:14:113:19 | arg : | -| test.swift:119:31:119:31 | x : | test.swift:119:18:119:44 | call to forward(arg:lambda:) : | -| test.swift:122:18:125:6 | call to forward(arg:lambda:) : | test.swift:126:15:126:15 | z | -| test.swift:122:31:122:38 | call to source() : | test.swift:113:14:113:19 | arg : | -| test.swift:122:31:122:38 | call to source() : | test.swift:122:18:125:6 | call to forward(arg:lambda:) : | -| test.swift:123:10:123:13 | i : | test.swift:124:16:124:16 | i : | -| test.swift:142:10:142:13 | i : | test.swift:143:16:143:16 | i : | -| test.swift:145:23:145:30 | call to source() : | test.swift:142:10:142:13 | i : | -| test.swift:145:23:145:30 | call to source() : | test.swift:145:15:145:31 | call to ... | -| test.swift:149:16:149:23 | call to source() : | test.swift:151:15:151:28 | call to ... | -| test.swift:149:16:149:23 | call to source() : | test.swift:159:16:159:29 | call to ... : | -| test.swift:154:10:154:13 | i : | test.swift:155:19:155:19 | i | -| test.swift:157:16:157:23 | call to source() : | test.swift:154:10:154:13 | i : | -| test.swift:159:16:159:29 | call to ... : | test.swift:154:10:154:13 | i : | -| test.swift:163:7:163:7 | self [x] : | file://:0:0:0:0 | self [x] : | -| test.swift:163:7:163:7 | value : | file://:0:0:0:0 | value : | -| test.swift:169:12:169:22 | value : | test.swift:170:9:170:9 | value : | -| test.swift:170:5:170:5 | [post] self [x] : | test.swift:169:3:171:3 | self[return] [x] : | -| test.swift:170:9:170:9 | value : | test.swift:163:7:163:7 | value : | -| test.swift:170:9:170:9 | value : | test.swift:170:5:170:5 | [post] self [x] : | -| test.swift:173:8:173:8 | self [x] : | test.swift:174:12:174:12 | self [x] : | -| test.swift:174:12:174:12 | self [x] : | test.swift:163:7:163:7 | self [x] : | -| test.swift:174:12:174:12 | self [x] : | test.swift:174:12:174:12 | .x : | -| test.swift:180:3:180:3 | [post] a [x] : | test.swift:181:13:181:13 | a [x] : | -| test.swift:180:9:180:16 | call to source() : | test.swift:163:7:163:7 | value : | -| test.swift:180:9:180:16 | call to source() : | test.swift:180:3:180:3 | [post] a [x] : | -| test.swift:181:13:181:13 | a [x] : | test.swift:163:7:163:7 | self [x] : | -| test.swift:181:13:181:13 | a [x] : | test.swift:181:13:181:15 | .x | -| test.swift:185:7:185:7 | self [a, x] : | file://:0:0:0:0 | self [a, x] : | -| test.swift:194:3:194:3 | [post] b [a, x] : | test.swift:195:13:195:13 | b [a, x] : | -| test.swift:194:3:194:5 | [post] getter for .a [x] : | test.swift:194:3:194:3 | [post] b [a, x] : | -| test.swift:194:11:194:18 | call to source() : | test.swift:163:7:163:7 | value : | -| test.swift:194:11:194:18 | call to source() : | test.swift:194:3:194:5 | [post] getter for .a [x] : | -| test.swift:195:13:195:13 | b [a, x] : | test.swift:185:7:185:7 | self [a, x] : | -| test.swift:195:13:195:13 | b [a, x] : | test.swift:195:13:195:15 | .a [x] : | -| test.swift:195:13:195:15 | .a [x] : | test.swift:163:7:163:7 | self [x] : | -| test.swift:195:13:195:15 | .a [x] : | test.swift:195:13:195:17 | .x | -| test.swift:200:3:200:3 | [post] a [x] : | test.swift:201:13:201:13 | a [x] : | -| test.swift:200:9:200:16 | call to source() : | test.swift:169:12:169:22 | value : | -| test.swift:200:9:200:16 | call to source() : | test.swift:200:3:200:3 | [post] a [x] : | -| test.swift:201:13:201:13 | a [x] : | test.swift:163:7:163:7 | self [x] : | -| test.swift:201:13:201:13 | a [x] : | test.swift:201:13:201:15 | .x | -| test.swift:206:3:206:3 | [post] a [x] : | test.swift:207:13:207:13 | a [x] : | -| test.swift:206:9:206:16 | call to source() : | test.swift:163:7:163:7 | value : | -| test.swift:206:9:206:16 | call to source() : | test.swift:206:3:206:3 | [post] a [x] : | -| test.swift:207:13:207:13 | a [x] : | test.swift:173:8:173:8 | self [x] : | -| test.swift:207:13:207:13 | a [x] : | test.swift:207:13:207:19 | call to get() | -| test.swift:212:3:212:3 | [post] a [x] : | test.swift:213:13:213:13 | a [x] : | -| test.swift:212:9:212:16 | call to source() : | test.swift:169:12:169:22 | value : | -| test.swift:212:9:212:16 | call to source() : | test.swift:212:3:212:3 | [post] a [x] : | -| test.swift:213:13:213:13 | a [x] : | test.swift:173:8:173:8 | self [x] : | -| test.swift:213:13:213:13 | a [x] : | test.swift:213:13:213:19 | call to get() | -| test.swift:218:3:218:3 | [post] b [a, x] : | test.swift:219:13:219:13 | b [a, x] : | -| test.swift:218:3:218:5 | [post] getter for .a [x] : | test.swift:218:3:218:3 | [post] b [a, x] : | -| test.swift:218:11:218:18 | call to source() : | test.swift:169:12:169:22 | value : | -| test.swift:218:11:218:18 | call to source() : | test.swift:218:3:218:5 | [post] getter for .a [x] : | -| test.swift:219:13:219:13 | b [a, x] : | test.swift:185:7:185:7 | self [a, x] : | -| test.swift:219:13:219:13 | b [a, x] : | test.swift:219:13:219:15 | .a [x] : | -| test.swift:219:13:219:15 | .a [x] : | test.swift:163:7:163:7 | self [x] : | -| test.swift:219:13:219:15 | .a [x] : | test.swift:219:13:219:17 | .x | -| test.swift:225:14:225:21 | call to source() : | test.swift:235:13:235:15 | .source_value | -| test.swift:225:14:225:21 | call to source() : | test.swift:238:13:238:15 | .source_value | -| test.swift:259:12:259:19 | call to source() : | test.swift:259:12:259:19 | call to source() [some:0] : | -| test.swift:259:12:259:19 | call to source() : | test.swift:263:13:263:28 | call to optionalSource() : | -| test.swift:259:12:259:19 | call to source() [some:0] : | test.swift:263:13:263:28 | call to optionalSource() [some:0] : | -| test.swift:259:12:259:19 | call to source() [some:0] : | test.swift:486:13:486:28 | call to optionalSource() [some:0] : | -| test.swift:259:12:259:19 | call to source() [some:0] : | test.swift:513:13:513:28 | call to optionalSource() [some:0] : | -| test.swift:263:13:263:28 | call to optionalSource() : | test.swift:265:15:265:15 | x | -| test.swift:263:13:263:28 | call to optionalSource() : | test.swift:267:15:267:16 | ...! | -| test.swift:263:13:263:28 | call to optionalSource() : | test.swift:271:15:271:16 | ...? : | -| test.swift:263:13:263:28 | call to optionalSource() : | test.swift:274:15:274:20 | ... ??(_:_:) ... | -| test.swift:263:13:263:28 | call to optionalSource() : | test.swift:275:15:275:27 | ... ??(_:_:) ... | -| test.swift:263:13:263:28 | call to optionalSource() : | test.swift:279:15:279:31 | ... ? ... : ... | -| test.swift:263:13:263:28 | call to optionalSource() : | test.swift:280:15:280:38 | ... ? ... : ... | -| test.swift:263:13:263:28 | call to optionalSource() : | test.swift:291:16:291:17 | ...? : | -| test.swift:263:13:263:28 | call to optionalSource() : | test.swift:303:15:303:16 | ...! : | -| test.swift:263:13:263:28 | call to optionalSource() [some:0] : | test.swift:284:8:284:12 | let ...? [some:0] : | -| test.swift:263:13:263:28 | call to optionalSource() [some:0] : | test.swift:291:16:291:17 | ...? [some:0] : | -| test.swift:263:13:263:28 | call to optionalSource() [some:0] : | test.swift:298:11:298:15 | let ...? [some:0] : | -| test.swift:263:13:263:28 | call to optionalSource() [some:0] : | test.swift:306:13:306:24 | .some(...) [some:0] : | -| test.swift:263:13:263:28 | call to optionalSource() [some:0] : | test.swift:314:10:314:21 | .some(...) [some:0] : | -| test.swift:270:15:270:22 | call to source() : | file://:0:0:0:0 | [summary param] this in signum() : | -| test.swift:270:15:270:22 | call to source() : | test.swift:270:15:270:31 | call to signum() | -| test.swift:271:15:271:16 | ...? : | file://:0:0:0:0 | [summary param] this in signum() : | -| test.swift:271:15:271:16 | ...? : | test.swift:271:15:271:25 | call to signum() : | -| test.swift:271:15:271:25 | call to signum() : | test.swift:271:15:271:25 | OptionalEvaluationExpr | -| test.swift:280:31:280:38 | call to source() : | test.swift:280:15:280:38 | ... ? ... : ... | -| test.swift:282:31:282:38 | call to source() : | test.swift:282:15:282:38 | ... ? ... : ... | -| test.swift:284:8:284:12 | let ...? [some:0] : | test.swift:284:12:284:12 | z : | -| test.swift:284:12:284:12 | z : | test.swift:285:19:285:19 | z | -| test.swift:291:8:291:12 | let ...? [some:0] : | test.swift:291:12:291:12 | z : | -| test.swift:291:12:291:12 | z : | test.swift:292:19:292:19 | z | -| test.swift:291:16:291:17 | ...? : | file://:0:0:0:0 | [summary param] this in signum() : | -| test.swift:291:16:291:17 | ...? : | test.swift:291:16:291:26 | call to signum() : | -| test.swift:291:16:291:17 | ...? [some:0] : | file://:0:0:0:0 | [summary param] this in signum() [some:0] : | -| test.swift:291:16:291:17 | ...? [some:0] : | test.swift:291:16:291:26 | call to signum() [some:0] : | -| test.swift:291:16:291:26 | call to signum() : | test.swift:291:16:291:26 | call to signum() [some:0] : | -| test.swift:291:16:291:26 | call to signum() [some:0] : | test.swift:291:8:291:12 | let ...? [some:0] : | -| test.swift:298:11:298:15 | let ...? [some:0] : | test.swift:298:15:298:15 | z1 : | -| test.swift:298:15:298:15 | z1 : | test.swift:300:15:300:15 | z1 | -| test.swift:303:15:303:16 | ...! : | file://:0:0:0:0 | [summary param] this in signum() : | -| test.swift:303:15:303:16 | ...! : | test.swift:303:15:303:25 | call to signum() | -| test.swift:306:13:306:24 | .some(...) [some:0] : | test.swift:306:23:306:23 | z : | -| test.swift:306:23:306:23 | z : | test.swift:307:19:307:19 | z | -| test.swift:314:10:314:21 | .some(...) [some:0] : | test.swift:314:20:314:20 | z : | -| test.swift:314:20:314:20 | z : | test.swift:315:19:315:19 | z | -| test.swift:331:14:331:26 | (...) [Tuple element at index 1] : | test.swift:335:15:335:15 | t1 [Tuple element at index 1] : | -| test.swift:331:18:331:25 | call to source() : | test.swift:331:14:331:26 | (...) [Tuple element at index 1] : | -| test.swift:335:15:335:15 | t1 [Tuple element at index 1] : | test.swift:335:15:335:18 | .1 | -| test.swift:343:5:343:5 | [post] t1 [Tuple element at index 0] : | test.swift:346:15:346:15 | t1 [Tuple element at index 0] : | -| test.swift:343:12:343:19 | call to source() : | test.swift:343:5:343:5 | [post] t1 [Tuple element at index 0] : | -| test.swift:346:15:346:15 | t1 [Tuple element at index 0] : | test.swift:346:15:346:18 | .0 | -| test.swift:351:14:351:45 | (...) [Tuple element at index 0] : | test.swift:353:9:353:17 | (...) [Tuple element at index 0] : | -| test.swift:351:14:351:45 | (...) [Tuple element at index 0] : | test.swift:356:15:356:15 | t1 [Tuple element at index 0] : | -| test.swift:351:14:351:45 | (...) [Tuple element at index 0] : | test.swift:360:15:360:15 | t2 [Tuple element at index 0] : | -| test.swift:351:14:351:45 | (...) [Tuple element at index 1] : | test.swift:353:9:353:17 | (...) [Tuple element at index 1] : | -| test.swift:351:14:351:45 | (...) [Tuple element at index 1] : | test.swift:357:15:357:15 | t1 [Tuple element at index 1] : | -| test.swift:351:14:351:45 | (...) [Tuple element at index 1] : | test.swift:361:15:361:15 | t2 [Tuple element at index 1] : | -| test.swift:351:18:351:25 | call to source() : | test.swift:351:14:351:45 | (...) [Tuple element at index 0] : | -| test.swift:351:31:351:38 | call to source() : | test.swift:351:14:351:45 | (...) [Tuple element at index 1] : | -| test.swift:353:9:353:17 | (...) [Tuple element at index 0] : | test.swift:353:10:353:10 | a : | -| test.swift:353:9:353:17 | (...) [Tuple element at index 1] : | test.swift:353:13:353:13 | b : | -| test.swift:353:10:353:10 | a : | test.swift:363:15:363:15 | a | -| test.swift:353:13:353:13 | b : | test.swift:364:15:364:15 | b | -| test.swift:356:15:356:15 | t1 [Tuple element at index 0] : | test.swift:356:15:356:18 | .0 | -| test.swift:357:15:357:15 | t1 [Tuple element at index 1] : | test.swift:357:15:357:18 | .1 | -| test.swift:360:15:360:15 | t2 [Tuple element at index 0] : | test.swift:360:15:360:18 | .0 | -| test.swift:361:15:361:15 | t2 [Tuple element at index 1] : | test.swift:361:15:361:18 | .1 | -| test.swift:398:9:398:27 | call to ... [mySingle:0] : | test.swift:403:10:403:25 | .mySingle(...) [mySingle:0] : | -| test.swift:398:9:398:27 | call to ... [mySingle:0] : | test.swift:412:13:412:28 | .mySingle(...) [mySingle:0] : | -| test.swift:398:19:398:26 | call to source() : | test.swift:398:9:398:27 | call to ... [mySingle:0] : | -| test.swift:403:10:403:25 | .mySingle(...) [mySingle:0] : | test.swift:403:24:403:24 | a : | -| test.swift:403:24:403:24 | a : | test.swift:404:19:404:19 | a | -| test.swift:412:13:412:28 | .mySingle(...) [mySingle:0] : | test.swift:412:27:412:27 | x : | -| test.swift:412:27:412:27 | x : | test.swift:413:19:413:19 | x | -| test.swift:420:9:420:34 | call to ... [myPair:1] : | test.swift:427:10:427:30 | .myPair(...) [myPair:1] : | -| test.swift:420:9:420:34 | call to ... [myPair:1] : | test.swift:437:13:437:33 | .myPair(...) [myPair:1] : | -| test.swift:420:9:420:34 | call to ... [myPair:1] : | test.swift:442:33:442:33 | a [myPair:1] : | -| test.swift:420:9:420:34 | call to ... [myPair:1] : | test.swift:471:13:471:13 | a [myPair:1] : | -| test.swift:420:26:420:33 | call to source() : | test.swift:420:9:420:34 | call to ... [myPair:1] : | -| test.swift:427:10:427:30 | .myPair(...) [myPair:1] : | test.swift:427:29:427:29 | b : | -| test.swift:427:29:427:29 | b : | test.swift:429:19:429:19 | b | -| test.swift:437:13:437:33 | .myPair(...) [myPair:1] : | test.swift:437:32:437:32 | y : | -| test.swift:437:32:437:32 | y : | test.swift:439:19:439:19 | y | -| test.swift:442:21:442:34 | call to ... [myCons:1, myPair:1] : | test.swift:452:14:452:38 | .myCons(...) [myCons:1, myPair:1] : | -| test.swift:442:21:442:34 | call to ... [myCons:1, myPair:1] : | test.swift:467:17:467:41 | .myCons(...) [myCons:1, myPair:1] : | -| test.swift:442:21:442:34 | call to ... [myCons:1, myPair:1] : | test.swift:471:16:471:16 | b [myCons:1, myPair:1] : | -| test.swift:442:33:442:33 | a [myPair:1] : | test.swift:442:21:442:34 | call to ... [myCons:1, myPair:1] : | -| test.swift:452:14:452:38 | .myCons(...) [myCons:1, myPair:1] : | test.swift:452:25:452:37 | .myPair(...) [myPair:1] : | -| test.swift:452:25:452:37 | .myPair(...) [myPair:1] : | test.swift:452:36:452:36 | c : | -| test.swift:452:36:452:36 | c : | test.swift:455:19:455:19 | c | -| test.swift:463:13:463:39 | .myPair(...) [myPair:0] : | test.swift:463:31:463:31 | x : | -| test.swift:463:31:463:31 | x : | test.swift:464:19:464:19 | x | -| test.swift:463:43:463:62 | call to ... [myPair:0] : | test.swift:463:13:463:39 | .myPair(...) [myPair:0] : | -| test.swift:463:51:463:58 | call to source() : | test.swift:463:43:463:62 | call to ... [myPair:0] : | -| test.swift:467:17:467:41 | .myCons(...) [myCons:1, myPair:1] : | test.swift:467:28:467:40 | .myPair(...) [myPair:1] : | -| test.swift:467:28:467:40 | .myPair(...) [myPair:1] : | test.swift:467:39:467:39 | c : | -| test.swift:467:39:467:39 | c : | test.swift:468:19:468:19 | c | -| test.swift:471:12:471:17 | (...) [Tuple element at index 0, myPair:1] : | test.swift:472:14:472:55 | (...) [Tuple element at index 0, myPair:1] : | -| test.swift:471:12:471:17 | (...) [Tuple element at index 1, myCons:1, myPair:1] : | test.swift:472:14:472:55 | (...) [Tuple element at index 1, myCons:1, myPair:1] : | -| test.swift:471:13:471:13 | a [myPair:1] : | test.swift:471:12:471:17 | (...) [Tuple element at index 0, myPair:1] : | -| test.swift:471:16:471:16 | b [myCons:1, myPair:1] : | test.swift:471:12:471:17 | (...) [Tuple element at index 1, myCons:1, myPair:1] : | -| test.swift:472:14:472:55 | (...) [Tuple element at index 0, myPair:1] : | test.swift:472:15:472:27 | .myPair(...) [myPair:1] : | -| test.swift:472:14:472:55 | (...) [Tuple element at index 1, myCons:1, myPair:1] : | test.swift:472:30:472:54 | .myCons(...) [myCons:1, myPair:1] : | -| test.swift:472:15:472:27 | .myPair(...) [myPair:1] : | test.swift:472:26:472:26 | b : | -| test.swift:472:26:472:26 | b : | test.swift:474:19:474:19 | b | -| test.swift:472:30:472:54 | .myCons(...) [myCons:1, myPair:1] : | test.swift:472:41:472:53 | .myPair(...) [myPair:1] : | -| test.swift:472:41:472:53 | .myPair(...) [myPair:1] : | test.swift:472:52:472:52 | e : | -| test.swift:472:52:472:52 | e : | test.swift:477:19:477:19 | e | -| test.swift:486:13:486:28 | call to optionalSource() [some:0] : | test.swift:488:8:488:12 | let ...? [some:0] : | -| test.swift:486:13:486:28 | call to optionalSource() [some:0] : | test.swift:493:19:493:19 | x [some:0] : | -| test.swift:488:8:488:12 | let ...? [some:0] : | test.swift:488:12:488:12 | a : | -| test.swift:488:12:488:12 | a : | test.swift:489:19:489:19 | a | -| test.swift:493:18:493:23 | (...) [Tuple element at index 0, some:0] : | test.swift:495:10:495:37 | (...) [Tuple element at index 0, some:0] : | -| test.swift:493:19:493:19 | x [some:0] : | test.swift:493:18:493:23 | (...) [Tuple element at index 0, some:0] : | -| test.swift:495:10:495:37 | (...) [Tuple element at index 0, some:0] : | test.swift:495:11:495:22 | .some(...) [some:0] : | -| test.swift:495:11:495:22 | .some(...) [some:0] : | test.swift:495:21:495:21 | a : | -| test.swift:495:21:495:21 | a : | test.swift:496:19:496:19 | a | -| test.swift:509:9:509:9 | self [x, some:0] : | file://:0:0:0:0 | self [x, some:0] : | -| test.swift:509:9:509:9 | value [some:0] : | file://:0:0:0:0 | value [some:0] : | -| test.swift:513:13:513:28 | call to optionalSource() [some:0] : | test.swift:515:12:515:12 | x [some:0] : | -| test.swift:515:5:515:5 | [post] cx [x, some:0] : | test.swift:519:20:519:20 | cx [x, some:0] : | -| test.swift:515:12:515:12 | x [some:0] : | test.swift:509:9:509:9 | value [some:0] : | -| test.swift:515:12:515:12 | x [some:0] : | test.swift:515:5:515:5 | [post] cx [x, some:0] : | -| test.swift:519:11:519:15 | let ...? [some:0] : | test.swift:519:15:519:15 | z1 : | -| test.swift:519:15:519:15 | z1 : | test.swift:520:15:520:15 | z1 | -| test.swift:519:20:519:20 | cx [x, some:0] : | test.swift:509:9:509:9 | self [x, some:0] : | -| test.swift:519:20:519:20 | cx [x, some:0] : | test.swift:519:20:519:23 | .x [some:0] : | -| test.swift:519:20:519:23 | .x [some:0] : | test.swift:519:11:519:15 | let ...? [some:0] : | -| test.swift:526:14:526:21 | call to source() : | test.swift:526:13:526:21 | call to +(_:) | -| test.swift:535:9:535:9 | self [str] : | file://:0:0:0:0 | self [str] : | -| test.swift:536:10:536:13 | s : | test.swift:537:13:537:13 | s : | -| test.swift:537:7:537:7 | [post] self [str] : | test.swift:536:5:538:5 | self[return] [str] : | -| test.swift:537:13:537:13 | s : | test.swift:537:7:537:7 | [post] self [str] : | -| test.swift:542:17:545:5 | self[return] [str] : | test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] : | -| test.swift:543:7:543:7 | [post] self [str] : | test.swift:542:17:545:5 | self[return] [str] : | -| test.swift:543:7:543:7 | [post] self [str] : | test.swift:544:17:544:17 | self [str] : | -| test.swift:543:20:543:28 | call to source3() : | test.swift:536:10:536:13 | s : | -| test.swift:543:20:543:28 | call to source3() : | test.swift:543:7:543:7 | [post] self [str] : | -| test.swift:544:17:544:17 | self [str] : | test.swift:544:17:544:17 | .str | -| test.swift:549:13:549:33 | call to MyClass.init(s:) [str] : | test.swift:535:9:535:9 | self [str] : | -| test.swift:549:13:549:33 | call to MyClass.init(s:) [str] : | test.swift:549:13:549:35 | .str | -| test.swift:549:24:549:32 | call to source3() : | test.swift:536:10:536:13 | s : | -| test.swift:549:24:549:32 | call to source3() : | test.swift:549:13:549:33 | call to MyClass.init(s:) [str] : | -| test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] : | test.swift:535:9:535:9 | self [str] : | -| test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] : | test.swift:550:13:550:43 | .str | +| file://:0:0:0:0 | [summary param] this in signum() | file://:0:0:0:0 | [summary] to write: return (return) in signum() | +| file://:0:0:0:0 | [summary param] this in signum() [some:0] | file://:0:0:0:0 | [summary] to write: return (return) in signum() [some:0] | +| file://:0:0:0:0 | self [a, x] | file://:0:0:0:0 | .a [x] | +| file://:0:0:0:0 | self [str] | file://:0:0:0:0 | .str | +| file://:0:0:0:0 | self [x, some:0] | file://:0:0:0:0 | .x [some:0] | +| file://:0:0:0:0 | self [x] | file://:0:0:0:0 | .x | +| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [x] | +| file://:0:0:0:0 | value [some:0] | file://:0:0:0:0 | [post] self [x, some:0] | +| test.swift:6:19:6:26 | call to source() | test.swift:7:15:7:15 | t1 | +| test.swift:6:19:6:26 | call to source() | test.swift:9:15:9:15 | t1 | +| test.swift:6:19:6:26 | call to source() | test.swift:10:15:10:15 | t2 | +| test.swift:25:20:25:27 | call to source() | test.swift:29:18:29:21 | x | +| test.swift:26:26:26:33 | call to source() | test.swift:29:26:29:29 | y | +| test.swift:29:18:29:21 | x | test.swift:30:15:30:15 | x | +| test.swift:29:26:29:29 | y | test.swift:31:15:31:15 | y | +| test.swift:35:12:35:19 | call to source() | test.swift:39:15:39:29 | call to callee_source() | +| test.swift:43:19:43:26 | call to source() | test.swift:50:15:50:15 | t | +| test.swift:53:1:56:1 | arg[return] | test.swift:61:22:61:23 | [post] &... | +| test.swift:54:11:54:18 | call to source() | test.swift:53:1:56:1 | arg[return] | +| test.swift:61:22:61:23 | [post] &... | test.swift:62:15:62:15 | x | +| test.swift:65:16:65:28 | arg1 | test.swift:65:1:70:1 | arg2[return] | +| test.swift:73:18:73:25 | call to source() | test.swift:75:21:75:22 | &... | +| test.swift:73:18:73:25 | call to source() | test.swift:76:15:76:15 | x | +| test.swift:75:21:75:22 | &... | test.swift:65:16:65:28 | arg1 | +| test.swift:75:21:75:22 | &... | test.swift:75:31:75:32 | [post] &... | +| test.swift:75:31:75:32 | [post] &... | test.swift:77:15:77:15 | y | +| test.swift:80:1:82:1 | arg[return] | test.swift:97:39:97:40 | [post] &... | +| test.swift:81:11:81:18 | call to source() | test.swift:80:1:82:1 | arg[return] | +| test.swift:84:1:91:1 | arg[return] | test.swift:104:40:104:41 | [post] &... | +| test.swift:86:15:86:22 | call to source() | test.swift:84:1:91:1 | arg[return] | +| test.swift:89:15:89:22 | call to source() | test.swift:84:1:91:1 | arg[return] | +| test.swift:97:39:97:40 | [post] &... | test.swift:98:19:98:19 | x | +| test.swift:104:40:104:41 | [post] &... | test.swift:105:19:105:19 | x | +| test.swift:109:9:109:14 | arg | test.swift:110:12:110:12 | arg | +| test.swift:113:14:113:19 | arg | test.swift:114:19:114:19 | arg | +| test.swift:113:14:113:19 | arg | test.swift:114:19:114:19 | arg | +| test.swift:114:19:114:19 | arg | test.swift:109:9:109:14 | arg | +| test.swift:114:19:114:19 | arg | test.swift:114:12:114:22 | call to ... | +| test.swift:114:19:114:19 | arg | test.swift:114:12:114:22 | call to ... | +| test.swift:114:19:114:19 | arg | test.swift:123:10:123:13 | i | +| test.swift:118:18:118:25 | call to source() | test.swift:119:31:119:31 | x | +| test.swift:119:18:119:44 | call to forward(arg:lambda:) | test.swift:120:15:120:15 | y | +| test.swift:119:31:119:31 | x | test.swift:113:14:113:19 | arg | +| test.swift:119:31:119:31 | x | test.swift:119:18:119:44 | call to forward(arg:lambda:) | +| test.swift:122:18:125:6 | call to forward(arg:lambda:) | test.swift:126:15:126:15 | z | +| test.swift:122:31:122:38 | call to source() | test.swift:113:14:113:19 | arg | +| test.swift:122:31:122:38 | call to source() | test.swift:122:18:125:6 | call to forward(arg:lambda:) | +| test.swift:123:10:123:13 | i | test.swift:124:16:124:16 | i | +| test.swift:142:10:142:13 | i | test.swift:143:16:143:16 | i | +| test.swift:145:23:145:30 | call to source() | test.swift:142:10:142:13 | i | +| test.swift:145:23:145:30 | call to source() | test.swift:145:15:145:31 | call to ... | +| test.swift:149:16:149:23 | call to source() | test.swift:151:15:151:28 | call to ... | +| test.swift:149:16:149:23 | call to source() | test.swift:159:16:159:29 | call to ... | +| test.swift:154:10:154:13 | i | test.swift:155:19:155:19 | i | +| test.swift:157:16:157:23 | call to source() | test.swift:154:10:154:13 | i | +| test.swift:159:16:159:29 | call to ... | test.swift:154:10:154:13 | i | +| test.swift:163:7:163:7 | self [x] | file://:0:0:0:0 | self [x] | +| test.swift:163:7:163:7 | value | file://:0:0:0:0 | value | +| test.swift:169:12:169:22 | value | test.swift:170:9:170:9 | value | +| test.swift:170:5:170:5 | [post] self [x] | test.swift:169:3:171:3 | self[return] [x] | +| test.swift:170:9:170:9 | value | test.swift:163:7:163:7 | value | +| test.swift:170:9:170:9 | value | test.swift:170:5:170:5 | [post] self [x] | +| test.swift:173:8:173:8 | self [x] | test.swift:174:12:174:12 | self [x] | +| test.swift:174:12:174:12 | self [x] | test.swift:163:7:163:7 | self [x] | +| test.swift:174:12:174:12 | self [x] | test.swift:174:12:174:12 | .x | +| test.swift:180:3:180:3 | [post] a [x] | test.swift:181:13:181:13 | a [x] | +| test.swift:180:9:180:16 | call to source() | test.swift:163:7:163:7 | value | +| test.swift:180:9:180:16 | call to source() | test.swift:180:3:180:3 | [post] a [x] | +| test.swift:181:13:181:13 | a [x] | test.swift:163:7:163:7 | self [x] | +| test.swift:181:13:181:13 | a [x] | test.swift:181:13:181:15 | .x | +| test.swift:185:7:185:7 | self [a, x] | file://:0:0:0:0 | self [a, x] | +| test.swift:194:3:194:3 | [post] b [a, x] | test.swift:195:13:195:13 | b [a, x] | +| test.swift:194:3:194:5 | [post] getter for .a [x] | test.swift:194:3:194:3 | [post] b [a, x] | +| test.swift:194:11:194:18 | call to source() | test.swift:163:7:163:7 | value | +| test.swift:194:11:194:18 | call to source() | test.swift:194:3:194:5 | [post] getter for .a [x] | +| test.swift:195:13:195:13 | b [a, x] | test.swift:185:7:185:7 | self [a, x] | +| test.swift:195:13:195:13 | b [a, x] | test.swift:195:13:195:15 | .a [x] | +| test.swift:195:13:195:15 | .a [x] | test.swift:163:7:163:7 | self [x] | +| test.swift:195:13:195:15 | .a [x] | test.swift:195:13:195:17 | .x | +| test.swift:200:3:200:3 | [post] a [x] | test.swift:201:13:201:13 | a [x] | +| test.swift:200:9:200:16 | call to source() | test.swift:169:12:169:22 | value | +| test.swift:200:9:200:16 | call to source() | test.swift:200:3:200:3 | [post] a [x] | +| test.swift:201:13:201:13 | a [x] | test.swift:163:7:163:7 | self [x] | +| test.swift:201:13:201:13 | a [x] | test.swift:201:13:201:15 | .x | +| test.swift:206:3:206:3 | [post] a [x] | test.swift:207:13:207:13 | a [x] | +| test.swift:206:9:206:16 | call to source() | test.swift:163:7:163:7 | value | +| test.swift:206:9:206:16 | call to source() | test.swift:206:3:206:3 | [post] a [x] | +| test.swift:207:13:207:13 | a [x] | test.swift:173:8:173:8 | self [x] | +| test.swift:207:13:207:13 | a [x] | test.swift:207:13:207:19 | call to get() | +| test.swift:212:3:212:3 | [post] a [x] | test.swift:213:13:213:13 | a [x] | +| test.swift:212:9:212:16 | call to source() | test.swift:169:12:169:22 | value | +| test.swift:212:9:212:16 | call to source() | test.swift:212:3:212:3 | [post] a [x] | +| test.swift:213:13:213:13 | a [x] | test.swift:173:8:173:8 | self [x] | +| test.swift:213:13:213:13 | a [x] | test.swift:213:13:213:19 | call to get() | +| test.swift:218:3:218:3 | [post] b [a, x] | test.swift:219:13:219:13 | b [a, x] | +| test.swift:218:3:218:5 | [post] getter for .a [x] | test.swift:218:3:218:3 | [post] b [a, x] | +| test.swift:218:11:218:18 | call to source() | test.swift:169:12:169:22 | value | +| test.swift:218:11:218:18 | call to source() | test.swift:218:3:218:5 | [post] getter for .a [x] | +| test.swift:219:13:219:13 | b [a, x] | test.swift:185:7:185:7 | self [a, x] | +| test.swift:219:13:219:13 | b [a, x] | test.swift:219:13:219:15 | .a [x] | +| test.swift:219:13:219:15 | .a [x] | test.swift:163:7:163:7 | self [x] | +| test.swift:219:13:219:15 | .a [x] | test.swift:219:13:219:17 | .x | +| test.swift:225:14:225:21 | call to source() | test.swift:235:13:235:15 | .source_value | +| test.swift:225:14:225:21 | call to source() | test.swift:238:13:238:15 | .source_value | +| test.swift:259:12:259:19 | call to source() | test.swift:259:12:259:19 | call to source() [some:0] | +| test.swift:259:12:259:19 | call to source() | test.swift:263:13:263:28 | call to optionalSource() | +| test.swift:259:12:259:19 | call to source() [some:0] | test.swift:263:13:263:28 | call to optionalSource() [some:0] | +| test.swift:259:12:259:19 | call to source() [some:0] | test.swift:486:13:486:28 | call to optionalSource() [some:0] | +| test.swift:259:12:259:19 | call to source() [some:0] | test.swift:513:13:513:28 | call to optionalSource() [some:0] | +| test.swift:263:13:263:28 | call to optionalSource() | test.swift:265:15:265:15 | x | +| test.swift:263:13:263:28 | call to optionalSource() | test.swift:267:15:267:16 | ...! | +| test.swift:263:13:263:28 | call to optionalSource() | test.swift:271:15:271:16 | ...? | +| test.swift:263:13:263:28 | call to optionalSource() | test.swift:274:15:274:20 | ... ??(_:_:) ... | +| test.swift:263:13:263:28 | call to optionalSource() | test.swift:275:15:275:27 | ... ??(_:_:) ... | +| test.swift:263:13:263:28 | call to optionalSource() | test.swift:279:15:279:31 | ... ? ... : ... | +| test.swift:263:13:263:28 | call to optionalSource() | test.swift:280:15:280:38 | ... ? ... : ... | +| test.swift:263:13:263:28 | call to optionalSource() | test.swift:291:16:291:17 | ...? | +| test.swift:263:13:263:28 | call to optionalSource() | test.swift:303:15:303:16 | ...! | +| test.swift:263:13:263:28 | call to optionalSource() [some:0] | test.swift:284:8:284:12 | let ...? [some:0] | +| test.swift:263:13:263:28 | call to optionalSource() [some:0] | test.swift:291:16:291:17 | ...? [some:0] | +| test.swift:263:13:263:28 | call to optionalSource() [some:0] | test.swift:298:11:298:15 | let ...? [some:0] | +| test.swift:263:13:263:28 | call to optionalSource() [some:0] | test.swift:306:13:306:24 | .some(...) [some:0] | +| test.swift:263:13:263:28 | call to optionalSource() [some:0] | test.swift:314:10:314:21 | .some(...) [some:0] | +| test.swift:270:15:270:22 | call to source() | file://:0:0:0:0 | [summary param] this in signum() | +| test.swift:270:15:270:22 | call to source() | test.swift:270:15:270:31 | call to signum() | +| test.swift:271:15:271:16 | ...? | file://:0:0:0:0 | [summary param] this in signum() | +| test.swift:271:15:271:16 | ...? | test.swift:271:15:271:25 | call to signum() | +| test.swift:271:15:271:25 | call to signum() | test.swift:271:15:271:25 | OptionalEvaluationExpr | +| test.swift:280:31:280:38 | call to source() | test.swift:280:15:280:38 | ... ? ... : ... | +| test.swift:282:31:282:38 | call to source() | test.swift:282:15:282:38 | ... ? ... : ... | +| test.swift:284:8:284:12 | let ...? [some:0] | test.swift:284:12:284:12 | z | +| test.swift:284:12:284:12 | z | test.swift:285:19:285:19 | z | +| test.swift:291:8:291:12 | let ...? [some:0] | test.swift:291:12:291:12 | z | +| test.swift:291:12:291:12 | z | test.swift:292:19:292:19 | z | +| test.swift:291:16:291:17 | ...? | file://:0:0:0:0 | [summary param] this in signum() | +| test.swift:291:16:291:17 | ...? | test.swift:291:16:291:26 | call to signum() | +| test.swift:291:16:291:17 | ...? [some:0] | file://:0:0:0:0 | [summary param] this in signum() [some:0] | +| test.swift:291:16:291:17 | ...? [some:0] | test.swift:291:16:291:26 | call to signum() [some:0] | +| test.swift:291:16:291:26 | call to signum() | test.swift:291:16:291:26 | call to signum() [some:0] | +| test.swift:291:16:291:26 | call to signum() [some:0] | test.swift:291:8:291:12 | let ...? [some:0] | +| test.swift:298:11:298:15 | let ...? [some:0] | test.swift:298:15:298:15 | z1 | +| test.swift:298:15:298:15 | z1 | test.swift:300:15:300:15 | z1 | +| test.swift:303:15:303:16 | ...! | file://:0:0:0:0 | [summary param] this in signum() | +| test.swift:303:15:303:16 | ...! | test.swift:303:15:303:25 | call to signum() | +| test.swift:306:13:306:24 | .some(...) [some:0] | test.swift:306:23:306:23 | z | +| test.swift:306:23:306:23 | z | test.swift:307:19:307:19 | z | +| test.swift:314:10:314:21 | .some(...) [some:0] | test.swift:314:20:314:20 | z | +| test.swift:314:20:314:20 | z | test.swift:315:19:315:19 | z | +| test.swift:331:14:331:26 | (...) [Tuple element at index 1] | test.swift:335:15:335:15 | t1 [Tuple element at index 1] | +| test.swift:331:18:331:25 | call to source() | test.swift:331:14:331:26 | (...) [Tuple element at index 1] | +| test.swift:335:15:335:15 | t1 [Tuple element at index 1] | test.swift:335:15:335:18 | .1 | +| test.swift:343:5:343:5 | [post] t1 [Tuple element at index 0] | test.swift:346:15:346:15 | t1 [Tuple element at index 0] | +| test.swift:343:12:343:19 | call to source() | test.swift:343:5:343:5 | [post] t1 [Tuple element at index 0] | +| test.swift:346:15:346:15 | t1 [Tuple element at index 0] | test.swift:346:15:346:18 | .0 | +| test.swift:351:14:351:45 | (...) [Tuple element at index 0] | test.swift:353:9:353:17 | (...) [Tuple element at index 0] | +| test.swift:351:14:351:45 | (...) [Tuple element at index 0] | test.swift:356:15:356:15 | t1 [Tuple element at index 0] | +| test.swift:351:14:351:45 | (...) [Tuple element at index 0] | test.swift:360:15:360:15 | t2 [Tuple element at index 0] | +| test.swift:351:14:351:45 | (...) [Tuple element at index 1] | test.swift:353:9:353:17 | (...) [Tuple element at index 1] | +| test.swift:351:14:351:45 | (...) [Tuple element at index 1] | test.swift:357:15:357:15 | t1 [Tuple element at index 1] | +| test.swift:351:14:351:45 | (...) [Tuple element at index 1] | test.swift:361:15:361:15 | t2 [Tuple element at index 1] | +| test.swift:351:18:351:25 | call to source() | test.swift:351:14:351:45 | (...) [Tuple element at index 0] | +| test.swift:351:31:351:38 | call to source() | test.swift:351:14:351:45 | (...) [Tuple element at index 1] | +| test.swift:353:9:353:17 | (...) [Tuple element at index 0] | test.swift:353:10:353:10 | a | +| test.swift:353:9:353:17 | (...) [Tuple element at index 1] | test.swift:353:13:353:13 | b | +| test.swift:353:10:353:10 | a | test.swift:363:15:363:15 | a | +| test.swift:353:13:353:13 | b | test.swift:364:15:364:15 | b | +| test.swift:356:15:356:15 | t1 [Tuple element at index 0] | test.swift:356:15:356:18 | .0 | +| test.swift:357:15:357:15 | t1 [Tuple element at index 1] | test.swift:357:15:357:18 | .1 | +| test.swift:360:15:360:15 | t2 [Tuple element at index 0] | test.swift:360:15:360:18 | .0 | +| test.swift:361:15:361:15 | t2 [Tuple element at index 1] | test.swift:361:15:361:18 | .1 | +| test.swift:398:9:398:27 | call to ... [mySingle:0] | test.swift:403:10:403:25 | .mySingle(...) [mySingle:0] | +| test.swift:398:9:398:27 | call to ... [mySingle:0] | test.swift:412:13:412:28 | .mySingle(...) [mySingle:0] | +| test.swift:398:19:398:26 | call to source() | test.swift:398:9:398:27 | call to ... [mySingle:0] | +| test.swift:403:10:403:25 | .mySingle(...) [mySingle:0] | test.swift:403:24:403:24 | a | +| test.swift:403:24:403:24 | a | test.swift:404:19:404:19 | a | +| test.swift:412:13:412:28 | .mySingle(...) [mySingle:0] | test.swift:412:27:412:27 | x | +| test.swift:412:27:412:27 | x | test.swift:413:19:413:19 | x | +| test.swift:420:9:420:34 | call to ... [myPair:1] | test.swift:427:10:427:30 | .myPair(...) [myPair:1] | +| test.swift:420:9:420:34 | call to ... [myPair:1] | test.swift:437:13:437:33 | .myPair(...) [myPair:1] | +| test.swift:420:9:420:34 | call to ... [myPair:1] | test.swift:442:33:442:33 | a [myPair:1] | +| test.swift:420:9:420:34 | call to ... [myPair:1] | test.swift:471:13:471:13 | a [myPair:1] | +| test.swift:420:26:420:33 | call to source() | test.swift:420:9:420:34 | call to ... [myPair:1] | +| test.swift:427:10:427:30 | .myPair(...) [myPair:1] | test.swift:427:29:427:29 | b | +| test.swift:427:29:427:29 | b | test.swift:429:19:429:19 | b | +| test.swift:437:13:437:33 | .myPair(...) [myPair:1] | test.swift:437:32:437:32 | y | +| test.swift:437:32:437:32 | y | test.swift:439:19:439:19 | y | +| test.swift:442:21:442:34 | call to ... [myCons:1, myPair:1] | test.swift:452:14:452:38 | .myCons(...) [myCons:1, myPair:1] | +| test.swift:442:21:442:34 | call to ... [myCons:1, myPair:1] | test.swift:467:17:467:41 | .myCons(...) [myCons:1, myPair:1] | +| test.swift:442:21:442:34 | call to ... [myCons:1, myPair:1] | test.swift:471:16:471:16 | b [myCons:1, myPair:1] | +| test.swift:442:33:442:33 | a [myPair:1] | test.swift:442:21:442:34 | call to ... [myCons:1, myPair:1] | +| test.swift:452:14:452:38 | .myCons(...) [myCons:1, myPair:1] | test.swift:452:25:452:37 | .myPair(...) [myPair:1] | +| test.swift:452:25:452:37 | .myPair(...) [myPair:1] | test.swift:452:36:452:36 | c | +| test.swift:452:36:452:36 | c | test.swift:455:19:455:19 | c | +| test.swift:463:13:463:39 | .myPair(...) [myPair:0] | test.swift:463:31:463:31 | x | +| test.swift:463:31:463:31 | x | test.swift:464:19:464:19 | x | +| test.swift:463:43:463:62 | call to ... [myPair:0] | test.swift:463:13:463:39 | .myPair(...) [myPair:0] | +| test.swift:463:51:463:58 | call to source() | test.swift:463:43:463:62 | call to ... [myPair:0] | +| test.swift:467:17:467:41 | .myCons(...) [myCons:1, myPair:1] | test.swift:467:28:467:40 | .myPair(...) [myPair:1] | +| test.swift:467:28:467:40 | .myPair(...) [myPair:1] | test.swift:467:39:467:39 | c | +| test.swift:467:39:467:39 | c | test.swift:468:19:468:19 | c | +| test.swift:471:12:471:17 | (...) [Tuple element at index 0, myPair:1] | test.swift:472:14:472:55 | (...) [Tuple element at index 0, myPair:1] | +| test.swift:471:12:471:17 | (...) [Tuple element at index 1, myCons:1, myPair:1] | test.swift:472:14:472:55 | (...) [Tuple element at index 1, myCons:1, myPair:1] | +| test.swift:471:13:471:13 | a [myPair:1] | test.swift:471:12:471:17 | (...) [Tuple element at index 0, myPair:1] | +| test.swift:471:16:471:16 | b [myCons:1, myPair:1] | test.swift:471:12:471:17 | (...) [Tuple element at index 1, myCons:1, myPair:1] | +| test.swift:472:14:472:55 | (...) [Tuple element at index 0, myPair:1] | test.swift:472:15:472:27 | .myPair(...) [myPair:1] | +| test.swift:472:14:472:55 | (...) [Tuple element at index 1, myCons:1, myPair:1] | test.swift:472:30:472:54 | .myCons(...) [myCons:1, myPair:1] | +| test.swift:472:15:472:27 | .myPair(...) [myPair:1] | test.swift:472:26:472:26 | b | +| test.swift:472:26:472:26 | b | test.swift:474:19:474:19 | b | +| test.swift:472:30:472:54 | .myCons(...) [myCons:1, myPair:1] | test.swift:472:41:472:53 | .myPair(...) [myPair:1] | +| test.swift:472:41:472:53 | .myPair(...) [myPair:1] | test.swift:472:52:472:52 | e | +| test.swift:472:52:472:52 | e | test.swift:477:19:477:19 | e | +| test.swift:486:13:486:28 | call to optionalSource() [some:0] | test.swift:488:8:488:12 | let ...? [some:0] | +| test.swift:486:13:486:28 | call to optionalSource() [some:0] | test.swift:493:19:493:19 | x [some:0] | +| test.swift:488:8:488:12 | let ...? [some:0] | test.swift:488:12:488:12 | a | +| test.swift:488:12:488:12 | a | test.swift:489:19:489:19 | a | +| test.swift:493:18:493:23 | (...) [Tuple element at index 0, some:0] | test.swift:495:10:495:37 | (...) [Tuple element at index 0, some:0] | +| test.swift:493:19:493:19 | x [some:0] | test.swift:493:18:493:23 | (...) [Tuple element at index 0, some:0] | +| test.swift:495:10:495:37 | (...) [Tuple element at index 0, some:0] | test.swift:495:11:495:22 | .some(...) [some:0] | +| test.swift:495:11:495:22 | .some(...) [some:0] | test.swift:495:21:495:21 | a | +| test.swift:495:21:495:21 | a | test.swift:496:19:496:19 | a | +| test.swift:509:9:509:9 | self [x, some:0] | file://:0:0:0:0 | self [x, some:0] | +| test.swift:509:9:509:9 | value [some:0] | file://:0:0:0:0 | value [some:0] | +| test.swift:513:13:513:28 | call to optionalSource() [some:0] | test.swift:515:12:515:12 | x [some:0] | +| test.swift:515:5:515:5 | [post] cx [x, some:0] | test.swift:519:20:519:20 | cx [x, some:0] | +| test.swift:515:12:515:12 | x [some:0] | test.swift:509:9:509:9 | value [some:0] | +| test.swift:515:12:515:12 | x [some:0] | test.swift:515:5:515:5 | [post] cx [x, some:0] | +| test.swift:519:11:519:15 | let ...? [some:0] | test.swift:519:15:519:15 | z1 | +| test.swift:519:15:519:15 | z1 | test.swift:520:15:520:15 | z1 | +| test.swift:519:20:519:20 | cx [x, some:0] | test.swift:509:9:509:9 | self [x, some:0] | +| test.swift:519:20:519:20 | cx [x, some:0] | test.swift:519:20:519:23 | .x [some:0] | +| test.swift:519:20:519:23 | .x [some:0] | test.swift:519:11:519:15 | let ...? [some:0] | +| test.swift:526:14:526:21 | call to source() | test.swift:526:13:526:21 | call to +(_:) | +| test.swift:535:9:535:9 | self [str] | file://:0:0:0:0 | self [str] | +| test.swift:536:10:536:13 | s | test.swift:537:13:537:13 | s | +| test.swift:537:7:537:7 | [post] self [str] | test.swift:536:5:538:5 | self[return] [str] | +| test.swift:537:13:537:13 | s | test.swift:537:7:537:7 | [post] self [str] | +| test.swift:542:17:545:5 | self[return] [str] | test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] | +| test.swift:543:7:543:7 | [post] self [str] | test.swift:542:17:545:5 | self[return] [str] | +| test.swift:543:7:543:7 | [post] self [str] | test.swift:544:17:544:17 | self [str] | +| test.swift:543:20:543:28 | call to source3() | test.swift:536:10:536:13 | s | +| test.swift:543:20:543:28 | call to source3() | test.swift:543:7:543:7 | [post] self [str] | +| test.swift:544:17:544:17 | self [str] | test.swift:544:17:544:17 | .str | +| test.swift:549:13:549:33 | call to MyClass.init(s:) [str] | test.swift:535:9:535:9 | self [str] | +| test.swift:549:13:549:33 | call to MyClass.init(s:) [str] | test.swift:549:13:549:35 | .str | +| test.swift:549:24:549:32 | call to source3() | test.swift:536:10:536:13 | s | +| test.swift:549:24:549:32 | call to source3() | test.swift:549:13:549:33 | call to MyClass.init(s:) [str] | +| test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] | test.swift:535:9:535:9 | self [str] | +| test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] | test.swift:550:13:550:43 | .str | +| test.swift:567:8:567:11 | x | test.swift:568:14:568:14 | x | +| test.swift:568:5:568:5 | [post] self [x] | test.swift:567:3:569:3 | self[return] [x] | +| test.swift:568:14:568:14 | x | test.swift:568:5:568:5 | [post] self [x] | +| test.swift:573:11:573:24 | call to S.init(x:) [x] | test.swift:575:13:575:13 | s [x] | +| test.swift:573:11:573:24 | call to S.init(x:) [x] | test.swift:578:13:578:13 | s [x] | +| test.swift:573:16:573:23 | call to source() | test.swift:567:8:567:11 | x | +| test.swift:573:16:573:23 | call to source() | test.swift:573:11:573:24 | call to S.init(x:) [x] | +| test.swift:574:11:574:14 | enter #keyPath(...) [x] | test.swift:574:14:574:14 | KeyPathComponent [x] | +| test.swift:574:14:574:14 | KeyPathComponent [x] | test.swift:574:11:574:14 | exit #keyPath(...) | +| test.swift:575:13:575:13 | s [x] | test.swift:574:11:574:14 | enter #keyPath(...) [x] | +| test.swift:575:13:575:13 | s [x] | test.swift:575:13:575:25 | \\...[...] | +| test.swift:577:36:577:38 | enter #keyPath(...) [x] | test.swift:577:38:577:38 | KeyPathComponent [x] | +| test.swift:577:38:577:38 | KeyPathComponent [x] | test.swift:577:36:577:38 | exit #keyPath(...) | +| test.swift:578:13:578:13 | s [x] | test.swift:577:36:577:38 | enter #keyPath(...) [x] | +| test.swift:578:13:578:13 | s [x] | test.swift:578:13:578:32 | \\...[...] | +| test.swift:584:8:584:11 | s [x] | test.swift:585:14:585:14 | s [x] | +| test.swift:585:5:585:5 | [post] self [s, x] | test.swift:584:3:586:3 | self[return] [s, x] | +| test.swift:585:14:585:14 | s [x] | test.swift:585:5:585:5 | [post] self [s, x] | +| test.swift:590:11:590:24 | call to S.init(x:) [x] | test.swift:591:18:591:18 | s [x] | +| test.swift:590:16:590:23 | call to source() | test.swift:567:8:567:11 | x | +| test.swift:590:16:590:23 | call to source() | test.swift:590:11:590:24 | call to S.init(x:) [x] | +| test.swift:591:12:591:19 | call to S2.init(s:) [s, x] | test.swift:593:13:593:13 | s2 [s, x] | +| test.swift:591:18:591:18 | s [x] | test.swift:584:8:584:11 | s [x] | +| test.swift:591:18:591:18 | s [x] | test.swift:591:12:591:19 | call to S2.init(s:) [s, x] | +| test.swift:592:11:592:17 | enter #keyPath(...) [s, x] | test.swift:592:15:592:15 | KeyPathComponent [s, x] | +| test.swift:592:15:592:15 | KeyPathComponent [s, x] | test.swift:592:17:592:17 | KeyPathComponent [x] | +| test.swift:592:17:592:17 | KeyPathComponent [x] | test.swift:592:11:592:17 | exit #keyPath(...) | +| test.swift:593:13:593:13 | s2 [s, x] | test.swift:592:11:592:17 | enter #keyPath(...) [s, x] | +| test.swift:593:13:593:13 | s2 [s, x] | test.swift:593:13:593:26 | \\...[...] | nodes -| file://:0:0:0:0 | .a [x] : | semmle.label | .a [x] : | -| file://:0:0:0:0 | .str : | semmle.label | .str : | -| file://:0:0:0:0 | .x : | semmle.label | .x : | -| file://:0:0:0:0 | .x [some:0] : | semmle.label | .x [some:0] : | -| file://:0:0:0:0 | [post] self [x, some:0] : | semmle.label | [post] self [x, some:0] : | -| file://:0:0:0:0 | [post] self [x] : | semmle.label | [post] self [x] : | -| file://:0:0:0:0 | [summary param] this in signum() : | semmle.label | [summary param] this in signum() : | -| file://:0:0:0:0 | [summary param] this in signum() [some:0] : | semmle.label | [summary param] this in signum() [some:0] : | -| file://:0:0:0:0 | [summary] to write: return (return) in signum() : | semmle.label | [summary] to write: return (return) in signum() : | -| file://:0:0:0:0 | [summary] to write: return (return) in signum() [some:0] : | semmle.label | [summary] to write: return (return) in signum() [some:0] : | -| file://:0:0:0:0 | self [a, x] : | semmle.label | self [a, x] : | -| file://:0:0:0:0 | self [str] : | semmle.label | self [str] : | -| file://:0:0:0:0 | self [x, some:0] : | semmle.label | self [x, some:0] : | -| file://:0:0:0:0 | self [x] : | semmle.label | self [x] : | -| file://:0:0:0:0 | value : | semmle.label | value : | -| file://:0:0:0:0 | value [some:0] : | semmle.label | value [some:0] : | -| test.swift:6:19:6:26 | call to source() : | semmle.label | call to source() : | +| file://:0:0:0:0 | .a [x] | semmle.label | .a [x] | +| file://:0:0:0:0 | .str | semmle.label | .str | +| file://:0:0:0:0 | .x | semmle.label | .x | +| file://:0:0:0:0 | .x [some:0] | semmle.label | .x [some:0] | +| file://:0:0:0:0 | [post] self [x, some:0] | semmle.label | [post] self [x, some:0] | +| file://:0:0:0:0 | [post] self [x] | semmle.label | [post] self [x] | +| file://:0:0:0:0 | [summary param] this in signum() | semmle.label | [summary param] this in signum() | +| file://:0:0:0:0 | [summary param] this in signum() [some:0] | semmle.label | [summary param] this in signum() [some:0] | +| file://:0:0:0:0 | [summary] to write: return (return) in signum() | semmle.label | [summary] to write: return (return) in signum() | +| file://:0:0:0:0 | [summary] to write: return (return) in signum() [some:0] | semmle.label | [summary] to write: return (return) in signum() [some:0] | +| file://:0:0:0:0 | self [a, x] | semmle.label | self [a, x] | +| file://:0:0:0:0 | self [str] | semmle.label | self [str] | +| file://:0:0:0:0 | self [x, some:0] | semmle.label | self [x, some:0] | +| file://:0:0:0:0 | self [x] | semmle.label | self [x] | +| file://:0:0:0:0 | value | semmle.label | value | +| file://:0:0:0:0 | value [some:0] | semmle.label | value [some:0] | +| test.swift:6:19:6:26 | call to source() | semmle.label | call to source() | | test.swift:7:15:7:15 | t1 | semmle.label | t1 | | test.swift:9:15:9:15 | t1 | semmle.label | t1 | | test.swift:10:15:10:15 | t2 | semmle.label | t2 | -| test.swift:25:20:25:27 | call to source() : | semmle.label | call to source() : | -| test.swift:26:26:26:33 | call to source() : | semmle.label | call to source() : | -| test.swift:29:18:29:21 | x : | semmle.label | x : | -| test.swift:29:26:29:29 | y : | semmle.label | y : | +| test.swift:25:20:25:27 | call to source() | semmle.label | call to source() | +| test.swift:26:26:26:33 | call to source() | semmle.label | call to source() | +| test.swift:29:18:29:21 | x | semmle.label | x | +| test.swift:29:26:29:29 | y | semmle.label | y | | test.swift:30:15:30:15 | x | semmle.label | x | | test.swift:31:15:31:15 | y | semmle.label | y | -| test.swift:35:12:35:19 | call to source() : | semmle.label | call to source() : | +| test.swift:35:12:35:19 | call to source() | semmle.label | call to source() | | test.swift:39:15:39:29 | call to callee_source() | semmle.label | call to callee_source() | -| test.swift:43:19:43:26 | call to source() : | semmle.label | call to source() : | +| test.swift:43:19:43:26 | call to source() | semmle.label | call to source() | | test.swift:50:15:50:15 | t | semmle.label | t | -| test.swift:53:1:56:1 | arg[return] : | semmle.label | arg[return] : | -| test.swift:54:11:54:18 | call to source() : | semmle.label | call to source() : | -| test.swift:61:22:61:23 | [post] &... : | semmle.label | [post] &... : | +| test.swift:53:1:56:1 | arg[return] | semmle.label | arg[return] | +| test.swift:54:11:54:18 | call to source() | semmle.label | call to source() | +| test.swift:61:22:61:23 | [post] &... | semmle.label | [post] &... | | test.swift:62:15:62:15 | x | semmle.label | x | -| test.swift:65:1:70:1 | arg2[return] : | semmle.label | arg2[return] : | -| test.swift:65:16:65:28 | arg1 : | semmle.label | arg1 : | -| test.swift:73:18:73:25 | call to source() : | semmle.label | call to source() : | -| test.swift:75:21:75:22 | &... : | semmle.label | &... : | -| test.swift:75:31:75:32 | [post] &... : | semmle.label | [post] &... : | +| test.swift:65:1:70:1 | arg2[return] | semmle.label | arg2[return] | +| test.swift:65:16:65:28 | arg1 | semmle.label | arg1 | +| test.swift:73:18:73:25 | call to source() | semmle.label | call to source() | +| test.swift:75:21:75:22 | &... | semmle.label | &... | +| test.swift:75:31:75:32 | [post] &... | semmle.label | [post] &... | | test.swift:76:15:76:15 | x | semmle.label | x | | test.swift:77:15:77:15 | y | semmle.label | y | -| test.swift:80:1:82:1 | arg[return] : | semmle.label | arg[return] : | -| test.swift:81:11:81:18 | call to source() : | semmle.label | call to source() : | -| test.swift:84:1:91:1 | arg[return] : | semmle.label | arg[return] : | -| test.swift:86:15:86:22 | call to source() : | semmle.label | call to source() : | -| test.swift:89:15:89:22 | call to source() : | semmle.label | call to source() : | -| test.swift:97:39:97:40 | [post] &... : | semmle.label | [post] &... : | +| test.swift:80:1:82:1 | arg[return] | semmle.label | arg[return] | +| test.swift:81:11:81:18 | call to source() | semmle.label | call to source() | +| test.swift:84:1:91:1 | arg[return] | semmle.label | arg[return] | +| test.swift:86:15:86:22 | call to source() | semmle.label | call to source() | +| test.swift:89:15:89:22 | call to source() | semmle.label | call to source() | +| test.swift:97:39:97:40 | [post] &... | semmle.label | [post] &... | | test.swift:98:19:98:19 | x | semmle.label | x | -| test.swift:104:40:104:41 | [post] &... : | semmle.label | [post] &... : | +| test.swift:104:40:104:41 | [post] &... | semmle.label | [post] &... | | test.swift:105:19:105:19 | x | semmle.label | x | -| test.swift:109:9:109:14 | arg : | semmle.label | arg : | -| test.swift:110:12:110:12 | arg : | semmle.label | arg : | -| test.swift:113:14:113:19 | arg : | semmle.label | arg : | -| test.swift:113:14:113:19 | arg : | semmle.label | arg : | -| test.swift:114:12:114:22 | call to ... : | semmle.label | call to ... : | -| test.swift:114:12:114:22 | call to ... : | semmle.label | call to ... : | -| test.swift:114:19:114:19 | arg : | semmle.label | arg : | -| test.swift:114:19:114:19 | arg : | semmle.label | arg : | -| test.swift:118:18:118:25 | call to source() : | semmle.label | call to source() : | -| test.swift:119:18:119:44 | call to forward(arg:lambda:) : | semmle.label | call to forward(arg:lambda:) : | -| test.swift:119:31:119:31 | x : | semmle.label | x : | +| test.swift:109:9:109:14 | arg | semmle.label | arg | +| test.swift:110:12:110:12 | arg | semmle.label | arg | +| test.swift:113:14:113:19 | arg | semmle.label | arg | +| test.swift:113:14:113:19 | arg | semmle.label | arg | +| test.swift:114:12:114:22 | call to ... | semmle.label | call to ... | +| test.swift:114:12:114:22 | call to ... | semmle.label | call to ... | +| test.swift:114:19:114:19 | arg | semmle.label | arg | +| test.swift:114:19:114:19 | arg | semmle.label | arg | +| test.swift:118:18:118:25 | call to source() | semmle.label | call to source() | +| test.swift:119:18:119:44 | call to forward(arg:lambda:) | semmle.label | call to forward(arg:lambda:) | +| test.swift:119:31:119:31 | x | semmle.label | x | | test.swift:120:15:120:15 | y | semmle.label | y | -| test.swift:122:18:125:6 | call to forward(arg:lambda:) : | semmle.label | call to forward(arg:lambda:) : | -| test.swift:122:31:122:38 | call to source() : | semmle.label | call to source() : | -| test.swift:123:10:123:13 | i : | semmle.label | i : | -| test.swift:124:16:124:16 | i : | semmle.label | i : | +| test.swift:122:18:125:6 | call to forward(arg:lambda:) | semmle.label | call to forward(arg:lambda:) | +| test.swift:122:31:122:38 | call to source() | semmle.label | call to source() | +| test.swift:123:10:123:13 | i | semmle.label | i | +| test.swift:124:16:124:16 | i | semmle.label | i | | test.swift:126:15:126:15 | z | semmle.label | z | | test.swift:138:19:138:26 | call to source() | semmle.label | call to source() | -| test.swift:142:10:142:13 | i : | semmle.label | i : | -| test.swift:143:16:143:16 | i : | semmle.label | i : | +| test.swift:142:10:142:13 | i | semmle.label | i | +| test.swift:143:16:143:16 | i | semmle.label | i | | test.swift:145:15:145:31 | call to ... | semmle.label | call to ... | -| test.swift:145:23:145:30 | call to source() : | semmle.label | call to source() : | -| test.swift:149:16:149:23 | call to source() : | semmle.label | call to source() : | +| test.swift:145:23:145:30 | call to source() | semmle.label | call to source() | +| test.swift:149:16:149:23 | call to source() | semmle.label | call to source() | | test.swift:151:15:151:28 | call to ... | semmle.label | call to ... | -| test.swift:154:10:154:13 | i : | semmle.label | i : | +| test.swift:154:10:154:13 | i | semmle.label | i | | test.swift:155:19:155:19 | i | semmle.label | i | -| test.swift:157:16:157:23 | call to source() : | semmle.label | call to source() : | -| test.swift:159:16:159:29 | call to ... : | semmle.label | call to ... : | -| test.swift:163:7:163:7 | self [x] : | semmle.label | self [x] : | -| test.swift:163:7:163:7 | value : | semmle.label | value : | -| test.swift:169:3:171:3 | self[return] [x] : | semmle.label | self[return] [x] : | -| test.swift:169:12:169:22 | value : | semmle.label | value : | -| test.swift:170:5:170:5 | [post] self [x] : | semmle.label | [post] self [x] : | -| test.swift:170:9:170:9 | value : | semmle.label | value : | -| test.swift:173:8:173:8 | self [x] : | semmle.label | self [x] : | -| test.swift:174:12:174:12 | .x : | semmle.label | .x : | -| test.swift:174:12:174:12 | self [x] : | semmle.label | self [x] : | -| test.swift:180:3:180:3 | [post] a [x] : | semmle.label | [post] a [x] : | -| test.swift:180:9:180:16 | call to source() : | semmle.label | call to source() : | -| test.swift:181:13:181:13 | a [x] : | semmle.label | a [x] : | +| test.swift:157:16:157:23 | call to source() | semmle.label | call to source() | +| test.swift:159:16:159:29 | call to ... | semmle.label | call to ... | +| test.swift:163:7:163:7 | self [x] | semmle.label | self [x] | +| test.swift:163:7:163:7 | value | semmle.label | value | +| test.swift:169:3:171:3 | self[return] [x] | semmle.label | self[return] [x] | +| test.swift:169:12:169:22 | value | semmle.label | value | +| test.swift:170:5:170:5 | [post] self [x] | semmle.label | [post] self [x] | +| test.swift:170:9:170:9 | value | semmle.label | value | +| test.swift:173:8:173:8 | self [x] | semmle.label | self [x] | +| test.swift:174:12:174:12 | .x | semmle.label | .x | +| test.swift:174:12:174:12 | self [x] | semmle.label | self [x] | +| test.swift:180:3:180:3 | [post] a [x] | semmle.label | [post] a [x] | +| test.swift:180:9:180:16 | call to source() | semmle.label | call to source() | +| test.swift:181:13:181:13 | a [x] | semmle.label | a [x] | | test.swift:181:13:181:15 | .x | semmle.label | .x | -| test.swift:185:7:185:7 | self [a, x] : | semmle.label | self [a, x] : | -| test.swift:194:3:194:3 | [post] b [a, x] : | semmle.label | [post] b [a, x] : | -| test.swift:194:3:194:5 | [post] getter for .a [x] : | semmle.label | [post] getter for .a [x] : | -| test.swift:194:11:194:18 | call to source() : | semmle.label | call to source() : | -| test.swift:195:13:195:13 | b [a, x] : | semmle.label | b [a, x] : | -| test.swift:195:13:195:15 | .a [x] : | semmle.label | .a [x] : | +| test.swift:185:7:185:7 | self [a, x] | semmle.label | self [a, x] | +| test.swift:194:3:194:3 | [post] b [a, x] | semmle.label | [post] b [a, x] | +| test.swift:194:3:194:5 | [post] getter for .a [x] | semmle.label | [post] getter for .a [x] | +| test.swift:194:11:194:18 | call to source() | semmle.label | call to source() | +| test.swift:195:13:195:13 | b [a, x] | semmle.label | b [a, x] | +| test.swift:195:13:195:15 | .a [x] | semmle.label | .a [x] | | test.swift:195:13:195:17 | .x | semmle.label | .x | -| test.swift:200:3:200:3 | [post] a [x] : | semmle.label | [post] a [x] : | -| test.swift:200:9:200:16 | call to source() : | semmle.label | call to source() : | -| test.swift:201:13:201:13 | a [x] : | semmle.label | a [x] : | +| test.swift:200:3:200:3 | [post] a [x] | semmle.label | [post] a [x] | +| test.swift:200:9:200:16 | call to source() | semmle.label | call to source() | +| test.swift:201:13:201:13 | a [x] | semmle.label | a [x] | | test.swift:201:13:201:15 | .x | semmle.label | .x | -| test.swift:206:3:206:3 | [post] a [x] : | semmle.label | [post] a [x] : | -| test.swift:206:9:206:16 | call to source() : | semmle.label | call to source() : | -| test.swift:207:13:207:13 | a [x] : | semmle.label | a [x] : | +| test.swift:206:3:206:3 | [post] a [x] | semmle.label | [post] a [x] | +| test.swift:206:9:206:16 | call to source() | semmle.label | call to source() | +| test.swift:207:13:207:13 | a [x] | semmle.label | a [x] | | test.swift:207:13:207:19 | call to get() | semmle.label | call to get() | -| test.swift:212:3:212:3 | [post] a [x] : | semmle.label | [post] a [x] : | -| test.swift:212:9:212:16 | call to source() : | semmle.label | call to source() : | -| test.swift:213:13:213:13 | a [x] : | semmle.label | a [x] : | +| test.swift:212:3:212:3 | [post] a [x] | semmle.label | [post] a [x] | +| test.swift:212:9:212:16 | call to source() | semmle.label | call to source() | +| test.swift:213:13:213:13 | a [x] | semmle.label | a [x] | | test.swift:213:13:213:19 | call to get() | semmle.label | call to get() | -| test.swift:218:3:218:3 | [post] b [a, x] : | semmle.label | [post] b [a, x] : | -| test.swift:218:3:218:5 | [post] getter for .a [x] : | semmle.label | [post] getter for .a [x] : | -| test.swift:218:11:218:18 | call to source() : | semmle.label | call to source() : | -| test.swift:219:13:219:13 | b [a, x] : | semmle.label | b [a, x] : | -| test.swift:219:13:219:15 | .a [x] : | semmle.label | .a [x] : | +| test.swift:218:3:218:3 | [post] b [a, x] | semmle.label | [post] b [a, x] | +| test.swift:218:3:218:5 | [post] getter for .a [x] | semmle.label | [post] getter for .a [x] | +| test.swift:218:11:218:18 | call to source() | semmle.label | call to source() | +| test.swift:219:13:219:13 | b [a, x] | semmle.label | b [a, x] | +| test.swift:219:13:219:15 | .a [x] | semmle.label | .a [x] | | test.swift:219:13:219:17 | .x | semmle.label | .x | -| test.swift:225:14:225:21 | call to source() : | semmle.label | call to source() : | +| test.swift:225:14:225:21 | call to source() | semmle.label | call to source() | | test.swift:235:13:235:15 | .source_value | semmle.label | .source_value | | test.swift:238:13:238:15 | .source_value | semmle.label | .source_value | -| test.swift:259:12:259:19 | call to source() : | semmle.label | call to source() : | -| test.swift:259:12:259:19 | call to source() [some:0] : | semmle.label | call to source() [some:0] : | -| test.swift:263:13:263:28 | call to optionalSource() : | semmle.label | call to optionalSource() : | -| test.swift:263:13:263:28 | call to optionalSource() [some:0] : | semmle.label | call to optionalSource() [some:0] : | +| test.swift:259:12:259:19 | call to source() | semmle.label | call to source() | +| test.swift:259:12:259:19 | call to source() [some:0] | semmle.label | call to source() [some:0] | +| test.swift:263:13:263:28 | call to optionalSource() | semmle.label | call to optionalSource() | +| test.swift:263:13:263:28 | call to optionalSource() [some:0] | semmle.label | call to optionalSource() [some:0] | | test.swift:265:15:265:15 | x | semmle.label | x | | test.swift:267:15:267:16 | ...! | semmle.label | ...! | -| test.swift:270:15:270:22 | call to source() : | semmle.label | call to source() : | +| test.swift:270:15:270:22 | call to source() | semmle.label | call to source() | | test.swift:270:15:270:31 | call to signum() | semmle.label | call to signum() | -| test.swift:271:15:271:16 | ...? : | semmle.label | ...? : | +| test.swift:271:15:271:16 | ...? | semmle.label | ...? | | test.swift:271:15:271:25 | OptionalEvaluationExpr | semmle.label | OptionalEvaluationExpr | -| test.swift:271:15:271:25 | call to signum() : | semmle.label | call to signum() : | +| test.swift:271:15:271:25 | call to signum() | semmle.label | call to signum() | | test.swift:274:15:274:20 | ... ??(_:_:) ... | semmle.label | ... ??(_:_:) ... | | test.swift:275:15:275:27 | ... ??(_:_:) ... | semmle.label | ... ??(_:_:) ... | | test.swift:279:15:279:31 | ... ? ... : ... | semmle.label | ... ? ... : ... | | test.swift:280:15:280:38 | ... ? ... : ... | semmle.label | ... ? ... : ... | -| test.swift:280:31:280:38 | call to source() : | semmle.label | call to source() : | +| test.swift:280:31:280:38 | call to source() | semmle.label | call to source() | | test.swift:282:15:282:38 | ... ? ... : ... | semmle.label | ... ? ... : ... | -| test.swift:282:31:282:38 | call to source() : | semmle.label | call to source() : | -| test.swift:284:8:284:12 | let ...? [some:0] : | semmle.label | let ...? [some:0] : | -| test.swift:284:12:284:12 | z : | semmle.label | z : | +| test.swift:282:31:282:38 | call to source() | semmle.label | call to source() | +| test.swift:284:8:284:12 | let ...? [some:0] | semmle.label | let ...? [some:0] | +| test.swift:284:12:284:12 | z | semmle.label | z | | test.swift:285:19:285:19 | z | semmle.label | z | -| test.swift:291:8:291:12 | let ...? [some:0] : | semmle.label | let ...? [some:0] : | -| test.swift:291:12:291:12 | z : | semmle.label | z : | -| test.swift:291:16:291:17 | ...? : | semmle.label | ...? : | -| test.swift:291:16:291:17 | ...? [some:0] : | semmle.label | ...? [some:0] : | -| test.swift:291:16:291:26 | call to signum() : | semmle.label | call to signum() : | -| test.swift:291:16:291:26 | call to signum() [some:0] : | semmle.label | call to signum() [some:0] : | +| test.swift:291:8:291:12 | let ...? [some:0] | semmle.label | let ...? [some:0] | +| test.swift:291:12:291:12 | z | semmle.label | z | +| test.swift:291:16:291:17 | ...? | semmle.label | ...? | +| test.swift:291:16:291:17 | ...? [some:0] | semmle.label | ...? [some:0] | +| test.swift:291:16:291:26 | call to signum() | semmle.label | call to signum() | +| test.swift:291:16:291:26 | call to signum() [some:0] | semmle.label | call to signum() [some:0] | | test.swift:292:19:292:19 | z | semmle.label | z | -| test.swift:298:11:298:15 | let ...? [some:0] : | semmle.label | let ...? [some:0] : | -| test.swift:298:15:298:15 | z1 : | semmle.label | z1 : | +| test.swift:298:11:298:15 | let ...? [some:0] | semmle.label | let ...? [some:0] | +| test.swift:298:15:298:15 | z1 | semmle.label | z1 | | test.swift:300:15:300:15 | z1 | semmle.label | z1 | -| test.swift:303:15:303:16 | ...! : | semmle.label | ...! : | +| test.swift:303:15:303:16 | ...! | semmle.label | ...! | | test.swift:303:15:303:25 | call to signum() | semmle.label | call to signum() | -| test.swift:306:13:306:24 | .some(...) [some:0] : | semmle.label | .some(...) [some:0] : | -| test.swift:306:23:306:23 | z : | semmle.label | z : | +| test.swift:306:13:306:24 | .some(...) [some:0] | semmle.label | .some(...) [some:0] | +| test.swift:306:23:306:23 | z | semmle.label | z | | test.swift:307:19:307:19 | z | semmle.label | z | -| test.swift:314:10:314:21 | .some(...) [some:0] : | semmle.label | .some(...) [some:0] : | -| test.swift:314:20:314:20 | z : | semmle.label | z : | +| test.swift:314:10:314:21 | .some(...) [some:0] | semmle.label | .some(...) [some:0] | +| test.swift:314:20:314:20 | z | semmle.label | z | | test.swift:315:19:315:19 | z | semmle.label | z | -| test.swift:331:14:331:26 | (...) [Tuple element at index 1] : | semmle.label | (...) [Tuple element at index 1] : | -| test.swift:331:18:331:25 | call to source() : | semmle.label | call to source() : | -| test.swift:335:15:335:15 | t1 [Tuple element at index 1] : | semmle.label | t1 [Tuple element at index 1] : | +| test.swift:331:14:331:26 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] | +| test.swift:331:18:331:25 | call to source() | semmle.label | call to source() | +| test.swift:335:15:335:15 | t1 [Tuple element at index 1] | semmle.label | t1 [Tuple element at index 1] | | test.swift:335:15:335:18 | .1 | semmle.label | .1 | -| test.swift:343:5:343:5 | [post] t1 [Tuple element at index 0] : | semmle.label | [post] t1 [Tuple element at index 0] : | -| test.swift:343:12:343:19 | call to source() : | semmle.label | call to source() : | -| test.swift:346:15:346:15 | t1 [Tuple element at index 0] : | semmle.label | t1 [Tuple element at index 0] : | +| test.swift:343:5:343:5 | [post] t1 [Tuple element at index 0] | semmle.label | [post] t1 [Tuple element at index 0] | +| test.swift:343:12:343:19 | call to source() | semmle.label | call to source() | +| test.swift:346:15:346:15 | t1 [Tuple element at index 0] | semmle.label | t1 [Tuple element at index 0] | | test.swift:346:15:346:18 | .0 | semmle.label | .0 | -| test.swift:351:14:351:45 | (...) [Tuple element at index 0] : | semmle.label | (...) [Tuple element at index 0] : | -| test.swift:351:14:351:45 | (...) [Tuple element at index 1] : | semmle.label | (...) [Tuple element at index 1] : | -| test.swift:351:18:351:25 | call to source() : | semmle.label | call to source() : | -| test.swift:351:31:351:38 | call to source() : | semmle.label | call to source() : | -| test.swift:353:9:353:17 | (...) [Tuple element at index 0] : | semmle.label | (...) [Tuple element at index 0] : | -| test.swift:353:9:353:17 | (...) [Tuple element at index 1] : | semmle.label | (...) [Tuple element at index 1] : | -| test.swift:353:10:353:10 | a : | semmle.label | a : | -| test.swift:353:13:353:13 | b : | semmle.label | b : | -| test.swift:356:15:356:15 | t1 [Tuple element at index 0] : | semmle.label | t1 [Tuple element at index 0] : | +| test.swift:351:14:351:45 | (...) [Tuple element at index 0] | semmle.label | (...) [Tuple element at index 0] | +| test.swift:351:14:351:45 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] | +| test.swift:351:18:351:25 | call to source() | semmle.label | call to source() | +| test.swift:351:31:351:38 | call to source() | semmle.label | call to source() | +| test.swift:353:9:353:17 | (...) [Tuple element at index 0] | semmle.label | (...) [Tuple element at index 0] | +| test.swift:353:9:353:17 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] | +| test.swift:353:10:353:10 | a | semmle.label | a | +| test.swift:353:13:353:13 | b | semmle.label | b | +| test.swift:356:15:356:15 | t1 [Tuple element at index 0] | semmle.label | t1 [Tuple element at index 0] | | test.swift:356:15:356:18 | .0 | semmle.label | .0 | -| test.swift:357:15:357:15 | t1 [Tuple element at index 1] : | semmle.label | t1 [Tuple element at index 1] : | +| test.swift:357:15:357:15 | t1 [Tuple element at index 1] | semmle.label | t1 [Tuple element at index 1] | | test.swift:357:15:357:18 | .1 | semmle.label | .1 | -| test.swift:360:15:360:15 | t2 [Tuple element at index 0] : | semmle.label | t2 [Tuple element at index 0] : | +| test.swift:360:15:360:15 | t2 [Tuple element at index 0] | semmle.label | t2 [Tuple element at index 0] | | test.swift:360:15:360:18 | .0 | semmle.label | .0 | -| test.swift:361:15:361:15 | t2 [Tuple element at index 1] : | semmle.label | t2 [Tuple element at index 1] : | +| test.swift:361:15:361:15 | t2 [Tuple element at index 1] | semmle.label | t2 [Tuple element at index 1] | | test.swift:361:15:361:18 | .1 | semmle.label | .1 | | test.swift:363:15:363:15 | a | semmle.label | a | | test.swift:364:15:364:15 | b | semmle.label | b | -| test.swift:398:9:398:27 | call to ... [mySingle:0] : | semmle.label | call to ... [mySingle:0] : | -| test.swift:398:19:398:26 | call to source() : | semmle.label | call to source() : | -| test.swift:403:10:403:25 | .mySingle(...) [mySingle:0] : | semmle.label | .mySingle(...) [mySingle:0] : | -| test.swift:403:24:403:24 | a : | semmle.label | a : | +| test.swift:398:9:398:27 | call to ... [mySingle:0] | semmle.label | call to ... [mySingle:0] | +| test.swift:398:19:398:26 | call to source() | semmle.label | call to source() | +| test.swift:403:10:403:25 | .mySingle(...) [mySingle:0] | semmle.label | .mySingle(...) [mySingle:0] | +| test.swift:403:24:403:24 | a | semmle.label | a | | test.swift:404:19:404:19 | a | semmle.label | a | -| test.swift:412:13:412:28 | .mySingle(...) [mySingle:0] : | semmle.label | .mySingle(...) [mySingle:0] : | -| test.swift:412:27:412:27 | x : | semmle.label | x : | +| test.swift:412:13:412:28 | .mySingle(...) [mySingle:0] | semmle.label | .mySingle(...) [mySingle:0] | +| test.swift:412:27:412:27 | x | semmle.label | x | | test.swift:413:19:413:19 | x | semmle.label | x | -| test.swift:420:9:420:34 | call to ... [myPair:1] : | semmle.label | call to ... [myPair:1] : | -| test.swift:420:26:420:33 | call to source() : | semmle.label | call to source() : | -| test.swift:427:10:427:30 | .myPair(...) [myPair:1] : | semmle.label | .myPair(...) [myPair:1] : | -| test.swift:427:29:427:29 | b : | semmle.label | b : | +| test.swift:420:9:420:34 | call to ... [myPair:1] | semmle.label | call to ... [myPair:1] | +| test.swift:420:26:420:33 | call to source() | semmle.label | call to source() | +| test.swift:427:10:427:30 | .myPair(...) [myPair:1] | semmle.label | .myPair(...) [myPair:1] | +| test.swift:427:29:427:29 | b | semmle.label | b | | test.swift:429:19:429:19 | b | semmle.label | b | -| test.swift:437:13:437:33 | .myPair(...) [myPair:1] : | semmle.label | .myPair(...) [myPair:1] : | -| test.swift:437:32:437:32 | y : | semmle.label | y : | +| test.swift:437:13:437:33 | .myPair(...) [myPair:1] | semmle.label | .myPair(...) [myPair:1] | +| test.swift:437:32:437:32 | y | semmle.label | y | | test.swift:439:19:439:19 | y | semmle.label | y | -| test.swift:442:21:442:34 | call to ... [myCons:1, myPair:1] : | semmle.label | call to ... [myCons:1, myPair:1] : | -| test.swift:442:33:442:33 | a [myPair:1] : | semmle.label | a [myPair:1] : | -| test.swift:452:14:452:38 | .myCons(...) [myCons:1, myPair:1] : | semmle.label | .myCons(...) [myCons:1, myPair:1] : | -| test.swift:452:25:452:37 | .myPair(...) [myPair:1] : | semmle.label | .myPair(...) [myPair:1] : | -| test.swift:452:36:452:36 | c : | semmle.label | c : | +| test.swift:442:21:442:34 | call to ... [myCons:1, myPair:1] | semmle.label | call to ... [myCons:1, myPair:1] | +| test.swift:442:33:442:33 | a [myPair:1] | semmle.label | a [myPair:1] | +| test.swift:452:14:452:38 | .myCons(...) [myCons:1, myPair:1] | semmle.label | .myCons(...) [myCons:1, myPair:1] | +| test.swift:452:25:452:37 | .myPair(...) [myPair:1] | semmle.label | .myPair(...) [myPair:1] | +| test.swift:452:36:452:36 | c | semmle.label | c | | test.swift:455:19:455:19 | c | semmle.label | c | -| test.swift:463:13:463:39 | .myPair(...) [myPair:0] : | semmle.label | .myPair(...) [myPair:0] : | -| test.swift:463:31:463:31 | x : | semmle.label | x : | -| test.swift:463:43:463:62 | call to ... [myPair:0] : | semmle.label | call to ... [myPair:0] : | -| test.swift:463:51:463:58 | call to source() : | semmle.label | call to source() : | +| test.swift:463:13:463:39 | .myPair(...) [myPair:0] | semmle.label | .myPair(...) [myPair:0] | +| test.swift:463:31:463:31 | x | semmle.label | x | +| test.swift:463:43:463:62 | call to ... [myPair:0] | semmle.label | call to ... [myPair:0] | +| test.swift:463:51:463:58 | call to source() | semmle.label | call to source() | | test.swift:464:19:464:19 | x | semmle.label | x | -| test.swift:467:17:467:41 | .myCons(...) [myCons:1, myPair:1] : | semmle.label | .myCons(...) [myCons:1, myPair:1] : | -| test.swift:467:28:467:40 | .myPair(...) [myPair:1] : | semmle.label | .myPair(...) [myPair:1] : | -| test.swift:467:39:467:39 | c : | semmle.label | c : | +| test.swift:467:17:467:41 | .myCons(...) [myCons:1, myPair:1] | semmle.label | .myCons(...) [myCons:1, myPair:1] | +| test.swift:467:28:467:40 | .myPair(...) [myPair:1] | semmle.label | .myPair(...) [myPair:1] | +| test.swift:467:39:467:39 | c | semmle.label | c | | test.swift:468:19:468:19 | c | semmle.label | c | -| test.swift:471:12:471:17 | (...) [Tuple element at index 0, myPair:1] : | semmle.label | (...) [Tuple element at index 0, myPair:1] : | -| test.swift:471:12:471:17 | (...) [Tuple element at index 1, myCons:1, myPair:1] : | semmle.label | (...) [Tuple element at index 1, myCons:1, myPair:1] : | -| test.swift:471:13:471:13 | a [myPair:1] : | semmle.label | a [myPair:1] : | -| test.swift:471:16:471:16 | b [myCons:1, myPair:1] : | semmle.label | b [myCons:1, myPair:1] : | -| test.swift:472:14:472:55 | (...) [Tuple element at index 0, myPair:1] : | semmle.label | (...) [Tuple element at index 0, myPair:1] : | -| test.swift:472:14:472:55 | (...) [Tuple element at index 1, myCons:1, myPair:1] : | semmle.label | (...) [Tuple element at index 1, myCons:1, myPair:1] : | -| test.swift:472:15:472:27 | .myPair(...) [myPair:1] : | semmle.label | .myPair(...) [myPair:1] : | -| test.swift:472:26:472:26 | b : | semmle.label | b : | -| test.swift:472:30:472:54 | .myCons(...) [myCons:1, myPair:1] : | semmle.label | .myCons(...) [myCons:1, myPair:1] : | -| test.swift:472:41:472:53 | .myPair(...) [myPair:1] : | semmle.label | .myPair(...) [myPair:1] : | -| test.swift:472:52:472:52 | e : | semmle.label | e : | +| test.swift:471:12:471:17 | (...) [Tuple element at index 0, myPair:1] | semmle.label | (...) [Tuple element at index 0, myPair:1] | +| test.swift:471:12:471:17 | (...) [Tuple element at index 1, myCons:1, myPair:1] | semmle.label | (...) [Tuple element at index 1, myCons:1, myPair:1] | +| test.swift:471:13:471:13 | a [myPair:1] | semmle.label | a [myPair:1] | +| test.swift:471:16:471:16 | b [myCons:1, myPair:1] | semmle.label | b [myCons:1, myPair:1] | +| test.swift:472:14:472:55 | (...) [Tuple element at index 0, myPair:1] | semmle.label | (...) [Tuple element at index 0, myPair:1] | +| test.swift:472:14:472:55 | (...) [Tuple element at index 1, myCons:1, myPair:1] | semmle.label | (...) [Tuple element at index 1, myCons:1, myPair:1] | +| test.swift:472:15:472:27 | .myPair(...) [myPair:1] | semmle.label | .myPair(...) [myPair:1] | +| test.swift:472:26:472:26 | b | semmle.label | b | +| test.swift:472:30:472:54 | .myCons(...) [myCons:1, myPair:1] | semmle.label | .myCons(...) [myCons:1, myPair:1] | +| test.swift:472:41:472:53 | .myPair(...) [myPair:1] | semmle.label | .myPair(...) [myPair:1] | +| test.swift:472:52:472:52 | e | semmle.label | e | | test.swift:474:19:474:19 | b | semmle.label | b | | test.swift:477:19:477:19 | e | semmle.label | e | -| test.swift:486:13:486:28 | call to optionalSource() [some:0] : | semmle.label | call to optionalSource() [some:0] : | -| test.swift:488:8:488:12 | let ...? [some:0] : | semmle.label | let ...? [some:0] : | -| test.swift:488:12:488:12 | a : | semmle.label | a : | +| test.swift:486:13:486:28 | call to optionalSource() [some:0] | semmle.label | call to optionalSource() [some:0] | +| test.swift:488:8:488:12 | let ...? [some:0] | semmle.label | let ...? [some:0] | +| test.swift:488:12:488:12 | a | semmle.label | a | | test.swift:489:19:489:19 | a | semmle.label | a | -| test.swift:493:18:493:23 | (...) [Tuple element at index 0, some:0] : | semmle.label | (...) [Tuple element at index 0, some:0] : | -| test.swift:493:19:493:19 | x [some:0] : | semmle.label | x [some:0] : | -| test.swift:495:10:495:37 | (...) [Tuple element at index 0, some:0] : | semmle.label | (...) [Tuple element at index 0, some:0] : | -| test.swift:495:11:495:22 | .some(...) [some:0] : | semmle.label | .some(...) [some:0] : | -| test.swift:495:21:495:21 | a : | semmle.label | a : | +| test.swift:493:18:493:23 | (...) [Tuple element at index 0, some:0] | semmle.label | (...) [Tuple element at index 0, some:0] | +| test.swift:493:19:493:19 | x [some:0] | semmle.label | x [some:0] | +| test.swift:495:10:495:37 | (...) [Tuple element at index 0, some:0] | semmle.label | (...) [Tuple element at index 0, some:0] | +| test.swift:495:11:495:22 | .some(...) [some:0] | semmle.label | .some(...) [some:0] | +| test.swift:495:21:495:21 | a | semmle.label | a | | test.swift:496:19:496:19 | a | semmle.label | a | -| test.swift:509:9:509:9 | self [x, some:0] : | semmle.label | self [x, some:0] : | -| test.swift:509:9:509:9 | value [some:0] : | semmle.label | value [some:0] : | -| test.swift:513:13:513:28 | call to optionalSource() [some:0] : | semmle.label | call to optionalSource() [some:0] : | -| test.swift:515:5:515:5 | [post] cx [x, some:0] : | semmle.label | [post] cx [x, some:0] : | -| test.swift:515:12:515:12 | x [some:0] : | semmle.label | x [some:0] : | -| test.swift:519:11:519:15 | let ...? [some:0] : | semmle.label | let ...? [some:0] : | -| test.swift:519:15:519:15 | z1 : | semmle.label | z1 : | -| test.swift:519:20:519:20 | cx [x, some:0] : | semmle.label | cx [x, some:0] : | -| test.swift:519:20:519:23 | .x [some:0] : | semmle.label | .x [some:0] : | +| test.swift:509:9:509:9 | self [x, some:0] | semmle.label | self [x, some:0] | +| test.swift:509:9:509:9 | value [some:0] | semmle.label | value [some:0] | +| test.swift:513:13:513:28 | call to optionalSource() [some:0] | semmle.label | call to optionalSource() [some:0] | +| test.swift:515:5:515:5 | [post] cx [x, some:0] | semmle.label | [post] cx [x, some:0] | +| test.swift:515:12:515:12 | x [some:0] | semmle.label | x [some:0] | +| test.swift:519:11:519:15 | let ...? [some:0] | semmle.label | let ...? [some:0] | +| test.swift:519:15:519:15 | z1 | semmle.label | z1 | +| test.swift:519:20:519:20 | cx [x, some:0] | semmle.label | cx [x, some:0] | +| test.swift:519:20:519:23 | .x [some:0] | semmle.label | .x [some:0] | | test.swift:520:15:520:15 | z1 | semmle.label | z1 | | test.swift:526:13:526:21 | call to +(_:) | semmle.label | call to +(_:) | -| test.swift:526:14:526:21 | call to source() : | semmle.label | call to source() : | +| test.swift:526:14:526:21 | call to source() | semmle.label | call to source() | | test.swift:527:14:527:21 | call to source() | semmle.label | call to source() | -| test.swift:535:9:535:9 | self [str] : | semmle.label | self [str] : | -| test.swift:536:5:538:5 | self[return] [str] : | semmle.label | self[return] [str] : | -| test.swift:536:10:536:13 | s : | semmle.label | s : | -| test.swift:537:7:537:7 | [post] self [str] : | semmle.label | [post] self [str] : | -| test.swift:537:13:537:13 | s : | semmle.label | s : | -| test.swift:542:17:545:5 | self[return] [str] : | semmle.label | self[return] [str] : | -| test.swift:543:7:543:7 | [post] self [str] : | semmle.label | [post] self [str] : | -| test.swift:543:20:543:28 | call to source3() : | semmle.label | call to source3() : | +| test.swift:535:9:535:9 | self [str] | semmle.label | self [str] | +| test.swift:536:5:538:5 | self[return] [str] | semmle.label | self[return] [str] | +| test.swift:536:10:536:13 | s | semmle.label | s | +| test.swift:537:7:537:7 | [post] self [str] | semmle.label | [post] self [str] | +| test.swift:537:13:537:13 | s | semmle.label | s | +| test.swift:542:17:545:5 | self[return] [str] | semmle.label | self[return] [str] | +| test.swift:543:7:543:7 | [post] self [str] | semmle.label | [post] self [str] | +| test.swift:543:20:543:28 | call to source3() | semmle.label | call to source3() | | test.swift:544:17:544:17 | .str | semmle.label | .str | -| test.swift:544:17:544:17 | self [str] : | semmle.label | self [str] : | -| test.swift:549:13:549:33 | call to MyClass.init(s:) [str] : | semmle.label | call to MyClass.init(s:) [str] : | +| test.swift:544:17:544:17 | self [str] | semmle.label | self [str] | +| test.swift:549:13:549:33 | call to MyClass.init(s:) [str] | semmle.label | call to MyClass.init(s:) [str] | | test.swift:549:13:549:35 | .str | semmle.label | .str | -| test.swift:549:24:549:32 | call to source3() : | semmle.label | call to source3() : | -| test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] : | semmle.label | call to Self.init(contentsOfFile:) [str] : | +| test.swift:549:24:549:32 | call to source3() | semmle.label | call to source3() | +| test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] | semmle.label | call to Self.init(contentsOfFile:) [str] | | test.swift:550:13:550:43 | .str | semmle.label | .str | +| test.swift:567:3:569:3 | self[return] [x] | semmle.label | self[return] [x] | +| test.swift:567:8:567:11 | x | semmle.label | x | +| test.swift:568:5:568:5 | [post] self [x] | semmle.label | [post] self [x] | +| test.swift:568:14:568:14 | x | semmle.label | x | +| test.swift:573:11:573:24 | call to S.init(x:) [x] | semmle.label | call to S.init(x:) [x] | +| test.swift:573:16:573:23 | call to source() | semmle.label | call to source() | +| test.swift:574:11:574:14 | enter #keyPath(...) [x] | semmle.label | enter #keyPath(...) [x] | +| test.swift:574:11:574:14 | exit #keyPath(...) | semmle.label | exit #keyPath(...) | +| test.swift:574:14:574:14 | KeyPathComponent [x] | semmle.label | KeyPathComponent [x] | +| test.swift:575:13:575:13 | s [x] | semmle.label | s [x] | +| test.swift:575:13:575:25 | \\...[...] | semmle.label | \\...[...] | +| test.swift:577:36:577:38 | enter #keyPath(...) [x] | semmle.label | enter #keyPath(...) [x] | +| test.swift:577:36:577:38 | exit #keyPath(...) | semmle.label | exit #keyPath(...) | +| test.swift:577:38:577:38 | KeyPathComponent [x] | semmle.label | KeyPathComponent [x] | +| test.swift:578:13:578:13 | s [x] | semmle.label | s [x] | +| test.swift:578:13:578:32 | \\...[...] | semmle.label | \\...[...] | +| test.swift:584:3:586:3 | self[return] [s, x] | semmle.label | self[return] [s, x] | +| test.swift:584:8:584:11 | s [x] | semmle.label | s [x] | +| test.swift:585:5:585:5 | [post] self [s, x] | semmle.label | [post] self [s, x] | +| test.swift:585:14:585:14 | s [x] | semmle.label | s [x] | +| test.swift:590:11:590:24 | call to S.init(x:) [x] | semmle.label | call to S.init(x:) [x] | +| test.swift:590:16:590:23 | call to source() | semmle.label | call to source() | +| test.swift:591:12:591:19 | call to S2.init(s:) [s, x] | semmle.label | call to S2.init(s:) [s, x] | +| test.swift:591:18:591:18 | s [x] | semmle.label | s [x] | +| test.swift:592:11:592:17 | enter #keyPath(...) [s, x] | semmle.label | enter #keyPath(...) [s, x] | +| test.swift:592:11:592:17 | exit #keyPath(...) | semmle.label | exit #keyPath(...) | +| test.swift:592:15:592:15 | KeyPathComponent [s, x] | semmle.label | KeyPathComponent [s, x] | +| test.swift:592:17:592:17 | KeyPathComponent [x] | semmle.label | KeyPathComponent [x] | +| test.swift:593:13:593:13 | s2 [s, x] | semmle.label | s2 [s, x] | +| test.swift:593:13:593:26 | \\...[...] | semmle.label | \\...[...] | subpaths -| test.swift:75:21:75:22 | &... : | test.swift:65:16:65:28 | arg1 : | test.swift:65:1:70:1 | arg2[return] : | test.swift:75:31:75:32 | [post] &... : | -| test.swift:114:19:114:19 | arg : | test.swift:109:9:109:14 | arg : | test.swift:110:12:110:12 | arg : | test.swift:114:12:114:22 | call to ... : | -| test.swift:114:19:114:19 | arg : | test.swift:123:10:123:13 | i : | test.swift:124:16:124:16 | i : | test.swift:114:12:114:22 | call to ... : | -| test.swift:119:31:119:31 | x : | test.swift:113:14:113:19 | arg : | test.swift:114:12:114:22 | call to ... : | test.swift:119:18:119:44 | call to forward(arg:lambda:) : | -| test.swift:122:31:122:38 | call to source() : | test.swift:113:14:113:19 | arg : | test.swift:114:12:114:22 | call to ... : | test.swift:122:18:125:6 | call to forward(arg:lambda:) : | -| test.swift:145:23:145:30 | call to source() : | test.swift:142:10:142:13 | i : | test.swift:143:16:143:16 | i : | test.swift:145:15:145:31 | call to ... | -| test.swift:170:9:170:9 | value : | test.swift:163:7:163:7 | value : | file://:0:0:0:0 | [post] self [x] : | test.swift:170:5:170:5 | [post] self [x] : | -| test.swift:174:12:174:12 | self [x] : | test.swift:163:7:163:7 | self [x] : | file://:0:0:0:0 | .x : | test.swift:174:12:174:12 | .x : | -| test.swift:180:9:180:16 | call to source() : | test.swift:163:7:163:7 | value : | file://:0:0:0:0 | [post] self [x] : | test.swift:180:3:180:3 | [post] a [x] : | -| test.swift:181:13:181:13 | a [x] : | test.swift:163:7:163:7 | self [x] : | file://:0:0:0:0 | .x : | test.swift:181:13:181:15 | .x | -| test.swift:194:11:194:18 | call to source() : | test.swift:163:7:163:7 | value : | file://:0:0:0:0 | [post] self [x] : | test.swift:194:3:194:5 | [post] getter for .a [x] : | -| test.swift:195:13:195:13 | b [a, x] : | test.swift:185:7:185:7 | self [a, x] : | file://:0:0:0:0 | .a [x] : | test.swift:195:13:195:15 | .a [x] : | -| test.swift:195:13:195:15 | .a [x] : | test.swift:163:7:163:7 | self [x] : | file://:0:0:0:0 | .x : | test.swift:195:13:195:17 | .x | -| test.swift:200:9:200:16 | call to source() : | test.swift:169:12:169:22 | value : | test.swift:169:3:171:3 | self[return] [x] : | test.swift:200:3:200:3 | [post] a [x] : | -| test.swift:200:9:200:16 | call to source() : | test.swift:169:12:169:22 | value : | test.swift:170:5:170:5 | [post] self [x] : | test.swift:200:3:200:3 | [post] a [x] : | -| test.swift:201:13:201:13 | a [x] : | test.swift:163:7:163:7 | self [x] : | file://:0:0:0:0 | .x : | test.swift:201:13:201:15 | .x | -| test.swift:206:9:206:16 | call to source() : | test.swift:163:7:163:7 | value : | file://:0:0:0:0 | [post] self [x] : | test.swift:206:3:206:3 | [post] a [x] : | -| test.swift:207:13:207:13 | a [x] : | test.swift:173:8:173:8 | self [x] : | test.swift:174:12:174:12 | .x : | test.swift:207:13:207:19 | call to get() | -| test.swift:212:9:212:16 | call to source() : | test.swift:169:12:169:22 | value : | test.swift:169:3:171:3 | self[return] [x] : | test.swift:212:3:212:3 | [post] a [x] : | -| test.swift:212:9:212:16 | call to source() : | test.swift:169:12:169:22 | value : | test.swift:170:5:170:5 | [post] self [x] : | test.swift:212:3:212:3 | [post] a [x] : | -| test.swift:213:13:213:13 | a [x] : | test.swift:173:8:173:8 | self [x] : | test.swift:174:12:174:12 | .x : | test.swift:213:13:213:19 | call to get() | -| test.swift:218:11:218:18 | call to source() : | test.swift:169:12:169:22 | value : | test.swift:169:3:171:3 | self[return] [x] : | test.swift:218:3:218:5 | [post] getter for .a [x] : | -| test.swift:218:11:218:18 | call to source() : | test.swift:169:12:169:22 | value : | test.swift:170:5:170:5 | [post] self [x] : | test.swift:218:3:218:5 | [post] getter for .a [x] : | -| test.swift:219:13:219:13 | b [a, x] : | test.swift:185:7:185:7 | self [a, x] : | file://:0:0:0:0 | .a [x] : | test.swift:219:13:219:15 | .a [x] : | -| test.swift:219:13:219:15 | .a [x] : | test.swift:163:7:163:7 | self [x] : | file://:0:0:0:0 | .x : | test.swift:219:13:219:17 | .x | -| test.swift:270:15:270:22 | call to source() : | file://:0:0:0:0 | [summary param] this in signum() : | file://:0:0:0:0 | [summary] to write: return (return) in signum() : | test.swift:270:15:270:31 | call to signum() | -| test.swift:271:15:271:16 | ...? : | file://:0:0:0:0 | [summary param] this in signum() : | file://:0:0:0:0 | [summary] to write: return (return) in signum() : | test.swift:271:15:271:25 | call to signum() : | -| test.swift:291:16:291:17 | ...? : | file://:0:0:0:0 | [summary param] this in signum() : | file://:0:0:0:0 | [summary] to write: return (return) in signum() : | test.swift:291:16:291:26 | call to signum() : | -| test.swift:291:16:291:17 | ...? [some:0] : | file://:0:0:0:0 | [summary param] this in signum() [some:0] : | file://:0:0:0:0 | [summary] to write: return (return) in signum() [some:0] : | test.swift:291:16:291:26 | call to signum() [some:0] : | -| test.swift:303:15:303:16 | ...! : | file://:0:0:0:0 | [summary param] this in signum() : | file://:0:0:0:0 | [summary] to write: return (return) in signum() : | test.swift:303:15:303:25 | call to signum() | -| test.swift:515:12:515:12 | x [some:0] : | test.swift:509:9:509:9 | value [some:0] : | file://:0:0:0:0 | [post] self [x, some:0] : | test.swift:515:5:515:5 | [post] cx [x, some:0] : | -| test.swift:519:20:519:20 | cx [x, some:0] : | test.swift:509:9:509:9 | self [x, some:0] : | file://:0:0:0:0 | .x [some:0] : | test.swift:519:20:519:23 | .x [some:0] : | -| test.swift:543:20:543:28 | call to source3() : | test.swift:536:10:536:13 | s : | test.swift:537:7:537:7 | [post] self [str] : | test.swift:543:7:543:7 | [post] self [str] : | -| test.swift:549:13:549:33 | call to MyClass.init(s:) [str] : | test.swift:535:9:535:9 | self [str] : | file://:0:0:0:0 | .str : | test.swift:549:13:549:35 | .str | -| test.swift:549:24:549:32 | call to source3() : | test.swift:536:10:536:13 | s : | test.swift:536:5:538:5 | self[return] [str] : | test.swift:549:13:549:33 | call to MyClass.init(s:) [str] : | -| test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] : | test.swift:535:9:535:9 | self [str] : | file://:0:0:0:0 | .str : | test.swift:550:13:550:43 | .str | +| test.swift:75:21:75:22 | &... | test.swift:65:16:65:28 | arg1 | test.swift:65:1:70:1 | arg2[return] | test.swift:75:31:75:32 | [post] &... | +| test.swift:114:19:114:19 | arg | test.swift:109:9:109:14 | arg | test.swift:110:12:110:12 | arg | test.swift:114:12:114:22 | call to ... | +| test.swift:114:19:114:19 | arg | test.swift:123:10:123:13 | i | test.swift:124:16:124:16 | i | test.swift:114:12:114:22 | call to ... | +| test.swift:119:31:119:31 | x | test.swift:113:14:113:19 | arg | test.swift:114:12:114:22 | call to ... | test.swift:119:18:119:44 | call to forward(arg:lambda:) | +| test.swift:122:31:122:38 | call to source() | test.swift:113:14:113:19 | arg | test.swift:114:12:114:22 | call to ... | test.swift:122:18:125:6 | call to forward(arg:lambda:) | +| test.swift:145:23:145:30 | call to source() | test.swift:142:10:142:13 | i | test.swift:143:16:143:16 | i | test.swift:145:15:145:31 | call to ... | +| test.swift:170:9:170:9 | value | test.swift:163:7:163:7 | value | file://:0:0:0:0 | [post] self [x] | test.swift:170:5:170:5 | [post] self [x] | +| test.swift:174:12:174:12 | self [x] | test.swift:163:7:163:7 | self [x] | file://:0:0:0:0 | .x | test.swift:174:12:174:12 | .x | +| test.swift:180:9:180:16 | call to source() | test.swift:163:7:163:7 | value | file://:0:0:0:0 | [post] self [x] | test.swift:180:3:180:3 | [post] a [x] | +| test.swift:181:13:181:13 | a [x] | test.swift:163:7:163:7 | self [x] | file://:0:0:0:0 | .x | test.swift:181:13:181:15 | .x | +| test.swift:194:11:194:18 | call to source() | test.swift:163:7:163:7 | value | file://:0:0:0:0 | [post] self [x] | test.swift:194:3:194:5 | [post] getter for .a [x] | +| test.swift:195:13:195:13 | b [a, x] | test.swift:185:7:185:7 | self [a, x] | file://:0:0:0:0 | .a [x] | test.swift:195:13:195:15 | .a [x] | +| test.swift:195:13:195:15 | .a [x] | test.swift:163:7:163:7 | self [x] | file://:0:0:0:0 | .x | test.swift:195:13:195:17 | .x | +| test.swift:200:9:200:16 | call to source() | test.swift:169:12:169:22 | value | test.swift:169:3:171:3 | self[return] [x] | test.swift:200:3:200:3 | [post] a [x] | +| test.swift:200:9:200:16 | call to source() | test.swift:169:12:169:22 | value | test.swift:170:5:170:5 | [post] self [x] | test.swift:200:3:200:3 | [post] a [x] | +| test.swift:201:13:201:13 | a [x] | test.swift:163:7:163:7 | self [x] | file://:0:0:0:0 | .x | test.swift:201:13:201:15 | .x | +| test.swift:206:9:206:16 | call to source() | test.swift:163:7:163:7 | value | file://:0:0:0:0 | [post] self [x] | test.swift:206:3:206:3 | [post] a [x] | +| test.swift:207:13:207:13 | a [x] | test.swift:173:8:173:8 | self [x] | test.swift:174:12:174:12 | .x | test.swift:207:13:207:19 | call to get() | +| test.swift:212:9:212:16 | call to source() | test.swift:169:12:169:22 | value | test.swift:169:3:171:3 | self[return] [x] | test.swift:212:3:212:3 | [post] a [x] | +| test.swift:212:9:212:16 | call to source() | test.swift:169:12:169:22 | value | test.swift:170:5:170:5 | [post] self [x] | test.swift:212:3:212:3 | [post] a [x] | +| test.swift:213:13:213:13 | a [x] | test.swift:173:8:173:8 | self [x] | test.swift:174:12:174:12 | .x | test.swift:213:13:213:19 | call to get() | +| test.swift:218:11:218:18 | call to source() | test.swift:169:12:169:22 | value | test.swift:169:3:171:3 | self[return] [x] | test.swift:218:3:218:5 | [post] getter for .a [x] | +| test.swift:218:11:218:18 | call to source() | test.swift:169:12:169:22 | value | test.swift:170:5:170:5 | [post] self [x] | test.swift:218:3:218:5 | [post] getter for .a [x] | +| test.swift:219:13:219:13 | b [a, x] | test.swift:185:7:185:7 | self [a, x] | file://:0:0:0:0 | .a [x] | test.swift:219:13:219:15 | .a [x] | +| test.swift:219:13:219:15 | .a [x] | test.swift:163:7:163:7 | self [x] | file://:0:0:0:0 | .x | test.swift:219:13:219:17 | .x | +| test.swift:270:15:270:22 | call to source() | file://:0:0:0:0 | [summary param] this in signum() | file://:0:0:0:0 | [summary] to write: return (return) in signum() | test.swift:270:15:270:31 | call to signum() | +| test.swift:271:15:271:16 | ...? | file://:0:0:0:0 | [summary param] this in signum() | file://:0:0:0:0 | [summary] to write: return (return) in signum() | test.swift:271:15:271:25 | call to signum() | +| test.swift:291:16:291:17 | ...? | file://:0:0:0:0 | [summary param] this in signum() | file://:0:0:0:0 | [summary] to write: return (return) in signum() | test.swift:291:16:291:26 | call to signum() | +| test.swift:291:16:291:17 | ...? [some:0] | file://:0:0:0:0 | [summary param] this in signum() [some:0] | file://:0:0:0:0 | [summary] to write: return (return) in signum() [some:0] | test.swift:291:16:291:26 | call to signum() [some:0] | +| test.swift:303:15:303:16 | ...! | file://:0:0:0:0 | [summary param] this in signum() | file://:0:0:0:0 | [summary] to write: return (return) in signum() | test.swift:303:15:303:25 | call to signum() | +| test.swift:515:12:515:12 | x [some:0] | test.swift:509:9:509:9 | value [some:0] | file://:0:0:0:0 | [post] self [x, some:0] | test.swift:515:5:515:5 | [post] cx [x, some:0] | +| test.swift:519:20:519:20 | cx [x, some:0] | test.swift:509:9:509:9 | self [x, some:0] | file://:0:0:0:0 | .x [some:0] | test.swift:519:20:519:23 | .x [some:0] | +| test.swift:543:20:543:28 | call to source3() | test.swift:536:10:536:13 | s | test.swift:537:7:537:7 | [post] self [str] | test.swift:543:7:543:7 | [post] self [str] | +| test.swift:549:13:549:33 | call to MyClass.init(s:) [str] | test.swift:535:9:535:9 | self [str] | file://:0:0:0:0 | .str | test.swift:549:13:549:35 | .str | +| test.swift:549:24:549:32 | call to source3() | test.swift:536:10:536:13 | s | test.swift:536:5:538:5 | self[return] [str] | test.swift:549:13:549:33 | call to MyClass.init(s:) [str] | +| test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] | test.swift:535:9:535:9 | self [str] | file://:0:0:0:0 | .str | test.swift:550:13:550:43 | .str | +| test.swift:573:16:573:23 | call to source() | test.swift:567:8:567:11 | x | test.swift:567:3:569:3 | self[return] [x] | test.swift:573:11:573:24 | call to S.init(x:) [x] | +| test.swift:575:13:575:13 | s [x] | test.swift:574:11:574:14 | enter #keyPath(...) [x] | test.swift:574:11:574:14 | exit #keyPath(...) | test.swift:575:13:575:25 | \\...[...] | +| test.swift:578:13:578:13 | s [x] | test.swift:577:36:577:38 | enter #keyPath(...) [x] | test.swift:577:36:577:38 | exit #keyPath(...) | test.swift:578:13:578:32 | \\...[...] | +| test.swift:590:16:590:23 | call to source() | test.swift:567:8:567:11 | x | test.swift:567:3:569:3 | self[return] [x] | test.swift:590:11:590:24 | call to S.init(x:) [x] | +| test.swift:591:18:591:18 | s [x] | test.swift:584:8:584:11 | s [x] | test.swift:584:3:586:3 | self[return] [s, x] | test.swift:591:12:591:19 | call to S2.init(s:) [s, x] | +| test.swift:593:13:593:13 | s2 [s, x] | test.swift:592:11:592:17 | enter #keyPath(...) [s, x] | test.swift:592:11:592:17 | exit #keyPath(...) | test.swift:593:13:593:26 | \\...[...] | #select -| test.swift:7:15:7:15 | t1 | test.swift:6:19:6:26 | call to source() : | test.swift:7:15:7:15 | t1 | result | -| test.swift:9:15:9:15 | t1 | test.swift:6:19:6:26 | call to source() : | test.swift:9:15:9:15 | t1 | result | -| test.swift:10:15:10:15 | t2 | test.swift:6:19:6:26 | call to source() : | test.swift:10:15:10:15 | t2 | result | -| test.swift:30:15:30:15 | x | test.swift:25:20:25:27 | call to source() : | test.swift:30:15:30:15 | x | result | -| test.swift:31:15:31:15 | y | test.swift:26:26:26:33 | call to source() : | test.swift:31:15:31:15 | y | result | -| test.swift:39:15:39:29 | call to callee_source() | test.swift:35:12:35:19 | call to source() : | test.swift:39:15:39:29 | call to callee_source() | result | -| test.swift:50:15:50:15 | t | test.swift:43:19:43:26 | call to source() : | test.swift:50:15:50:15 | t | result | -| test.swift:62:15:62:15 | x | test.swift:54:11:54:18 | call to source() : | test.swift:62:15:62:15 | x | result | -| test.swift:76:15:76:15 | x | test.swift:73:18:73:25 | call to source() : | test.swift:76:15:76:15 | x | result | -| test.swift:77:15:77:15 | y | test.swift:73:18:73:25 | call to source() : | test.swift:77:15:77:15 | y | result | -| test.swift:98:19:98:19 | x | test.swift:81:11:81:18 | call to source() : | test.swift:98:19:98:19 | x | result | -| test.swift:105:19:105:19 | x | test.swift:86:15:86:22 | call to source() : | test.swift:105:19:105:19 | x | result | -| test.swift:105:19:105:19 | x | test.swift:89:15:89:22 | call to source() : | test.swift:105:19:105:19 | x | result | -| test.swift:120:15:120:15 | y | test.swift:118:18:118:25 | call to source() : | test.swift:120:15:120:15 | y | result | -| test.swift:126:15:126:15 | z | test.swift:122:31:122:38 | call to source() : | test.swift:126:15:126:15 | z | result | +| test.swift:7:15:7:15 | t1 | test.swift:6:19:6:26 | call to source() | test.swift:7:15:7:15 | t1 | result | +| test.swift:9:15:9:15 | t1 | test.swift:6:19:6:26 | call to source() | test.swift:9:15:9:15 | t1 | result | +| test.swift:10:15:10:15 | t2 | test.swift:6:19:6:26 | call to source() | test.swift:10:15:10:15 | t2 | result | +| test.swift:30:15:30:15 | x | test.swift:25:20:25:27 | call to source() | test.swift:30:15:30:15 | x | result | +| test.swift:31:15:31:15 | y | test.swift:26:26:26:33 | call to source() | test.swift:31:15:31:15 | y | result | +| test.swift:39:15:39:29 | call to callee_source() | test.swift:35:12:35:19 | call to source() | test.swift:39:15:39:29 | call to callee_source() | result | +| test.swift:50:15:50:15 | t | test.swift:43:19:43:26 | call to source() | test.swift:50:15:50:15 | t | result | +| test.swift:62:15:62:15 | x | test.swift:54:11:54:18 | call to source() | test.swift:62:15:62:15 | x | result | +| test.swift:76:15:76:15 | x | test.swift:73:18:73:25 | call to source() | test.swift:76:15:76:15 | x | result | +| test.swift:77:15:77:15 | y | test.swift:73:18:73:25 | call to source() | test.swift:77:15:77:15 | y | result | +| test.swift:98:19:98:19 | x | test.swift:81:11:81:18 | call to source() | test.swift:98:19:98:19 | x | result | +| test.swift:105:19:105:19 | x | test.swift:86:15:86:22 | call to source() | test.swift:105:19:105:19 | x | result | +| test.swift:105:19:105:19 | x | test.swift:89:15:89:22 | call to source() | test.swift:105:19:105:19 | x | result | +| test.swift:120:15:120:15 | y | test.swift:118:18:118:25 | call to source() | test.swift:120:15:120:15 | y | result | +| test.swift:126:15:126:15 | z | test.swift:122:31:122:38 | call to source() | test.swift:126:15:126:15 | z | result | | test.swift:138:19:138:26 | call to source() | test.swift:138:19:138:26 | call to source() | test.swift:138:19:138:26 | call to source() | result | -| test.swift:145:15:145:31 | call to ... | test.swift:145:23:145:30 | call to source() : | test.swift:145:15:145:31 | call to ... | result | -| test.swift:151:15:151:28 | call to ... | test.swift:149:16:149:23 | call to source() : | test.swift:151:15:151:28 | call to ... | result | -| test.swift:155:19:155:19 | i | test.swift:149:16:149:23 | call to source() : | test.swift:155:19:155:19 | i | result | -| test.swift:155:19:155:19 | i | test.swift:157:16:157:23 | call to source() : | test.swift:155:19:155:19 | i | result | -| test.swift:181:13:181:15 | .x | test.swift:180:9:180:16 | call to source() : | test.swift:181:13:181:15 | .x | result | -| test.swift:195:13:195:17 | .x | test.swift:194:11:194:18 | call to source() : | test.swift:195:13:195:17 | .x | result | -| test.swift:201:13:201:15 | .x | test.swift:200:9:200:16 | call to source() : | test.swift:201:13:201:15 | .x | result | -| test.swift:207:13:207:19 | call to get() | test.swift:206:9:206:16 | call to source() : | test.swift:207:13:207:19 | call to get() | result | -| test.swift:213:13:213:19 | call to get() | test.swift:212:9:212:16 | call to source() : | test.swift:213:13:213:19 | call to get() | result | -| test.swift:219:13:219:17 | .x | test.swift:218:11:218:18 | call to source() : | test.swift:219:13:219:17 | .x | result | -| test.swift:235:13:235:15 | .source_value | test.swift:225:14:225:21 | call to source() : | test.swift:235:13:235:15 | .source_value | result | -| test.swift:238:13:238:15 | .source_value | test.swift:225:14:225:21 | call to source() : | test.swift:238:13:238:15 | .source_value | result | -| test.swift:265:15:265:15 | x | test.swift:259:12:259:19 | call to source() : | test.swift:265:15:265:15 | x | result | -| test.swift:267:15:267:16 | ...! | test.swift:259:12:259:19 | call to source() : | test.swift:267:15:267:16 | ...! | result | -| test.swift:270:15:270:31 | call to signum() | test.swift:270:15:270:22 | call to source() : | test.swift:270:15:270:31 | call to signum() | result | -| test.swift:271:15:271:25 | OptionalEvaluationExpr | test.swift:259:12:259:19 | call to source() : | test.swift:271:15:271:25 | OptionalEvaluationExpr | result | -| test.swift:274:15:274:20 | ... ??(_:_:) ... | test.swift:259:12:259:19 | call to source() : | test.swift:274:15:274:20 | ... ??(_:_:) ... | result | -| test.swift:275:15:275:27 | ... ??(_:_:) ... | test.swift:259:12:259:19 | call to source() : | test.swift:275:15:275:27 | ... ??(_:_:) ... | result | -| test.swift:279:15:279:31 | ... ? ... : ... | test.swift:259:12:259:19 | call to source() : | test.swift:279:15:279:31 | ... ? ... : ... | result | -| test.swift:280:15:280:38 | ... ? ... : ... | test.swift:259:12:259:19 | call to source() : | test.swift:280:15:280:38 | ... ? ... : ... | result | -| test.swift:280:15:280:38 | ... ? ... : ... | test.swift:280:31:280:38 | call to source() : | test.swift:280:15:280:38 | ... ? ... : ... | result | -| test.swift:282:15:282:38 | ... ? ... : ... | test.swift:282:31:282:38 | call to source() : | test.swift:282:15:282:38 | ... ? ... : ... | result | -| test.swift:285:19:285:19 | z | test.swift:259:12:259:19 | call to source() : | test.swift:285:19:285:19 | z | result | -| test.swift:292:19:292:19 | z | test.swift:259:12:259:19 | call to source() : | test.swift:292:19:292:19 | z | result | -| test.swift:300:15:300:15 | z1 | test.swift:259:12:259:19 | call to source() : | test.swift:300:15:300:15 | z1 | result | -| test.swift:303:15:303:25 | call to signum() | test.swift:259:12:259:19 | call to source() : | test.swift:303:15:303:25 | call to signum() | result | -| test.swift:307:19:307:19 | z | test.swift:259:12:259:19 | call to source() : | test.swift:307:19:307:19 | z | result | -| test.swift:315:19:315:19 | z | test.swift:259:12:259:19 | call to source() : | test.swift:315:19:315:19 | z | result | -| test.swift:335:15:335:18 | .1 | test.swift:331:18:331:25 | call to source() : | test.swift:335:15:335:18 | .1 | result | -| test.swift:346:15:346:18 | .0 | test.swift:343:12:343:19 | call to source() : | test.swift:346:15:346:18 | .0 | result | -| test.swift:356:15:356:18 | .0 | test.swift:351:18:351:25 | call to source() : | test.swift:356:15:356:18 | .0 | result | -| test.swift:357:15:357:18 | .1 | test.swift:351:31:351:38 | call to source() : | test.swift:357:15:357:18 | .1 | result | -| test.swift:360:15:360:18 | .0 | test.swift:351:18:351:25 | call to source() : | test.swift:360:15:360:18 | .0 | result | -| test.swift:361:15:361:18 | .1 | test.swift:351:31:351:38 | call to source() : | test.swift:361:15:361:18 | .1 | result | -| test.swift:363:15:363:15 | a | test.swift:351:18:351:25 | call to source() : | test.swift:363:15:363:15 | a | result | -| test.swift:364:15:364:15 | b | test.swift:351:31:351:38 | call to source() : | test.swift:364:15:364:15 | b | result | -| test.swift:404:19:404:19 | a | test.swift:398:19:398:26 | call to source() : | test.swift:404:19:404:19 | a | result | -| test.swift:413:19:413:19 | x | test.swift:398:19:398:26 | call to source() : | test.swift:413:19:413:19 | x | result | -| test.swift:429:19:429:19 | b | test.swift:420:26:420:33 | call to source() : | test.swift:429:19:429:19 | b | result | -| test.swift:439:19:439:19 | y | test.swift:420:26:420:33 | call to source() : | test.swift:439:19:439:19 | y | result | -| test.swift:455:19:455:19 | c | test.swift:420:26:420:33 | call to source() : | test.swift:455:19:455:19 | c | result | -| test.swift:464:19:464:19 | x | test.swift:463:51:463:58 | call to source() : | test.swift:464:19:464:19 | x | result | -| test.swift:468:19:468:19 | c | test.swift:420:26:420:33 | call to source() : | test.swift:468:19:468:19 | c | result | -| test.swift:474:19:474:19 | b | test.swift:420:26:420:33 | call to source() : | test.swift:474:19:474:19 | b | result | -| test.swift:477:19:477:19 | e | test.swift:420:26:420:33 | call to source() : | test.swift:477:19:477:19 | e | result | -| test.swift:489:19:489:19 | a | test.swift:259:12:259:19 | call to source() : | test.swift:489:19:489:19 | a | result | -| test.swift:496:19:496:19 | a | test.swift:259:12:259:19 | call to source() : | test.swift:496:19:496:19 | a | result | -| test.swift:520:15:520:15 | z1 | test.swift:259:12:259:19 | call to source() : | test.swift:520:15:520:15 | z1 | result | -| test.swift:526:13:526:21 | call to +(_:) | test.swift:526:14:526:21 | call to source() : | test.swift:526:13:526:21 | call to +(_:) | result | +| test.swift:145:15:145:31 | call to ... | test.swift:145:23:145:30 | call to source() | test.swift:145:15:145:31 | call to ... | result | +| test.swift:151:15:151:28 | call to ... | test.swift:149:16:149:23 | call to source() | test.swift:151:15:151:28 | call to ... | result | +| test.swift:155:19:155:19 | i | test.swift:149:16:149:23 | call to source() | test.swift:155:19:155:19 | i | result | +| test.swift:155:19:155:19 | i | test.swift:157:16:157:23 | call to source() | test.swift:155:19:155:19 | i | result | +| test.swift:181:13:181:15 | .x | test.swift:180:9:180:16 | call to source() | test.swift:181:13:181:15 | .x | result | +| test.swift:195:13:195:17 | .x | test.swift:194:11:194:18 | call to source() | test.swift:195:13:195:17 | .x | result | +| test.swift:201:13:201:15 | .x | test.swift:200:9:200:16 | call to source() | test.swift:201:13:201:15 | .x | result | +| test.swift:207:13:207:19 | call to get() | test.swift:206:9:206:16 | call to source() | test.swift:207:13:207:19 | call to get() | result | +| test.swift:213:13:213:19 | call to get() | test.swift:212:9:212:16 | call to source() | test.swift:213:13:213:19 | call to get() | result | +| test.swift:219:13:219:17 | .x | test.swift:218:11:218:18 | call to source() | test.swift:219:13:219:17 | .x | result | +| test.swift:235:13:235:15 | .source_value | test.swift:225:14:225:21 | call to source() | test.swift:235:13:235:15 | .source_value | result | +| test.swift:238:13:238:15 | .source_value | test.swift:225:14:225:21 | call to source() | test.swift:238:13:238:15 | .source_value | result | +| test.swift:265:15:265:15 | x | test.swift:259:12:259:19 | call to source() | test.swift:265:15:265:15 | x | result | +| test.swift:267:15:267:16 | ...! | test.swift:259:12:259:19 | call to source() | test.swift:267:15:267:16 | ...! | result | +| test.swift:270:15:270:31 | call to signum() | test.swift:270:15:270:22 | call to source() | test.swift:270:15:270:31 | call to signum() | result | +| test.swift:271:15:271:25 | OptionalEvaluationExpr | test.swift:259:12:259:19 | call to source() | test.swift:271:15:271:25 | OptionalEvaluationExpr | result | +| test.swift:274:15:274:20 | ... ??(_:_:) ... | test.swift:259:12:259:19 | call to source() | test.swift:274:15:274:20 | ... ??(_:_:) ... | result | +| test.swift:275:15:275:27 | ... ??(_:_:) ... | test.swift:259:12:259:19 | call to source() | test.swift:275:15:275:27 | ... ??(_:_:) ... | result | +| test.swift:279:15:279:31 | ... ? ... : ... | test.swift:259:12:259:19 | call to source() | test.swift:279:15:279:31 | ... ? ... : ... | result | +| test.swift:280:15:280:38 | ... ? ... : ... | test.swift:259:12:259:19 | call to source() | test.swift:280:15:280:38 | ... ? ... : ... | result | +| test.swift:280:15:280:38 | ... ? ... : ... | test.swift:280:31:280:38 | call to source() | test.swift:280:15:280:38 | ... ? ... : ... | result | +| test.swift:282:15:282:38 | ... ? ... : ... | test.swift:282:31:282:38 | call to source() | test.swift:282:15:282:38 | ... ? ... : ... | result | +| test.swift:285:19:285:19 | z | test.swift:259:12:259:19 | call to source() | test.swift:285:19:285:19 | z | result | +| test.swift:292:19:292:19 | z | test.swift:259:12:259:19 | call to source() | test.swift:292:19:292:19 | z | result | +| test.swift:300:15:300:15 | z1 | test.swift:259:12:259:19 | call to source() | test.swift:300:15:300:15 | z1 | result | +| test.swift:303:15:303:25 | call to signum() | test.swift:259:12:259:19 | call to source() | test.swift:303:15:303:25 | call to signum() | result | +| test.swift:307:19:307:19 | z | test.swift:259:12:259:19 | call to source() | test.swift:307:19:307:19 | z | result | +| test.swift:315:19:315:19 | z | test.swift:259:12:259:19 | call to source() | test.swift:315:19:315:19 | z | result | +| test.swift:335:15:335:18 | .1 | test.swift:331:18:331:25 | call to source() | test.swift:335:15:335:18 | .1 | result | +| test.swift:346:15:346:18 | .0 | test.swift:343:12:343:19 | call to source() | test.swift:346:15:346:18 | .0 | result | +| test.swift:356:15:356:18 | .0 | test.swift:351:18:351:25 | call to source() | test.swift:356:15:356:18 | .0 | result | +| test.swift:357:15:357:18 | .1 | test.swift:351:31:351:38 | call to source() | test.swift:357:15:357:18 | .1 | result | +| test.swift:360:15:360:18 | .0 | test.swift:351:18:351:25 | call to source() | test.swift:360:15:360:18 | .0 | result | +| test.swift:361:15:361:18 | .1 | test.swift:351:31:351:38 | call to source() | test.swift:361:15:361:18 | .1 | result | +| test.swift:363:15:363:15 | a | test.swift:351:18:351:25 | call to source() | test.swift:363:15:363:15 | a | result | +| test.swift:364:15:364:15 | b | test.swift:351:31:351:38 | call to source() | test.swift:364:15:364:15 | b | result | +| test.swift:404:19:404:19 | a | test.swift:398:19:398:26 | call to source() | test.swift:404:19:404:19 | a | result | +| test.swift:413:19:413:19 | x | test.swift:398:19:398:26 | call to source() | test.swift:413:19:413:19 | x | result | +| test.swift:429:19:429:19 | b | test.swift:420:26:420:33 | call to source() | test.swift:429:19:429:19 | b | result | +| test.swift:439:19:439:19 | y | test.swift:420:26:420:33 | call to source() | test.swift:439:19:439:19 | y | result | +| test.swift:455:19:455:19 | c | test.swift:420:26:420:33 | call to source() | test.swift:455:19:455:19 | c | result | +| test.swift:464:19:464:19 | x | test.swift:463:51:463:58 | call to source() | test.swift:464:19:464:19 | x | result | +| test.swift:468:19:468:19 | c | test.swift:420:26:420:33 | call to source() | test.swift:468:19:468:19 | c | result | +| test.swift:474:19:474:19 | b | test.swift:420:26:420:33 | call to source() | test.swift:474:19:474:19 | b | result | +| test.swift:477:19:477:19 | e | test.swift:420:26:420:33 | call to source() | test.swift:477:19:477:19 | e | result | +| test.swift:489:19:489:19 | a | test.swift:259:12:259:19 | call to source() | test.swift:489:19:489:19 | a | result | +| test.swift:496:19:496:19 | a | test.swift:259:12:259:19 | call to source() | test.swift:496:19:496:19 | a | result | +| test.swift:520:15:520:15 | z1 | test.swift:259:12:259:19 | call to source() | test.swift:520:15:520:15 | z1 | result | +| test.swift:526:13:526:21 | call to +(_:) | test.swift:526:14:526:21 | call to source() | test.swift:526:13:526:21 | call to +(_:) | result | | test.swift:527:14:527:21 | call to source() | test.swift:527:14:527:21 | call to source() | test.swift:527:14:527:21 | call to source() | result | -| test.swift:544:17:544:17 | .str | test.swift:543:20:543:28 | call to source3() : | test.swift:544:17:544:17 | .str | result | -| test.swift:549:13:549:35 | .str | test.swift:549:24:549:32 | call to source3() : | test.swift:549:13:549:35 | .str | result | -| test.swift:550:13:550:43 | .str | test.swift:543:20:543:28 | call to source3() : | test.swift:550:13:550:43 | .str | result | +| test.swift:544:17:544:17 | .str | test.swift:543:20:543:28 | call to source3() | test.swift:544:17:544:17 | .str | result | +| test.swift:549:13:549:35 | .str | test.swift:549:24:549:32 | call to source3() | test.swift:549:13:549:35 | .str | result | +| test.swift:550:13:550:43 | .str | test.swift:543:20:543:28 | call to source3() | test.swift:550:13:550:43 | .str | result | +| test.swift:575:13:575:25 | \\...[...] | test.swift:573:16:573:23 | call to source() | test.swift:575:13:575:25 | \\...[...] | result | +| test.swift:578:13:578:32 | \\...[...] | test.swift:573:16:573:23 | call to source() | test.swift:578:13:578:32 | \\...[...] | result | +| test.swift:593:13:593:26 | \\...[...] | test.swift:590:16:590:23 | call to source() | test.swift:593:13:593:26 | \\...[...] | result | diff --git a/swift/ql/test/library-tests/dataflow/dataflow/LocalFlow.expected b/swift/ql/test/library-tests/dataflow/dataflow/LocalFlow.expected index 516612aa964..7b8717c8655 100644 --- a/swift/ql/test/library-tests/dataflow/dataflow/LocalFlow.expected +++ b/swift/ql/test/library-tests/dataflow/dataflow/LocalFlow.expected @@ -601,3 +601,64 @@ | test.swift:560:7:560:7 | n | test.swift:560:7:560:7 | SSA def(n) | | test.swift:560:11:560:11 | 0 | test.swift:560:7:560:7 | n | | test.swift:561:36:561:36 | n | test.swift:561:35:561:36 | &... | +| test.swift:565:7:565:7 | self | test.swift:565:7:565:7 | SSA def(self) | +| test.swift:567:3:567:3 | SSA def(self) | test.swift:568:5:568:5 | self | +| test.swift:567:3:567:3 | self | test.swift:567:3:567:3 | SSA def(self) | +| test.swift:567:8:567:11 | SSA def(x) | test.swift:568:14:568:14 | x | +| test.swift:567:8:567:11 | x | test.swift:567:8:567:11 | SSA def(x) | +| test.swift:568:5:568:5 | [post] self | test.swift:567:3:569:3 | self[return] | +| test.swift:568:5:568:5 | self | test.swift:567:3:569:3 | self[return] | +| test.swift:573:7:573:7 | SSA def(s) | test.swift:575:13:575:13 | s | +| test.swift:573:7:573:7 | s | test.swift:573:7:573:7 | SSA def(s) | +| test.swift:573:11:573:24 | call to S.init(x:) | test.swift:573:7:573:7 | s | +| test.swift:574:7:574:7 | SSA def(f) | test.swift:575:24:575:24 | f | +| test.swift:574:7:574:7 | f | test.swift:574:7:574:7 | SSA def(f) | +| test.swift:574:11:574:14 | #keyPath(...) | test.swift:574:7:574:7 | f | +| test.swift:574:11:574:14 | enter #keyPath(...) | test.swift:574:14:574:14 | KeyPathComponent | +| test.swift:575:13:575:13 | s | test.swift:578:13:578:13 | s | +| test.swift:577:7:577:7 | SSA def(inferred) | test.swift:578:24:578:24 | inferred | +| test.swift:577:7:577:7 | inferred | test.swift:577:7:577:7 | SSA def(inferred) | +| test.swift:577:7:577:32 | ... as ... | test.swift:577:7:577:7 | inferred | +| test.swift:577:36:577:38 | #keyPath(...) | test.swift:577:7:577:32 | ... as ... | +| test.swift:577:36:577:38 | enter #keyPath(...) | test.swift:577:38:577:38 | KeyPathComponent | +| test.swift:582:7:582:7 | self | test.swift:582:7:582:7 | SSA def(self) | +| test.swift:584:3:584:3 | SSA def(self) | test.swift:585:5:585:5 | self | +| test.swift:584:3:584:3 | self | test.swift:584:3:584:3 | SSA def(self) | +| test.swift:584:8:584:11 | SSA def(s) | test.swift:585:14:585:14 | s | +| test.swift:584:8:584:11 | s | test.swift:584:8:584:11 | SSA def(s) | +| test.swift:585:5:585:5 | [post] self | test.swift:584:3:586:3 | self[return] | +| test.swift:585:5:585:5 | self | test.swift:584:3:586:3 | self[return] | +| test.swift:590:7:590:7 | SSA def(s) | test.swift:591:18:591:18 | s | +| test.swift:590:7:590:7 | s | test.swift:590:7:590:7 | SSA def(s) | +| test.swift:590:11:590:24 | call to S.init(x:) | test.swift:590:7:590:7 | s | +| test.swift:591:7:591:7 | SSA def(s2) | test.swift:593:13:593:13 | s2 | +| test.swift:591:7:591:7 | s2 | test.swift:591:7:591:7 | SSA def(s2) | +| test.swift:591:12:591:19 | call to S2.init(s:) | test.swift:591:7:591:7 | s2 | +| test.swift:592:7:592:7 | SSA def(f) | test.swift:593:25:593:25 | f | +| test.swift:592:7:592:7 | f | test.swift:592:7:592:7 | SSA def(f) | +| test.swift:592:11:592:17 | #keyPath(...) | test.swift:592:7:592:7 | f | +| test.swift:592:11:592:17 | enter #keyPath(...) | test.swift:592:15:592:15 | KeyPathComponent | +| test.swift:597:9:597:9 | SSA def(array) | test.swift:599:15:599:15 | array | +| test.swift:597:9:597:9 | array | test.swift:597:9:597:9 | SSA def(array) | +| test.swift:597:17:597:26 | [...] | test.swift:597:9:597:9 | array | +| test.swift:598:9:598:9 | SSA def(f) | test.swift:599:30:599:30 | f | +| test.swift:598:9:598:9 | f | test.swift:598:9:598:9 | SSA def(f) | +| test.swift:598:13:598:22 | #keyPath(...) | test.swift:598:9:598:9 | f | +| test.swift:598:13:598:22 | enter #keyPath(...) | test.swift:598:20:598:22 | KeyPathComponent | +| test.swift:603:7:603:7 | self | test.swift:603:7:603:7 | SSA def(self) | +| test.swift:605:3:605:3 | SSA def(self) | test.swift:606:5:606:5 | self | +| test.swift:605:3:605:3 | self | test.swift:605:3:605:3 | SSA def(self) | +| test.swift:605:8:605:12 | SSA def(s) | test.swift:606:14:606:14 | s | +| test.swift:605:8:605:12 | s | test.swift:605:8:605:12 | SSA def(s) | +| test.swift:606:5:606:5 | [post] self | test.swift:605:3:607:3 | self[return] | +| test.swift:606:5:606:5 | self | test.swift:605:3:607:3 | self[return] | +| test.swift:611:9:611:9 | SSA def(s) | test.swift:612:29:612:29 | s | +| test.swift:611:9:611:9 | s | test.swift:611:9:611:9 | SSA def(s) | +| test.swift:611:13:611:26 | call to S.init(x:) | test.swift:611:9:611:9 | s | +| test.swift:612:9:612:9 | SSA def(s2) | test.swift:614:15:614:15 | s2 | +| test.swift:612:9:612:9 | s2 | test.swift:612:9:612:9 | SSA def(s2) | +| test.swift:612:14:612:30 | call to S2_Optional.init(s:) | test.swift:612:9:612:9 | s2 | +| test.swift:613:9:613:9 | SSA def(f) | test.swift:614:27:614:27 | f | +| test.swift:613:9:613:9 | f | test.swift:613:9:613:9 | SSA def(f) | +| test.swift:613:13:613:29 | #keyPath(...) | test.swift:613:9:613:9 | f | +| test.swift:613:13:613:29 | enter #keyPath(...) | test.swift:613:26:613:26 | KeyPathComponent | diff --git a/swift/ql/test/library-tests/dataflow/dataflow/test.swift b/swift/ql/test/library-tests/dataflow/dataflow/test.swift index 8fa01273d20..e3a74f920ef 100644 --- a/swift/ql/test/library-tests/dataflow/dataflow/test.swift +++ b/swift/ql/test/library-tests/dataflow/dataflow/test.swift @@ -560,3 +560,56 @@ func inoutConstructor() { var n = 0 sink(arg: InoutConstructorClass(&n)) } + +struct S { + let x: Int + + init(x: Int) { + self.x = x + } +} + +func testKeyPath() { + let s = S(x: source()) + let f = \S.x + sink(arg: s[keyPath: f]) // $ flow=573 + + let inferred : KeyPath = \.x + sink(arg: s[keyPath: inferred]) // $ flow=573 +} + +struct S2 { + let s: S + + init(s: S) { + self.s = s + } +} + +func testNestedKeyPath() { + let s = S(x: source()) + let s2 = S2(s: s) + let f = \S2.s.x + sink(arg: s2[keyPath: f]) // $ flow=590 +} + +func testArrayKeyPath() { + let array = [source()] + let f = \[Int].[0] + sink(arg: array[keyPath: f]) // $ MISSING: flow=597 +} + +struct S2_Optional { + let s: S? + + init(s: S?) { + self.s = s + } +} + +func testOptionalKeyPath() { + let s = S(x: source()) + let s2 = S2_Optional(s: s) + let f = \S2_Optional.s?.x + sink(opt: s2[keyPath: f]) // $ MISSING: flow=611 +} \ No newline at end of file diff --git a/swift/ql/test/library-tests/dataflow/taint/core/Taint.expected b/swift/ql/test/library-tests/dataflow/taint/core/Taint.expected index 34b86a2a5bf..b7c91003b01 100644 --- a/swift/ql/test/library-tests/dataflow/taint/core/Taint.expected +++ b/swift/ql/test/library-tests/dataflow/taint/core/Taint.expected @@ -1,243 +1,243 @@ edges -| file://:0:0:0:0 | self [first] : | file://:0:0:0:0 | .first : | -| file://:0:0:0:0 | self [second] : | file://:0:0:0:0 | .second : | -| file://:0:0:0:0 | value : | file://:0:0:0:0 | [post] self [first] : | -| file://:0:0:0:0 | value : | file://:0:0:0:0 | [post] self [second] : | -| simple.swift:12:17:12:24 | call to source() : | simple.swift:12:13:12:24 | ... .+(_:_:) ... | -| simple.swift:13:13:13:20 | call to source() : | simple.swift:13:13:13:24 | ... .+(_:_:) ... | -| simple.swift:14:17:14:24 | call to source() : | simple.swift:14:13:14:24 | ... .-(_:_:) ... | -| simple.swift:15:13:15:20 | call to source() : | simple.swift:15:13:15:24 | ... .-(_:_:) ... | -| simple.swift:16:17:16:24 | call to source() : | simple.swift:16:13:16:24 | ... .*(_:_:) ... | -| simple.swift:17:13:17:20 | call to source() : | simple.swift:17:13:17:24 | ... .*(_:_:) ... | -| simple.swift:18:19:18:26 | call to source() : | simple.swift:18:13:18:26 | ... ./(_:_:) ... | -| simple.swift:19:13:19:20 | call to source() : | simple.swift:19:13:19:24 | ... ./(_:_:) ... | -| simple.swift:20:19:20:26 | call to source() : | simple.swift:20:13:20:26 | ... .%(_:_:) ... | -| simple.swift:21:13:21:20 | call to source() : | simple.swift:21:13:21:24 | ... .%(_:_:) ... | -| simple.swift:23:14:23:21 | call to source() : | simple.swift:23:13:23:21 | call to -(_:) | -| simple.swift:27:18:27:25 | call to source() : | simple.swift:27:13:27:25 | ... .&+(_:_:) ... | -| simple.swift:28:13:28:20 | call to source() : | simple.swift:28:13:28:25 | ... .&+(_:_:) ... | -| simple.swift:29:18:29:25 | call to source() : | simple.swift:29:13:29:25 | ... .&-(_:_:) ... | -| simple.swift:30:13:30:20 | call to source() : | simple.swift:30:13:30:25 | ... .&-(_:_:) ... | -| simple.swift:31:18:31:25 | call to source() : | simple.swift:31:13:31:25 | ... .&*(_:_:) ... | -| simple.swift:32:13:32:20 | call to source() : | simple.swift:32:13:32:25 | ... .&*(_:_:) ... | -| simple.swift:40:8:40:15 | call to source() : | simple.swift:41:13:41:13 | a | -| simple.swift:40:8:40:15 | call to source() : | simple.swift:43:13:43:13 | a | -| simple.swift:48:8:48:15 | call to source() : | simple.swift:49:13:49:13 | b | -| simple.swift:48:8:48:15 | call to source() : | simple.swift:51:13:51:13 | b | -| simple.swift:54:8:54:15 | call to source() : | simple.swift:55:13:55:13 | c | -| simple.swift:54:8:54:15 | call to source() : | simple.swift:57:13:57:13 | c | -| simple.swift:60:8:60:15 | call to source() : | simple.swift:61:13:61:13 | d | -| simple.swift:60:8:60:15 | call to source() : | simple.swift:63:13:63:13 | d | -| simple.swift:66:8:66:15 | call to source() : | simple.swift:67:13:67:13 | e | -| simple.swift:66:8:66:15 | call to source() : | simple.swift:69:13:69:13 | e | -| simple.swift:73:17:73:24 | call to source() : | simple.swift:73:13:73:24 | ... .\|(_:_:) ... | -| simple.swift:74:13:74:20 | call to source() : | simple.swift:74:13:74:24 | ... .\|(_:_:) ... | -| simple.swift:76:22:76:29 | call to source() : | simple.swift:76:13:76:29 | ... .&(_:_:) ... | -| simple.swift:77:13:77:20 | call to source() : | simple.swift:77:13:77:24 | ... .&(_:_:) ... | -| simple.swift:79:22:79:29 | call to source() : | simple.swift:79:13:79:29 | ... .^(_:_:) ... | -| simple.swift:80:13:80:20 | call to source() : | simple.swift:80:13:80:24 | ... .^(_:_:) ... | -| simple.swift:82:13:82:20 | call to source() : | simple.swift:82:13:82:25 | ... .<<(_:_:) ... | -| simple.swift:83:13:83:20 | call to source() : | simple.swift:83:13:83:26 | ... .&<<(_:_:) ... | -| simple.swift:84:13:84:20 | call to source() : | simple.swift:84:13:84:25 | ... .>>(_:_:) ... | -| simple.swift:85:13:85:20 | call to source() : | simple.swift:85:13:85:26 | ... .&>>(_:_:) ... | -| simple.swift:87:14:87:21 | call to source() : | simple.swift:87:13:87:21 | call to ~(_:) | -| stringinterpolation.swift:6:6:6:6 | self [first] : | file://:0:0:0:0 | self [first] : | -| stringinterpolation.swift:6:6:6:6 | value : | file://:0:0:0:0 | value : | -| stringinterpolation.swift:7:6:7:6 | self [second] : | file://:0:0:0:0 | self [second] : | -| stringinterpolation.swift:7:6:7:6 | value : | file://:0:0:0:0 | value : | -| stringinterpolation.swift:11:36:11:44 | pair [first] : | stringinterpolation.swift:13:36:13:36 | pair [first] : | -| stringinterpolation.swift:13:3:13:3 | [post] &... : | stringinterpolation.swift:11:11:14:2 | self[return] : | -| stringinterpolation.swift:13:36:13:36 | pair [first] : | stringinterpolation.swift:6:6:6:6 | self [first] : | -| stringinterpolation.swift:13:36:13:36 | pair [first] : | stringinterpolation.swift:13:36:13:41 | .first : | -| stringinterpolation.swift:13:36:13:41 | .first : | stringinterpolation.swift:11:11:14:2 | self[return] : | -| stringinterpolation.swift:13:36:13:41 | .first : | stringinterpolation.swift:13:3:13:3 | [post] &... : | -| stringinterpolation.swift:19:2:19:2 | [post] p1 [first] : | stringinterpolation.swift:20:2:20:2 | p1 [first] : | -| stringinterpolation.swift:19:13:19:20 | call to source() : | stringinterpolation.swift:6:6:6:6 | value : | -| stringinterpolation.swift:19:13:19:20 | call to source() : | stringinterpolation.swift:19:2:19:2 | [post] p1 [first] : | -| stringinterpolation.swift:20:2:20:2 | p1 [first] : | stringinterpolation.swift:22:21:22:21 | p1 [first] : | -| stringinterpolation.swift:20:2:20:2 | p1 [first] : | stringinterpolation.swift:24:21:24:21 | p1 [first] : | -| stringinterpolation.swift:22:21:22:21 | p1 [first] : | stringinterpolation.swift:6:6:6:6 | self [first] : | -| stringinterpolation.swift:22:21:22:21 | p1 [first] : | stringinterpolation.swift:22:21:22:24 | .first : | -| stringinterpolation.swift:22:21:22:24 | .first : | stringinterpolation.swift:22:12:22:12 | "..." | -| stringinterpolation.swift:24:20:24:20 | [post] &... : | stringinterpolation.swift:24:12:24:12 | "..." | -| stringinterpolation.swift:24:21:24:21 | p1 [first] : | stringinterpolation.swift:11:36:11:44 | pair [first] : | -| stringinterpolation.swift:24:21:24:21 | p1 [first] : | stringinterpolation.swift:24:20:24:20 | [post] &... : | -| stringinterpolation.swift:28:2:28:2 | [post] p2 [second] : | stringinterpolation.swift:31:21:31:21 | p2 [second] : | -| stringinterpolation.swift:28:14:28:21 | call to source() : | stringinterpolation.swift:7:6:7:6 | value : | -| stringinterpolation.swift:28:14:28:21 | call to source() : | stringinterpolation.swift:28:2:28:2 | [post] p2 [second] : | -| stringinterpolation.swift:31:21:31:21 | p2 [second] : | stringinterpolation.swift:7:6:7:6 | self [second] : | -| stringinterpolation.swift:31:21:31:21 | p2 [second] : | stringinterpolation.swift:31:21:31:24 | .second : | -| stringinterpolation.swift:31:21:31:24 | .second : | stringinterpolation.swift:31:12:31:12 | "..." | -| subscript.swift:13:15:13:22 | call to source() : | subscript.swift:13:15:13:25 | ...[...] | -| subscript.swift:14:15:14:23 | call to source2() : | subscript.swift:14:15:14:26 | ...[...] | -| try.swift:9:17:9:24 | call to source() : | try.swift:9:13:9:24 | try ... | -| try.swift:15:17:15:24 | call to source() : | try.swift:15:12:15:24 | try! ... | -| try.swift:18:18:18:25 | call to source() : | try.swift:18:12:18:27 | ...! | +| file://:0:0:0:0 | self [first] | file://:0:0:0:0 | .first | +| file://:0:0:0:0 | self [second] | file://:0:0:0:0 | .second | +| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [first] | +| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [second] | +| simple.swift:12:17:12:24 | call to source() | simple.swift:12:13:12:24 | ... .+(_:_:) ... | +| simple.swift:13:13:13:20 | call to source() | simple.swift:13:13:13:24 | ... .+(_:_:) ... | +| simple.swift:14:17:14:24 | call to source() | simple.swift:14:13:14:24 | ... .-(_:_:) ... | +| simple.swift:15:13:15:20 | call to source() | simple.swift:15:13:15:24 | ... .-(_:_:) ... | +| simple.swift:16:17:16:24 | call to source() | simple.swift:16:13:16:24 | ... .*(_:_:) ... | +| simple.swift:17:13:17:20 | call to source() | simple.swift:17:13:17:24 | ... .*(_:_:) ... | +| simple.swift:18:19:18:26 | call to source() | simple.swift:18:13:18:26 | ... ./(_:_:) ... | +| simple.swift:19:13:19:20 | call to source() | simple.swift:19:13:19:24 | ... ./(_:_:) ... | +| simple.swift:20:19:20:26 | call to source() | simple.swift:20:13:20:26 | ... .%(_:_:) ... | +| simple.swift:21:13:21:20 | call to source() | simple.swift:21:13:21:24 | ... .%(_:_:) ... | +| simple.swift:23:14:23:21 | call to source() | simple.swift:23:13:23:21 | call to -(_:) | +| simple.swift:27:18:27:25 | call to source() | simple.swift:27:13:27:25 | ... .&+(_:_:) ... | +| simple.swift:28:13:28:20 | call to source() | simple.swift:28:13:28:25 | ... .&+(_:_:) ... | +| simple.swift:29:18:29:25 | call to source() | simple.swift:29:13:29:25 | ... .&-(_:_:) ... | +| simple.swift:30:13:30:20 | call to source() | simple.swift:30:13:30:25 | ... .&-(_:_:) ... | +| simple.swift:31:18:31:25 | call to source() | simple.swift:31:13:31:25 | ... .&*(_:_:) ... | +| simple.swift:32:13:32:20 | call to source() | simple.swift:32:13:32:25 | ... .&*(_:_:) ... | +| simple.swift:40:8:40:15 | call to source() | simple.swift:41:13:41:13 | a | +| simple.swift:40:8:40:15 | call to source() | simple.swift:43:13:43:13 | a | +| simple.swift:48:8:48:15 | call to source() | simple.swift:49:13:49:13 | b | +| simple.swift:48:8:48:15 | call to source() | simple.swift:51:13:51:13 | b | +| simple.swift:54:8:54:15 | call to source() | simple.swift:55:13:55:13 | c | +| simple.swift:54:8:54:15 | call to source() | simple.swift:57:13:57:13 | c | +| simple.swift:60:8:60:15 | call to source() | simple.swift:61:13:61:13 | d | +| simple.swift:60:8:60:15 | call to source() | simple.swift:63:13:63:13 | d | +| simple.swift:66:8:66:15 | call to source() | simple.swift:67:13:67:13 | e | +| simple.swift:66:8:66:15 | call to source() | simple.swift:69:13:69:13 | e | +| simple.swift:73:17:73:24 | call to source() | simple.swift:73:13:73:24 | ... .\|(_:_:) ... | +| simple.swift:74:13:74:20 | call to source() | simple.swift:74:13:74:24 | ... .\|(_:_:) ... | +| simple.swift:76:22:76:29 | call to source() | simple.swift:76:13:76:29 | ... .&(_:_:) ... | +| simple.swift:77:13:77:20 | call to source() | simple.swift:77:13:77:24 | ... .&(_:_:) ... | +| simple.swift:79:22:79:29 | call to source() | simple.swift:79:13:79:29 | ... .^(_:_:) ... | +| simple.swift:80:13:80:20 | call to source() | simple.swift:80:13:80:24 | ... .^(_:_:) ... | +| simple.swift:82:13:82:20 | call to source() | simple.swift:82:13:82:25 | ... .<<(_:_:) ... | +| simple.swift:83:13:83:20 | call to source() | simple.swift:83:13:83:26 | ... .&<<(_:_:) ... | +| simple.swift:84:13:84:20 | call to source() | simple.swift:84:13:84:25 | ... .>>(_:_:) ... | +| simple.swift:85:13:85:20 | call to source() | simple.swift:85:13:85:26 | ... .&>>(_:_:) ... | +| simple.swift:87:14:87:21 | call to source() | simple.swift:87:13:87:21 | call to ~(_:) | +| stringinterpolation.swift:6:6:6:6 | self [first] | file://:0:0:0:0 | self [first] | +| stringinterpolation.swift:6:6:6:6 | value | file://:0:0:0:0 | value | +| stringinterpolation.swift:7:6:7:6 | self [second] | file://:0:0:0:0 | self [second] | +| stringinterpolation.swift:7:6:7:6 | value | file://:0:0:0:0 | value | +| stringinterpolation.swift:11:36:11:44 | pair [first] | stringinterpolation.swift:13:36:13:36 | pair [first] | +| stringinterpolation.swift:13:3:13:3 | [post] &... | stringinterpolation.swift:11:11:14:2 | self[return] | +| stringinterpolation.swift:13:36:13:36 | pair [first] | stringinterpolation.swift:6:6:6:6 | self [first] | +| stringinterpolation.swift:13:36:13:36 | pair [first] | stringinterpolation.swift:13:36:13:41 | .first | +| stringinterpolation.swift:13:36:13:41 | .first | stringinterpolation.swift:11:11:14:2 | self[return] | +| stringinterpolation.swift:13:36:13:41 | .first | stringinterpolation.swift:13:3:13:3 | [post] &... | +| stringinterpolation.swift:19:2:19:2 | [post] p1 [first] | stringinterpolation.swift:20:2:20:2 | p1 [first] | +| stringinterpolation.swift:19:13:19:20 | call to source() | stringinterpolation.swift:6:6:6:6 | value | +| stringinterpolation.swift:19:13:19:20 | call to source() | stringinterpolation.swift:19:2:19:2 | [post] p1 [first] | +| stringinterpolation.swift:20:2:20:2 | p1 [first] | stringinterpolation.swift:22:21:22:21 | p1 [first] | +| stringinterpolation.swift:20:2:20:2 | p1 [first] | stringinterpolation.swift:24:21:24:21 | p1 [first] | +| stringinterpolation.swift:22:21:22:21 | p1 [first] | stringinterpolation.swift:6:6:6:6 | self [first] | +| stringinterpolation.swift:22:21:22:21 | p1 [first] | stringinterpolation.swift:22:21:22:24 | .first | +| stringinterpolation.swift:22:21:22:24 | .first | stringinterpolation.swift:22:12:22:12 | "..." | +| stringinterpolation.swift:24:20:24:20 | [post] &... | stringinterpolation.swift:24:12:24:12 | "..." | +| stringinterpolation.swift:24:21:24:21 | p1 [first] | stringinterpolation.swift:11:36:11:44 | pair [first] | +| stringinterpolation.swift:24:21:24:21 | p1 [first] | stringinterpolation.swift:24:20:24:20 | [post] &... | +| stringinterpolation.swift:28:2:28:2 | [post] p2 [second] | stringinterpolation.swift:31:21:31:21 | p2 [second] | +| stringinterpolation.swift:28:14:28:21 | call to source() | stringinterpolation.swift:7:6:7:6 | value | +| stringinterpolation.swift:28:14:28:21 | call to source() | stringinterpolation.swift:28:2:28:2 | [post] p2 [second] | +| stringinterpolation.swift:31:21:31:21 | p2 [second] | stringinterpolation.swift:7:6:7:6 | self [second] | +| stringinterpolation.swift:31:21:31:21 | p2 [second] | stringinterpolation.swift:31:21:31:24 | .second | +| stringinterpolation.swift:31:21:31:24 | .second | stringinterpolation.swift:31:12:31:12 | "..." | +| subscript.swift:13:15:13:22 | call to source() | subscript.swift:13:15:13:25 | ...[...] | +| subscript.swift:14:15:14:23 | call to source2() | subscript.swift:14:15:14:26 | ...[...] | +| try.swift:9:17:9:24 | call to source() | try.swift:9:13:9:24 | try ... | +| try.swift:15:17:15:24 | call to source() | try.swift:15:12:15:24 | try! ... | +| try.swift:18:18:18:25 | call to source() | try.swift:18:12:18:27 | ...! | nodes -| file://:0:0:0:0 | .first : | semmle.label | .first : | -| file://:0:0:0:0 | .second : | semmle.label | .second : | -| file://:0:0:0:0 | [post] self [first] : | semmle.label | [post] self [first] : | -| file://:0:0:0:0 | [post] self [second] : | semmle.label | [post] self [second] : | -| file://:0:0:0:0 | self [first] : | semmle.label | self [first] : | -| file://:0:0:0:0 | self [second] : | semmle.label | self [second] : | -| file://:0:0:0:0 | value : | semmle.label | value : | -| file://:0:0:0:0 | value : | semmle.label | value : | +| file://:0:0:0:0 | .first | semmle.label | .first | +| file://:0:0:0:0 | .second | semmle.label | .second | +| file://:0:0:0:0 | [post] self [first] | semmle.label | [post] self [first] | +| file://:0:0:0:0 | [post] self [second] | semmle.label | [post] self [second] | +| file://:0:0:0:0 | self [first] | semmle.label | self [first] | +| file://:0:0:0:0 | self [second] | semmle.label | self [second] | +| file://:0:0:0:0 | value | semmle.label | value | +| file://:0:0:0:0 | value | semmle.label | value | | simple.swift:12:13:12:24 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | -| simple.swift:12:17:12:24 | call to source() : | semmle.label | call to source() : | -| simple.swift:13:13:13:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:12:17:12:24 | call to source() | semmle.label | call to source() | +| simple.swift:13:13:13:20 | call to source() | semmle.label | call to source() | | simple.swift:13:13:13:24 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | | simple.swift:14:13:14:24 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| simple.swift:14:17:14:24 | call to source() : | semmle.label | call to source() : | -| simple.swift:15:13:15:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:14:17:14:24 | call to source() | semmle.label | call to source() | +| simple.swift:15:13:15:20 | call to source() | semmle.label | call to source() | | simple.swift:15:13:15:24 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | | simple.swift:16:13:16:24 | ... .*(_:_:) ... | semmle.label | ... .*(_:_:) ... | -| simple.swift:16:17:16:24 | call to source() : | semmle.label | call to source() : | -| simple.swift:17:13:17:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:16:17:16:24 | call to source() | semmle.label | call to source() | +| simple.swift:17:13:17:20 | call to source() | semmle.label | call to source() | | simple.swift:17:13:17:24 | ... .*(_:_:) ... | semmle.label | ... .*(_:_:) ... | | simple.swift:18:13:18:26 | ... ./(_:_:) ... | semmle.label | ... ./(_:_:) ... | -| simple.swift:18:19:18:26 | call to source() : | semmle.label | call to source() : | -| simple.swift:19:13:19:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:18:19:18:26 | call to source() | semmle.label | call to source() | +| simple.swift:19:13:19:20 | call to source() | semmle.label | call to source() | | simple.swift:19:13:19:24 | ... ./(_:_:) ... | semmle.label | ... ./(_:_:) ... | | simple.swift:20:13:20:26 | ... .%(_:_:) ... | semmle.label | ... .%(_:_:) ... | -| simple.swift:20:19:20:26 | call to source() : | semmle.label | call to source() : | -| simple.swift:21:13:21:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:20:19:20:26 | call to source() | semmle.label | call to source() | +| simple.swift:21:13:21:20 | call to source() | semmle.label | call to source() | | simple.swift:21:13:21:24 | ... .%(_:_:) ... | semmle.label | ... .%(_:_:) ... | | simple.swift:23:13:23:21 | call to -(_:) | semmle.label | call to -(_:) | -| simple.swift:23:14:23:21 | call to source() : | semmle.label | call to source() : | +| simple.swift:23:14:23:21 | call to source() | semmle.label | call to source() | | simple.swift:27:13:27:25 | ... .&+(_:_:) ... | semmle.label | ... .&+(_:_:) ... | -| simple.swift:27:18:27:25 | call to source() : | semmle.label | call to source() : | -| simple.swift:28:13:28:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:27:18:27:25 | call to source() | semmle.label | call to source() | +| simple.swift:28:13:28:20 | call to source() | semmle.label | call to source() | | simple.swift:28:13:28:25 | ... .&+(_:_:) ... | semmle.label | ... .&+(_:_:) ... | | simple.swift:29:13:29:25 | ... .&-(_:_:) ... | semmle.label | ... .&-(_:_:) ... | -| simple.swift:29:18:29:25 | call to source() : | semmle.label | call to source() : | -| simple.swift:30:13:30:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:29:18:29:25 | call to source() | semmle.label | call to source() | +| simple.swift:30:13:30:20 | call to source() | semmle.label | call to source() | | simple.swift:30:13:30:25 | ... .&-(_:_:) ... | semmle.label | ... .&-(_:_:) ... | | simple.swift:31:13:31:25 | ... .&*(_:_:) ... | semmle.label | ... .&*(_:_:) ... | -| simple.swift:31:18:31:25 | call to source() : | semmle.label | call to source() : | -| simple.swift:32:13:32:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:31:18:31:25 | call to source() | semmle.label | call to source() | +| simple.swift:32:13:32:20 | call to source() | semmle.label | call to source() | | simple.swift:32:13:32:25 | ... .&*(_:_:) ... | semmle.label | ... .&*(_:_:) ... | -| simple.swift:40:8:40:15 | call to source() : | semmle.label | call to source() : | +| simple.swift:40:8:40:15 | call to source() | semmle.label | call to source() | | simple.swift:41:13:41:13 | a | semmle.label | a | | simple.swift:43:13:43:13 | a | semmle.label | a | -| simple.swift:48:8:48:15 | call to source() : | semmle.label | call to source() : | +| simple.swift:48:8:48:15 | call to source() | semmle.label | call to source() | | simple.swift:49:13:49:13 | b | semmle.label | b | | simple.swift:51:13:51:13 | b | semmle.label | b | -| simple.swift:54:8:54:15 | call to source() : | semmle.label | call to source() : | +| simple.swift:54:8:54:15 | call to source() | semmle.label | call to source() | | simple.swift:55:13:55:13 | c | semmle.label | c | | simple.swift:57:13:57:13 | c | semmle.label | c | -| simple.swift:60:8:60:15 | call to source() : | semmle.label | call to source() : | +| simple.swift:60:8:60:15 | call to source() | semmle.label | call to source() | | simple.swift:61:13:61:13 | d | semmle.label | d | | simple.swift:63:13:63:13 | d | semmle.label | d | -| simple.swift:66:8:66:15 | call to source() : | semmle.label | call to source() : | +| simple.swift:66:8:66:15 | call to source() | semmle.label | call to source() | | simple.swift:67:13:67:13 | e | semmle.label | e | | simple.swift:69:13:69:13 | e | semmle.label | e | | simple.swift:73:13:73:24 | ... .\|(_:_:) ... | semmle.label | ... .\|(_:_:) ... | -| simple.swift:73:17:73:24 | call to source() : | semmle.label | call to source() : | -| simple.swift:74:13:74:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:73:17:73:24 | call to source() | semmle.label | call to source() | +| simple.swift:74:13:74:20 | call to source() | semmle.label | call to source() | | simple.swift:74:13:74:24 | ... .\|(_:_:) ... | semmle.label | ... .\|(_:_:) ... | | simple.swift:76:13:76:29 | ... .&(_:_:) ... | semmle.label | ... .&(_:_:) ... | -| simple.swift:76:22:76:29 | call to source() : | semmle.label | call to source() : | -| simple.swift:77:13:77:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:76:22:76:29 | call to source() | semmle.label | call to source() | +| simple.swift:77:13:77:20 | call to source() | semmle.label | call to source() | | simple.swift:77:13:77:24 | ... .&(_:_:) ... | semmle.label | ... .&(_:_:) ... | | simple.swift:79:13:79:29 | ... .^(_:_:) ... | semmle.label | ... .^(_:_:) ... | -| simple.swift:79:22:79:29 | call to source() : | semmle.label | call to source() : | -| simple.swift:80:13:80:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:79:22:79:29 | call to source() | semmle.label | call to source() | +| simple.swift:80:13:80:20 | call to source() | semmle.label | call to source() | | simple.swift:80:13:80:24 | ... .^(_:_:) ... | semmle.label | ... .^(_:_:) ... | -| simple.swift:82:13:82:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:82:13:82:20 | call to source() | semmle.label | call to source() | | simple.swift:82:13:82:25 | ... .<<(_:_:) ... | semmle.label | ... .<<(_:_:) ... | -| simple.swift:83:13:83:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:83:13:83:20 | call to source() | semmle.label | call to source() | | simple.swift:83:13:83:26 | ... .&<<(_:_:) ... | semmle.label | ... .&<<(_:_:) ... | -| simple.swift:84:13:84:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:84:13:84:20 | call to source() | semmle.label | call to source() | | simple.swift:84:13:84:25 | ... .>>(_:_:) ... | semmle.label | ... .>>(_:_:) ... | -| simple.swift:85:13:85:20 | call to source() : | semmle.label | call to source() : | +| simple.swift:85:13:85:20 | call to source() | semmle.label | call to source() | | simple.swift:85:13:85:26 | ... .&>>(_:_:) ... | semmle.label | ... .&>>(_:_:) ... | | simple.swift:87:13:87:21 | call to ~(_:) | semmle.label | call to ~(_:) | -| simple.swift:87:14:87:21 | call to source() : | semmle.label | call to source() : | -| stringinterpolation.swift:6:6:6:6 | self [first] : | semmle.label | self [first] : | -| stringinterpolation.swift:6:6:6:6 | value : | semmle.label | value : | -| stringinterpolation.swift:7:6:7:6 | self [second] : | semmle.label | self [second] : | -| stringinterpolation.swift:7:6:7:6 | value : | semmle.label | value : | -| stringinterpolation.swift:11:11:14:2 | self[return] : | semmle.label | self[return] : | -| stringinterpolation.swift:11:36:11:44 | pair [first] : | semmle.label | pair [first] : | -| stringinterpolation.swift:13:3:13:3 | [post] &... : | semmle.label | [post] &... : | -| stringinterpolation.swift:13:36:13:36 | pair [first] : | semmle.label | pair [first] : | -| stringinterpolation.swift:13:36:13:41 | .first : | semmle.label | .first : | -| stringinterpolation.swift:19:2:19:2 | [post] p1 [first] : | semmle.label | [post] p1 [first] : | -| stringinterpolation.swift:19:13:19:20 | call to source() : | semmle.label | call to source() : | -| stringinterpolation.swift:20:2:20:2 | p1 [first] : | semmle.label | p1 [first] : | +| simple.swift:87:14:87:21 | call to source() | semmle.label | call to source() | +| stringinterpolation.swift:6:6:6:6 | self [first] | semmle.label | self [first] | +| stringinterpolation.swift:6:6:6:6 | value | semmle.label | value | +| stringinterpolation.swift:7:6:7:6 | self [second] | semmle.label | self [second] | +| stringinterpolation.swift:7:6:7:6 | value | semmle.label | value | +| stringinterpolation.swift:11:11:14:2 | self[return] | semmle.label | self[return] | +| stringinterpolation.swift:11:36:11:44 | pair [first] | semmle.label | pair [first] | +| stringinterpolation.swift:13:3:13:3 | [post] &... | semmle.label | [post] &... | +| stringinterpolation.swift:13:36:13:36 | pair [first] | semmle.label | pair [first] | +| stringinterpolation.swift:13:36:13:41 | .first | semmle.label | .first | +| stringinterpolation.swift:19:2:19:2 | [post] p1 [first] | semmle.label | [post] p1 [first] | +| stringinterpolation.swift:19:13:19:20 | call to source() | semmle.label | call to source() | +| stringinterpolation.swift:20:2:20:2 | p1 [first] | semmle.label | p1 [first] | | stringinterpolation.swift:22:12:22:12 | "..." | semmle.label | "..." | -| stringinterpolation.swift:22:21:22:21 | p1 [first] : | semmle.label | p1 [first] : | -| stringinterpolation.swift:22:21:22:24 | .first : | semmle.label | .first : | +| stringinterpolation.swift:22:21:22:21 | p1 [first] | semmle.label | p1 [first] | +| stringinterpolation.swift:22:21:22:24 | .first | semmle.label | .first | | stringinterpolation.swift:24:12:24:12 | "..." | semmle.label | "..." | -| stringinterpolation.swift:24:20:24:20 | [post] &... : | semmle.label | [post] &... : | -| stringinterpolation.swift:24:21:24:21 | p1 [first] : | semmle.label | p1 [first] : | -| stringinterpolation.swift:28:2:28:2 | [post] p2 [second] : | semmle.label | [post] p2 [second] : | -| stringinterpolation.swift:28:14:28:21 | call to source() : | semmle.label | call to source() : | +| stringinterpolation.swift:24:20:24:20 | [post] &... | semmle.label | [post] &... | +| stringinterpolation.swift:24:21:24:21 | p1 [first] | semmle.label | p1 [first] | +| stringinterpolation.swift:28:2:28:2 | [post] p2 [second] | semmle.label | [post] p2 [second] | +| stringinterpolation.swift:28:14:28:21 | call to source() | semmle.label | call to source() | | stringinterpolation.swift:31:12:31:12 | "..." | semmle.label | "..." | -| stringinterpolation.swift:31:21:31:21 | p2 [second] : | semmle.label | p2 [second] : | -| stringinterpolation.swift:31:21:31:24 | .second : | semmle.label | .second : | -| subscript.swift:13:15:13:22 | call to source() : | semmle.label | call to source() : | +| stringinterpolation.swift:31:21:31:21 | p2 [second] | semmle.label | p2 [second] | +| stringinterpolation.swift:31:21:31:24 | .second | semmle.label | .second | +| subscript.swift:13:15:13:22 | call to source() | semmle.label | call to source() | | subscript.swift:13:15:13:25 | ...[...] | semmle.label | ...[...] | -| subscript.swift:14:15:14:23 | call to source2() : | semmle.label | call to source2() : | +| subscript.swift:14:15:14:23 | call to source2() | semmle.label | call to source2() | | subscript.swift:14:15:14:26 | ...[...] | semmle.label | ...[...] | | try.swift:9:13:9:24 | try ... | semmle.label | try ... | -| try.swift:9:17:9:24 | call to source() : | semmle.label | call to source() : | +| try.swift:9:17:9:24 | call to source() | semmle.label | call to source() | | try.swift:15:12:15:24 | try! ... | semmle.label | try! ... | -| try.swift:15:17:15:24 | call to source() : | semmle.label | call to source() : | +| try.swift:15:17:15:24 | call to source() | semmle.label | call to source() | | try.swift:18:12:18:27 | ...! | semmle.label | ...! | -| try.swift:18:18:18:25 | call to source() : | semmle.label | call to source() : | +| try.swift:18:18:18:25 | call to source() | semmle.label | call to source() | subpaths -| stringinterpolation.swift:13:36:13:36 | pair [first] : | stringinterpolation.swift:6:6:6:6 | self [first] : | file://:0:0:0:0 | .first : | stringinterpolation.swift:13:36:13:41 | .first : | -| stringinterpolation.swift:19:13:19:20 | call to source() : | stringinterpolation.swift:6:6:6:6 | value : | file://:0:0:0:0 | [post] self [first] : | stringinterpolation.swift:19:2:19:2 | [post] p1 [first] : | -| stringinterpolation.swift:22:21:22:21 | p1 [first] : | stringinterpolation.swift:6:6:6:6 | self [first] : | file://:0:0:0:0 | .first : | stringinterpolation.swift:22:21:22:24 | .first : | -| stringinterpolation.swift:24:21:24:21 | p1 [first] : | stringinterpolation.swift:11:36:11:44 | pair [first] : | stringinterpolation.swift:11:11:14:2 | self[return] : | stringinterpolation.swift:24:20:24:20 | [post] &... : | -| stringinterpolation.swift:24:21:24:21 | p1 [first] : | stringinterpolation.swift:11:36:11:44 | pair [first] : | stringinterpolation.swift:13:3:13:3 | [post] &... : | stringinterpolation.swift:24:20:24:20 | [post] &... : | -| stringinterpolation.swift:28:14:28:21 | call to source() : | stringinterpolation.swift:7:6:7:6 | value : | file://:0:0:0:0 | [post] self [second] : | stringinterpolation.swift:28:2:28:2 | [post] p2 [second] : | -| stringinterpolation.swift:31:21:31:21 | p2 [second] : | stringinterpolation.swift:7:6:7:6 | self [second] : | file://:0:0:0:0 | .second : | stringinterpolation.swift:31:21:31:24 | .second : | +| stringinterpolation.swift:13:36:13:36 | pair [first] | stringinterpolation.swift:6:6:6:6 | self [first] | file://:0:0:0:0 | .first | stringinterpolation.swift:13:36:13:41 | .first | +| stringinterpolation.swift:19:13:19:20 | call to source() | stringinterpolation.swift:6:6:6:6 | value | file://:0:0:0:0 | [post] self [first] | stringinterpolation.swift:19:2:19:2 | [post] p1 [first] | +| stringinterpolation.swift:22:21:22:21 | p1 [first] | stringinterpolation.swift:6:6:6:6 | self [first] | file://:0:0:0:0 | .first | stringinterpolation.swift:22:21:22:24 | .first | +| stringinterpolation.swift:24:21:24:21 | p1 [first] | stringinterpolation.swift:11:36:11:44 | pair [first] | stringinterpolation.swift:11:11:14:2 | self[return] | stringinterpolation.swift:24:20:24:20 | [post] &... | +| stringinterpolation.swift:24:21:24:21 | p1 [first] | stringinterpolation.swift:11:36:11:44 | pair [first] | stringinterpolation.swift:13:3:13:3 | [post] &... | stringinterpolation.swift:24:20:24:20 | [post] &... | +| stringinterpolation.swift:28:14:28:21 | call to source() | stringinterpolation.swift:7:6:7:6 | value | file://:0:0:0:0 | [post] self [second] | stringinterpolation.swift:28:2:28:2 | [post] p2 [second] | +| stringinterpolation.swift:31:21:31:21 | p2 [second] | stringinterpolation.swift:7:6:7:6 | self [second] | file://:0:0:0:0 | .second | stringinterpolation.swift:31:21:31:24 | .second | #select -| simple.swift:12:13:12:24 | ... .+(_:_:) ... | simple.swift:12:17:12:24 | call to source() : | simple.swift:12:13:12:24 | ... .+(_:_:) ... | result | -| simple.swift:13:13:13:24 | ... .+(_:_:) ... | simple.swift:13:13:13:20 | call to source() : | simple.swift:13:13:13:24 | ... .+(_:_:) ... | result | -| simple.swift:14:13:14:24 | ... .-(_:_:) ... | simple.swift:14:17:14:24 | call to source() : | simple.swift:14:13:14:24 | ... .-(_:_:) ... | result | -| simple.swift:15:13:15:24 | ... .-(_:_:) ... | simple.swift:15:13:15:20 | call to source() : | simple.swift:15:13:15:24 | ... .-(_:_:) ... | result | -| simple.swift:16:13:16:24 | ... .*(_:_:) ... | simple.swift:16:17:16:24 | call to source() : | simple.swift:16:13:16:24 | ... .*(_:_:) ... | result | -| simple.swift:17:13:17:24 | ... .*(_:_:) ... | simple.swift:17:13:17:20 | call to source() : | simple.swift:17:13:17:24 | ... .*(_:_:) ... | result | -| simple.swift:18:13:18:26 | ... ./(_:_:) ... | simple.swift:18:19:18:26 | call to source() : | simple.swift:18:13:18:26 | ... ./(_:_:) ... | result | -| simple.swift:19:13:19:24 | ... ./(_:_:) ... | simple.swift:19:13:19:20 | call to source() : | simple.swift:19:13:19:24 | ... ./(_:_:) ... | result | -| simple.swift:20:13:20:26 | ... .%(_:_:) ... | simple.swift:20:19:20:26 | call to source() : | simple.swift:20:13:20:26 | ... .%(_:_:) ... | result | -| simple.swift:21:13:21:24 | ... .%(_:_:) ... | simple.swift:21:13:21:20 | call to source() : | simple.swift:21:13:21:24 | ... .%(_:_:) ... | result | -| simple.swift:23:13:23:21 | call to -(_:) | simple.swift:23:14:23:21 | call to source() : | simple.swift:23:13:23:21 | call to -(_:) | result | -| simple.swift:27:13:27:25 | ... .&+(_:_:) ... | simple.swift:27:18:27:25 | call to source() : | simple.swift:27:13:27:25 | ... .&+(_:_:) ... | result | -| simple.swift:28:13:28:25 | ... .&+(_:_:) ... | simple.swift:28:13:28:20 | call to source() : | simple.swift:28:13:28:25 | ... .&+(_:_:) ... | result | -| simple.swift:29:13:29:25 | ... .&-(_:_:) ... | simple.swift:29:18:29:25 | call to source() : | simple.swift:29:13:29:25 | ... .&-(_:_:) ... | result | -| simple.swift:30:13:30:25 | ... .&-(_:_:) ... | simple.swift:30:13:30:20 | call to source() : | simple.swift:30:13:30:25 | ... .&-(_:_:) ... | result | -| simple.swift:31:13:31:25 | ... .&*(_:_:) ... | simple.swift:31:18:31:25 | call to source() : | simple.swift:31:13:31:25 | ... .&*(_:_:) ... | result | -| simple.swift:32:13:32:25 | ... .&*(_:_:) ... | simple.swift:32:13:32:20 | call to source() : | simple.swift:32:13:32:25 | ... .&*(_:_:) ... | result | -| simple.swift:41:13:41:13 | a | simple.swift:40:8:40:15 | call to source() : | simple.swift:41:13:41:13 | a | result | -| simple.swift:43:13:43:13 | a | simple.swift:40:8:40:15 | call to source() : | simple.swift:43:13:43:13 | a | result | -| simple.swift:49:13:49:13 | b | simple.swift:48:8:48:15 | call to source() : | simple.swift:49:13:49:13 | b | result | -| simple.swift:51:13:51:13 | b | simple.swift:48:8:48:15 | call to source() : | simple.swift:51:13:51:13 | b | result | -| simple.swift:55:13:55:13 | c | simple.swift:54:8:54:15 | call to source() : | simple.swift:55:13:55:13 | c | result | -| simple.swift:57:13:57:13 | c | simple.swift:54:8:54:15 | call to source() : | simple.swift:57:13:57:13 | c | result | -| simple.swift:61:13:61:13 | d | simple.swift:60:8:60:15 | call to source() : | simple.swift:61:13:61:13 | d | result | -| simple.swift:63:13:63:13 | d | simple.swift:60:8:60:15 | call to source() : | simple.swift:63:13:63:13 | d | result | -| simple.swift:67:13:67:13 | e | simple.swift:66:8:66:15 | call to source() : | simple.swift:67:13:67:13 | e | result | -| simple.swift:69:13:69:13 | e | simple.swift:66:8:66:15 | call to source() : | simple.swift:69:13:69:13 | e | result | -| simple.swift:73:13:73:24 | ... .\|(_:_:) ... | simple.swift:73:17:73:24 | call to source() : | simple.swift:73:13:73:24 | ... .\|(_:_:) ... | result | -| simple.swift:74:13:74:24 | ... .\|(_:_:) ... | simple.swift:74:13:74:20 | call to source() : | simple.swift:74:13:74:24 | ... .\|(_:_:) ... | result | -| simple.swift:76:13:76:29 | ... .&(_:_:) ... | simple.swift:76:22:76:29 | call to source() : | simple.swift:76:13:76:29 | ... .&(_:_:) ... | result | -| simple.swift:77:13:77:24 | ... .&(_:_:) ... | simple.swift:77:13:77:20 | call to source() : | simple.swift:77:13:77:24 | ... .&(_:_:) ... | result | -| simple.swift:79:13:79:29 | ... .^(_:_:) ... | simple.swift:79:22:79:29 | call to source() : | simple.swift:79:13:79:29 | ... .^(_:_:) ... | result | -| simple.swift:80:13:80:24 | ... .^(_:_:) ... | simple.swift:80:13:80:20 | call to source() : | simple.swift:80:13:80:24 | ... .^(_:_:) ... | result | -| simple.swift:82:13:82:25 | ... .<<(_:_:) ... | simple.swift:82:13:82:20 | call to source() : | simple.swift:82:13:82:25 | ... .<<(_:_:) ... | result | -| simple.swift:83:13:83:26 | ... .&<<(_:_:) ... | simple.swift:83:13:83:20 | call to source() : | simple.swift:83:13:83:26 | ... .&<<(_:_:) ... | result | -| simple.swift:84:13:84:25 | ... .>>(_:_:) ... | simple.swift:84:13:84:20 | call to source() : | simple.swift:84:13:84:25 | ... .>>(_:_:) ... | result | -| simple.swift:85:13:85:26 | ... .&>>(_:_:) ... | simple.swift:85:13:85:20 | call to source() : | simple.swift:85:13:85:26 | ... .&>>(_:_:) ... | result | -| simple.swift:87:13:87:21 | call to ~(_:) | simple.swift:87:14:87:21 | call to source() : | simple.swift:87:13:87:21 | call to ~(_:) | result | -| stringinterpolation.swift:22:12:22:12 | "..." | stringinterpolation.swift:19:13:19:20 | call to source() : | stringinterpolation.swift:22:12:22:12 | "..." | result | -| stringinterpolation.swift:24:12:24:12 | "..." | stringinterpolation.swift:19:13:19:20 | call to source() : | stringinterpolation.swift:24:12:24:12 | "..." | result | -| stringinterpolation.swift:31:12:31:12 | "..." | stringinterpolation.swift:28:14:28:21 | call to source() : | stringinterpolation.swift:31:12:31:12 | "..." | result | -| subscript.swift:13:15:13:25 | ...[...] | subscript.swift:13:15:13:22 | call to source() : | subscript.swift:13:15:13:25 | ...[...] | result | -| subscript.swift:14:15:14:26 | ...[...] | subscript.swift:14:15:14:23 | call to source2() : | subscript.swift:14:15:14:26 | ...[...] | result | -| try.swift:9:13:9:24 | try ... | try.swift:9:17:9:24 | call to source() : | try.swift:9:13:9:24 | try ... | result | -| try.swift:15:12:15:24 | try! ... | try.swift:15:17:15:24 | call to source() : | try.swift:15:12:15:24 | try! ... | result | -| try.swift:18:12:18:27 | ...! | try.swift:18:18:18:25 | call to source() : | try.swift:18:12:18:27 | ...! | result | +| simple.swift:12:13:12:24 | ... .+(_:_:) ... | simple.swift:12:17:12:24 | call to source() | simple.swift:12:13:12:24 | ... .+(_:_:) ... | result | +| simple.swift:13:13:13:24 | ... .+(_:_:) ... | simple.swift:13:13:13:20 | call to source() | simple.swift:13:13:13:24 | ... .+(_:_:) ... | result | +| simple.swift:14:13:14:24 | ... .-(_:_:) ... | simple.swift:14:17:14:24 | call to source() | simple.swift:14:13:14:24 | ... .-(_:_:) ... | result | +| simple.swift:15:13:15:24 | ... .-(_:_:) ... | simple.swift:15:13:15:20 | call to source() | simple.swift:15:13:15:24 | ... .-(_:_:) ... | result | +| simple.swift:16:13:16:24 | ... .*(_:_:) ... | simple.swift:16:17:16:24 | call to source() | simple.swift:16:13:16:24 | ... .*(_:_:) ... | result | +| simple.swift:17:13:17:24 | ... .*(_:_:) ... | simple.swift:17:13:17:20 | call to source() | simple.swift:17:13:17:24 | ... .*(_:_:) ... | result | +| simple.swift:18:13:18:26 | ... ./(_:_:) ... | simple.swift:18:19:18:26 | call to source() | simple.swift:18:13:18:26 | ... ./(_:_:) ... | result | +| simple.swift:19:13:19:24 | ... ./(_:_:) ... | simple.swift:19:13:19:20 | call to source() | simple.swift:19:13:19:24 | ... ./(_:_:) ... | result | +| simple.swift:20:13:20:26 | ... .%(_:_:) ... | simple.swift:20:19:20:26 | call to source() | simple.swift:20:13:20:26 | ... .%(_:_:) ... | result | +| simple.swift:21:13:21:24 | ... .%(_:_:) ... | simple.swift:21:13:21:20 | call to source() | simple.swift:21:13:21:24 | ... .%(_:_:) ... | result | +| simple.swift:23:13:23:21 | call to -(_:) | simple.swift:23:14:23:21 | call to source() | simple.swift:23:13:23:21 | call to -(_:) | result | +| simple.swift:27:13:27:25 | ... .&+(_:_:) ... | simple.swift:27:18:27:25 | call to source() | simple.swift:27:13:27:25 | ... .&+(_:_:) ... | result | +| simple.swift:28:13:28:25 | ... .&+(_:_:) ... | simple.swift:28:13:28:20 | call to source() | simple.swift:28:13:28:25 | ... .&+(_:_:) ... | result | +| simple.swift:29:13:29:25 | ... .&-(_:_:) ... | simple.swift:29:18:29:25 | call to source() | simple.swift:29:13:29:25 | ... .&-(_:_:) ... | result | +| simple.swift:30:13:30:25 | ... .&-(_:_:) ... | simple.swift:30:13:30:20 | call to source() | simple.swift:30:13:30:25 | ... .&-(_:_:) ... | result | +| simple.swift:31:13:31:25 | ... .&*(_:_:) ... | simple.swift:31:18:31:25 | call to source() | simple.swift:31:13:31:25 | ... .&*(_:_:) ... | result | +| simple.swift:32:13:32:25 | ... .&*(_:_:) ... | simple.swift:32:13:32:20 | call to source() | simple.swift:32:13:32:25 | ... .&*(_:_:) ... | result | +| simple.swift:41:13:41:13 | a | simple.swift:40:8:40:15 | call to source() | simple.swift:41:13:41:13 | a | result | +| simple.swift:43:13:43:13 | a | simple.swift:40:8:40:15 | call to source() | simple.swift:43:13:43:13 | a | result | +| simple.swift:49:13:49:13 | b | simple.swift:48:8:48:15 | call to source() | simple.swift:49:13:49:13 | b | result | +| simple.swift:51:13:51:13 | b | simple.swift:48:8:48:15 | call to source() | simple.swift:51:13:51:13 | b | result | +| simple.swift:55:13:55:13 | c | simple.swift:54:8:54:15 | call to source() | simple.swift:55:13:55:13 | c | result | +| simple.swift:57:13:57:13 | c | simple.swift:54:8:54:15 | call to source() | simple.swift:57:13:57:13 | c | result | +| simple.swift:61:13:61:13 | d | simple.swift:60:8:60:15 | call to source() | simple.swift:61:13:61:13 | d | result | +| simple.swift:63:13:63:13 | d | simple.swift:60:8:60:15 | call to source() | simple.swift:63:13:63:13 | d | result | +| simple.swift:67:13:67:13 | e | simple.swift:66:8:66:15 | call to source() | simple.swift:67:13:67:13 | e | result | +| simple.swift:69:13:69:13 | e | simple.swift:66:8:66:15 | call to source() | simple.swift:69:13:69:13 | e | result | +| simple.swift:73:13:73:24 | ... .\|(_:_:) ... | simple.swift:73:17:73:24 | call to source() | simple.swift:73:13:73:24 | ... .\|(_:_:) ... | result | +| simple.swift:74:13:74:24 | ... .\|(_:_:) ... | simple.swift:74:13:74:20 | call to source() | simple.swift:74:13:74:24 | ... .\|(_:_:) ... | result | +| simple.swift:76:13:76:29 | ... .&(_:_:) ... | simple.swift:76:22:76:29 | call to source() | simple.swift:76:13:76:29 | ... .&(_:_:) ... | result | +| simple.swift:77:13:77:24 | ... .&(_:_:) ... | simple.swift:77:13:77:20 | call to source() | simple.swift:77:13:77:24 | ... .&(_:_:) ... | result | +| simple.swift:79:13:79:29 | ... .^(_:_:) ... | simple.swift:79:22:79:29 | call to source() | simple.swift:79:13:79:29 | ... .^(_:_:) ... | result | +| simple.swift:80:13:80:24 | ... .^(_:_:) ... | simple.swift:80:13:80:20 | call to source() | simple.swift:80:13:80:24 | ... .^(_:_:) ... | result | +| simple.swift:82:13:82:25 | ... .<<(_:_:) ... | simple.swift:82:13:82:20 | call to source() | simple.swift:82:13:82:25 | ... .<<(_:_:) ... | result | +| simple.swift:83:13:83:26 | ... .&<<(_:_:) ... | simple.swift:83:13:83:20 | call to source() | simple.swift:83:13:83:26 | ... .&<<(_:_:) ... | result | +| simple.swift:84:13:84:25 | ... .>>(_:_:) ... | simple.swift:84:13:84:20 | call to source() | simple.swift:84:13:84:25 | ... .>>(_:_:) ... | result | +| simple.swift:85:13:85:26 | ... .&>>(_:_:) ... | simple.swift:85:13:85:20 | call to source() | simple.swift:85:13:85:26 | ... .&>>(_:_:) ... | result | +| simple.swift:87:13:87:21 | call to ~(_:) | simple.swift:87:14:87:21 | call to source() | simple.swift:87:13:87:21 | call to ~(_:) | result | +| stringinterpolation.swift:22:12:22:12 | "..." | stringinterpolation.swift:19:13:19:20 | call to source() | stringinterpolation.swift:22:12:22:12 | "..." | result | +| stringinterpolation.swift:24:12:24:12 | "..." | stringinterpolation.swift:19:13:19:20 | call to source() | stringinterpolation.swift:24:12:24:12 | "..." | result | +| stringinterpolation.swift:31:12:31:12 | "..." | stringinterpolation.swift:28:14:28:21 | call to source() | stringinterpolation.swift:31:12:31:12 | "..." | result | +| subscript.swift:13:15:13:25 | ...[...] | subscript.swift:13:15:13:22 | call to source() | subscript.swift:13:15:13:25 | ...[...] | result | +| subscript.swift:14:15:14:26 | ...[...] | subscript.swift:14:15:14:23 | call to source2() | subscript.swift:14:15:14:26 | ...[...] | result | +| try.swift:9:13:9:24 | try ... | try.swift:9:17:9:24 | call to source() | try.swift:9:13:9:24 | try ... | result | +| try.swift:15:12:15:24 | try! ... | try.swift:15:17:15:24 | call to source() | try.swift:15:12:15:24 | try! ... | result | +| try.swift:18:12:18:27 | ...! | try.swift:18:18:18:25 | call to source() | try.swift:18:12:18:27 | ...! | result | diff --git a/swift/ql/test/library-tests/elements/decl/extensiondecl/extensiondecl.expected b/swift/ql/test/library-tests/elements/decl/extensiondecl/extensiondecl.expected new file mode 100644 index 00000000000..ff5034a7c2b --- /dev/null +++ b/swift/ql/test/library-tests/elements/decl/extensiondecl/extensiondecl.expected @@ -0,0 +1,4 @@ +| extensiondecl.swift:11:1:12:1 | extension of MyClass | getExtendedTypeDecl:MyClass | +| extensiondecl.swift:14:1:15:1 | extension of MyClass | getExtendedTypeDecl:MyClass, getProtocol(0):MyProtocol1, getProtocol(1):MyProtocol2 | +| extensiondecl.swift:17:1:18:1 | extension of Int | getExtendedTypeDecl:Int | +| extensiondecl.swift:20:1:21:1 | extension of String | getExtendedTypeDecl:String | diff --git a/swift/ql/test/library-tests/elements/decl/extensiondecl/extensiondecl.ql b/swift/ql/test/library-tests/elements/decl/extensiondecl/extensiondecl.ql new file mode 100644 index 00000000000..c73bf13b4e2 --- /dev/null +++ b/swift/ql/test/library-tests/elements/decl/extensiondecl/extensiondecl.ql @@ -0,0 +1,11 @@ +import swift + +string describe(ExtensionDecl e) { + result = "getExtendedTypeDecl:" + e.getExtendedTypeDecl().toString() + or + exists(int ix | result = "getProtocol(" + ix.toString() + "):" + e.getProtocol(ix).toString()) +} + +from ExtensionDecl e +where not e.getFile() instanceof UnknownFile +select e, concat(describe(e), ", ") diff --git a/swift/ql/test/library-tests/elements/decl/extensiondecl/extensiondecl.swift b/swift/ql/test/library-tests/elements/decl/extensiondecl/extensiondecl.swift new file mode 100644 index 00000000000..a669f24d1b0 --- /dev/null +++ b/swift/ql/test/library-tests/elements/decl/extensiondecl/extensiondecl.swift @@ -0,0 +1,21 @@ + +protocol MyProtocol1 { +} + +protocol MyProtocol2 { +} + +class MyClass { +} + +extension MyClass { +} + +extension MyClass : MyProtocol1, MyProtocol2 { +} + +extension Int { +} + +extension String { +} diff --git a/swift/ql/test/query-tests/Security/CWE-022/testPathInjection.swift b/swift/ql/test/query-tests/Security/CWE-022/testPathInjection.swift index bceeaf1a1ed..b614cfb5314 100644 --- a/swift/ql/test/query-tests/Security/CWE-022/testPathInjection.swift +++ b/swift/ql/test/query-tests/Security/CWE-022/testPathInjection.swift @@ -2,6 +2,7 @@ struct URL { init?(string: String) {} + init(fileURLWithPath path: String, isDirectory: Bool) {} } class NSURL { @@ -176,6 +177,31 @@ class SerializedDatabase { init(path: String, configuration: Configuration = Configuration(), defaultLabel: String, purpose: String? = nil) {} } +// Realm + +class Realm { +} + +extension Realm { + struct Configuration { + init( + fileURL: URL? = URL(fileURLWithPath: "defaultFile", isDirectory: false), + inMemoryIdentifier: String? = nil, + syncConfiguration: Int = 0, + encryptionKey: Data? = nil, + readOnly: Bool = false, + schemaVersion: UInt64 = 0, + migrationBlock: Int = 0, + deleteRealmIfMigrationNeeded: Bool = false, + shouldCompactOnLaunch: Bool = false, + objectTypes: Int = 0, + seedFilePath: URL? = nil) { } + + var fileURL: URL? + var seedFilePath: URL? + } +} + // --- tests --- func test() { @@ -185,100 +211,115 @@ func test() { let safeUrl = URL(string: "")! let safeNsUrl = NSURL(string: "")! - Data("").write(to: remoteUrl, options: []) // $ hasPathInjection=182 + Data("").write(to: remoteUrl, options: []) // $ hasPathInjection=208 let nsData = NSData() - let _ = nsData.write(to: remoteUrl, atomically: false) // $ hasPathInjection=182 - nsData.write(to: remoteUrl, options: []) // $ hasPathInjection=182 - let _ = nsData.write(toFile: remoteString, atomically: false) // $ hasPathInjection=182 - nsData.write(toFile: remoteString, options: []) // $ hasPathInjection=182 + let _ = nsData.write(to: remoteUrl, atomically: false) // $ hasPathInjection=208 + nsData.write(to: remoteUrl, options: []) // $ hasPathInjection=208 + let _ = nsData.write(toFile: remoteString, atomically: false) // $ hasPathInjection=208 + nsData.write(toFile: remoteString, options: []) // $ hasPathInjection=208 let fm = FileManager() - let _ = fm.contentsOfDirectory(at: remoteUrl, includingPropertiesForKeys: [], options: []) // $ hasPathInjection=182 - let _ = fm.contentsOfDirectory(atPath: remoteString) // $ hasPathInjection=182 - let _ = fm.enumerator(at: remoteUrl, includingPropertiesForKeys: [], options: [], errorHandler: nil) // $ hasPathInjection=182 - let _ = fm.enumerator(atPath: remoteString) // $ hasPathInjection=182 - let _ = fm.subpathsOfDirectory(atPath: remoteString) // $ hasPathInjection=182 - let _ = fm.subpaths(atPath: remoteString) // $ hasPathInjection=182 - fm.createDirectory(at: remoteUrl, withIntermediateDirectories: false, attributes: [:]) // $ hasPathInjection=182 - let _ = fm.createDirectory(atPath: remoteString, attributes: [:]) // $ hasPathInjection=182 - let _ = fm.createFile(atPath: remoteString, contents: nil, attributes: [:]) // $ hasPathInjection=182 - fm.removeItem(at: remoteUrl) // $ hasPathInjection=182 - fm.removeItem(atPath: remoteString) // $ hasPathInjection=182 - fm.trashItem(at: remoteUrl, resultingItemURL: AutoreleasingUnsafeMutablePointer()) // $ hasPathInjection=182 - let _ = fm.replaceItemAt(remoteUrl, withItemAt: safeUrl, backupItemName: nil, options: []) // $ hasPathInjection=182 - let _ = fm.replaceItemAt(safeUrl, withItemAt: remoteUrl, backupItemName: nil, options: []) // $ hasPathInjection=182 - fm.replaceItem(at: remoteUrl, withItemAt: safeUrl, backupItemName: nil, options: [], resultingItemURL: AutoreleasingUnsafeMutablePointer()) // $ hasPathInjection=182 - fm.replaceItem(at: safeUrl, withItemAt: remoteUrl, backupItemName: nil, options: [], resultingItemURL: AutoreleasingUnsafeMutablePointer()) // $ hasPathInjection=182 - fm.copyItem(at: remoteUrl, to: safeUrl) // $ hasPathInjection=182 - fm.copyItem(at: safeUrl, to: remoteUrl) // $ hasPathInjection=182 - fm.copyItem(atPath: remoteString, toPath: "") // $ hasPathInjection=182 - fm.copyItem(atPath: "", toPath: remoteString) // $ hasPathInjection=182 - fm.moveItem(at: remoteUrl, to: safeUrl) // $ hasPathInjection=182 - fm.moveItem(at: safeUrl, to: remoteUrl) // $ hasPathInjection=182 - fm.moveItem(atPath: remoteString, toPath: "") // $ hasPathInjection=182 - fm.moveItem(atPath: "", toPath: remoteString) // $ hasPathInjection=182 - fm.createSymbolicLink(at: remoteUrl, withDestinationURL: safeUrl) // $ hasPathInjection=182 - fm.createSymbolicLink(at: safeUrl, withDestinationURL: remoteUrl) // $ hasPathInjection=182 - fm.createSymbolicLink(atPath: remoteString, withDestinationPath: "") // $ hasPathInjection=182 - fm.createSymbolicLink(atPath: "", withDestinationPath: remoteString) // $ hasPathInjection=182 - fm.linkItem(at: remoteUrl, to: safeUrl) // $ hasPathInjection=182 - fm.linkItem(at: safeUrl, to: remoteUrl) // $ hasPathInjection=182 - fm.linkItem(atPath: remoteString, toPath: "") // $ hasPathInjection=182 - fm.linkItem(atPath: "", toPath: remoteString) // $ hasPathInjection=182 - let _ = fm.destinationOfSymbolicLink(atPath: remoteString) // $ hasPathInjection=182 - let _ = fm.fileExists(atPath: remoteString) // $ hasPathInjection=182 - let _ = fm.fileExists(atPath: remoteString, isDirectory: UnsafeMutablePointer.init(bitPattern: 0)) // $ hasPathInjection=182 - fm.setAttributes([:], ofItemAtPath: remoteString) // $ hasPathInjection=182 - let _ = fm.contents(atPath: remoteString) // $ hasPathInjection=182 - let _ = fm.contentsEqual(atPath: remoteString, andPath: "") // $ hasPathInjection=182 - let _ = fm.contentsEqual(atPath: "", andPath: remoteString) // $ hasPathInjection=182 - let _ = fm.changeCurrentDirectoryPath(remoteString) // $ hasPathInjection=182 - let _ = fm.unmountVolume(at: remoteUrl, options: [], completionHandler: { _ in }) // $ hasPathInjection=182 + let _ = fm.contentsOfDirectory(at: remoteUrl, includingPropertiesForKeys: [], options: []) // $ hasPathInjection=208 + let _ = fm.contentsOfDirectory(atPath: remoteString) // $ hasPathInjection=208 + let _ = fm.enumerator(at: remoteUrl, includingPropertiesForKeys: [], options: [], errorHandler: nil) // $ hasPathInjection=208 + let _ = fm.enumerator(atPath: remoteString) // $ hasPathInjection=208 + let _ = fm.subpathsOfDirectory(atPath: remoteString) // $ hasPathInjection=208 + let _ = fm.subpaths(atPath: remoteString) // $ hasPathInjection=208 + fm.createDirectory(at: remoteUrl, withIntermediateDirectories: false, attributes: [:]) // $ hasPathInjection=208 + let _ = fm.createDirectory(atPath: remoteString, attributes: [:]) // $ hasPathInjection=208 + let _ = fm.createFile(atPath: remoteString, contents: nil, attributes: [:]) // $ hasPathInjection=208 + fm.removeItem(at: remoteUrl) // $ hasPathInjection=208 + fm.removeItem(atPath: remoteString) // $ hasPathInjection=208 + fm.trashItem(at: remoteUrl, resultingItemURL: AutoreleasingUnsafeMutablePointer()) // $ hasPathInjection=208 + let _ = fm.replaceItemAt(remoteUrl, withItemAt: safeUrl, backupItemName: nil, options: []) // $ hasPathInjection=208 + let _ = fm.replaceItemAt(safeUrl, withItemAt: remoteUrl, backupItemName: nil, options: []) // $ hasPathInjection=208 + fm.replaceItem(at: remoteUrl, withItemAt: safeUrl, backupItemName: nil, options: [], resultingItemURL: AutoreleasingUnsafeMutablePointer()) // $ hasPathInjection=208 + fm.replaceItem(at: safeUrl, withItemAt: remoteUrl, backupItemName: nil, options: [], resultingItemURL: AutoreleasingUnsafeMutablePointer()) // $ hasPathInjection=208 + fm.copyItem(at: remoteUrl, to: safeUrl) // $ hasPathInjection=208 + fm.copyItem(at: safeUrl, to: remoteUrl) // $ hasPathInjection=208 + fm.copyItem(atPath: remoteString, toPath: "") // $ hasPathInjection=208 + fm.copyItem(atPath: "", toPath: remoteString) // $ hasPathInjection=208 + fm.moveItem(at: remoteUrl, to: safeUrl) // $ hasPathInjection=208 + fm.moveItem(at: safeUrl, to: remoteUrl) // $ hasPathInjection=208 + fm.moveItem(atPath: remoteString, toPath: "") // $ hasPathInjection=208 + fm.moveItem(atPath: "", toPath: remoteString) // $ hasPathInjection=208 + fm.createSymbolicLink(at: remoteUrl, withDestinationURL: safeUrl) // $ hasPathInjection=208 + fm.createSymbolicLink(at: safeUrl, withDestinationURL: remoteUrl) // $ hasPathInjection=208 + fm.createSymbolicLink(atPath: remoteString, withDestinationPath: "") // $ hasPathInjection=208 + fm.createSymbolicLink(atPath: "", withDestinationPath: remoteString) // $ hasPathInjection=208 + fm.linkItem(at: remoteUrl, to: safeUrl) // $ hasPathInjection=208 + fm.linkItem(at: safeUrl, to: remoteUrl) // $ hasPathInjection=208 + fm.linkItem(atPath: remoteString, toPath: "") // $ hasPathInjection=208 + fm.linkItem(atPath: "", toPath: remoteString) // $ hasPathInjection=208 + let _ = fm.destinationOfSymbolicLink(atPath: remoteString) // $ hasPathInjection=208 + let _ = fm.fileExists(atPath: remoteString) // $ hasPathInjection=208 + let _ = fm.fileExists(atPath: remoteString, isDirectory: UnsafeMutablePointer.init(bitPattern: 0)) // $ hasPathInjection=208 + fm.setAttributes([:], ofItemAtPath: remoteString) // $ hasPathInjection=208 + let _ = fm.contents(atPath: remoteString) // $ hasPathInjection=208 + let _ = fm.contentsEqual(atPath: remoteString, andPath: "") // $ hasPathInjection=208 + let _ = fm.contentsEqual(atPath: "", andPath: remoteString) // $ hasPathInjection=208 + let _ = fm.changeCurrentDirectoryPath(remoteString) // $ hasPathInjection=208 + let _ = fm.unmountVolume(at: remoteUrl, options: [], completionHandler: { _ in }) // $ hasPathInjection=208 // Deprecated methods - let _ = fm.changeFileAttributes([:], atPath: remoteString) // $ hasPathInjection=182 - let _ = fm.directoryContents(atPath: remoteString) // $ hasPathInjection=182 - let _ = fm.createDirectory(atPath: remoteString, attributes: [:]) // $ hasPathInjection=182 - let _ = fm.createSymbolicLink(atPath: remoteString, pathContent: "") // $ hasPathInjection=182 - let _ = fm.createSymbolicLink(atPath: "", pathContent: remoteString) // $ hasPathInjection=182 - let _ = fm.pathContentOfSymbolicLink(atPath: remoteString) // $ hasPathInjection=182 - let _ = fm.replaceItemAtURL(originalItemURL: remoteNsUrl, withItemAtURL: safeNsUrl, backupItemName: nil, options: []) // $ hasPathInjection=182 - let _ = fm.replaceItemAtURL(originalItemURL: safeNsUrl, withItemAtURL: remoteNsUrl, backupItemName: nil, options: []) // $ hasPathInjection=182 + let _ = fm.changeFileAttributes([:], atPath: remoteString) // $ hasPathInjection=208 + let _ = fm.directoryContents(atPath: remoteString) // $ hasPathInjection=208 + let _ = fm.createDirectory(atPath: remoteString, attributes: [:]) // $ hasPathInjection=208 + let _ = fm.createSymbolicLink(atPath: remoteString, pathContent: "") // $ hasPathInjection=208 + let _ = fm.createSymbolicLink(atPath: "", pathContent: remoteString) // $ hasPathInjection=208 + let _ = fm.pathContentOfSymbolicLink(atPath: remoteString) // $ hasPathInjection=208 + let _ = fm.replaceItemAtURL(originalItemURL: remoteNsUrl, withItemAtURL: safeNsUrl, backupItemName: nil, options: []) // $ hasPathInjection=208 + let _ = fm.replaceItemAtURL(originalItemURL: safeNsUrl, withItemAtURL: remoteNsUrl, backupItemName: nil, options: []) // $ hasPathInjection=208 var encoding = String.Encoding.utf8 - let _ = try! String(contentsOfFile: remoteString) // $ hasPathInjection=182 - let _ = try! String(contentsOfFile: remoteString, encoding: String.Encoding.utf8) // $ hasPathInjection=182 - let _ = try! String(contentsOfFile: remoteString, usedEncoding: &encoding) // $ hasPathInjection=182 + let _ = try! String(contentsOfFile: remoteString) // $ hasPathInjection=208 + let _ = try! String(contentsOfFile: remoteString, encoding: String.Encoding.utf8) // $ hasPathInjection=208 + let _ = try! String(contentsOfFile: remoteString, usedEncoding: &encoding) // $ hasPathInjection=208 - let _ = try! NSString(contentsOfFile: remoteString, encoding: 0) // $ hasPathInjection=182 - let _ = try! NSString(contentsOfFile: remoteString, usedEncoding: nil) // $ hasPathInjection=182 - NSString().write(to: remoteUrl, atomically: true, encoding: 0) // $ hasPathInjection=182 - NSString().write(toFile: remoteString, atomically: true, encoding: 0) // $ hasPathInjection=182 + let _ = try! NSString(contentsOfFile: remoteString, encoding: 0) // $ hasPathInjection=208 + let _ = try! NSString(contentsOfFile: remoteString, usedEncoding: nil) // $ hasPathInjection=208 + NSString().write(to: remoteUrl, atomically: true, encoding: 0) // $ hasPathInjection=208 + NSString().write(toFile: remoteString, atomically: true, encoding: 0) // $ hasPathInjection=208 - let _ = NSKeyedUnarchiver().unarchiveObject(withFile: remoteString) // $ hasPathInjection=182 - let _ = ArchiveByteStream.fileStream(fd: remoteString as! FileDescriptor, automaticClose: true) // $ hasPathInjection=182 - ArchiveByteStream.withFileStream(fd: remoteString as! FileDescriptor, automaticClose: true) { _ in } // $ hasPathInjection=182 - let _ = ArchiveByteStream.fileStream(path: FilePath(stringLiteral: remoteString), mode: .readOnly, options: .append, permissions: .ownerRead) // $ hasPathInjection=182 - ArchiveByteStream.withFileStream(path: FilePath(stringLiteral: remoteString), mode: .readOnly, options: .append, permissions: .ownerRead) { _ in } // $ hasPathInjection=182 - let _ = Bundle(url: remoteUrl) // $ hasPathInjection=182 - let _ = Bundle(path: remoteString) // $ hasPathInjection=182 + let _ = NSKeyedUnarchiver().unarchiveObject(withFile: remoteString) // $ hasPathInjection=208 + let _ = ArchiveByteStream.fileStream(fd: remoteString as! FileDescriptor, automaticClose: true) // $ hasPathInjection=208 + ArchiveByteStream.withFileStream(fd: remoteString as! FileDescriptor, automaticClose: true) { _ in } // $ hasPathInjection=208 + let _ = ArchiveByteStream.fileStream(path: FilePath(stringLiteral: remoteString), mode: .readOnly, options: .append, permissions: .ownerRead) // $ hasPathInjection=208 + ArchiveByteStream.withFileStream(path: FilePath(stringLiteral: remoteString), mode: .readOnly, options: .append, permissions: .ownerRead) { _ in } // $ hasPathInjection=208 + let _ = Bundle(url: remoteUrl) // $ hasPathInjection=208 + let _ = Bundle(path: remoteString) // $ hasPathInjection=208 - let _ = Database(path: remoteString, description: "", configuration: Configuration()) // $ hasPathInjection=182 + // GRDB + + let _ = Database(path: remoteString, description: "", configuration: Configuration()) // $ hasPathInjection=208 let _ = Database(path: "", description: "", configuration: Configuration()) // Safe - let _ = DatabasePool(path: remoteString, configuration: Configuration()) // $ hasPathInjection=182 + let _ = DatabasePool(path: remoteString, configuration: Configuration()) // $ hasPathInjection=208 let _ = DatabasePool(path: "", configuration: Configuration()) // Safe - let _ = DatabaseQueue(path: remoteString, configuration: Configuration()) // $ hasPathInjection=182 + let _ = DatabaseQueue(path: remoteString, configuration: Configuration()) // $ hasPathInjection=208 let _ = DatabaseQueue(path: "", configuration: Configuration()) // Safe - let _ = DatabaseSnapshotPool(path: remoteString, configuration: Configuration()) // $ hasPathInjection=182 + let _ = DatabaseSnapshotPool(path: remoteString, configuration: Configuration()) // $ hasPathInjection=208 let _ = DatabaseSnapshotPool(path: "", configuration: Configuration()) // Safe - let _ = SerializedDatabase(path: remoteString, defaultLabel: "") // $ hasPathInjection=182 + let _ = SerializedDatabase(path: remoteString, defaultLabel: "") // $ hasPathInjection=208 let _ = SerializedDatabase(path: "", defaultLabel: "") // Safe - let _ = SerializedDatabase(path: remoteString, defaultLabel: "", purpose: nil) // $ hasPathInjection=182 + let _ = SerializedDatabase(path: remoteString, defaultLabel: "", purpose: nil) // $ hasPathInjection=208 let _ = SerializedDatabase(path: "", defaultLabel: "", purpose: nil) // Safe - let _ = SerializedDatabase(path: remoteString, configuration: Configuration(), defaultLabel: "") // $ hasPathInjection=182 + let _ = SerializedDatabase(path: remoteString, configuration: Configuration(), defaultLabel: "") // $ hasPathInjection=208 let _ = SerializedDatabase(path: "", configuration: Configuration(), defaultLabel: "") // Safe - let _ = SerializedDatabase(path: remoteString, configuration: Configuration(), defaultLabel: "", purpose: nil) // $ hasPathInjection=182 + let _ = SerializedDatabase(path: remoteString, configuration: Configuration(), defaultLabel: "", purpose: nil) // $ hasPathInjection=208 let _ = SerializedDatabase(path: "", configuration: Configuration(), defaultLabel: "", purpose: nil) // Safe + + // Realm + + _ = Realm.Configuration(fileURL: safeUrl) // GOOD + _ = Realm.Configuration(fileURL: remoteUrl) // $ hasPathInjection=208 + _ = Realm.Configuration(seedFilePath: safeUrl) // GOOD + _ = Realm.Configuration(seedFilePath: remoteUrl) // $ hasPathInjection=208 + + var config = Realm.Configuration() // GOOD + config.fileURL = safeUrl // GOOD + config.fileURL = remoteUrl // $ MISSING: hasPathInjection=208 + config.seedFilePath = safeUrl // GOOD + config.seedFilePath = remoteUrl // $ MISSING: hasPathInjection=208 } func testSanitizers() { @@ -290,5 +331,5 @@ func testSanitizers() { if (filePath.lexicallyNormalized().starts(with: "/safe")) { let _ = fm.contents(atPath: remoteString) // Safe } - let _ = fm.contents(atPath: remoteString) // $ hasPathInjection=285 + let _ = fm.contents(atPath: remoteString) // $ hasPathInjection=326 } diff --git a/swift/ql/test/query-tests/Security/CWE-079/UnsafeWebViewFetch.expected b/swift/ql/test/query-tests/Security/CWE-079/UnsafeWebViewFetch.expected index 393fe87e573..e1968b05209 100644 --- a/swift/ql/test/query-tests/Security/CWE-079/UnsafeWebViewFetch.expected +++ b/swift/ql/test/query-tests/Security/CWE-079/UnsafeWebViewFetch.expected @@ -1,87 +1,87 @@ edges -| UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) : | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:) : | -| UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) : | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:relativeTo:) : | -| UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | -| UnsafeWebViewFetch.swift:94:10:94:37 | try ... : | UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | -| UnsafeWebViewFetch.swift:94:10:94:37 | try ... : | UnsafeWebViewFetch.swift:120:25:120:39 | call to getRemoteData() | -| UnsafeWebViewFetch.swift:94:10:94:37 | try ... : | UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | -| UnsafeWebViewFetch.swift:94:10:94:37 | try ... : | UnsafeWebViewFetch.swift:167:25:167:39 | call to getRemoteData() | -| UnsafeWebViewFetch.swift:94:10:94:37 | try ... : | UnsafeWebViewFetch.swift:206:17:206:31 | call to getRemoteData() : | -| UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:94:10:94:37 | try ... : | -| UnsafeWebViewFetch.swift:103:30:103:84 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:103:25:103:84 | try! ... | -| UnsafeWebViewFetch.swift:105:18:105:72 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:106:25:106:25 | data | -| UnsafeWebViewFetch.swift:109:30:109:53 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:109:25:109:53 | try! ... | -| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:121:25:121:25 | remoteString | -| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:124:25:124:51 | ... .+(_:_:) ... | -| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:127:25:127:25 | "..." | -| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:131:30:131:30 | remoteString : | -| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:135:25:135:25 | remoteString | -| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:137:25:137:25 | remoteString | -| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:139:25:139:25 | remoteString | -| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:141:25:141:25 | remoteString | -| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:150:24:150:37 | .utf8 : | -| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) : | UnsafeWebViewFetch.swift:132:52:132:52 | remoteURL : | -| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) : | UnsafeWebViewFetch.swift:138:47:138:56 | ...! | -| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) : | UnsafeWebViewFetch.swift:139:48:139:57 | ...! | -| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) : | UnsafeWebViewFetch.swift:153:85:153:94 | ...! | -| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) : | UnsafeWebViewFetch.swift:154:86:154:95 | ...! | -| UnsafeWebViewFetch.swift:131:30:131:30 | remoteString : | UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) : | -| UnsafeWebViewFetch.swift:131:30:131:30 | remoteString : | UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) : | -| UnsafeWebViewFetch.swift:132:19:132:61 | call to URL.init(string:relativeTo:) : | UnsafeWebViewFetch.swift:140:47:140:57 | ...! | -| UnsafeWebViewFetch.swift:132:19:132:61 | call to URL.init(string:relativeTo:) : | UnsafeWebViewFetch.swift:141:48:141:58 | ...! | -| UnsafeWebViewFetch.swift:132:52:132:52 | remoteURL : | UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) : | -| UnsafeWebViewFetch.swift:132:52:132:52 | remoteURL : | UnsafeWebViewFetch.swift:132:19:132:61 | call to URL.init(string:relativeTo:) : | -| UnsafeWebViewFetch.swift:150:19:150:41 | call to Data.init(_:) : | UnsafeWebViewFetch.swift:152:15:152:15 | remoteData | -| UnsafeWebViewFetch.swift:150:19:150:41 | call to Data.init(_:) : | UnsafeWebViewFetch.swift:154:15:154:15 | remoteData | -| UnsafeWebViewFetch.swift:150:24:150:37 | .utf8 : | UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) : | -| UnsafeWebViewFetch.swift:150:24:150:37 | .utf8 : | UnsafeWebViewFetch.swift:150:19:150:41 | call to Data.init(_:) : | -| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:168:25:168:25 | remoteString | -| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:171:25:171:51 | ... .+(_:_:) ... | -| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:174:25:174:25 | "..." | -| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:178:30:178:30 | remoteString : | -| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:182:25:182:25 | remoteString | -| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:184:25:184:25 | remoteString | -| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:186:25:186:25 | remoteString | -| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:188:25:188:25 | remoteString | -| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | UnsafeWebViewFetch.swift:197:24:197:37 | .utf8 : | -| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) : | UnsafeWebViewFetch.swift:179:52:179:52 | remoteURL : | -| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) : | UnsafeWebViewFetch.swift:185:47:185:56 | ...! | -| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) : | UnsafeWebViewFetch.swift:186:48:186:57 | ...! | -| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) : | UnsafeWebViewFetch.swift:200:90:200:99 | ...! | -| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) : | UnsafeWebViewFetch.swift:201:91:201:100 | ...! | -| UnsafeWebViewFetch.swift:178:30:178:30 | remoteString : | UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) : | -| UnsafeWebViewFetch.swift:178:30:178:30 | remoteString : | UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) : | -| UnsafeWebViewFetch.swift:179:19:179:61 | call to URL.init(string:relativeTo:) : | UnsafeWebViewFetch.swift:187:47:187:57 | ...! | -| UnsafeWebViewFetch.swift:179:19:179:61 | call to URL.init(string:relativeTo:) : | UnsafeWebViewFetch.swift:188:48:188:58 | ...! | -| UnsafeWebViewFetch.swift:179:52:179:52 | remoteURL : | UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) : | -| UnsafeWebViewFetch.swift:179:52:179:52 | remoteURL : | UnsafeWebViewFetch.swift:179:19:179:61 | call to URL.init(string:relativeTo:) : | -| UnsafeWebViewFetch.swift:197:19:197:41 | call to Data.init(_:) : | UnsafeWebViewFetch.swift:199:15:199:15 | remoteData | -| UnsafeWebViewFetch.swift:197:19:197:41 | call to Data.init(_:) : | UnsafeWebViewFetch.swift:201:15:201:15 | remoteData | -| UnsafeWebViewFetch.swift:197:24:197:37 | .utf8 : | UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) : | -| UnsafeWebViewFetch.swift:197:24:197:37 | .utf8 : | UnsafeWebViewFetch.swift:197:19:197:41 | call to Data.init(_:) : | -| UnsafeWebViewFetch.swift:206:17:206:31 | call to getRemoteData() : | UnsafeWebViewFetch.swift:210:25:210:25 | htmlData | -| UnsafeWebViewFetch.swift:206:17:206:31 | call to getRemoteData() : | UnsafeWebViewFetch.swift:211:25:211:25 | htmlData | +| UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:) | +| UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:relativeTo:) | +| UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | +| UnsafeWebViewFetch.swift:94:10:94:37 | try ... | UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | +| UnsafeWebViewFetch.swift:94:10:94:37 | try ... | UnsafeWebViewFetch.swift:120:25:120:39 | call to getRemoteData() | +| UnsafeWebViewFetch.swift:94:10:94:37 | try ... | UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | +| UnsafeWebViewFetch.swift:94:10:94:37 | try ... | UnsafeWebViewFetch.swift:167:25:167:39 | call to getRemoteData() | +| UnsafeWebViewFetch.swift:94:10:94:37 | try ... | UnsafeWebViewFetch.swift:206:17:206:31 | call to getRemoteData() | +| UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:94:10:94:37 | try ... | +| UnsafeWebViewFetch.swift:103:30:103:84 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:103:25:103:84 | try! ... | +| UnsafeWebViewFetch.swift:105:18:105:72 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:106:25:106:25 | data | +| UnsafeWebViewFetch.swift:109:30:109:53 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:109:25:109:53 | try! ... | +| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:121:25:121:25 | remoteString | +| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:124:25:124:51 | ... .+(_:_:) ... | +| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:127:25:127:25 | "..." | +| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:131:30:131:30 | remoteString | +| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:135:25:135:25 | remoteString | +| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:137:25:137:25 | remoteString | +| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:139:25:139:25 | remoteString | +| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:141:25:141:25 | remoteString | +| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:150:24:150:37 | .utf8 | +| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) | UnsafeWebViewFetch.swift:132:52:132:52 | remoteURL | +| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) | UnsafeWebViewFetch.swift:138:47:138:56 | ...! | +| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) | UnsafeWebViewFetch.swift:139:48:139:57 | ...! | +| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) | UnsafeWebViewFetch.swift:153:85:153:94 | ...! | +| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) | UnsafeWebViewFetch.swift:154:86:154:95 | ...! | +| UnsafeWebViewFetch.swift:131:30:131:30 | remoteString | UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) | +| UnsafeWebViewFetch.swift:131:30:131:30 | remoteString | UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) | +| UnsafeWebViewFetch.swift:132:19:132:61 | call to URL.init(string:relativeTo:) | UnsafeWebViewFetch.swift:140:47:140:57 | ...! | +| UnsafeWebViewFetch.swift:132:19:132:61 | call to URL.init(string:relativeTo:) | UnsafeWebViewFetch.swift:141:48:141:58 | ...! | +| UnsafeWebViewFetch.swift:132:52:132:52 | remoteURL | UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) | +| UnsafeWebViewFetch.swift:132:52:132:52 | remoteURL | UnsafeWebViewFetch.swift:132:19:132:61 | call to URL.init(string:relativeTo:) | +| UnsafeWebViewFetch.swift:150:19:150:41 | call to Data.init(_:) | UnsafeWebViewFetch.swift:152:15:152:15 | remoteData | +| UnsafeWebViewFetch.swift:150:19:150:41 | call to Data.init(_:) | UnsafeWebViewFetch.swift:154:15:154:15 | remoteData | +| UnsafeWebViewFetch.swift:150:24:150:37 | .utf8 | UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) | +| UnsafeWebViewFetch.swift:150:24:150:37 | .utf8 | UnsafeWebViewFetch.swift:150:19:150:41 | call to Data.init(_:) | +| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:168:25:168:25 | remoteString | +| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:171:25:171:51 | ... .+(_:_:) ... | +| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:174:25:174:25 | "..." | +| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:178:30:178:30 | remoteString | +| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:182:25:182:25 | remoteString | +| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:184:25:184:25 | remoteString | +| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:186:25:186:25 | remoteString | +| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:188:25:188:25 | remoteString | +| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | UnsafeWebViewFetch.swift:197:24:197:37 | .utf8 | +| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) | UnsafeWebViewFetch.swift:179:52:179:52 | remoteURL | +| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) | UnsafeWebViewFetch.swift:185:47:185:56 | ...! | +| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) | UnsafeWebViewFetch.swift:186:48:186:57 | ...! | +| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) | UnsafeWebViewFetch.swift:200:90:200:99 | ...! | +| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) | UnsafeWebViewFetch.swift:201:91:201:100 | ...! | +| UnsafeWebViewFetch.swift:178:30:178:30 | remoteString | UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) | +| UnsafeWebViewFetch.swift:178:30:178:30 | remoteString | UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) | +| UnsafeWebViewFetch.swift:179:19:179:61 | call to URL.init(string:relativeTo:) | UnsafeWebViewFetch.swift:187:47:187:57 | ...! | +| UnsafeWebViewFetch.swift:179:19:179:61 | call to URL.init(string:relativeTo:) | UnsafeWebViewFetch.swift:188:48:188:58 | ...! | +| UnsafeWebViewFetch.swift:179:52:179:52 | remoteURL | UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) | +| UnsafeWebViewFetch.swift:179:52:179:52 | remoteURL | UnsafeWebViewFetch.swift:179:19:179:61 | call to URL.init(string:relativeTo:) | +| UnsafeWebViewFetch.swift:197:19:197:41 | call to Data.init(_:) | UnsafeWebViewFetch.swift:199:15:199:15 | remoteData | +| UnsafeWebViewFetch.swift:197:19:197:41 | call to Data.init(_:) | UnsafeWebViewFetch.swift:201:15:201:15 | remoteData | +| UnsafeWebViewFetch.swift:197:24:197:37 | .utf8 | UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) | +| UnsafeWebViewFetch.swift:197:24:197:37 | .utf8 | UnsafeWebViewFetch.swift:197:19:197:41 | call to Data.init(_:) | +| UnsafeWebViewFetch.swift:206:17:206:31 | call to getRemoteData() | UnsafeWebViewFetch.swift:210:25:210:25 | htmlData | +| UnsafeWebViewFetch.swift:206:17:206:31 | call to getRemoteData() | UnsafeWebViewFetch.swift:211:25:211:25 | htmlData | nodes -| UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) : | semmle.label | [summary param] 0 in URL.init(string:) : | -| UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) : | semmle.label | [summary param] 1 in URL.init(string:relativeTo:) : | -| UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) : | semmle.label | [summary param] 0 in Data.init(_:) : | -| UnsafeWebViewFetch.swift:94:10:94:37 | try ... : | semmle.label | try ... : | -| UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) | semmle.label | [summary param] 0 in URL.init(string:) | +| UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) | semmle.label | [summary param] 1 in URL.init(string:relativeTo:) | +| UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) | semmle.label | [summary param] 0 in Data.init(_:) | +| UnsafeWebViewFetch.swift:94:10:94:37 | try ... | semmle.label | try ... | +| UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | UnsafeWebViewFetch.swift:103:25:103:84 | try! ... | semmle.label | try! ... | -| UnsafeWebViewFetch.swift:103:30:103:84 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | -| UnsafeWebViewFetch.swift:105:18:105:72 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| UnsafeWebViewFetch.swift:103:30:103:84 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | +| UnsafeWebViewFetch.swift:105:18:105:72 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | UnsafeWebViewFetch.swift:106:25:106:25 | data | semmle.label | data | | UnsafeWebViewFetch.swift:109:25:109:53 | try! ... | semmle.label | try! ... | -| UnsafeWebViewFetch.swift:109:30:109:53 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | -| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() : | semmle.label | call to getRemoteData() : | +| UnsafeWebViewFetch.swift:109:30:109:53 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | +| UnsafeWebViewFetch.swift:117:21:117:35 | call to getRemoteData() | semmle.label | call to getRemoteData() | | UnsafeWebViewFetch.swift:120:25:120:39 | call to getRemoteData() | semmle.label | call to getRemoteData() | | UnsafeWebViewFetch.swift:121:25:121:25 | remoteString | semmle.label | remoteString | | UnsafeWebViewFetch.swift:124:25:124:51 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | | UnsafeWebViewFetch.swift:127:25:127:25 | "..." | semmle.label | "..." | -| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) : | semmle.label | call to URL.init(string:) : | -| UnsafeWebViewFetch.swift:131:30:131:30 | remoteString : | semmle.label | remoteString : | -| UnsafeWebViewFetch.swift:132:19:132:61 | call to URL.init(string:relativeTo:) : | semmle.label | call to URL.init(string:relativeTo:) : | -| UnsafeWebViewFetch.swift:132:52:132:52 | remoteURL : | semmle.label | remoteURL : | +| UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) | semmle.label | call to URL.init(string:) | +| UnsafeWebViewFetch.swift:131:30:131:30 | remoteString | semmle.label | remoteString | +| UnsafeWebViewFetch.swift:132:19:132:61 | call to URL.init(string:relativeTo:) | semmle.label | call to URL.init(string:relativeTo:) | +| UnsafeWebViewFetch.swift:132:52:132:52 | remoteURL | semmle.label | remoteURL | | UnsafeWebViewFetch.swift:135:25:135:25 | remoteString | semmle.label | remoteString | | UnsafeWebViewFetch.swift:137:25:137:25 | remoteString | semmle.label | remoteString | | UnsafeWebViewFetch.swift:138:47:138:56 | ...! | semmle.label | ...! | @@ -90,21 +90,21 @@ nodes | UnsafeWebViewFetch.swift:140:47:140:57 | ...! | semmle.label | ...! | | UnsafeWebViewFetch.swift:141:25:141:25 | remoteString | semmle.label | remoteString | | UnsafeWebViewFetch.swift:141:48:141:58 | ...! | semmle.label | ...! | -| UnsafeWebViewFetch.swift:150:19:150:41 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| UnsafeWebViewFetch.swift:150:24:150:37 | .utf8 : | semmle.label | .utf8 : | +| UnsafeWebViewFetch.swift:150:19:150:41 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| UnsafeWebViewFetch.swift:150:24:150:37 | .utf8 | semmle.label | .utf8 | | UnsafeWebViewFetch.swift:152:15:152:15 | remoteData | semmle.label | remoteData | | UnsafeWebViewFetch.swift:153:85:153:94 | ...! | semmle.label | ...! | | UnsafeWebViewFetch.swift:154:15:154:15 | remoteData | semmle.label | remoteData | | UnsafeWebViewFetch.swift:154:86:154:95 | ...! | semmle.label | ...! | -| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() : | semmle.label | call to getRemoteData() : | +| UnsafeWebViewFetch.swift:164:21:164:35 | call to getRemoteData() | semmle.label | call to getRemoteData() | | UnsafeWebViewFetch.swift:167:25:167:39 | call to getRemoteData() | semmle.label | call to getRemoteData() | | UnsafeWebViewFetch.swift:168:25:168:25 | remoteString | semmle.label | remoteString | | UnsafeWebViewFetch.swift:171:25:171:51 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | | UnsafeWebViewFetch.swift:174:25:174:25 | "..." | semmle.label | "..." | -| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) : | semmle.label | call to URL.init(string:) : | -| UnsafeWebViewFetch.swift:178:30:178:30 | remoteString : | semmle.label | remoteString : | -| UnsafeWebViewFetch.swift:179:19:179:61 | call to URL.init(string:relativeTo:) : | semmle.label | call to URL.init(string:relativeTo:) : | -| UnsafeWebViewFetch.swift:179:52:179:52 | remoteURL : | semmle.label | remoteURL : | +| UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) | semmle.label | call to URL.init(string:) | +| UnsafeWebViewFetch.swift:178:30:178:30 | remoteString | semmle.label | remoteString | +| UnsafeWebViewFetch.swift:179:19:179:61 | call to URL.init(string:relativeTo:) | semmle.label | call to URL.init(string:relativeTo:) | +| UnsafeWebViewFetch.swift:179:52:179:52 | remoteURL | semmle.label | remoteURL | | UnsafeWebViewFetch.swift:182:25:182:25 | remoteString | semmle.label | remoteString | | UnsafeWebViewFetch.swift:184:25:184:25 | remoteString | semmle.label | remoteString | | UnsafeWebViewFetch.swift:185:47:185:56 | ...! | semmle.label | ...! | @@ -113,41 +113,41 @@ nodes | UnsafeWebViewFetch.swift:187:47:187:57 | ...! | semmle.label | ...! | | UnsafeWebViewFetch.swift:188:25:188:25 | remoteString | semmle.label | remoteString | | UnsafeWebViewFetch.swift:188:48:188:58 | ...! | semmle.label | ...! | -| UnsafeWebViewFetch.swift:197:19:197:41 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| UnsafeWebViewFetch.swift:197:24:197:37 | .utf8 : | semmle.label | .utf8 : | +| UnsafeWebViewFetch.swift:197:19:197:41 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| UnsafeWebViewFetch.swift:197:24:197:37 | .utf8 | semmle.label | .utf8 | | UnsafeWebViewFetch.swift:199:15:199:15 | remoteData | semmle.label | remoteData | | UnsafeWebViewFetch.swift:200:90:200:99 | ...! | semmle.label | ...! | | UnsafeWebViewFetch.swift:201:15:201:15 | remoteData | semmle.label | remoteData | | UnsafeWebViewFetch.swift:201:91:201:100 | ...! | semmle.label | ...! | -| UnsafeWebViewFetch.swift:206:17:206:31 | call to getRemoteData() : | semmle.label | call to getRemoteData() : | +| UnsafeWebViewFetch.swift:206:17:206:31 | call to getRemoteData() | semmle.label | call to getRemoteData() | | UnsafeWebViewFetch.swift:210:25:210:25 | htmlData | semmle.label | htmlData | | UnsafeWebViewFetch.swift:211:25:211:25 | htmlData | semmle.label | htmlData | -| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | semmle.label | [summary] to write: return (return) in Data.init(_:) : | -| file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:) : | semmle.label | [summary] to write: return (return) in URL.init(string:) : | -| file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:relativeTo:) : | semmle.label | [summary] to write: return (return) in URL.init(string:relativeTo:) : | +| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | semmle.label | [summary] to write: return (return) in Data.init(_:) | +| file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:) | semmle.label | [summary] to write: return (return) in URL.init(string:) | +| file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:relativeTo:) | semmle.label | [summary] to write: return (return) in URL.init(string:relativeTo:) | subpaths -| UnsafeWebViewFetch.swift:131:30:131:30 | remoteString : | UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) : | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:) : | UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) : | -| UnsafeWebViewFetch.swift:132:52:132:52 | remoteURL : | UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) : | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:relativeTo:) : | UnsafeWebViewFetch.swift:132:19:132:61 | call to URL.init(string:relativeTo:) : | -| UnsafeWebViewFetch.swift:150:24:150:37 | .utf8 : | UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | UnsafeWebViewFetch.swift:150:19:150:41 | call to Data.init(_:) : | -| UnsafeWebViewFetch.swift:178:30:178:30 | remoteString : | UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) : | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:) : | UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) : | -| UnsafeWebViewFetch.swift:179:52:179:52 | remoteURL : | UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) : | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:relativeTo:) : | UnsafeWebViewFetch.swift:179:19:179:61 | call to URL.init(string:relativeTo:) : | -| UnsafeWebViewFetch.swift:197:24:197:37 | .utf8 : | UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | UnsafeWebViewFetch.swift:197:19:197:41 | call to Data.init(_:) : | +| UnsafeWebViewFetch.swift:131:30:131:30 | remoteString | UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:) | UnsafeWebViewFetch.swift:131:18:131:42 | call to URL.init(string:) | +| UnsafeWebViewFetch.swift:132:52:132:52 | remoteURL | UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:relativeTo:) | UnsafeWebViewFetch.swift:132:19:132:61 | call to URL.init(string:relativeTo:) | +| UnsafeWebViewFetch.swift:150:24:150:37 | .utf8 | UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | UnsafeWebViewFetch.swift:150:19:150:41 | call to Data.init(_:) | +| UnsafeWebViewFetch.swift:178:30:178:30 | remoteString | UnsafeWebViewFetch.swift:10:2:10:25 | [summary param] 0 in URL.init(string:) | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:) | UnsafeWebViewFetch.swift:178:18:178:42 | call to URL.init(string:) | +| UnsafeWebViewFetch.swift:179:52:179:52 | remoteURL | UnsafeWebViewFetch.swift:11:2:11:43 | [summary param] 1 in URL.init(string:relativeTo:) | file://:0:0:0:0 | [summary] to write: return (return) in URL.init(string:relativeTo:) | UnsafeWebViewFetch.swift:179:19:179:61 | call to URL.init(string:relativeTo:) | +| UnsafeWebViewFetch.swift:197:24:197:37 | .utf8 | UnsafeWebViewFetch.swift:43:5:43:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | UnsafeWebViewFetch.swift:197:19:197:41 | call to Data.init(_:) | #select -| UnsafeWebViewFetch.swift:103:25:103:84 | try! ... | UnsafeWebViewFetch.swift:103:30:103:84 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:103:25:103:84 | try! ... | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:106:25:106:25 | data | UnsafeWebViewFetch.swift:105:18:105:72 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:106:25:106:25 | data | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:109:25:109:53 | try! ... | UnsafeWebViewFetch.swift:109:30:109:53 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:109:25:109:53 | try! ... | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:120:25:120:39 | call to getRemoteData() | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:120:25:120:39 | call to getRemoteData() | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:121:25:121:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:121:25:121:25 | remoteString | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:124:25:124:51 | ... .+(_:_:) ... | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:124:25:124:51 | ... .+(_:_:) ... | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:127:25:127:25 | "..." | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:127:25:127:25 | "..." | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:139:25:139:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:139:25:139:25 | remoteString | Tainted data is used in a WebView fetch with a tainted base URL. | -| UnsafeWebViewFetch.swift:141:25:141:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:141:25:141:25 | remoteString | Tainted data is used in a WebView fetch with a tainted base URL. | -| UnsafeWebViewFetch.swift:154:15:154:15 | remoteData | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:154:15:154:15 | remoteData | Tainted data is used in a WebView fetch with a tainted base URL. | -| UnsafeWebViewFetch.swift:167:25:167:39 | call to getRemoteData() | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:167:25:167:39 | call to getRemoteData() | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:168:25:168:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:168:25:168:25 | remoteString | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:171:25:171:51 | ... .+(_:_:) ... | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:171:25:171:51 | ... .+(_:_:) ... | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:174:25:174:25 | "..." | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:174:25:174:25 | "..." | Tainted data is used in a WebView fetch without restricting the base URL. | -| UnsafeWebViewFetch.swift:186:25:186:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:186:25:186:25 | remoteString | Tainted data is used in a WebView fetch with a tainted base URL. | -| UnsafeWebViewFetch.swift:188:25:188:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:188:25:188:25 | remoteString | Tainted data is used in a WebView fetch with a tainted base URL. | -| UnsafeWebViewFetch.swift:201:15:201:15 | remoteData | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:201:15:201:15 | remoteData | Tainted data is used in a WebView fetch with a tainted base URL. | -| UnsafeWebViewFetch.swift:210:25:210:25 | htmlData | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) : | UnsafeWebViewFetch.swift:210:25:210:25 | htmlData | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:103:25:103:84 | try! ... | UnsafeWebViewFetch.swift:103:30:103:84 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:103:25:103:84 | try! ... | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:106:25:106:25 | data | UnsafeWebViewFetch.swift:105:18:105:72 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:106:25:106:25 | data | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:109:25:109:53 | try! ... | UnsafeWebViewFetch.swift:109:30:109:53 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:109:25:109:53 | try! ... | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:120:25:120:39 | call to getRemoteData() | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:120:25:120:39 | call to getRemoteData() | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:121:25:121:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:121:25:121:25 | remoteString | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:124:25:124:51 | ... .+(_:_:) ... | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:124:25:124:51 | ... .+(_:_:) ... | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:127:25:127:25 | "..." | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:127:25:127:25 | "..." | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:139:25:139:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:139:25:139:25 | remoteString | Tainted data is used in a WebView fetch with a tainted base URL. | +| UnsafeWebViewFetch.swift:141:25:141:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:141:25:141:25 | remoteString | Tainted data is used in a WebView fetch with a tainted base URL. | +| UnsafeWebViewFetch.swift:154:15:154:15 | remoteData | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:154:15:154:15 | remoteData | Tainted data is used in a WebView fetch with a tainted base URL. | +| UnsafeWebViewFetch.swift:167:25:167:39 | call to getRemoteData() | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:167:25:167:39 | call to getRemoteData() | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:168:25:168:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:168:25:168:25 | remoteString | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:171:25:171:51 | ... .+(_:_:) ... | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:171:25:171:51 | ... .+(_:_:) ... | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:174:25:174:25 | "..." | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:174:25:174:25 | "..." | Tainted data is used in a WebView fetch without restricting the base URL. | +| UnsafeWebViewFetch.swift:186:25:186:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:186:25:186:25 | remoteString | Tainted data is used in a WebView fetch with a tainted base URL. | +| UnsafeWebViewFetch.swift:188:25:188:25 | remoteString | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:188:25:188:25 | remoteString | Tainted data is used in a WebView fetch with a tainted base URL. | +| UnsafeWebViewFetch.swift:201:15:201:15 | remoteData | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:201:15:201:15 | remoteData | Tainted data is used in a WebView fetch with a tainted base URL. | +| UnsafeWebViewFetch.swift:210:25:210:25 | htmlData | UnsafeWebViewFetch.swift:94:14:94:37 | call to String.init(contentsOf:) | UnsafeWebViewFetch.swift:210:25:210:25 | htmlData | Tainted data is used in a WebView fetch without restricting the base URL. | diff --git a/swift/ql/test/query-tests/Security/CWE-089/SqlInjection.expected b/swift/ql/test/query-tests/Security/CWE-089/SqlInjection.expected index bfe5b10e499..6b21566c484 100644 --- a/swift/ql/test/query-tests/Security/CWE-089/SqlInjection.expected +++ b/swift/ql/test/query-tests/Security/CWE-089/SqlInjection.expected @@ -1,121 +1,121 @@ edges -| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:106:41:106:41 | remoteString | -| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:108:41:108:41 | remoteString | -| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:111:43:111:43 | remoteString | -| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:114:51:114:51 | remoteString | -| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:117:27:117:27 | remoteString | -| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:119:27:119:27 | remoteString | -| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:122:41:122:41 | remoteString | -| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:124:41:124:41 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:132:39:132:39 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:135:46:135:46 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:138:56:138:56 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:141:45:141:45 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:144:29:144:29 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:145:29:145:29 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:146:29:146:29 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:147:29:147:29 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:148:29:148:29 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:149:29:149:29 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:150:29:150:29 | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:151:29:151:29 | remoteString | -| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:166:32:166:32 | remoteString | -| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:167:39:167:39 | remoteString | -| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:168:49:168:49 | remoteString | -| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:169:38:169:38 | remoteString | -| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:170:22:170:22 | remoteString | -| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:172:22:172:22 | remoteString | -| GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) : | GRDB.swift:187:33:187:33 | remoteString | -| GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) : | GRDB.swift:190:32:190:32 | remoteString | -| GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) : | GRDB.swift:193:37:193:37 | remoteString | -| GRDB.swift:199:26:199:80 | call to String.init(contentsOf:) : | GRDB.swift:201:36:201:36 | remoteString | -| GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) : | GRDB.swift:209:41:209:41 | remoteString | -| GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) : | GRDB.swift:210:44:210:44 | remoteString | -| GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) : | GRDB.swift:211:47:211:47 | remoteString | -| GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) : | GRDB.swift:212:47:212:47 | remoteString | -| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:224:37:224:37 | remoteString | -| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:225:37:225:37 | remoteString | -| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:229:37:229:37 | remoteString | -| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:230:37:230:37 | remoteString | -| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:234:36:234:36 | remoteString | -| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:235:36:235:36 | remoteString | -| GRDB.swift:242:26:242:80 | call to String.init(contentsOf:) : | GRDB.swift:244:38:244:38 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:252:32:252:32 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:253:32:253:32 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:254:32:254:32 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:255:32:255:32 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:261:29:261:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:262:29:262:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:263:29:263:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:264:29:264:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:270:29:270:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:271:29:271:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:272:29:272:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:273:29:273:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:279:29:279:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:280:29:280:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:281:29:281:29 | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:282:29:282:29 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:293:53:293:53 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:294:53:294:53 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:295:53:295:53 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:296:53:296:53 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:302:50:302:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:303:50:303:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:304:50:304:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:305:50:305:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:311:50:311:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:312:50:312:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:313:50:313:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:314:50:314:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:320:50:320:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:321:50:321:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:322:50:322:50 | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:323:50:323:50 | remoteString | -| GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) : | GRDB.swift:334:57:334:57 | remoteString | -| GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) : | GRDB.swift:335:57:335:57 | remoteString | -| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:344:51:344:51 | remoteString | -| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:345:51:345:51 | remoteString | -| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:346:66:346:66 | remoteString | -| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:347:66:347:66 | remoteString | -| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:348:69:348:69 | remoteString | -| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:349:84:349:84 | remoteString | -| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:350:69:350:69 | remoteString | -| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:351:84:351:84 | remoteString | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:73:17:73:17 | unsafeQuery1 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:74:17:74:17 | unsafeQuery2 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:75:17:75:17 | unsafeQuery3 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:83:29:83:29 | unsafeQuery3 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:95:32:95:32 | remoteString | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:100:29:100:29 | unsafeQuery1 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:103:29:103:29 | unsafeQuery1 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:106:29:106:29 | unsafeQuery1 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:109:13:109:13 | unsafeQuery1 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:111:13:111:13 | unsafeQuery1 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:113:13:113:13 | unsafeQuery1 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:115:16:115:16 | unsafeQuery1 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:117:16:117:16 | unsafeQuery1 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:119:16:119:16 | unsafeQuery1 | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:132:20:132:20 | remoteString | -| sqlite3_c_api.swift:15:2:15:71 | [summary param] this in copyBytes(to:count:) : | file://:0:0:0:0 | [summary] to write: argument 0 in copyBytes(to:count:) : | -| sqlite3_c_api.swift:37:2:37:103 | [summary param] this in data(using:allowLossyConversion:) : | file://:0:0:0:0 | [summary] to write: return (return) in data(using:allowLossyConversion:) : | -| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:133:33:133:33 | unsafeQuery1 | -| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:134:33:134:33 | unsafeQuery2 | -| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:135:33:135:33 | unsafeQuery3 | -| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:145:26:145:26 | unsafeQuery3 | -| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:175:29:175:29 | unsafeQuery3 | -| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:183:29:183:29 | unsafeQuery3 | -| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:189:13:189:13 | unsafeQuery3 : | -| sqlite3_c_api.swift:189:13:189:13 | unsafeQuery3 : | sqlite3_c_api.swift:37:2:37:103 | [summary param] this in data(using:allowLossyConversion:) : | -| sqlite3_c_api.swift:189:13:189:13 | unsafeQuery3 : | sqlite3_c_api.swift:189:13:189:58 | call to data(using:allowLossyConversion:) : | -| sqlite3_c_api.swift:189:13:189:58 | call to data(using:allowLossyConversion:) : | sqlite3_c_api.swift:190:2:190:2 | data : | -| sqlite3_c_api.swift:190:2:190:2 | data : | sqlite3_c_api.swift:15:2:15:71 | [summary param] this in copyBytes(to:count:) : | -| sqlite3_c_api.swift:190:2:190:2 | data : | sqlite3_c_api.swift:190:21:190:21 | [post] buffer : | -| sqlite3_c_api.swift:190:21:190:21 | [post] buffer : | sqlite3_c_api.swift:194:28:194:28 | buffer | -| sqlite3_c_api.swift:190:21:190:21 | [post] buffer : | sqlite3_c_api.swift:202:31:202:31 | buffer | -| sqlite3_c_api.swift:190:21:190:21 | [post] buffer : | sqlite3_c_api.swift:210:31:210:31 | buffer | +| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:106:41:106:41 | remoteString | +| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:108:41:108:41 | remoteString | +| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:111:43:111:43 | remoteString | +| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:114:51:114:51 | remoteString | +| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:117:27:117:27 | remoteString | +| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:119:27:119:27 | remoteString | +| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:122:41:122:41 | remoteString | +| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:124:41:124:41 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:132:39:132:39 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:135:46:135:46 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:138:56:138:56 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:141:45:141:45 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:144:29:144:29 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:145:29:145:29 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:146:29:146:29 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:147:29:147:29 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:148:29:148:29 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:149:29:149:29 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:150:29:150:29 | remoteString | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:151:29:151:29 | remoteString | +| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:166:32:166:32 | remoteString | +| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:167:39:167:39 | remoteString | +| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:168:49:168:49 | remoteString | +| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:169:38:169:38 | remoteString | +| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:170:22:170:22 | remoteString | +| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:172:22:172:22 | remoteString | +| GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | GRDB.swift:187:33:187:33 | remoteString | +| GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | GRDB.swift:190:32:190:32 | remoteString | +| GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | GRDB.swift:193:37:193:37 | remoteString | +| GRDB.swift:199:26:199:80 | call to String.init(contentsOf:) | GRDB.swift:201:36:201:36 | remoteString | +| GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | GRDB.swift:209:41:209:41 | remoteString | +| GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | GRDB.swift:210:44:210:44 | remoteString | +| GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | GRDB.swift:211:47:211:47 | remoteString | +| GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | GRDB.swift:212:47:212:47 | remoteString | +| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:224:37:224:37 | remoteString | +| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:225:37:225:37 | remoteString | +| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:229:37:229:37 | remoteString | +| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:230:37:230:37 | remoteString | +| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:234:36:234:36 | remoteString | +| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:235:36:235:36 | remoteString | +| GRDB.swift:242:26:242:80 | call to String.init(contentsOf:) | GRDB.swift:244:38:244:38 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:252:32:252:32 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:253:32:253:32 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:254:32:254:32 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:255:32:255:32 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:261:29:261:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:262:29:262:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:263:29:263:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:264:29:264:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:270:29:270:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:271:29:271:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:272:29:272:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:273:29:273:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:279:29:279:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:280:29:280:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:281:29:281:29 | remoteString | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:282:29:282:29 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:293:53:293:53 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:294:53:294:53 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:295:53:295:53 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:296:53:296:53 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:302:50:302:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:303:50:303:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:304:50:304:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:305:50:305:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:311:50:311:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:312:50:312:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:313:50:313:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:314:50:314:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:320:50:320:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:321:50:321:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:322:50:322:50 | remoteString | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:323:50:323:50 | remoteString | +| GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) | GRDB.swift:334:57:334:57 | remoteString | +| GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) | GRDB.swift:335:57:335:57 | remoteString | +| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:344:51:344:51 | remoteString | +| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:345:51:345:51 | remoteString | +| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:346:66:346:66 | remoteString | +| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:347:66:347:66 | remoteString | +| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:348:69:348:69 | remoteString | +| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:349:84:349:84 | remoteString | +| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:350:69:350:69 | remoteString | +| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:351:84:351:84 | remoteString | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:73:17:73:17 | unsafeQuery1 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:74:17:74:17 | unsafeQuery2 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:75:17:75:17 | unsafeQuery3 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:83:29:83:29 | unsafeQuery3 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:95:32:95:32 | remoteString | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:100:29:100:29 | unsafeQuery1 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:103:29:103:29 | unsafeQuery1 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:106:29:106:29 | unsafeQuery1 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:109:13:109:13 | unsafeQuery1 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:111:13:111:13 | unsafeQuery1 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:113:13:113:13 | unsafeQuery1 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:115:16:115:16 | unsafeQuery1 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:117:16:117:16 | unsafeQuery1 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:119:16:119:16 | unsafeQuery1 | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:132:20:132:20 | remoteString | +| sqlite3_c_api.swift:15:2:15:71 | [summary param] this in copyBytes(to:count:) | file://:0:0:0:0 | [summary] to write: argument 0 in copyBytes(to:count:) | +| sqlite3_c_api.swift:37:2:37:103 | [summary param] this in data(using:allowLossyConversion:) | file://:0:0:0:0 | [summary] to write: return (return) in data(using:allowLossyConversion:) | +| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:133:33:133:33 | unsafeQuery1 | +| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:134:33:134:33 | unsafeQuery2 | +| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:135:33:135:33 | unsafeQuery3 | +| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:145:26:145:26 | unsafeQuery3 | +| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:175:29:175:29 | unsafeQuery3 | +| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:183:29:183:29 | unsafeQuery3 | +| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:189:13:189:13 | unsafeQuery3 | +| sqlite3_c_api.swift:189:13:189:13 | unsafeQuery3 | sqlite3_c_api.swift:37:2:37:103 | [summary param] this in data(using:allowLossyConversion:) | +| sqlite3_c_api.swift:189:13:189:13 | unsafeQuery3 | sqlite3_c_api.swift:189:13:189:58 | call to data(using:allowLossyConversion:) | +| sqlite3_c_api.swift:189:13:189:58 | call to data(using:allowLossyConversion:) | sqlite3_c_api.swift:190:2:190:2 | data | +| sqlite3_c_api.swift:190:2:190:2 | data | sqlite3_c_api.swift:15:2:15:71 | [summary param] this in copyBytes(to:count:) | +| sqlite3_c_api.swift:190:2:190:2 | data | sqlite3_c_api.swift:190:21:190:21 | [post] buffer | +| sqlite3_c_api.swift:190:21:190:21 | [post] buffer | sqlite3_c_api.swift:194:28:194:28 | buffer | +| sqlite3_c_api.swift:190:21:190:21 | [post] buffer | sqlite3_c_api.swift:202:31:202:31 | buffer | +| sqlite3_c_api.swift:190:21:190:21 | [post] buffer | sqlite3_c_api.swift:210:31:210:31 | buffer | nodes -| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:106:41:106:41 | remoteString | semmle.label | remoteString | | GRDB.swift:108:41:108:41 | remoteString | semmle.label | remoteString | | GRDB.swift:111:43:111:43 | remoteString | semmle.label | remoteString | @@ -124,7 +124,7 @@ nodes | GRDB.swift:119:27:119:27 | remoteString | semmle.label | remoteString | | GRDB.swift:122:41:122:41 | remoteString | semmle.label | remoteString | | GRDB.swift:124:41:124:41 | remoteString | semmle.label | remoteString | -| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:132:39:132:39 | remoteString | semmle.label | remoteString | | GRDB.swift:135:46:135:46 | remoteString | semmle.label | remoteString | | GRDB.swift:138:56:138:56 | remoteString | semmle.label | remoteString | @@ -137,34 +137,34 @@ nodes | GRDB.swift:149:29:149:29 | remoteString | semmle.label | remoteString | | GRDB.swift:150:29:150:29 | remoteString | semmle.label | remoteString | | GRDB.swift:151:29:151:29 | remoteString | semmle.label | remoteString | -| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:166:32:166:32 | remoteString | semmle.label | remoteString | | GRDB.swift:167:39:167:39 | remoteString | semmle.label | remoteString | | GRDB.swift:168:49:168:49 | remoteString | semmle.label | remoteString | | GRDB.swift:169:38:169:38 | remoteString | semmle.label | remoteString | | GRDB.swift:170:22:170:22 | remoteString | semmle.label | remoteString | | GRDB.swift:172:22:172:22 | remoteString | semmle.label | remoteString | -| GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:187:33:187:33 | remoteString | semmle.label | remoteString | | GRDB.swift:190:32:190:32 | remoteString | semmle.label | remoteString | | GRDB.swift:193:37:193:37 | remoteString | semmle.label | remoteString | -| GRDB.swift:199:26:199:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:199:26:199:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:201:36:201:36 | remoteString | semmle.label | remoteString | -| GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:209:41:209:41 | remoteString | semmle.label | remoteString | | GRDB.swift:210:44:210:44 | remoteString | semmle.label | remoteString | | GRDB.swift:211:47:211:47 | remoteString | semmle.label | remoteString | | GRDB.swift:212:47:212:47 | remoteString | semmle.label | remoteString | -| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:224:37:224:37 | remoteString | semmle.label | remoteString | | GRDB.swift:225:37:225:37 | remoteString | semmle.label | remoteString | | GRDB.swift:229:37:229:37 | remoteString | semmle.label | remoteString | | GRDB.swift:230:37:230:37 | remoteString | semmle.label | remoteString | | GRDB.swift:234:36:234:36 | remoteString | semmle.label | remoteString | | GRDB.swift:235:36:235:36 | remoteString | semmle.label | remoteString | -| GRDB.swift:242:26:242:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:242:26:242:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:244:38:244:38 | remoteString | semmle.label | remoteString | -| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:252:32:252:32 | remoteString | semmle.label | remoteString | | GRDB.swift:253:32:253:32 | remoteString | semmle.label | remoteString | | GRDB.swift:254:32:254:32 | remoteString | semmle.label | remoteString | @@ -181,7 +181,7 @@ nodes | GRDB.swift:280:29:280:29 | remoteString | semmle.label | remoteString | | GRDB.swift:281:29:281:29 | remoteString | semmle.label | remoteString | | GRDB.swift:282:29:282:29 | remoteString | semmle.label | remoteString | -| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:293:53:293:53 | remoteString | semmle.label | remoteString | | GRDB.swift:294:53:294:53 | remoteString | semmle.label | remoteString | | GRDB.swift:295:53:295:53 | remoteString | semmle.label | remoteString | @@ -198,10 +198,10 @@ nodes | GRDB.swift:321:50:321:50 | remoteString | semmle.label | remoteString | | GRDB.swift:322:50:322:50 | remoteString | semmle.label | remoteString | | GRDB.swift:323:50:323:50 | remoteString | semmle.label | remoteString | -| GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:334:57:334:57 | remoteString | semmle.label | remoteString | | GRDB.swift:335:57:335:57 | remoteString | semmle.label | remoteString | -| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | GRDB.swift:344:51:344:51 | remoteString | semmle.label | remoteString | | GRDB.swift:345:51:345:51 | remoteString | semmle.label | remoteString | | GRDB.swift:346:66:346:66 | remoteString | semmle.label | remoteString | @@ -210,7 +210,7 @@ nodes | GRDB.swift:349:84:349:84 | remoteString | semmle.label | remoteString | | GRDB.swift:350:69:350:69 | remoteString | semmle.label | remoteString | | GRDB.swift:351:84:351:84 | remoteString | semmle.label | remoteString | -| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | SQLite.swift:73:17:73:17 | unsafeQuery1 | semmle.label | unsafeQuery1 | | SQLite.swift:74:17:74:17 | unsafeQuery2 | semmle.label | unsafeQuery2 | | SQLite.swift:75:17:75:17 | unsafeQuery3 | semmle.label | unsafeQuery3 | @@ -226,132 +226,132 @@ nodes | SQLite.swift:117:16:117:16 | unsafeQuery1 | semmle.label | unsafeQuery1 | | SQLite.swift:119:16:119:16 | unsafeQuery1 | semmle.label | unsafeQuery1 | | SQLite.swift:132:20:132:20 | remoteString | semmle.label | remoteString | -| file://:0:0:0:0 | [summary] to write: argument 0 in copyBytes(to:count:) : | semmle.label | [summary] to write: argument 0 in copyBytes(to:count:) : | -| file://:0:0:0:0 | [summary] to write: return (return) in data(using:allowLossyConversion:) : | semmle.label | [summary] to write: return (return) in data(using:allowLossyConversion:) : | -| sqlite3_c_api.swift:15:2:15:71 | [summary param] this in copyBytes(to:count:) : | semmle.label | [summary param] this in copyBytes(to:count:) : | -| sqlite3_c_api.swift:37:2:37:103 | [summary param] this in data(using:allowLossyConversion:) : | semmle.label | [summary param] this in data(using:allowLossyConversion:) : | -| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| file://:0:0:0:0 | [summary] to write: argument 0 in copyBytes(to:count:) | semmle.label | [summary] to write: argument 0 in copyBytes(to:count:) | +| file://:0:0:0:0 | [summary] to write: return (return) in data(using:allowLossyConversion:) | semmle.label | [summary] to write: return (return) in data(using:allowLossyConversion:) | +| sqlite3_c_api.swift:15:2:15:71 | [summary param] this in copyBytes(to:count:) | semmle.label | [summary param] this in copyBytes(to:count:) | +| sqlite3_c_api.swift:37:2:37:103 | [summary param] this in data(using:allowLossyConversion:) | semmle.label | [summary param] this in data(using:allowLossyConversion:) | +| sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | sqlite3_c_api.swift:133:33:133:33 | unsafeQuery1 | semmle.label | unsafeQuery1 | | sqlite3_c_api.swift:134:33:134:33 | unsafeQuery2 | semmle.label | unsafeQuery2 | | sqlite3_c_api.swift:135:33:135:33 | unsafeQuery3 | semmle.label | unsafeQuery3 | | sqlite3_c_api.swift:145:26:145:26 | unsafeQuery3 | semmle.label | unsafeQuery3 | | sqlite3_c_api.swift:175:29:175:29 | unsafeQuery3 | semmle.label | unsafeQuery3 | | sqlite3_c_api.swift:183:29:183:29 | unsafeQuery3 | semmle.label | unsafeQuery3 | -| sqlite3_c_api.swift:189:13:189:13 | unsafeQuery3 : | semmle.label | unsafeQuery3 : | -| sqlite3_c_api.swift:189:13:189:58 | call to data(using:allowLossyConversion:) : | semmle.label | call to data(using:allowLossyConversion:) : | -| sqlite3_c_api.swift:190:2:190:2 | data : | semmle.label | data : | -| sqlite3_c_api.swift:190:21:190:21 | [post] buffer : | semmle.label | [post] buffer : | +| sqlite3_c_api.swift:189:13:189:13 | unsafeQuery3 | semmle.label | unsafeQuery3 | +| sqlite3_c_api.swift:189:13:189:58 | call to data(using:allowLossyConversion:) | semmle.label | call to data(using:allowLossyConversion:) | +| sqlite3_c_api.swift:190:2:190:2 | data | semmle.label | data | +| sqlite3_c_api.swift:190:21:190:21 | [post] buffer | semmle.label | [post] buffer | | sqlite3_c_api.swift:194:28:194:28 | buffer | semmle.label | buffer | | sqlite3_c_api.swift:202:31:202:31 | buffer | semmle.label | buffer | | sqlite3_c_api.swift:210:31:210:31 | buffer | semmle.label | buffer | subpaths -| sqlite3_c_api.swift:189:13:189:13 | unsafeQuery3 : | sqlite3_c_api.swift:37:2:37:103 | [summary param] this in data(using:allowLossyConversion:) : | file://:0:0:0:0 | [summary] to write: return (return) in data(using:allowLossyConversion:) : | sqlite3_c_api.swift:189:13:189:58 | call to data(using:allowLossyConversion:) : | -| sqlite3_c_api.swift:190:2:190:2 | data : | sqlite3_c_api.swift:15:2:15:71 | [summary param] this in copyBytes(to:count:) : | file://:0:0:0:0 | [summary] to write: argument 0 in copyBytes(to:count:) : | sqlite3_c_api.swift:190:21:190:21 | [post] buffer : | +| sqlite3_c_api.swift:189:13:189:13 | unsafeQuery3 | sqlite3_c_api.swift:37:2:37:103 | [summary param] this in data(using:allowLossyConversion:) | file://:0:0:0:0 | [summary] to write: return (return) in data(using:allowLossyConversion:) | sqlite3_c_api.swift:189:13:189:58 | call to data(using:allowLossyConversion:) | +| sqlite3_c_api.swift:190:2:190:2 | data | sqlite3_c_api.swift:15:2:15:71 | [summary param] this in copyBytes(to:count:) | file://:0:0:0:0 | [summary] to write: argument 0 in copyBytes(to:count:) | sqlite3_c_api.swift:190:21:190:21 | [post] buffer | #select -| GRDB.swift:106:41:106:41 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:106:41:106:41 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:108:41:108:41 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:108:41:108:41 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:111:43:111:43 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:111:43:111:43 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:114:51:114:51 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:114:51:114:51 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:117:27:117:27 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:117:27:117:27 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:119:27:119:27 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:119:27:119:27 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:122:41:122:41 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:122:41:122:41 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:124:41:124:41 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) : | GRDB.swift:124:41:124:41 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:132:39:132:39 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:132:39:132:39 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:135:46:135:46 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:135:46:135:46 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:138:56:138:56 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:138:56:138:56 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:141:45:141:45 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:141:45:141:45 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:144:29:144:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:144:29:144:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:145:29:145:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:145:29:145:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:146:29:146:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:146:29:146:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:147:29:147:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:147:29:147:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:148:29:148:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:148:29:148:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:149:29:149:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:149:29:149:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:150:29:150:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:150:29:150:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:151:29:151:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) : | GRDB.swift:151:29:151:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:166:32:166:32 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:166:32:166:32 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:167:39:167:39 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:167:39:167:39 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:168:49:168:49 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:168:49:168:49 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:169:38:169:38 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:169:38:169:38 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:170:22:170:22 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:170:22:170:22 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:172:22:172:22 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) : | GRDB.swift:172:22:172:22 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:187:33:187:33 | remoteString | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) : | GRDB.swift:187:33:187:33 | remoteString | This query depends on a $@. | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:190:32:190:32 | remoteString | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) : | GRDB.swift:190:32:190:32 | remoteString | This query depends on a $@. | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:193:37:193:37 | remoteString | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) : | GRDB.swift:193:37:193:37 | remoteString | This query depends on a $@. | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:201:36:201:36 | remoteString | GRDB.swift:199:26:199:80 | call to String.init(contentsOf:) : | GRDB.swift:201:36:201:36 | remoteString | This query depends on a $@. | GRDB.swift:199:26:199:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:209:41:209:41 | remoteString | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) : | GRDB.swift:209:41:209:41 | remoteString | This query depends on a $@. | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:210:44:210:44 | remoteString | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) : | GRDB.swift:210:44:210:44 | remoteString | This query depends on a $@. | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:211:47:211:47 | remoteString | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) : | GRDB.swift:211:47:211:47 | remoteString | This query depends on a $@. | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:212:47:212:47 | remoteString | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) : | GRDB.swift:212:47:212:47 | remoteString | This query depends on a $@. | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:224:37:224:37 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:224:37:224:37 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:225:37:225:37 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:225:37:225:37 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:229:37:229:37 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:229:37:229:37 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:230:37:230:37 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:230:37:230:37 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:234:36:234:36 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:234:36:234:36 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:235:36:235:36 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) : | GRDB.swift:235:36:235:36 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:244:38:244:38 | remoteString | GRDB.swift:242:26:242:80 | call to String.init(contentsOf:) : | GRDB.swift:244:38:244:38 | remoteString | This query depends on a $@. | GRDB.swift:242:26:242:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:252:32:252:32 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:252:32:252:32 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:253:32:253:32 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:253:32:253:32 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:254:32:254:32 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:254:32:254:32 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:255:32:255:32 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:255:32:255:32 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:261:29:261:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:261:29:261:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:262:29:262:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:262:29:262:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:263:29:263:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:263:29:263:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:264:29:264:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:264:29:264:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:270:29:270:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:270:29:270:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:271:29:271:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:271:29:271:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:272:29:272:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:272:29:272:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:273:29:273:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:273:29:273:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:279:29:279:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:279:29:279:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:280:29:280:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:280:29:280:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:281:29:281:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:281:29:281:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:282:29:282:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) : | GRDB.swift:282:29:282:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:293:53:293:53 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:293:53:293:53 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:294:53:294:53 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:294:53:294:53 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:295:53:295:53 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:295:53:295:53 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:296:53:296:53 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:296:53:296:53 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:302:50:302:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:302:50:302:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:303:50:303:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:303:50:303:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:304:50:304:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:304:50:304:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:305:50:305:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:305:50:305:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:311:50:311:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:311:50:311:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:312:50:312:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:312:50:312:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:313:50:313:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:313:50:313:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:314:50:314:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:314:50:314:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:320:50:320:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:320:50:320:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:321:50:321:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:321:50:321:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:322:50:322:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:322:50:322:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:323:50:323:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) : | GRDB.swift:323:50:323:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:334:57:334:57 | remoteString | GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) : | GRDB.swift:334:57:334:57 | remoteString | This query depends on a $@. | GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:335:57:335:57 | remoteString | GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) : | GRDB.swift:335:57:335:57 | remoteString | This query depends on a $@. | GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:344:51:344:51 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:344:51:344:51 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:345:51:345:51 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:345:51:345:51 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:346:66:346:66 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:346:66:346:66 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:347:66:347:66 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:347:66:347:66 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:348:69:348:69 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:348:69:348:69 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:349:84:349:84 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:349:84:349:84 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:350:69:350:69 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:350:69:350:69 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | -| GRDB.swift:351:84:351:84 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) : | GRDB.swift:351:84:351:84 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:73:17:73:17 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:73:17:73:17 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:74:17:74:17 | unsafeQuery2 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:74:17:74:17 | unsafeQuery2 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:75:17:75:17 | unsafeQuery3 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:75:17:75:17 | unsafeQuery3 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:83:29:83:29 | unsafeQuery3 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:83:29:83:29 | unsafeQuery3 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:95:32:95:32 | remoteString | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:95:32:95:32 | remoteString | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:100:29:100:29 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:100:29:100:29 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:103:29:103:29 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:103:29:103:29 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:106:29:106:29 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:106:29:106:29 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:109:13:109:13 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:109:13:109:13 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:111:13:111:13 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:111:13:111:13 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:113:13:113:13 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:113:13:113:13 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:115:16:115:16 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:115:16:115:16 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:117:16:117:16 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:117:16:117:16 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:119:16:119:16 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:119:16:119:16 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| SQLite.swift:132:20:132:20 | remoteString | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) : | SQLite.swift:132:20:132:20 | remoteString | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | -| sqlite3_c_api.swift:133:33:133:33 | unsafeQuery1 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:133:33:133:33 | unsafeQuery1 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | -| sqlite3_c_api.swift:134:33:134:33 | unsafeQuery2 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:134:33:134:33 | unsafeQuery2 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | -| sqlite3_c_api.swift:135:33:135:33 | unsafeQuery3 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:135:33:135:33 | unsafeQuery3 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | -| sqlite3_c_api.swift:145:26:145:26 | unsafeQuery3 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:145:26:145:26 | unsafeQuery3 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | -| sqlite3_c_api.swift:175:29:175:29 | unsafeQuery3 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:175:29:175:29 | unsafeQuery3 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | -| sqlite3_c_api.swift:183:29:183:29 | unsafeQuery3 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:183:29:183:29 | unsafeQuery3 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | -| sqlite3_c_api.swift:194:28:194:28 | buffer | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:194:28:194:28 | buffer | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | -| sqlite3_c_api.swift:202:31:202:31 | buffer | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:202:31:202:31 | buffer | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | -| sqlite3_c_api.swift:210:31:210:31 | buffer | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) : | sqlite3_c_api.swift:210:31:210:31 | buffer | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:106:41:106:41 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:106:41:106:41 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:108:41:108:41 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:108:41:108:41 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:111:43:111:43 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:111:43:111:43 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:114:51:114:51 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:114:51:114:51 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:117:27:117:27 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:117:27:117:27 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:119:27:119:27 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:119:27:119:27 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:122:41:122:41 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:122:41:122:41 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:124:41:124:41 | remoteString | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | GRDB.swift:124:41:124:41 | remoteString | This query depends on a $@. | GRDB.swift:104:25:104:79 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:132:39:132:39 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:132:39:132:39 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:135:46:135:46 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:135:46:135:46 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:138:56:138:56 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:138:56:138:56 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:141:45:141:45 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:141:45:141:45 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:144:29:144:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:144:29:144:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:145:29:145:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:145:29:145:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:146:29:146:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:146:29:146:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:147:29:147:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:147:29:147:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:148:29:148:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:148:29:148:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:149:29:149:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:149:29:149:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:150:29:150:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:150:29:150:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:151:29:151:29 | remoteString | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | GRDB.swift:151:29:151:29 | remoteString | This query depends on a $@. | GRDB.swift:130:26:130:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:166:32:166:32 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:166:32:166:32 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:167:39:167:39 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:167:39:167:39 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:168:49:168:49 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:168:49:168:49 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:169:38:169:38 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:169:38:169:38 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:170:22:170:22 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:170:22:170:22 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:172:22:172:22 | remoteString | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | GRDB.swift:172:22:172:22 | remoteString | This query depends on a $@. | GRDB.swift:164:26:164:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:187:33:187:33 | remoteString | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | GRDB.swift:187:33:187:33 | remoteString | This query depends on a $@. | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:190:32:190:32 | remoteString | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | GRDB.swift:190:32:190:32 | remoteString | This query depends on a $@. | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:193:37:193:37 | remoteString | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | GRDB.swift:193:37:193:37 | remoteString | This query depends on a $@. | GRDB.swift:185:26:185:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:201:36:201:36 | remoteString | GRDB.swift:199:26:199:80 | call to String.init(contentsOf:) | GRDB.swift:201:36:201:36 | remoteString | This query depends on a $@. | GRDB.swift:199:26:199:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:209:41:209:41 | remoteString | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | GRDB.swift:209:41:209:41 | remoteString | This query depends on a $@. | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:210:44:210:44 | remoteString | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | GRDB.swift:210:44:210:44 | remoteString | This query depends on a $@. | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:211:47:211:47 | remoteString | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | GRDB.swift:211:47:211:47 | remoteString | This query depends on a $@. | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:212:47:212:47 | remoteString | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | GRDB.swift:212:47:212:47 | remoteString | This query depends on a $@. | GRDB.swift:207:26:207:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:224:37:224:37 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:224:37:224:37 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:225:37:225:37 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:225:37:225:37 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:229:37:229:37 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:229:37:229:37 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:230:37:230:37 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:230:37:230:37 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:234:36:234:36 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:234:36:234:36 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:235:36:235:36 | remoteString | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | GRDB.swift:235:36:235:36 | remoteString | This query depends on a $@. | GRDB.swift:222:26:222:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:244:38:244:38 | remoteString | GRDB.swift:242:26:242:80 | call to String.init(contentsOf:) | GRDB.swift:244:38:244:38 | remoteString | This query depends on a $@. | GRDB.swift:242:26:242:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:252:32:252:32 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:252:32:252:32 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:253:32:253:32 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:253:32:253:32 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:254:32:254:32 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:254:32:254:32 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:255:32:255:32 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:255:32:255:32 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:261:29:261:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:261:29:261:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:262:29:262:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:262:29:262:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:263:29:263:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:263:29:263:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:264:29:264:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:264:29:264:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:270:29:270:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:270:29:270:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:271:29:271:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:271:29:271:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:272:29:272:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:272:29:272:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:273:29:273:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:273:29:273:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:279:29:279:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:279:29:279:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:280:29:280:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:280:29:280:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:281:29:281:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:281:29:281:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:282:29:282:29 | remoteString | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | GRDB.swift:282:29:282:29 | remoteString | This query depends on a $@. | GRDB.swift:250:26:250:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:293:53:293:53 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:293:53:293:53 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:294:53:294:53 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:294:53:294:53 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:295:53:295:53 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:295:53:295:53 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:296:53:296:53 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:296:53:296:53 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:302:50:302:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:302:50:302:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:303:50:303:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:303:50:303:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:304:50:304:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:304:50:304:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:305:50:305:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:305:50:305:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:311:50:311:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:311:50:311:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:312:50:312:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:312:50:312:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:313:50:313:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:313:50:313:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:314:50:314:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:314:50:314:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:320:50:320:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:320:50:320:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:321:50:321:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:321:50:321:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:322:50:322:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:322:50:322:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:323:50:323:50 | remoteString | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | GRDB.swift:323:50:323:50 | remoteString | This query depends on a $@. | GRDB.swift:291:26:291:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:334:57:334:57 | remoteString | GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) | GRDB.swift:334:57:334:57 | remoteString | This query depends on a $@. | GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:335:57:335:57 | remoteString | GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) | GRDB.swift:335:57:335:57 | remoteString | This query depends on a $@. | GRDB.swift:332:26:332:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:344:51:344:51 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:344:51:344:51 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:345:51:345:51 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:345:51:345:51 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:346:66:346:66 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:346:66:346:66 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:347:66:347:66 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:347:66:347:66 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:348:69:348:69 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:348:69:348:69 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:349:84:349:84 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:349:84:349:84 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:350:69:350:69 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:350:69:350:69 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | +| GRDB.swift:351:84:351:84 | remoteString | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | GRDB.swift:351:84:351:84 | remoteString | This query depends on a $@. | GRDB.swift:342:26:342:80 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:73:17:73:17 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:73:17:73:17 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:74:17:74:17 | unsafeQuery2 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:74:17:74:17 | unsafeQuery2 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:75:17:75:17 | unsafeQuery3 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:75:17:75:17 | unsafeQuery3 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:83:29:83:29 | unsafeQuery3 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:83:29:83:29 | unsafeQuery3 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:95:32:95:32 | remoteString | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:95:32:95:32 | remoteString | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:100:29:100:29 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:100:29:100:29 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:103:29:103:29 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:103:29:103:29 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:106:29:106:29 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:106:29:106:29 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:109:13:109:13 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:109:13:109:13 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:111:13:111:13 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:111:13:111:13 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:113:13:113:13 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:113:13:113:13 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:115:16:115:16 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:115:16:115:16 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:117:16:117:16 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:117:16:117:16 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:119:16:119:16 | unsafeQuery1 | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:119:16:119:16 | unsafeQuery1 | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| SQLite.swift:132:20:132:20 | remoteString | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | SQLite.swift:132:20:132:20 | remoteString | This query depends on a $@. | SQLite.swift:62:25:62:79 | call to String.init(contentsOf:) | user-provided value | +| sqlite3_c_api.swift:133:33:133:33 | unsafeQuery1 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:133:33:133:33 | unsafeQuery1 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | +| sqlite3_c_api.swift:134:33:134:33 | unsafeQuery2 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:134:33:134:33 | unsafeQuery2 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | +| sqlite3_c_api.swift:135:33:135:33 | unsafeQuery3 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:135:33:135:33 | unsafeQuery3 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | +| sqlite3_c_api.swift:145:26:145:26 | unsafeQuery3 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:145:26:145:26 | unsafeQuery3 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | +| sqlite3_c_api.swift:175:29:175:29 | unsafeQuery3 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:175:29:175:29 | unsafeQuery3 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | +| sqlite3_c_api.swift:183:29:183:29 | unsafeQuery3 | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:183:29:183:29 | unsafeQuery3 | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | +| sqlite3_c_api.swift:194:28:194:28 | buffer | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:194:28:194:28 | buffer | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | +| sqlite3_c_api.swift:202:31:202:31 | buffer | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:202:31:202:31 | buffer | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | +| sqlite3_c_api.swift:210:31:210:31 | buffer | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | sqlite3_c_api.swift:210:31:210:31 | buffer | This query depends on a $@. | sqlite3_c_api.swift:122:26:122:80 | call to String.init(contentsOf:) | user-provided value | diff --git a/swift/ql/test/query-tests/Security/CWE-094/UnsafeJsEval.expected b/swift/ql/test/query-tests/Security/CWE-094/UnsafeJsEval.expected index a7dd1661edb..a85c4c4be1f 100644 --- a/swift/ql/test/query-tests/Security/CWE-094/UnsafeJsEval.expected +++ b/swift/ql/test/query-tests/Security/CWE-094/UnsafeJsEval.expected @@ -1,133 +1,133 @@ edges -| UnsafeJsEval.swift:69:2:73:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:) : | file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:) : | -| UnsafeJsEval.swift:75:2:80:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) : | file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) : | -| UnsafeJsEval.swift:124:21:124:42 | string : | UnsafeJsEval.swift:124:70:124:70 | string : | -| UnsafeJsEval.swift:144:5:144:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | -| UnsafeJsEval.swift:165:10:165:37 | try ... : | UnsafeJsEval.swift:201:21:201:35 | call to getRemoteData() : | -| UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:165:10:165:37 | try ... : | -| UnsafeJsEval.swift:201:21:201:35 | call to getRemoteData() : | UnsafeJsEval.swift:205:7:205:7 | remoteString : | -| UnsafeJsEval.swift:201:21:201:35 | call to getRemoteData() : | UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... : | -| UnsafeJsEval.swift:201:21:201:35 | call to getRemoteData() : | UnsafeJsEval.swift:211:24:211:37 | .utf8 : | -| UnsafeJsEval.swift:204:7:204:66 | try! ... : | UnsafeJsEval.swift:265:13:265:13 | string : | -| UnsafeJsEval.swift:204:7:204:66 | try! ... : | UnsafeJsEval.swift:268:13:268:13 | string : | -| UnsafeJsEval.swift:204:7:204:66 | try! ... : | UnsafeJsEval.swift:276:13:276:13 | string : | -| UnsafeJsEval.swift:204:7:204:66 | try! ... : | UnsafeJsEval.swift:279:13:279:13 | string : | -| UnsafeJsEval.swift:204:7:204:66 | try! ... : | UnsafeJsEval.swift:285:13:285:13 | string : | -| UnsafeJsEval.swift:204:7:204:66 | try! ... : | UnsafeJsEval.swift:299:13:299:13 | string : | -| UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:204:7:204:66 | try! ... : | -| UnsafeJsEval.swift:205:7:205:7 | remoteString : | UnsafeJsEval.swift:265:13:265:13 | string : | -| UnsafeJsEval.swift:205:7:205:7 | remoteString : | UnsafeJsEval.swift:268:13:268:13 | string : | -| UnsafeJsEval.swift:205:7:205:7 | remoteString : | UnsafeJsEval.swift:276:13:276:13 | string : | -| UnsafeJsEval.swift:205:7:205:7 | remoteString : | UnsafeJsEval.swift:279:13:279:13 | string : | -| UnsafeJsEval.swift:205:7:205:7 | remoteString : | UnsafeJsEval.swift:285:13:285:13 | string : | -| UnsafeJsEval.swift:205:7:205:7 | remoteString : | UnsafeJsEval.swift:299:13:299:13 | string : | -| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... : | UnsafeJsEval.swift:265:13:265:13 | string : | -| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... : | UnsafeJsEval.swift:268:13:268:13 | string : | -| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... : | UnsafeJsEval.swift:276:13:276:13 | string : | -| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... : | UnsafeJsEval.swift:279:13:279:13 | string : | -| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... : | UnsafeJsEval.swift:285:13:285:13 | string : | -| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... : | UnsafeJsEval.swift:299:13:299:13 | string : | -| UnsafeJsEval.swift:211:19:211:41 | call to Data.init(_:) : | UnsafeJsEval.swift:214:24:214:24 | remoteData : | -| UnsafeJsEval.swift:211:24:211:37 | .utf8 : | UnsafeJsEval.swift:144:5:144:29 | [summary param] 0 in Data.init(_:) : | -| UnsafeJsEval.swift:211:24:211:37 | .utf8 : | UnsafeJsEval.swift:211:19:211:41 | call to Data.init(_:) : | -| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) : | UnsafeJsEval.swift:265:13:265:13 | string : | -| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) : | UnsafeJsEval.swift:268:13:268:13 | string : | -| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) : | UnsafeJsEval.swift:276:13:276:13 | string : | -| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) : | UnsafeJsEval.swift:279:13:279:13 | string : | -| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) : | UnsafeJsEval.swift:285:13:285:13 | string : | -| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) : | UnsafeJsEval.swift:299:13:299:13 | string : | -| UnsafeJsEval.swift:214:24:214:24 | remoteData : | UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) : | -| UnsafeJsEval.swift:214:24:214:24 | remoteData : | file://:0:0:0:0 | [summary param] 0 in String.init(decoding:as:) : | -| UnsafeJsEval.swift:265:13:265:13 | string : | UnsafeJsEval.swift:266:43:266:43 | string : | -| UnsafeJsEval.swift:266:43:266:43 | string : | UnsafeJsEval.swift:69:2:73:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:) : | -| UnsafeJsEval.swift:266:43:266:43 | string : | UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | -| UnsafeJsEval.swift:268:13:268:13 | string : | UnsafeJsEval.swift:269:43:269:43 | string : | -| UnsafeJsEval.swift:269:43:269:43 | string : | UnsafeJsEval.swift:75:2:80:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) : | -| UnsafeJsEval.swift:269:43:269:43 | string : | UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | -| UnsafeJsEval.swift:276:13:276:13 | string : | UnsafeJsEval.swift:277:26:277:26 | string | -| UnsafeJsEval.swift:279:13:279:13 | string : | UnsafeJsEval.swift:280:26:280:26 | string | -| UnsafeJsEval.swift:285:13:285:13 | string : | UnsafeJsEval.swift:286:3:286:10 | .utf16 : | -| UnsafeJsEval.swift:286:3:286:10 | .utf16 : | UnsafeJsEval.swift:286:51:286:51 | stringBytes : | -| UnsafeJsEval.swift:286:51:286:51 | stringBytes : | UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) : | -| UnsafeJsEval.swift:286:51:286:51 | stringBytes : | UnsafeJsEval.swift:291:17:291:17 | jsstr | -| UnsafeJsEval.swift:287:16:287:98 | call to JSStringRetain(_:) : | UnsafeJsEval.swift:291:17:291:17 | jsstr | -| UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) : | UnsafeJsEval.swift:124:21:124:42 | string : | -| UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) : | UnsafeJsEval.swift:287:16:287:98 | call to JSStringRetain(_:) : | -| UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) : | UnsafeJsEval.swift:291:17:291:17 | jsstr | -| UnsafeJsEval.swift:299:13:299:13 | string : | UnsafeJsEval.swift:300:3:300:10 | .utf8CString : | -| UnsafeJsEval.swift:300:3:300:10 | .utf8CString : | UnsafeJsEval.swift:300:48:300:48 | stringBytes : | -| UnsafeJsEval.swift:300:48:300:48 | stringBytes : | UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) : | -| UnsafeJsEval.swift:300:48:300:48 | stringBytes : | UnsafeJsEval.swift:305:17:305:17 | jsstr | -| UnsafeJsEval.swift:301:16:301:85 | call to JSStringRetain(_:) : | UnsafeJsEval.swift:305:17:305:17 | jsstr | -| UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) : | UnsafeJsEval.swift:124:21:124:42 | string : | -| UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) : | UnsafeJsEval.swift:301:16:301:85 | call to JSStringRetain(_:) : | -| UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) : | UnsafeJsEval.swift:305:17:305:17 | jsstr | -| UnsafeJsEval.swift:318:24:318:87 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:320:44:320:74 | ... .+(_:_:) ... | -| file://:0:0:0:0 | [summary param] 0 in String.init(decoding:as:) : | file://:0:0:0:0 | [summary] to write: return (return) in String.init(decoding:as:) : | +| UnsafeJsEval.swift:69:2:73:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:) | file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:) | +| UnsafeJsEval.swift:75:2:80:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | +| UnsafeJsEval.swift:124:21:124:42 | string | UnsafeJsEval.swift:124:70:124:70 | string | +| UnsafeJsEval.swift:144:5:144:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | +| UnsafeJsEval.swift:165:10:165:37 | try ... | UnsafeJsEval.swift:201:21:201:35 | call to getRemoteData() | +| UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) | UnsafeJsEval.swift:165:10:165:37 | try ... | +| UnsafeJsEval.swift:201:21:201:35 | call to getRemoteData() | UnsafeJsEval.swift:205:7:205:7 | remoteString | +| UnsafeJsEval.swift:201:21:201:35 | call to getRemoteData() | UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... | +| UnsafeJsEval.swift:201:21:201:35 | call to getRemoteData() | UnsafeJsEval.swift:211:24:211:37 | .utf8 | +| UnsafeJsEval.swift:204:7:204:66 | try! ... | UnsafeJsEval.swift:265:13:265:13 | string | +| UnsafeJsEval.swift:204:7:204:66 | try! ... | UnsafeJsEval.swift:268:13:268:13 | string | +| UnsafeJsEval.swift:204:7:204:66 | try! ... | UnsafeJsEval.swift:276:13:276:13 | string | +| UnsafeJsEval.swift:204:7:204:66 | try! ... | UnsafeJsEval.swift:279:13:279:13 | string | +| UnsafeJsEval.swift:204:7:204:66 | try! ... | UnsafeJsEval.swift:285:13:285:13 | string | +| UnsafeJsEval.swift:204:7:204:66 | try! ... | UnsafeJsEval.swift:299:13:299:13 | string | +| UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) | UnsafeJsEval.swift:204:7:204:66 | try! ... | +| UnsafeJsEval.swift:205:7:205:7 | remoteString | UnsafeJsEval.swift:265:13:265:13 | string | +| UnsafeJsEval.swift:205:7:205:7 | remoteString | UnsafeJsEval.swift:268:13:268:13 | string | +| UnsafeJsEval.swift:205:7:205:7 | remoteString | UnsafeJsEval.swift:276:13:276:13 | string | +| UnsafeJsEval.swift:205:7:205:7 | remoteString | UnsafeJsEval.swift:279:13:279:13 | string | +| UnsafeJsEval.swift:205:7:205:7 | remoteString | UnsafeJsEval.swift:285:13:285:13 | string | +| UnsafeJsEval.swift:205:7:205:7 | remoteString | UnsafeJsEval.swift:299:13:299:13 | string | +| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... | UnsafeJsEval.swift:265:13:265:13 | string | +| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... | UnsafeJsEval.swift:268:13:268:13 | string | +| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... | UnsafeJsEval.swift:276:13:276:13 | string | +| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... | UnsafeJsEval.swift:279:13:279:13 | string | +| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... | UnsafeJsEval.swift:285:13:285:13 | string | +| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... | UnsafeJsEval.swift:299:13:299:13 | string | +| UnsafeJsEval.swift:211:19:211:41 | call to Data.init(_:) | UnsafeJsEval.swift:214:24:214:24 | remoteData | +| UnsafeJsEval.swift:211:24:211:37 | .utf8 | UnsafeJsEval.swift:144:5:144:29 | [summary param] 0 in Data.init(_:) | +| UnsafeJsEval.swift:211:24:211:37 | .utf8 | UnsafeJsEval.swift:211:19:211:41 | call to Data.init(_:) | +| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) | UnsafeJsEval.swift:265:13:265:13 | string | +| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) | UnsafeJsEval.swift:268:13:268:13 | string | +| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) | UnsafeJsEval.swift:276:13:276:13 | string | +| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) | UnsafeJsEval.swift:279:13:279:13 | string | +| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) | UnsafeJsEval.swift:285:13:285:13 | string | +| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) | UnsafeJsEval.swift:299:13:299:13 | string | +| UnsafeJsEval.swift:214:24:214:24 | remoteData | UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) | +| UnsafeJsEval.swift:214:24:214:24 | remoteData | file://:0:0:0:0 | [summary param] 0 in String.init(decoding:as:) | +| UnsafeJsEval.swift:265:13:265:13 | string | UnsafeJsEval.swift:266:43:266:43 | string | +| UnsafeJsEval.swift:266:43:266:43 | string | UnsafeJsEval.swift:69:2:73:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:) | +| UnsafeJsEval.swift:266:43:266:43 | string | UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | +| UnsafeJsEval.swift:268:13:268:13 | string | UnsafeJsEval.swift:269:43:269:43 | string | +| UnsafeJsEval.swift:269:43:269:43 | string | UnsafeJsEval.swift:75:2:80:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | +| UnsafeJsEval.swift:269:43:269:43 | string | UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | +| UnsafeJsEval.swift:276:13:276:13 | string | UnsafeJsEval.swift:277:26:277:26 | string | +| UnsafeJsEval.swift:279:13:279:13 | string | UnsafeJsEval.swift:280:26:280:26 | string | +| UnsafeJsEval.swift:285:13:285:13 | string | UnsafeJsEval.swift:286:3:286:10 | .utf16 | +| UnsafeJsEval.swift:286:3:286:10 | .utf16 | UnsafeJsEval.swift:286:51:286:51 | stringBytes | +| UnsafeJsEval.swift:286:51:286:51 | stringBytes | UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) | +| UnsafeJsEval.swift:286:51:286:51 | stringBytes | UnsafeJsEval.swift:291:17:291:17 | jsstr | +| UnsafeJsEval.swift:287:16:287:98 | call to JSStringRetain(_:) | UnsafeJsEval.swift:291:17:291:17 | jsstr | +| UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) | UnsafeJsEval.swift:124:21:124:42 | string | +| UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) | UnsafeJsEval.swift:287:16:287:98 | call to JSStringRetain(_:) | +| UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) | UnsafeJsEval.swift:291:17:291:17 | jsstr | +| UnsafeJsEval.swift:299:13:299:13 | string | UnsafeJsEval.swift:300:3:300:10 | .utf8CString | +| UnsafeJsEval.swift:300:3:300:10 | .utf8CString | UnsafeJsEval.swift:300:48:300:48 | stringBytes | +| UnsafeJsEval.swift:300:48:300:48 | stringBytes | UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) | +| UnsafeJsEval.swift:300:48:300:48 | stringBytes | UnsafeJsEval.swift:305:17:305:17 | jsstr | +| UnsafeJsEval.swift:301:16:301:85 | call to JSStringRetain(_:) | UnsafeJsEval.swift:305:17:305:17 | jsstr | +| UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) | UnsafeJsEval.swift:124:21:124:42 | string | +| UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) | UnsafeJsEval.swift:301:16:301:85 | call to JSStringRetain(_:) | +| UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) | UnsafeJsEval.swift:305:17:305:17 | jsstr | +| UnsafeJsEval.swift:318:24:318:87 | call to String.init(contentsOf:) | UnsafeJsEval.swift:320:44:320:74 | ... .+(_:_:) ... | +| file://:0:0:0:0 | [summary param] 0 in String.init(decoding:as:) | file://:0:0:0:0 | [summary] to write: return (return) in String.init(decoding:as:) | nodes -| UnsafeJsEval.swift:69:2:73:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:) : | semmle.label | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:) : | -| UnsafeJsEval.swift:75:2:80:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) : | semmle.label | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) : | -| UnsafeJsEval.swift:124:21:124:42 | string : | semmle.label | string : | -| UnsafeJsEval.swift:124:70:124:70 | string : | semmle.label | string : | -| UnsafeJsEval.swift:144:5:144:29 | [summary param] 0 in Data.init(_:) : | semmle.label | [summary param] 0 in Data.init(_:) : | -| UnsafeJsEval.swift:165:10:165:37 | try ... : | semmle.label | try ... : | -| UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | -| UnsafeJsEval.swift:201:21:201:35 | call to getRemoteData() : | semmle.label | call to getRemoteData() : | -| UnsafeJsEval.swift:204:7:204:66 | try! ... : | semmle.label | try! ... : | -| UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | -| UnsafeJsEval.swift:205:7:205:7 | remoteString : | semmle.label | remoteString : | -| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... : | semmle.label | ... .+(_:_:) ... : | -| UnsafeJsEval.swift:211:19:211:41 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| UnsafeJsEval.swift:211:24:211:37 | .utf8 : | semmle.label | .utf8 : | -| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) : | semmle.label | call to String.init(decoding:as:) : | -| UnsafeJsEval.swift:214:24:214:24 | remoteData : | semmle.label | remoteData : | -| UnsafeJsEval.swift:265:13:265:13 | string : | semmle.label | string : | +| UnsafeJsEval.swift:69:2:73:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:) | semmle.label | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:) | +| UnsafeJsEval.swift:75:2:80:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | semmle.label | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | +| UnsafeJsEval.swift:124:21:124:42 | string | semmle.label | string | +| UnsafeJsEval.swift:124:70:124:70 | string | semmle.label | string | +| UnsafeJsEval.swift:144:5:144:29 | [summary param] 0 in Data.init(_:) | semmle.label | [summary param] 0 in Data.init(_:) | +| UnsafeJsEval.swift:165:10:165:37 | try ... | semmle.label | try ... | +| UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | +| UnsafeJsEval.swift:201:21:201:35 | call to getRemoteData() | semmle.label | call to getRemoteData() | +| UnsafeJsEval.swift:204:7:204:66 | try! ... | semmle.label | try! ... | +| UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | +| UnsafeJsEval.swift:205:7:205:7 | remoteString | semmle.label | remoteString | +| UnsafeJsEval.swift:208:7:208:39 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | +| UnsafeJsEval.swift:211:19:211:41 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| UnsafeJsEval.swift:211:24:211:37 | .utf8 | semmle.label | .utf8 | +| UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) | semmle.label | call to String.init(decoding:as:) | +| UnsafeJsEval.swift:214:24:214:24 | remoteData | semmle.label | remoteData | +| UnsafeJsEval.swift:265:13:265:13 | string | semmle.label | string | | UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | semmle.label | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | -| UnsafeJsEval.swift:266:43:266:43 | string : | semmle.label | string : | -| UnsafeJsEval.swift:268:13:268:13 | string : | semmle.label | string : | +| UnsafeJsEval.swift:266:43:266:43 | string | semmle.label | string | +| UnsafeJsEval.swift:268:13:268:13 | string | semmle.label | string | | UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | semmle.label | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | -| UnsafeJsEval.swift:269:43:269:43 | string : | semmle.label | string : | -| UnsafeJsEval.swift:276:13:276:13 | string : | semmle.label | string : | +| UnsafeJsEval.swift:269:43:269:43 | string | semmle.label | string | +| UnsafeJsEval.swift:276:13:276:13 | string | semmle.label | string | | UnsafeJsEval.swift:277:26:277:26 | string | semmle.label | string | -| UnsafeJsEval.swift:279:13:279:13 | string : | semmle.label | string : | +| UnsafeJsEval.swift:279:13:279:13 | string | semmle.label | string | | UnsafeJsEval.swift:280:26:280:26 | string | semmle.label | string | -| UnsafeJsEval.swift:285:13:285:13 | string : | semmle.label | string : | -| UnsafeJsEval.swift:286:3:286:10 | .utf16 : | semmle.label | .utf16 : | -| UnsafeJsEval.swift:286:51:286:51 | stringBytes : | semmle.label | stringBytes : | -| UnsafeJsEval.swift:287:16:287:98 | call to JSStringRetain(_:) : | semmle.label | call to JSStringRetain(_:) : | -| UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) : | semmle.label | call to JSStringCreateWithCharacters(_:_:) : | +| UnsafeJsEval.swift:285:13:285:13 | string | semmle.label | string | +| UnsafeJsEval.swift:286:3:286:10 | .utf16 | semmle.label | .utf16 | +| UnsafeJsEval.swift:286:51:286:51 | stringBytes | semmle.label | stringBytes | +| UnsafeJsEval.swift:287:16:287:98 | call to JSStringRetain(_:) | semmle.label | call to JSStringRetain(_:) | +| UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) | semmle.label | call to JSStringCreateWithCharacters(_:_:) | | UnsafeJsEval.swift:291:17:291:17 | jsstr | semmle.label | jsstr | -| UnsafeJsEval.swift:299:13:299:13 | string : | semmle.label | string : | -| UnsafeJsEval.swift:300:3:300:10 | .utf8CString : | semmle.label | .utf8CString : | -| UnsafeJsEval.swift:300:48:300:48 | stringBytes : | semmle.label | stringBytes : | -| UnsafeJsEval.swift:301:16:301:85 | call to JSStringRetain(_:) : | semmle.label | call to JSStringRetain(_:) : | -| UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) : | semmle.label | call to JSStringCreateWithUTF8CString(_:) : | +| UnsafeJsEval.swift:299:13:299:13 | string | semmle.label | string | +| UnsafeJsEval.swift:300:3:300:10 | .utf8CString | semmle.label | .utf8CString | +| UnsafeJsEval.swift:300:48:300:48 | stringBytes | semmle.label | stringBytes | +| UnsafeJsEval.swift:301:16:301:85 | call to JSStringRetain(_:) | semmle.label | call to JSStringRetain(_:) | +| UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) | semmle.label | call to JSStringCreateWithUTF8CString(_:) | | UnsafeJsEval.swift:305:17:305:17 | jsstr | semmle.label | jsstr | -| UnsafeJsEval.swift:318:24:318:87 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| UnsafeJsEval.swift:318:24:318:87 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | UnsafeJsEval.swift:320:44:320:74 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | -| file://:0:0:0:0 | [summary param] 0 in String.init(decoding:as:) : | semmle.label | [summary param] 0 in String.init(decoding:as:) : | -| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | semmle.label | [summary] to write: return (return) in Data.init(_:) : | -| file://:0:0:0:0 | [summary] to write: return (return) in String.init(decoding:as:) : | semmle.label | [summary] to write: return (return) in String.init(decoding:as:) : | -| file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:) : | semmle.label | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:) : | -| file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) : | semmle.label | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) : | +| file://:0:0:0:0 | [summary param] 0 in String.init(decoding:as:) | semmle.label | [summary param] 0 in String.init(decoding:as:) | +| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | semmle.label | [summary] to write: return (return) in Data.init(_:) | +| file://:0:0:0:0 | [summary] to write: return (return) in String.init(decoding:as:) | semmle.label | [summary] to write: return (return) in String.init(decoding:as:) | +| file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:) | semmle.label | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:) | +| file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | semmle.label | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | subpaths -| UnsafeJsEval.swift:211:24:211:37 | .utf8 : | UnsafeJsEval.swift:144:5:144:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | UnsafeJsEval.swift:211:19:211:41 | call to Data.init(_:) : | -| UnsafeJsEval.swift:214:24:214:24 | remoteData : | file://:0:0:0:0 | [summary param] 0 in String.init(decoding:as:) : | file://:0:0:0:0 | [summary] to write: return (return) in String.init(decoding:as:) : | UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) : | -| UnsafeJsEval.swift:266:43:266:43 | string : | UnsafeJsEval.swift:69:2:73:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:) : | file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:) : | UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | -| UnsafeJsEval.swift:269:43:269:43 | string : | UnsafeJsEval.swift:75:2:80:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) : | file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) : | UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | -| UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) : | UnsafeJsEval.swift:124:21:124:42 | string : | UnsafeJsEval.swift:124:70:124:70 | string : | UnsafeJsEval.swift:287:16:287:98 | call to JSStringRetain(_:) : | -| UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) : | UnsafeJsEval.swift:124:21:124:42 | string : | UnsafeJsEval.swift:124:70:124:70 | string : | UnsafeJsEval.swift:301:16:301:85 | call to JSStringRetain(_:) : | +| UnsafeJsEval.swift:211:24:211:37 | .utf8 | UnsafeJsEval.swift:144:5:144:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | UnsafeJsEval.swift:211:19:211:41 | call to Data.init(_:) | +| UnsafeJsEval.swift:214:24:214:24 | remoteData | file://:0:0:0:0 | [summary param] 0 in String.init(decoding:as:) | file://:0:0:0:0 | [summary] to write: return (return) in String.init(decoding:as:) | UnsafeJsEval.swift:214:7:214:49 | call to String.init(decoding:as:) | +| UnsafeJsEval.swift:266:43:266:43 | string | UnsafeJsEval.swift:69:2:73:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:) | file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:) | UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | +| UnsafeJsEval.swift:269:43:269:43 | string | UnsafeJsEval.swift:75:2:80:5 | [summary param] 0 in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | file://:0:0:0:0 | [summary] to write: return (return) in WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | +| UnsafeJsEval.swift:287:31:287:97 | call to JSStringCreateWithCharacters(_:_:) | UnsafeJsEval.swift:124:21:124:42 | string | UnsafeJsEval.swift:124:70:124:70 | string | UnsafeJsEval.swift:287:16:287:98 | call to JSStringRetain(_:) | +| UnsafeJsEval.swift:301:31:301:84 | call to JSStringCreateWithUTF8CString(_:) | UnsafeJsEval.swift:124:21:124:42 | string | UnsafeJsEval.swift:124:70:124:70 | string | UnsafeJsEval.swift:301:16:301:85 | call to JSStringRetain(_:) | #select -| UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:277:26:277:26 | string | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:277:26:277:26 | string | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:277:26:277:26 | string | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:277:26:277:26 | string | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:280:26:280:26 | string | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:280:26:280:26 | string | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:280:26:280:26 | string | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:280:26:280:26 | string | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:291:17:291:17 | jsstr | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:291:17:291:17 | jsstr | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:291:17:291:17 | jsstr | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:291:17:291:17 | jsstr | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:305:17:305:17 | jsstr | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:305:17:305:17 | jsstr | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:305:17:305:17 | jsstr | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:305:17:305:17 | jsstr | Evaluation of uncontrolled JavaScript from a remote source. | -| UnsafeJsEval.swift:320:44:320:74 | ... .+(_:_:) ... | UnsafeJsEval.swift:318:24:318:87 | call to String.init(contentsOf:) : | UnsafeJsEval.swift:320:44:320:74 | ... .+(_:_:) ... | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) | UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) | UnsafeJsEval.swift:266:22:266:107 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:) | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) | UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) | UnsafeJsEval.swift:269:22:269:124 | call to WKUserScript.init(source:injectionTime:forMainFrameOnly:in:) | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:277:26:277:26 | string | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) | UnsafeJsEval.swift:277:26:277:26 | string | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:277:26:277:26 | string | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) | UnsafeJsEval.swift:277:26:277:26 | string | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:280:26:280:26 | string | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) | UnsafeJsEval.swift:280:26:280:26 | string | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:280:26:280:26 | string | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) | UnsafeJsEval.swift:280:26:280:26 | string | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:291:17:291:17 | jsstr | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) | UnsafeJsEval.swift:291:17:291:17 | jsstr | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:291:17:291:17 | jsstr | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) | UnsafeJsEval.swift:291:17:291:17 | jsstr | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:305:17:305:17 | jsstr | UnsafeJsEval.swift:165:14:165:37 | call to String.init(contentsOf:) | UnsafeJsEval.swift:305:17:305:17 | jsstr | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:305:17:305:17 | jsstr | UnsafeJsEval.swift:204:12:204:66 | call to String.init(contentsOf:) | UnsafeJsEval.swift:305:17:305:17 | jsstr | Evaluation of uncontrolled JavaScript from a remote source. | +| UnsafeJsEval.swift:320:44:320:74 | ... .+(_:_:) ... | UnsafeJsEval.swift:318:24:318:87 | call to String.init(contentsOf:) | UnsafeJsEval.swift:320:44:320:74 | ... .+(_:_:) ... | Evaluation of uncontrolled JavaScript from a remote source. | diff --git a/swift/ql/test/query-tests/Security/CWE-1204/StaticInitializationVector.expected b/swift/ql/test/query-tests/Security/CWE-1204/StaticInitializationVector.expected index d98cdc3ef78..f557206f20d 100644 --- a/swift/ql/test/query-tests/Security/CWE-1204/StaticInitializationVector.expected +++ b/swift/ql/test/query-tests/Security/CWE-1204/StaticInitializationVector.expected @@ -1,55 +1,55 @@ edges -| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | -| rncryptor.swift:60:19:60:25 | call to Data.init(_:) : | rncryptor.swift:68:104:68:104 | myConstIV1 | -| rncryptor.swift:60:19:60:25 | call to Data.init(_:) : | rncryptor.swift:77:125:77:125 | myConstIV1 | -| rncryptor.swift:60:24:60:24 | 0 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | -| rncryptor.swift:60:24:60:24 | 0 : | rncryptor.swift:60:19:60:25 | call to Data.init(_:) : | -| rncryptor.swift:61:19:61:27 | call to Data.init(_:) : | rncryptor.swift:70:104:70:104 | myConstIV2 | -| rncryptor.swift:61:19:61:27 | call to Data.init(_:) : | rncryptor.swift:79:133:79:133 | myConstIV2 | -| rncryptor.swift:61:24:61:24 | 123 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | -| rncryptor.swift:61:24:61:24 | 123 : | rncryptor.swift:61:19:61:27 | call to Data.init(_:) : | -| rncryptor.swift:62:19:62:35 | call to Data.init(_:) : | rncryptor.swift:72:84:72:84 | myConstIV3 | -| rncryptor.swift:62:19:62:35 | call to Data.init(_:) : | rncryptor.swift:81:105:81:105 | myConstIV3 | -| rncryptor.swift:62:24:62:34 | [...] : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | -| rncryptor.swift:62:24:62:34 | [...] : | rncryptor.swift:62:19:62:35 | call to Data.init(_:) : | -| rncryptor.swift:63:19:63:28 | call to Data.init(_:) : | rncryptor.swift:74:84:74:84 | myConstIV4 | -| rncryptor.swift:63:19:63:28 | call to Data.init(_:) : | rncryptor.swift:83:113:83:113 | myConstIV4 | -| rncryptor.swift:63:24:63:24 | iv : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | -| rncryptor.swift:63:24:63:24 | iv : | rncryptor.swift:63:19:63:28 | call to Data.init(_:) : | -| test.swift:53:19:53:34 | iv : | test.swift:54:17:54:17 | iv | -| test.swift:85:3:85:3 | this string is constant : | test.swift:101:17:101:35 | call to getConstantString() : | -| test.swift:99:25:99:120 | [...] : | test.swift:128:33:128:33 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:135:22:135:22 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:139:22:139:22 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:140:22:140:22 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:145:22:145:22 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:146:22:146:22 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:147:22:147:22 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:147:22:147:22 | iv : | -| test.swift:99:25:99:120 | [...] : | test.swift:153:22:153:22 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:157:24:157:24 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:161:22:161:22 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:162:22:162:22 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:167:22:167:22 | iv | -| test.swift:99:25:99:120 | [...] : | test.swift:168:22:168:22 | iv | -| test.swift:101:17:101:35 | call to getConstantString() : | test.swift:112:36:112:36 | ivString | -| test.swift:101:17:101:35 | call to getConstantString() : | test.swift:113:36:113:36 | ivString | -| test.swift:101:17:101:35 | call to getConstantString() : | test.swift:118:41:118:41 | ivString | -| test.swift:101:17:101:35 | call to getConstantString() : | test.swift:122:41:122:41 | ivString | -| test.swift:101:17:101:35 | call to getConstantString() : | test.swift:123:41:123:41 | ivString | -| test.swift:101:17:101:35 | call to getConstantString() : | test.swift:130:39:130:39 | ivString | -| test.swift:147:22:147:22 | iv : | test.swift:53:19:53:34 | iv : | +| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | +| rncryptor.swift:60:19:60:25 | call to Data.init(_:) | rncryptor.swift:68:104:68:104 | myConstIV1 | +| rncryptor.swift:60:19:60:25 | call to Data.init(_:) | rncryptor.swift:77:125:77:125 | myConstIV1 | +| rncryptor.swift:60:24:60:24 | 0 | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | +| rncryptor.swift:60:24:60:24 | 0 | rncryptor.swift:60:19:60:25 | call to Data.init(_:) | +| rncryptor.swift:61:19:61:27 | call to Data.init(_:) | rncryptor.swift:70:104:70:104 | myConstIV2 | +| rncryptor.swift:61:19:61:27 | call to Data.init(_:) | rncryptor.swift:79:133:79:133 | myConstIV2 | +| rncryptor.swift:61:24:61:24 | 123 | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | +| rncryptor.swift:61:24:61:24 | 123 | rncryptor.swift:61:19:61:27 | call to Data.init(_:) | +| rncryptor.swift:62:19:62:35 | call to Data.init(_:) | rncryptor.swift:72:84:72:84 | myConstIV3 | +| rncryptor.swift:62:19:62:35 | call to Data.init(_:) | rncryptor.swift:81:105:81:105 | myConstIV3 | +| rncryptor.swift:62:24:62:34 | [...] | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | +| rncryptor.swift:62:24:62:34 | [...] | rncryptor.swift:62:19:62:35 | call to Data.init(_:) | +| rncryptor.swift:63:19:63:28 | call to Data.init(_:) | rncryptor.swift:74:84:74:84 | myConstIV4 | +| rncryptor.swift:63:19:63:28 | call to Data.init(_:) | rncryptor.swift:83:113:83:113 | myConstIV4 | +| rncryptor.swift:63:24:63:24 | iv | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | +| rncryptor.swift:63:24:63:24 | iv | rncryptor.swift:63:19:63:28 | call to Data.init(_:) | +| test.swift:53:19:53:34 | iv | test.swift:54:17:54:17 | iv | +| test.swift:85:3:85:3 | this string is constant | test.swift:101:17:101:35 | call to getConstantString() | +| test.swift:99:25:99:120 | [...] | test.swift:128:33:128:33 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:135:22:135:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:139:22:139:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:140:22:140:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:145:22:145:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:146:22:146:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:147:22:147:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:147:22:147:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:153:22:153:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:157:24:157:24 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:161:22:161:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:162:22:162:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:167:22:167:22 | iv | +| test.swift:99:25:99:120 | [...] | test.swift:168:22:168:22 | iv | +| test.swift:101:17:101:35 | call to getConstantString() | test.swift:112:36:112:36 | ivString | +| test.swift:101:17:101:35 | call to getConstantString() | test.swift:113:36:113:36 | ivString | +| test.swift:101:17:101:35 | call to getConstantString() | test.swift:118:41:118:41 | ivString | +| test.swift:101:17:101:35 | call to getConstantString() | test.swift:122:41:122:41 | ivString | +| test.swift:101:17:101:35 | call to getConstantString() | test.swift:123:41:123:41 | ivString | +| test.swift:101:17:101:35 | call to getConstantString() | test.swift:130:39:130:39 | ivString | +| test.swift:147:22:147:22 | iv | test.swift:53:19:53:34 | iv | nodes -| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | semmle.label | [summary] to write: return (return) in Data.init(_:) : | -| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | semmle.label | [summary param] 0 in Data.init(_:) : | -| rncryptor.swift:60:19:60:25 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| rncryptor.swift:60:24:60:24 | 0 : | semmle.label | 0 : | -| rncryptor.swift:61:19:61:27 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| rncryptor.swift:61:24:61:24 | 123 : | semmle.label | 123 : | -| rncryptor.swift:62:19:62:35 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| rncryptor.swift:62:24:62:34 | [...] : | semmle.label | [...] : | -| rncryptor.swift:63:19:63:28 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| rncryptor.swift:63:24:63:24 | iv : | semmle.label | iv : | +| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | semmle.label | [summary] to write: return (return) in Data.init(_:) | +| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | semmle.label | [summary param] 0 in Data.init(_:) | +| rncryptor.swift:60:19:60:25 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| rncryptor.swift:60:24:60:24 | 0 | semmle.label | 0 | +| rncryptor.swift:61:19:61:27 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| rncryptor.swift:61:24:61:24 | 123 | semmle.label | 123 | +| rncryptor.swift:62:19:62:35 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| rncryptor.swift:62:24:62:34 | [...] | semmle.label | [...] | +| rncryptor.swift:63:19:63:28 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| rncryptor.swift:63:24:63:24 | iv | semmle.label | iv | | rncryptor.swift:68:104:68:104 | myConstIV1 | semmle.label | myConstIV1 | | rncryptor.swift:70:104:70:104 | myConstIV2 | semmle.label | myConstIV2 | | rncryptor.swift:72:84:72:84 | myConstIV3 | semmle.label | myConstIV3 | @@ -58,11 +58,11 @@ nodes | rncryptor.swift:79:133:79:133 | myConstIV2 | semmle.label | myConstIV2 | | rncryptor.swift:81:105:81:105 | myConstIV3 | semmle.label | myConstIV3 | | rncryptor.swift:83:113:83:113 | myConstIV4 | semmle.label | myConstIV4 | -| test.swift:53:19:53:34 | iv : | semmle.label | iv : | +| test.swift:53:19:53:34 | iv | semmle.label | iv | | test.swift:54:17:54:17 | iv | semmle.label | iv | -| test.swift:85:3:85:3 | this string is constant : | semmle.label | this string is constant : | -| test.swift:99:25:99:120 | [...] : | semmle.label | [...] : | -| test.swift:101:17:101:35 | call to getConstantString() : | semmle.label | call to getConstantString() : | +| test.swift:85:3:85:3 | this string is constant | semmle.label | this string is constant | +| test.swift:99:25:99:120 | [...] | semmle.label | [...] | +| test.swift:101:17:101:35 | call to getConstantString() | semmle.label | call to getConstantString() | | test.swift:112:36:112:36 | ivString | semmle.label | ivString | | test.swift:113:36:113:36 | ivString | semmle.label | ivString | | test.swift:118:41:118:41 | ivString | semmle.label | ivString | @@ -76,7 +76,7 @@ nodes | test.swift:145:22:145:22 | iv | semmle.label | iv | | test.swift:146:22:146:22 | iv | semmle.label | iv | | test.swift:147:22:147:22 | iv | semmle.label | iv | -| test.swift:147:22:147:22 | iv : | semmle.label | iv : | +| test.swift:147:22:147:22 | iv | semmle.label | iv | | test.swift:153:22:153:22 | iv | semmle.label | iv | | test.swift:157:24:157:24 | iv | semmle.label | iv | | test.swift:161:22:161:22 | iv | semmle.label | iv | @@ -84,36 +84,36 @@ nodes | test.swift:167:22:167:22 | iv | semmle.label | iv | | test.swift:168:22:168:22 | iv | semmle.label | iv | subpaths -| rncryptor.swift:60:24:60:24 | 0 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | rncryptor.swift:60:19:60:25 | call to Data.init(_:) : | -| rncryptor.swift:61:24:61:24 | 123 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | rncryptor.swift:61:19:61:27 | call to Data.init(_:) : | -| rncryptor.swift:62:24:62:34 | [...] : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | rncryptor.swift:62:19:62:35 | call to Data.init(_:) : | -| rncryptor.swift:63:24:63:24 | iv : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | rncryptor.swift:63:19:63:28 | call to Data.init(_:) : | +| rncryptor.swift:60:24:60:24 | 0 | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | rncryptor.swift:60:19:60:25 | call to Data.init(_:) | +| rncryptor.swift:61:24:61:24 | 123 | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | rncryptor.swift:61:19:61:27 | call to Data.init(_:) | +| rncryptor.swift:62:24:62:34 | [...] | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | rncryptor.swift:62:19:62:35 | call to Data.init(_:) | +| rncryptor.swift:63:24:63:24 | iv | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | rncryptor.swift:63:19:63:28 | call to Data.init(_:) | #select -| rncryptor.swift:68:104:68:104 | myConstIV1 | rncryptor.swift:60:24:60:24 | 0 : | rncryptor.swift:68:104:68:104 | myConstIV1 | The static value '0' is used as an initialization vector for encryption. | -| rncryptor.swift:70:104:70:104 | myConstIV2 | rncryptor.swift:61:24:61:24 | 123 : | rncryptor.swift:70:104:70:104 | myConstIV2 | The static value '123' is used as an initialization vector for encryption. | -| rncryptor.swift:72:84:72:84 | myConstIV3 | rncryptor.swift:62:24:62:34 | [...] : | rncryptor.swift:72:84:72:84 | myConstIV3 | The static value '[...]' is used as an initialization vector for encryption. | -| rncryptor.swift:74:84:74:84 | myConstIV4 | rncryptor.swift:63:24:63:24 | iv : | rncryptor.swift:74:84:74:84 | myConstIV4 | The static value 'iv' is used as an initialization vector for encryption. | -| rncryptor.swift:77:125:77:125 | myConstIV1 | rncryptor.swift:60:24:60:24 | 0 : | rncryptor.swift:77:125:77:125 | myConstIV1 | The static value '0' is used as an initialization vector for encryption. | -| rncryptor.swift:79:133:79:133 | myConstIV2 | rncryptor.swift:61:24:61:24 | 123 : | rncryptor.swift:79:133:79:133 | myConstIV2 | The static value '123' is used as an initialization vector for encryption. | -| rncryptor.swift:81:105:81:105 | myConstIV3 | rncryptor.swift:62:24:62:34 | [...] : | rncryptor.swift:81:105:81:105 | myConstIV3 | The static value '[...]' is used as an initialization vector for encryption. | -| rncryptor.swift:83:113:83:113 | myConstIV4 | rncryptor.swift:63:24:63:24 | iv : | rncryptor.swift:83:113:83:113 | myConstIV4 | The static value 'iv' is used as an initialization vector for encryption. | -| test.swift:54:17:54:17 | iv | test.swift:99:25:99:120 | [...] : | test.swift:54:17:54:17 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:112:36:112:36 | ivString | test.swift:85:3:85:3 | this string is constant : | test.swift:112:36:112:36 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | -| test.swift:113:36:113:36 | ivString | test.swift:85:3:85:3 | this string is constant : | test.swift:113:36:113:36 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | -| test.swift:118:41:118:41 | ivString | test.swift:85:3:85:3 | this string is constant : | test.swift:118:41:118:41 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | -| test.swift:122:41:122:41 | ivString | test.swift:85:3:85:3 | this string is constant : | test.swift:122:41:122:41 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | -| test.swift:123:41:123:41 | ivString | test.swift:85:3:85:3 | this string is constant : | test.swift:123:41:123:41 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | -| test.swift:128:33:128:33 | iv | test.swift:99:25:99:120 | [...] : | test.swift:128:33:128:33 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:130:39:130:39 | ivString | test.swift:85:3:85:3 | this string is constant : | test.swift:130:39:130:39 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | -| test.swift:135:22:135:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:135:22:135:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:139:22:139:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:139:22:139:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:140:22:140:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:140:22:140:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:145:22:145:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:145:22:145:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:146:22:146:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:146:22:146:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:147:22:147:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:147:22:147:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:153:22:153:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:153:22:153:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:157:24:157:24 | iv | test.swift:99:25:99:120 | [...] : | test.swift:157:24:157:24 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:161:22:161:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:161:22:161:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:162:22:162:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:162:22:162:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:167:22:167:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:167:22:167:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | -| test.swift:168:22:168:22 | iv | test.swift:99:25:99:120 | [...] : | test.swift:168:22:168:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| rncryptor.swift:68:104:68:104 | myConstIV1 | rncryptor.swift:60:24:60:24 | 0 | rncryptor.swift:68:104:68:104 | myConstIV1 | The static value '0' is used as an initialization vector for encryption. | +| rncryptor.swift:70:104:70:104 | myConstIV2 | rncryptor.swift:61:24:61:24 | 123 | rncryptor.swift:70:104:70:104 | myConstIV2 | The static value '123' is used as an initialization vector for encryption. | +| rncryptor.swift:72:84:72:84 | myConstIV3 | rncryptor.swift:62:24:62:34 | [...] | rncryptor.swift:72:84:72:84 | myConstIV3 | The static value '[...]' is used as an initialization vector for encryption. | +| rncryptor.swift:74:84:74:84 | myConstIV4 | rncryptor.swift:63:24:63:24 | iv | rncryptor.swift:74:84:74:84 | myConstIV4 | The static value 'iv' is used as an initialization vector for encryption. | +| rncryptor.swift:77:125:77:125 | myConstIV1 | rncryptor.swift:60:24:60:24 | 0 | rncryptor.swift:77:125:77:125 | myConstIV1 | The static value '0' is used as an initialization vector for encryption. | +| rncryptor.swift:79:133:79:133 | myConstIV2 | rncryptor.swift:61:24:61:24 | 123 | rncryptor.swift:79:133:79:133 | myConstIV2 | The static value '123' is used as an initialization vector for encryption. | +| rncryptor.swift:81:105:81:105 | myConstIV3 | rncryptor.swift:62:24:62:34 | [...] | rncryptor.swift:81:105:81:105 | myConstIV3 | The static value '[...]' is used as an initialization vector for encryption. | +| rncryptor.swift:83:113:83:113 | myConstIV4 | rncryptor.swift:63:24:63:24 | iv | rncryptor.swift:83:113:83:113 | myConstIV4 | The static value 'iv' is used as an initialization vector for encryption. | +| test.swift:54:17:54:17 | iv | test.swift:99:25:99:120 | [...] | test.swift:54:17:54:17 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:112:36:112:36 | ivString | test.swift:85:3:85:3 | this string is constant | test.swift:112:36:112:36 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | +| test.swift:113:36:113:36 | ivString | test.swift:85:3:85:3 | this string is constant | test.swift:113:36:113:36 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | +| test.swift:118:41:118:41 | ivString | test.swift:85:3:85:3 | this string is constant | test.swift:118:41:118:41 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | +| test.swift:122:41:122:41 | ivString | test.swift:85:3:85:3 | this string is constant | test.swift:122:41:122:41 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | +| test.swift:123:41:123:41 | ivString | test.swift:85:3:85:3 | this string is constant | test.swift:123:41:123:41 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | +| test.swift:128:33:128:33 | iv | test.swift:99:25:99:120 | [...] | test.swift:128:33:128:33 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:130:39:130:39 | ivString | test.swift:85:3:85:3 | this string is constant | test.swift:130:39:130:39 | ivString | The static value 'this string is constant' is used as an initialization vector for encryption. | +| test.swift:135:22:135:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:135:22:135:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:139:22:139:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:139:22:139:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:140:22:140:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:140:22:140:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:145:22:145:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:145:22:145:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:146:22:146:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:146:22:146:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:147:22:147:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:147:22:147:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:153:22:153:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:153:22:153:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:157:24:157:24 | iv | test.swift:99:25:99:120 | [...] | test.swift:157:24:157:24 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:161:22:161:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:161:22:161:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:162:22:162:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:162:22:162:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:167:22:167:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:167:22:167:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | +| test.swift:168:22:168:22 | iv | test.swift:99:25:99:120 | [...] | test.swift:168:22:168:22 | iv | The static value '[...]' is used as an initialization vector for encryption. | diff --git a/swift/ql/test/query-tests/Security/CWE-134/UncontrolledFormatString.expected b/swift/ql/test/query-tests/Security/CWE-134/UncontrolledFormatString.expected index c1948429159..edf2fc3b140 100644 --- a/swift/ql/test/query-tests/Security/CWE-134/UncontrolledFormatString.expected +++ b/swift/ql/test/query-tests/Security/CWE-134/UncontrolledFormatString.expected @@ -1,29 +1,29 @@ edges -| UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) : | file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) : | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:70:28:70:28 | tainted | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:73:28:73:28 | tainted | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:74:28:74:28 | tainted | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:76:28:76:28 | tainted | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:77:28:77:28 | tainted | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:78:28:78:28 | tainted | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:79:46:79:46 | tainted | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:81:47:81:47 | tainted : | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:82:65:82:65 | tainted : | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:84:54:84:54 | tainted : | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:85:72:85:72 | tainted : | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:88:11:88:11 | tainted | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:91:61:91:61 | tainted | -| UncontrolledFormatString.swift:81:47:81:47 | tainted : | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) : | -| UncontrolledFormatString.swift:81:47:81:47 | tainted : | UncontrolledFormatString.swift:81:30:81:54 | call to NSString.init(string:) | -| UncontrolledFormatString.swift:82:65:82:65 | tainted : | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) : | -| UncontrolledFormatString.swift:82:65:82:65 | tainted : | UncontrolledFormatString.swift:82:48:82:72 | call to NSString.init(string:) | -| UncontrolledFormatString.swift:84:54:84:54 | tainted : | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) : | -| UncontrolledFormatString.swift:84:54:84:54 | tainted : | UncontrolledFormatString.swift:84:37:84:61 | call to NSString.init(string:) | -| UncontrolledFormatString.swift:85:72:85:72 | tainted : | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) : | -| UncontrolledFormatString.swift:85:72:85:72 | tainted : | UncontrolledFormatString.swift:85:55:85:79 | call to NSString.init(string:) | +| UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) | file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:70:28:70:28 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:73:28:73:28 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:74:28:74:28 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:76:28:76:28 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:77:28:77:28 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:78:28:78:28 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:79:46:79:46 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:81:47:81:47 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:82:65:82:65 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:84:54:84:54 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:85:72:85:72 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:88:11:88:11 | tainted | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:91:61:91:61 | tainted | +| UncontrolledFormatString.swift:81:47:81:47 | tainted | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) | +| UncontrolledFormatString.swift:81:47:81:47 | tainted | UncontrolledFormatString.swift:81:30:81:54 | call to NSString.init(string:) | +| UncontrolledFormatString.swift:82:65:82:65 | tainted | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) | +| UncontrolledFormatString.swift:82:65:82:65 | tainted | UncontrolledFormatString.swift:82:48:82:72 | call to NSString.init(string:) | +| UncontrolledFormatString.swift:84:54:84:54 | tainted | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) | +| UncontrolledFormatString.swift:84:54:84:54 | tainted | UncontrolledFormatString.swift:84:37:84:61 | call to NSString.init(string:) | +| UncontrolledFormatString.swift:85:72:85:72 | tainted | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) | +| UncontrolledFormatString.swift:85:72:85:72 | tainted | UncontrolledFormatString.swift:85:55:85:79 | call to NSString.init(string:) | nodes -| UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) : | semmle.label | [summary param] 0 in NSString.init(string:) : | -| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | semmle.label | call to String.init(contentsOf:) : | +| UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) | semmle.label | [summary param] 0 in NSString.init(string:) | +| UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | semmle.label | call to String.init(contentsOf:) | | UncontrolledFormatString.swift:70:28:70:28 | tainted | semmle.label | tainted | | UncontrolledFormatString.swift:73:28:73:28 | tainted | semmle.label | tainted | | UncontrolledFormatString.swift:74:28:74:28 | tainted | semmle.label | tainted | @@ -32,32 +32,32 @@ nodes | UncontrolledFormatString.swift:78:28:78:28 | tainted | semmle.label | tainted | | UncontrolledFormatString.swift:79:46:79:46 | tainted | semmle.label | tainted | | UncontrolledFormatString.swift:81:30:81:54 | call to NSString.init(string:) | semmle.label | call to NSString.init(string:) | -| UncontrolledFormatString.swift:81:47:81:47 | tainted : | semmle.label | tainted : | +| UncontrolledFormatString.swift:81:47:81:47 | tainted | semmle.label | tainted | | UncontrolledFormatString.swift:82:48:82:72 | call to NSString.init(string:) | semmle.label | call to NSString.init(string:) | -| UncontrolledFormatString.swift:82:65:82:65 | tainted : | semmle.label | tainted : | +| UncontrolledFormatString.swift:82:65:82:65 | tainted | semmle.label | tainted | | UncontrolledFormatString.swift:84:37:84:61 | call to NSString.init(string:) | semmle.label | call to NSString.init(string:) | -| UncontrolledFormatString.swift:84:54:84:54 | tainted : | semmle.label | tainted : | +| UncontrolledFormatString.swift:84:54:84:54 | tainted | semmle.label | tainted | | UncontrolledFormatString.swift:85:55:85:79 | call to NSString.init(string:) | semmle.label | call to NSString.init(string:) | -| UncontrolledFormatString.swift:85:72:85:72 | tainted : | semmle.label | tainted : | +| UncontrolledFormatString.swift:85:72:85:72 | tainted | semmle.label | tainted | | UncontrolledFormatString.swift:88:11:88:11 | tainted | semmle.label | tainted | | UncontrolledFormatString.swift:91:61:91:61 | tainted | semmle.label | tainted | -| file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) : | semmle.label | [summary] to write: return (return) in NSString.init(string:) : | +| file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) | semmle.label | [summary] to write: return (return) in NSString.init(string:) | subpaths -| UncontrolledFormatString.swift:81:47:81:47 | tainted : | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) : | file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) : | UncontrolledFormatString.swift:81:30:81:54 | call to NSString.init(string:) | -| UncontrolledFormatString.swift:82:65:82:65 | tainted : | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) : | file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) : | UncontrolledFormatString.swift:82:48:82:72 | call to NSString.init(string:) | -| UncontrolledFormatString.swift:84:54:84:54 | tainted : | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) : | file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) : | UncontrolledFormatString.swift:84:37:84:61 | call to NSString.init(string:) | -| UncontrolledFormatString.swift:85:72:85:72 | tainted : | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) : | file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) : | UncontrolledFormatString.swift:85:55:85:79 | call to NSString.init(string:) | +| UncontrolledFormatString.swift:81:47:81:47 | tainted | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) | file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) | UncontrolledFormatString.swift:81:30:81:54 | call to NSString.init(string:) | +| UncontrolledFormatString.swift:82:65:82:65 | tainted | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) | file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) | UncontrolledFormatString.swift:82:48:82:72 | call to NSString.init(string:) | +| UncontrolledFormatString.swift:84:54:84:54 | tainted | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) | file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) | UncontrolledFormatString.swift:84:37:84:61 | call to NSString.init(string:) | +| UncontrolledFormatString.swift:85:72:85:72 | tainted | UncontrolledFormatString.swift:30:5:30:35 | [summary param] 0 in NSString.init(string:) | file://:0:0:0:0 | [summary] to write: return (return) in NSString.init(string:) | UncontrolledFormatString.swift:85:55:85:79 | call to NSString.init(string:) | #select -| UncontrolledFormatString.swift:70:28:70:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:70:28:70:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:73:28:73:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:73:28:73:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:74:28:74:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:74:28:74:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:76:28:76:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:76:28:76:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:77:28:77:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:77:28:77:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:78:28:78:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:78:28:78:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:79:46:79:46 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:79:46:79:46 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:81:30:81:54 | call to NSString.init(string:) | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:81:30:81:54 | call to NSString.init(string:) | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:82:48:82:72 | call to NSString.init(string:) | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:82:48:82:72 | call to NSString.init(string:) | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:84:37:84:61 | call to NSString.init(string:) | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:84:37:84:61 | call to NSString.init(string:) | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:85:55:85:79 | call to NSString.init(string:) | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:85:55:85:79 | call to NSString.init(string:) | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:88:11:88:11 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:88:11:88:11 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | -| UncontrolledFormatString.swift:91:61:91:61 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) : | UncontrolledFormatString.swift:91:61:91:61 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:70:28:70:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:70:28:70:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:73:28:73:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:73:28:73:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:74:28:74:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:74:28:74:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:76:28:76:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:76:28:76:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:77:28:77:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:77:28:77:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:78:28:78:28 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:78:28:78:28 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:79:46:79:46 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:79:46:79:46 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:81:30:81:54 | call to NSString.init(string:) | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:81:30:81:54 | call to NSString.init(string:) | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:82:48:82:72 | call to NSString.init(string:) | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:82:48:82:72 | call to NSString.init(string:) | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:84:37:84:61 | call to NSString.init(string:) | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:84:37:84:61 | call to NSString.init(string:) | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:85:55:85:79 | call to NSString.init(string:) | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:85:55:85:79 | call to NSString.init(string:) | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:88:11:88:11 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:88:11:88:11 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | +| UncontrolledFormatString.swift:91:61:91:61 | tainted | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:91:61:91:61 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:64:24:64:77 | call to String.init(contentsOf:) | this user-provided value | diff --git a/swift/ql/test/query-tests/Security/CWE-135/StringLengthConflation.expected b/swift/ql/test/query-tests/Security/CWE-135/StringLengthConflation.expected index 17e2c383dd8..b0154ec15af 100644 --- a/swift/ql/test/query-tests/Security/CWE-135/StringLengthConflation.expected +++ b/swift/ql/test/query-tests/Security/CWE-135/StringLengthConflation.expected @@ -1,119 +1,119 @@ edges -| StringLengthConflation2.swift:35:36:35:38 | .count : | StringLengthConflation2.swift:35:36:35:46 | ... .-(_:_:) ... | -| StringLengthConflation2.swift:37:34:37:36 | .count : | StringLengthConflation2.swift:37:34:37:44 | ... .-(_:_:) ... | -| StringLengthConflation.swift:36:30:36:37 | len : | StringLengthConflation.swift:36:93:36:93 | len | -| StringLengthConflation.swift:60:47:60:50 | .length : | StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | -| StringLengthConflation.swift:66:33:66:36 | .length : | StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | -| StringLengthConflation.swift:72:33:72:35 | .count : | StringLengthConflation.swift:36:30:36:37 | len : | -| StringLengthConflation.swift:96:28:96:31 | .length : | StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | -| StringLengthConflation.swift:100:27:100:30 | .length : | StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | -| StringLengthConflation.swift:104:25:104:28 | .length : | StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | -| StringLengthConflation.swift:108:25:108:28 | .length : | StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | -| StringLengthConflation.swift:114:23:114:26 | .length : | StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | -| StringLengthConflation.swift:120:22:120:25 | .length : | StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | -| StringLengthConflation.swift:125:34:125:36 | .count : | StringLengthConflation.swift:125:34:125:44 | ... .-(_:_:) ... | -| StringLengthConflation.swift:126:36:126:38 | .count : | StringLengthConflation.swift:126:36:126:46 | ... .-(_:_:) ... | -| StringLengthConflation.swift:131:36:131:38 | .count : | StringLengthConflation.swift:131:36:131:46 | ... .-(_:_:) ... | -| StringLengthConflation.swift:132:38:132:40 | .count : | StringLengthConflation.swift:132:38:132:48 | ... .-(_:_:) ... | -| StringLengthConflation.swift:137:34:137:36 | .count : | StringLengthConflation.swift:137:34:137:44 | ... .-(_:_:) ... | -| StringLengthConflation.swift:138:36:138:38 | .count : | StringLengthConflation.swift:138:36:138:46 | ... .-(_:_:) ... | -| StringLengthConflation.swift:144:28:144:30 | .count : | StringLengthConflation.swift:144:28:144:38 | ... .-(_:_:) ... | -| file://:0:0:0:0 | .length : | StringLengthConflation.swift:53:43:53:46 | .length | -| file://:0:0:0:0 | .length : | StringLengthConflation.swift:60:47:60:50 | .length : | -| file://:0:0:0:0 | .length : | StringLengthConflation.swift:66:33:66:36 | .length : | -| file://:0:0:0:0 | .length : | StringLengthConflation.swift:96:28:96:31 | .length : | -| file://:0:0:0:0 | .length : | StringLengthConflation.swift:100:27:100:30 | .length : | -| file://:0:0:0:0 | .length : | StringLengthConflation.swift:104:25:104:28 | .length : | -| file://:0:0:0:0 | .length : | StringLengthConflation.swift:108:25:108:28 | .length : | -| file://:0:0:0:0 | .length : | StringLengthConflation.swift:114:23:114:26 | .length : | -| file://:0:0:0:0 | .length : | StringLengthConflation.swift:120:22:120:25 | .length : | +| StringLengthConflation2.swift:35:36:35:38 | .count | StringLengthConflation2.swift:35:36:35:46 | ... .-(_:_:) ... | +| StringLengthConflation2.swift:37:34:37:36 | .count | StringLengthConflation2.swift:37:34:37:44 | ... .-(_:_:) ... | +| StringLengthConflation.swift:36:30:36:37 | len | StringLengthConflation.swift:36:93:36:93 | len | +| StringLengthConflation.swift:60:47:60:50 | .length | StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | +| StringLengthConflation.swift:66:33:66:36 | .length | StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | +| StringLengthConflation.swift:72:33:72:35 | .count | StringLengthConflation.swift:36:30:36:37 | len | +| StringLengthConflation.swift:96:28:96:31 | .length | StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | +| StringLengthConflation.swift:100:27:100:30 | .length | StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | +| StringLengthConflation.swift:104:25:104:28 | .length | StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | +| StringLengthConflation.swift:108:25:108:28 | .length | StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | +| StringLengthConflation.swift:114:23:114:26 | .length | StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | +| StringLengthConflation.swift:120:22:120:25 | .length | StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | +| StringLengthConflation.swift:125:34:125:36 | .count | StringLengthConflation.swift:125:34:125:44 | ... .-(_:_:) ... | +| StringLengthConflation.swift:126:36:126:38 | .count | StringLengthConflation.swift:126:36:126:46 | ... .-(_:_:) ... | +| StringLengthConflation.swift:131:36:131:38 | .count | StringLengthConflation.swift:131:36:131:46 | ... .-(_:_:) ... | +| StringLengthConflation.swift:132:38:132:40 | .count | StringLengthConflation.swift:132:38:132:48 | ... .-(_:_:) ... | +| StringLengthConflation.swift:137:34:137:36 | .count | StringLengthConflation.swift:137:34:137:44 | ... .-(_:_:) ... | +| StringLengthConflation.swift:138:36:138:38 | .count | StringLengthConflation.swift:138:36:138:46 | ... .-(_:_:) ... | +| StringLengthConflation.swift:144:28:144:30 | .count | StringLengthConflation.swift:144:28:144:38 | ... .-(_:_:) ... | +| file://:0:0:0:0 | .length | StringLengthConflation.swift:53:43:53:46 | .length | +| file://:0:0:0:0 | .length | StringLengthConflation.swift:60:47:60:50 | .length | +| file://:0:0:0:0 | .length | StringLengthConflation.swift:66:33:66:36 | .length | +| file://:0:0:0:0 | .length | StringLengthConflation.swift:96:28:96:31 | .length | +| file://:0:0:0:0 | .length | StringLengthConflation.swift:100:27:100:30 | .length | +| file://:0:0:0:0 | .length | StringLengthConflation.swift:104:25:104:28 | .length | +| file://:0:0:0:0 | .length | StringLengthConflation.swift:108:25:108:28 | .length | +| file://:0:0:0:0 | .length | StringLengthConflation.swift:114:23:114:26 | .length | +| file://:0:0:0:0 | .length | StringLengthConflation.swift:120:22:120:25 | .length | nodes -| StringLengthConflation2.swift:35:36:35:38 | .count : | semmle.label | .count : | +| StringLengthConflation2.swift:35:36:35:38 | .count | semmle.label | .count | | StringLengthConflation2.swift:35:36:35:46 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation2.swift:37:34:37:36 | .count : | semmle.label | .count : | +| StringLengthConflation2.swift:37:34:37:36 | .count | semmle.label | .count | | StringLengthConflation2.swift:37:34:37:44 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:36:30:36:37 | len : | semmle.label | len : | +| StringLengthConflation.swift:36:30:36:37 | len | semmle.label | len | | StringLengthConflation.swift:36:93:36:93 | len | semmle.label | len | | StringLengthConflation.swift:53:43:53:46 | .length | semmle.label | .length | | StringLengthConflation.swift:54:43:54:50 | .count | semmle.label | .count | | StringLengthConflation.swift:55:43:55:51 | .count | semmle.label | .count | | StringLengthConflation.swift:56:43:56:60 | .count | semmle.label | .count | -| StringLengthConflation.swift:60:47:60:50 | .length : | semmle.label | .length : | +| StringLengthConflation.swift:60:47:60:50 | .length | semmle.label | .length | | StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | semmle.label | ... ./(_:_:) ... | -| StringLengthConflation.swift:66:33:66:36 | .length : | semmle.label | .length : | +| StringLengthConflation.swift:66:33:66:36 | .length | semmle.label | .length | | StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | semmle.label | ... ./(_:_:) ... | | StringLengthConflation.swift:72:33:72:35 | .count | semmle.label | .count | -| StringLengthConflation.swift:72:33:72:35 | .count : | semmle.label | .count : | +| StringLengthConflation.swift:72:33:72:35 | .count | semmle.label | .count | | StringLengthConflation.swift:78:47:78:49 | .count | semmle.label | .count | | StringLengthConflation.swift:79:47:79:54 | .count | semmle.label | .count | | StringLengthConflation.swift:81:47:81:64 | .count | semmle.label | .count | -| StringLengthConflation.swift:96:28:96:31 | .length : | semmle.label | .length : | +| StringLengthConflation.swift:96:28:96:31 | .length | semmle.label | .length | | StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:100:27:100:30 | .length : | semmle.label | .length : | +| StringLengthConflation.swift:100:27:100:30 | .length | semmle.label | .length | | StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:104:25:104:28 | .length : | semmle.label | .length : | +| StringLengthConflation.swift:104:25:104:28 | .length | semmle.label | .length | | StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:108:25:108:28 | .length : | semmle.label | .length : | +| StringLengthConflation.swift:108:25:108:28 | .length | semmle.label | .length | | StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:114:23:114:26 | .length : | semmle.label | .length : | +| StringLengthConflation.swift:114:23:114:26 | .length | semmle.label | .length | | StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:120:22:120:25 | .length : | semmle.label | .length : | +| StringLengthConflation.swift:120:22:120:25 | .length | semmle.label | .length | | StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:125:34:125:36 | .count : | semmle.label | .count : | +| StringLengthConflation.swift:125:34:125:36 | .count | semmle.label | .count | | StringLengthConflation.swift:125:34:125:44 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:126:36:126:38 | .count : | semmle.label | .count : | +| StringLengthConflation.swift:126:36:126:38 | .count | semmle.label | .count | | StringLengthConflation.swift:126:36:126:46 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:131:36:131:38 | .count : | semmle.label | .count : | +| StringLengthConflation.swift:131:36:131:38 | .count | semmle.label | .count | | StringLengthConflation.swift:131:36:131:46 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:132:38:132:40 | .count : | semmle.label | .count : | +| StringLengthConflation.swift:132:38:132:40 | .count | semmle.label | .count | | StringLengthConflation.swift:132:38:132:48 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:137:34:137:36 | .count : | semmle.label | .count : | +| StringLengthConflation.swift:137:34:137:36 | .count | semmle.label | .count | | StringLengthConflation.swift:137:34:137:44 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:138:36:138:38 | .count : | semmle.label | .count : | +| StringLengthConflation.swift:138:36:138:38 | .count | semmle.label | .count | | StringLengthConflation.swift:138:36:138:46 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | -| StringLengthConflation.swift:144:28:144:30 | .count : | semmle.label | .count : | +| StringLengthConflation.swift:144:28:144:30 | .count | semmle.label | .count | | StringLengthConflation.swift:144:28:144:38 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... | | StringLengthConflation.swift:151:45:151:53 | .count | semmle.label | .count | | StringLengthConflation.swift:156:45:156:52 | .count | semmle.label | .count | | StringLengthConflation.swift:161:45:161:53 | .count | semmle.label | .count | -| file://:0:0:0:0 | .length : | semmle.label | .length : | +| file://:0:0:0:0 | .length | semmle.label | .length | subpaths #select -| StringLengthConflation2.swift:35:36:35:46 | ... .-(_:_:) ... | StringLengthConflation2.swift:35:36:35:38 | .count : | StringLengthConflation2.swift:35:36:35:46 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | -| StringLengthConflation2.swift:37:34:37:44 | ... .-(_:_:) ... | StringLengthConflation2.swift:37:34:37:36 | .count : | StringLengthConflation2.swift:37:34:37:44 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | -| StringLengthConflation.swift:36:93:36:93 | len | StringLengthConflation.swift:72:33:72:35 | .count : | StringLengthConflation.swift:36:93:36:93 | len | This String length is used in an NSString, but it may not be equivalent. | +| StringLengthConflation2.swift:35:36:35:46 | ... .-(_:_:) ... | StringLengthConflation2.swift:35:36:35:38 | .count | StringLengthConflation2.swift:35:36:35:46 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | +| StringLengthConflation2.swift:37:34:37:44 | ... .-(_:_:) ... | StringLengthConflation2.swift:37:34:37:36 | .count | StringLengthConflation2.swift:37:34:37:44 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | +| StringLengthConflation.swift:36:93:36:93 | len | StringLengthConflation.swift:72:33:72:35 | .count | StringLengthConflation.swift:36:93:36:93 | len | This String length is used in an NSString, but it may not be equivalent. | | StringLengthConflation.swift:53:43:53:46 | .length | StringLengthConflation.swift:53:43:53:46 | .length | StringLengthConflation.swift:53:43:53:46 | .length | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:53:43:53:46 | .length | file://:0:0:0:0 | .length : | StringLengthConflation.swift:53:43:53:46 | .length | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:53:43:53:46 | .length | file://:0:0:0:0 | .length | StringLengthConflation.swift:53:43:53:46 | .length | This NSString length is used in a String, but it may not be equivalent. | | StringLengthConflation.swift:54:43:54:50 | .count | StringLengthConflation.swift:54:43:54:50 | .count | StringLengthConflation.swift:54:43:54:50 | .count | This String.utf8 length is used in a String, but it may not be equivalent. | | StringLengthConflation.swift:55:43:55:51 | .count | StringLengthConflation.swift:55:43:55:51 | .count | StringLengthConflation.swift:55:43:55:51 | .count | This String.utf16 length is used in a String, but it may not be equivalent. | | StringLengthConflation.swift:56:43:56:60 | .count | StringLengthConflation.swift:56:43:56:60 | .count | StringLengthConflation.swift:56:43:56:60 | .count | This String.unicodeScalars length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | StringLengthConflation.swift:60:47:60:50 | .length : | StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | file://:0:0:0:0 | .length : | StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | StringLengthConflation.swift:66:33:66:36 | .length : | StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | file://:0:0:0:0 | .length : | StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | StringLengthConflation.swift:60:47:60:50 | .length | StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | file://:0:0:0:0 | .length | StringLengthConflation.swift:60:47:60:59 | ... ./(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | StringLengthConflation.swift:66:33:66:36 | .length | StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | file://:0:0:0:0 | .length | StringLengthConflation.swift:66:33:66:45 | ... ./(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | | StringLengthConflation.swift:72:33:72:35 | .count | StringLengthConflation.swift:72:33:72:35 | .count | StringLengthConflation.swift:72:33:72:35 | .count | This String length is used in an NSString, but it may not be equivalent. | | StringLengthConflation.swift:78:47:78:49 | .count | StringLengthConflation.swift:78:47:78:49 | .count | StringLengthConflation.swift:78:47:78:49 | .count | This String length is used in an NSString, but it may not be equivalent. | | StringLengthConflation.swift:79:47:79:54 | .count | StringLengthConflation.swift:79:47:79:54 | .count | StringLengthConflation.swift:79:47:79:54 | .count | This String.utf8 length is used in an NSString, but it may not be equivalent. | | StringLengthConflation.swift:81:47:81:64 | .count | StringLengthConflation.swift:81:47:81:64 | .count | StringLengthConflation.swift:81:47:81:64 | .count | This String.unicodeScalars length is used in an NSString, but it may not be equivalent. | -| StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | StringLengthConflation.swift:96:28:96:31 | .length : | StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | file://:0:0:0:0 | .length : | StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | StringLengthConflation.swift:100:27:100:30 | .length : | StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | file://:0:0:0:0 | .length : | StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | StringLengthConflation.swift:104:25:104:28 | .length : | StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | file://:0:0:0:0 | .length : | StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | StringLengthConflation.swift:108:25:108:28 | .length : | StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | file://:0:0:0:0 | .length : | StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | StringLengthConflation.swift:114:23:114:26 | .length : | StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | file://:0:0:0:0 | .length : | StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | StringLengthConflation.swift:120:22:120:25 | .length : | StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | file://:0:0:0:0 | .length : | StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | -| StringLengthConflation.swift:125:34:125:44 | ... .-(_:_:) ... | StringLengthConflation.swift:125:34:125:36 | .count : | StringLengthConflation.swift:125:34:125:44 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | -| StringLengthConflation.swift:126:36:126:46 | ... .-(_:_:) ... | StringLengthConflation.swift:126:36:126:38 | .count : | StringLengthConflation.swift:126:36:126:46 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | -| StringLengthConflation.swift:131:36:131:46 | ... .-(_:_:) ... | StringLengthConflation.swift:131:36:131:38 | .count : | StringLengthConflation.swift:131:36:131:46 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | -| StringLengthConflation.swift:132:38:132:48 | ... .-(_:_:) ... | StringLengthConflation.swift:132:38:132:40 | .count : | StringLengthConflation.swift:132:38:132:48 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | -| StringLengthConflation.swift:137:34:137:44 | ... .-(_:_:) ... | StringLengthConflation.swift:137:34:137:36 | .count : | StringLengthConflation.swift:137:34:137:44 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | -| StringLengthConflation.swift:138:36:138:46 | ... .-(_:_:) ... | StringLengthConflation.swift:138:36:138:38 | .count : | StringLengthConflation.swift:138:36:138:46 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | -| StringLengthConflation.swift:144:28:144:38 | ... .-(_:_:) ... | StringLengthConflation.swift:144:28:144:30 | .count : | StringLengthConflation.swift:144:28:144:38 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | +| StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | StringLengthConflation.swift:96:28:96:31 | .length | StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | file://:0:0:0:0 | .length | StringLengthConflation.swift:96:28:96:40 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | StringLengthConflation.swift:100:27:100:30 | .length | StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | file://:0:0:0:0 | .length | StringLengthConflation.swift:100:27:100:39 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | StringLengthConflation.swift:104:25:104:28 | .length | StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | file://:0:0:0:0 | .length | StringLengthConflation.swift:104:25:104:37 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | StringLengthConflation.swift:108:25:108:28 | .length | StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | file://:0:0:0:0 | .length | StringLengthConflation.swift:108:25:108:37 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | StringLengthConflation.swift:114:23:114:26 | .length | StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | file://:0:0:0:0 | .length | StringLengthConflation.swift:114:23:114:35 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | StringLengthConflation.swift:120:22:120:25 | .length | StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | file://:0:0:0:0 | .length | StringLengthConflation.swift:120:22:120:34 | ... .-(_:_:) ... | This NSString length is used in a String, but it may not be equivalent. | +| StringLengthConflation.swift:125:34:125:44 | ... .-(_:_:) ... | StringLengthConflation.swift:125:34:125:36 | .count | StringLengthConflation.swift:125:34:125:44 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | +| StringLengthConflation.swift:126:36:126:46 | ... .-(_:_:) ... | StringLengthConflation.swift:126:36:126:38 | .count | StringLengthConflation.swift:126:36:126:46 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | +| StringLengthConflation.swift:131:36:131:46 | ... .-(_:_:) ... | StringLengthConflation.swift:131:36:131:38 | .count | StringLengthConflation.swift:131:36:131:46 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | +| StringLengthConflation.swift:132:38:132:48 | ... .-(_:_:) ... | StringLengthConflation.swift:132:38:132:40 | .count | StringLengthConflation.swift:132:38:132:48 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | +| StringLengthConflation.swift:137:34:137:44 | ... .-(_:_:) ... | StringLengthConflation.swift:137:34:137:36 | .count | StringLengthConflation.swift:137:34:137:44 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | +| StringLengthConflation.swift:138:36:138:46 | ... .-(_:_:) ... | StringLengthConflation.swift:138:36:138:38 | .count | StringLengthConflation.swift:138:36:138:46 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | +| StringLengthConflation.swift:144:28:144:38 | ... .-(_:_:) ... | StringLengthConflation.swift:144:28:144:30 | .count | StringLengthConflation.swift:144:28:144:38 | ... .-(_:_:) ... | This String length is used in an NSString, but it may not be equivalent. | | StringLengthConflation.swift:151:45:151:53 | .count | StringLengthConflation.swift:151:45:151:53 | .count | StringLengthConflation.swift:151:45:151:53 | .count | This String.unicodeScalars length is used in a String, but it may not be equivalent. | | StringLengthConflation.swift:156:45:156:52 | .count | StringLengthConflation.swift:156:45:156:52 | .count | StringLengthConflation.swift:156:45:156:52 | .count | This String.utf8 length is used in a String, but it may not be equivalent. | | StringLengthConflation.swift:161:45:161:53 | .count | StringLengthConflation.swift:161:45:161:53 | .count | StringLengthConflation.swift:161:45:161:53 | .count | This String.utf16 length is used in a String, but it may not be equivalent. | diff --git a/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected b/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected index 91539ad285b..a3f4c333024 100644 --- a/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected +++ b/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected @@ -1,28 +1,28 @@ edges -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:77:89:77:89 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:78:56:78:56 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:80:89:80:89 | myMaybePassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:81:56:81:56 | myMaybePassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:91:39:91:39 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:92:37:92:37 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:93:39:93:39 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:94:37:94:37 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:96:68:96:68 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:97:68:97:68 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:98:68:98:68 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:100:89:100:89 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:101:97:101:97 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:102:89:102:89 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:103:97:103:97 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:105:32:105:32 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:107:61:107:61 | myConstPassword | -| rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:108:97:108:97 | myConstPassword | -| test.swift:43:39:43:134 | [...] : | test.swift:51:30:51:30 | constantPassword | -| test.swift:43:39:43:134 | [...] : | test.swift:56:40:56:40 | constantPassword | -| test.swift:43:39:43:134 | [...] : | test.swift:62:40:62:40 | constantPassword | -| test.swift:43:39:43:134 | [...] : | test.swift:67:34:67:34 | constantPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:77:89:77:89 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:78:56:78:56 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:80:89:80:89 | myMaybePassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:81:56:81:56 | myMaybePassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:91:39:91:39 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:92:37:92:37 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:93:39:93:39 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:94:37:94:37 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:96:68:96:68 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:97:68:97:68 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:98:68:98:68 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:100:89:100:89 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:101:97:101:97 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:102:89:102:89 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:103:97:103:97 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:105:32:105:32 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:107:61:107:61 | myConstPassword | +| rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:108:97:108:97 | myConstPassword | +| test.swift:43:39:43:134 | [...] | test.swift:51:30:51:30 | constantPassword | +| test.swift:43:39:43:134 | [...] | test.swift:56:40:56:40 | constantPassword | +| test.swift:43:39:43:134 | [...] | test.swift:62:40:62:40 | constantPassword | +| test.swift:43:39:43:134 | [...] | test.swift:67:34:67:34 | constantPassword | nodes -| rncryptor.swift:69:24:69:24 | abc123 : | semmle.label | abc123 : | +| rncryptor.swift:69:24:69:24 | abc123 | semmle.label | abc123 | | rncryptor.swift:77:89:77:89 | myConstPassword | semmle.label | myConstPassword | | rncryptor.swift:78:56:78:56 | myConstPassword | semmle.label | myConstPassword | | rncryptor.swift:80:89:80:89 | myMaybePassword | semmle.label | myMaybePassword | @@ -41,32 +41,32 @@ nodes | rncryptor.swift:105:32:105:32 | myConstPassword | semmle.label | myConstPassword | | rncryptor.swift:107:61:107:61 | myConstPassword | semmle.label | myConstPassword | | rncryptor.swift:108:97:108:97 | myConstPassword | semmle.label | myConstPassword | -| test.swift:43:39:43:134 | [...] : | semmle.label | [...] : | +| test.swift:43:39:43:134 | [...] | semmle.label | [...] | | test.swift:51:30:51:30 | constantPassword | semmle.label | constantPassword | | test.swift:56:40:56:40 | constantPassword | semmle.label | constantPassword | | test.swift:62:40:62:40 | constantPassword | semmle.label | constantPassword | | test.swift:67:34:67:34 | constantPassword | semmle.label | constantPassword | subpaths #select -| rncryptor.swift:77:89:77:89 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:77:89:77:89 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:78:56:78:56 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:78:56:78:56 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:80:89:80:89 | myMaybePassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:80:89:80:89 | myMaybePassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:81:56:81:56 | myMaybePassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:81:56:81:56 | myMaybePassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:91:39:91:39 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:91:39:91:39 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:92:37:92:37 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:92:37:92:37 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:93:39:93:39 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:93:39:93:39 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:94:37:94:37 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:94:37:94:37 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:96:68:96:68 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:96:68:96:68 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:97:68:97:68 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:97:68:97:68 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:98:68:98:68 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:98:68:98:68 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:100:89:100:89 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:100:89:100:89 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:101:97:101:97 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:101:97:101:97 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:102:89:102:89 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:102:89:102:89 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:103:97:103:97 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:103:97:103:97 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:105:32:105:32 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:105:32:105:32 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:107:61:107:61 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:107:61:107:61 | myConstPassword | The value 'abc123' is used as a constant password. | -| rncryptor.swift:108:97:108:97 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:108:97:108:97 | myConstPassword | The value 'abc123' is used as a constant password. | -| test.swift:51:30:51:30 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:51:30:51:30 | constantPassword | The value '[...]' is used as a constant password. | -| test.swift:56:40:56:40 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:56:40:56:40 | constantPassword | The value '[...]' is used as a constant password. | -| test.swift:62:40:62:40 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:62:40:62:40 | constantPassword | The value '[...]' is used as a constant password. | -| test.swift:67:34:67:34 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:67:34:67:34 | constantPassword | The value '[...]' is used as a constant password. | +| rncryptor.swift:77:89:77:89 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:77:89:77:89 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:78:56:78:56 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:78:56:78:56 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:80:89:80:89 | myMaybePassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:80:89:80:89 | myMaybePassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:81:56:81:56 | myMaybePassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:81:56:81:56 | myMaybePassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:91:39:91:39 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:91:39:91:39 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:92:37:92:37 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:92:37:92:37 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:93:39:93:39 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:93:39:93:39 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:94:37:94:37 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:94:37:94:37 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:96:68:96:68 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:96:68:96:68 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:97:68:97:68 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:97:68:97:68 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:98:68:98:68 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:98:68:98:68 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:100:89:100:89 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:100:89:100:89 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:101:97:101:97 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:101:97:101:97 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:102:89:102:89 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:102:89:102:89 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:103:97:103:97 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:103:97:103:97 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:105:32:105:32 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:105:32:105:32 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:107:61:107:61 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:107:61:107:61 | myConstPassword | The value 'abc123' is used as a constant password. | +| rncryptor.swift:108:97:108:97 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 | rncryptor.swift:108:97:108:97 | myConstPassword | The value 'abc123' is used as a constant password. | +| test.swift:51:30:51:30 | constantPassword | test.swift:43:39:43:134 | [...] | test.swift:51:30:51:30 | constantPassword | The value '[...]' is used as a constant password. | +| test.swift:56:40:56:40 | constantPassword | test.swift:43:39:43:134 | [...] | test.swift:56:40:56:40 | constantPassword | The value '[...]' is used as a constant password. | +| test.swift:62:40:62:40 | constantPassword | test.swift:43:39:43:134 | [...] | test.swift:62:40:62:40 | constantPassword | The value '[...]' is used as a constant password. | +| test.swift:67:34:67:34 | constantPassword | test.swift:43:39:43:134 | [...] | test.swift:67:34:67:34 | constantPassword | The value '[...]' is used as a constant password. | diff --git a/swift/ql/test/query-tests/Security/CWE-311/CleartextStorageDatabase.expected b/swift/ql/test/query-tests/Security/CWE-311/CleartextStorageDatabase.expected index 52c9a9e6bc7..320f4873d08 100644 --- a/swift/ql/test/query-tests/Security/CWE-311/CleartextStorageDatabase.expected +++ b/swift/ql/test/query-tests/Security/CWE-311/CleartextStorageDatabase.expected @@ -1,561 +1,561 @@ edges -| file://:0:0:0:0 | self [value] : | file://:0:0:0:0 | .value : | -| file://:0:0:0:0 | value : | file://:0:0:0:0 | [post] self [data] : | -| file://:0:0:0:0 | value : | file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] : | -| file://:0:0:0:0 | value : | file://:0:0:0:0 | [post] self [password] : | -| file://:0:0:0:0 | value : | file://:0:0:0:0 | [post] self [value] : | -| testCoreData2.swift:23:13:23:13 | value : | file://:0:0:0:0 | value : | -| testCoreData2.swift:37:2:37:2 | [post] obj [myValue] : | testCoreData2.swift:37:2:37:2 | [post] obj | -| testCoreData2.swift:37:16:37:16 | bankAccountNo : | testCoreData2.swift:37:2:37:2 | [post] obj [myValue] : | -| testCoreData2.swift:39:2:39:2 | [post] obj [myBankAccountNumber] : | testCoreData2.swift:39:2:39:2 | [post] obj | -| testCoreData2.swift:39:28:39:28 | bankAccountNo : | testCoreData2.swift:39:2:39:2 | [post] obj [myBankAccountNumber] : | -| testCoreData2.swift:41:2:41:2 | [post] obj [myBankAccountNumber2] : | testCoreData2.swift:41:2:41:2 | [post] obj | -| testCoreData2.swift:41:29:41:29 | bankAccountNo : | testCoreData2.swift:41:2:41:2 | [post] obj [myBankAccountNumber2] : | -| testCoreData2.swift:43:2:43:2 | [post] obj [notStoredBankAccountNumber] : | testCoreData2.swift:43:2:43:2 | [post] obj | -| testCoreData2.swift:43:35:43:35 | bankAccountNo : | testCoreData2.swift:23:13:23:13 | value : | -| testCoreData2.swift:43:35:43:35 | bankAccountNo : | testCoreData2.swift:43:2:43:2 | [post] obj [notStoredBankAccountNumber] : | -| testCoreData2.swift:46:2:46:10 | [post] ...? [myValue] : | testCoreData2.swift:46:2:46:10 | [post] ...? | -| testCoreData2.swift:46:22:46:22 | bankAccountNo : | testCoreData2.swift:46:2:46:10 | [post] ...? [myValue] : | -| testCoreData2.swift:48:2:48:10 | [post] ...? [myBankAccountNumber] : | testCoreData2.swift:48:2:48:10 | [post] ...? | -| testCoreData2.swift:48:34:48:34 | bankAccountNo : | testCoreData2.swift:48:2:48:10 | [post] ...? [myBankAccountNumber] : | -| testCoreData2.swift:50:2:50:10 | [post] ...? [myBankAccountNumber2] : | testCoreData2.swift:50:2:50:10 | [post] ...? | -| testCoreData2.swift:50:35:50:35 | bankAccountNo : | testCoreData2.swift:50:2:50:10 | [post] ...? [myBankAccountNumber2] : | -| testCoreData2.swift:52:2:52:10 | [post] ...? [notStoredBankAccountNumber] : | testCoreData2.swift:52:2:52:10 | [post] ...? | -| testCoreData2.swift:52:41:52:41 | bankAccountNo : | testCoreData2.swift:23:13:23:13 | value : | -| testCoreData2.swift:52:41:52:41 | bankAccountNo : | testCoreData2.swift:52:2:52:10 | [post] ...? [notStoredBankAccountNumber] : | -| testCoreData2.swift:57:3:57:3 | [post] obj [myBankAccountNumber] : | testCoreData2.swift:57:3:57:3 | [post] obj | -| testCoreData2.swift:57:29:57:29 | bankAccountNo : | testCoreData2.swift:57:3:57:3 | [post] obj [myBankAccountNumber] : | -| testCoreData2.swift:60:4:60:4 | [post] obj [myBankAccountNumber] : | testCoreData2.swift:60:4:60:4 | [post] obj | -| testCoreData2.swift:60:30:60:30 | bankAccountNo : | testCoreData2.swift:60:4:60:4 | [post] obj [myBankAccountNumber] : | -| testCoreData2.swift:62:4:62:4 | [post] obj [myBankAccountNumber] : | testCoreData2.swift:62:4:62:4 | [post] obj | -| testCoreData2.swift:62:30:62:30 | bankAccountNo : | testCoreData2.swift:62:4:62:4 | [post] obj [myBankAccountNumber] : | -| testCoreData2.swift:65:3:65:3 | [post] obj [myBankAccountNumber] : | testCoreData2.swift:65:3:65:3 | [post] obj | -| testCoreData2.swift:65:29:65:29 | bankAccountNo : | testCoreData2.swift:65:3:65:3 | [post] obj [myBankAccountNumber] : | -| testCoreData2.swift:70:9:70:9 | self : | file://:0:0:0:0 | .value : | -| testCoreData2.swift:70:9:70:9 | self [value] : | file://:0:0:0:0 | self [value] : | -| testCoreData2.swift:70:9:70:9 | value : | file://:0:0:0:0 | value : | -| testCoreData2.swift:71:9:71:9 | self : | file://:0:0:0:0 | .value2 : | -| testCoreData2.swift:79:2:79:2 | [post] dbObj [myValue] : | testCoreData2.swift:79:2:79:2 | [post] dbObj | -| testCoreData2.swift:79:18:79:28 | .bankAccountNo : | testCoreData2.swift:79:2:79:2 | [post] dbObj [myValue] : | -| testCoreData2.swift:80:2:80:2 | [post] dbObj [myValue] : | testCoreData2.swift:80:2:80:2 | [post] dbObj | -| testCoreData2.swift:80:18:80:28 | ...! : | testCoreData2.swift:80:2:80:2 | [post] dbObj [myValue] : | -| testCoreData2.swift:80:18:80:28 | .bankAccountNo2 : | testCoreData2.swift:80:18:80:28 | ...! : | -| testCoreData2.swift:82:2:82:2 | [post] dbObj [myValue] : | testCoreData2.swift:82:2:82:2 | [post] dbObj | -| testCoreData2.swift:82:18:82:18 | bankAccountNo : | testCoreData2.swift:70:9:70:9 | self : | -| testCoreData2.swift:82:18:82:18 | bankAccountNo : | testCoreData2.swift:82:18:82:32 | .value : | -| testCoreData2.swift:82:18:82:32 | .value : | testCoreData2.swift:82:2:82:2 | [post] dbObj [myValue] : | -| testCoreData2.swift:83:2:83:2 | [post] dbObj [myValue] : | testCoreData2.swift:83:2:83:2 | [post] dbObj | -| testCoreData2.swift:83:18:83:18 | bankAccountNo : | testCoreData2.swift:71:9:71:9 | self : | -| testCoreData2.swift:83:18:83:18 | bankAccountNo : | testCoreData2.swift:83:18:83:32 | ...! : | -| testCoreData2.swift:83:18:83:18 | bankAccountNo : | testCoreData2.swift:83:18:83:32 | .value2 : | -| testCoreData2.swift:83:18:83:32 | ...! : | testCoreData2.swift:83:2:83:2 | [post] dbObj [myValue] : | -| testCoreData2.swift:83:18:83:32 | .value2 : | testCoreData2.swift:83:18:83:32 | ...! : | -| testCoreData2.swift:84:2:84:2 | [post] dbObj [myValue] : | testCoreData2.swift:84:2:84:2 | [post] dbObj | -| testCoreData2.swift:84:18:84:18 | ...! : | testCoreData2.swift:70:9:70:9 | self : | -| testCoreData2.swift:84:18:84:18 | ...! : | testCoreData2.swift:84:18:84:33 | .value : | -| testCoreData2.swift:84:18:84:18 | bankAccountNo2 : | testCoreData2.swift:84:18:84:18 | ...! : | -| testCoreData2.swift:84:18:84:18 | bankAccountNo2 : | testCoreData2.swift:84:18:84:33 | .value : | -| testCoreData2.swift:84:18:84:33 | .value : | testCoreData2.swift:84:2:84:2 | [post] dbObj [myValue] : | -| testCoreData2.swift:85:2:85:2 | [post] dbObj [myValue] : | testCoreData2.swift:85:2:85:2 | [post] dbObj | -| testCoreData2.swift:85:18:85:18 | ...! : | testCoreData2.swift:71:9:71:9 | self : | -| testCoreData2.swift:85:18:85:18 | ...! : | testCoreData2.swift:85:18:85:33 | .value2 : | -| testCoreData2.swift:85:18:85:18 | bankAccountNo2 : | testCoreData2.swift:85:18:85:18 | ...! : | -| testCoreData2.swift:85:18:85:18 | bankAccountNo2 : | testCoreData2.swift:85:18:85:33 | ...! : | -| testCoreData2.swift:85:18:85:33 | ...! : | testCoreData2.swift:85:2:85:2 | [post] dbObj [myValue] : | -| testCoreData2.swift:85:18:85:33 | .value2 : | testCoreData2.swift:85:18:85:33 | ...! : | -| testCoreData2.swift:87:2:87:10 | [post] ...? [myValue] : | testCoreData2.swift:87:2:87:10 | [post] ...? | -| testCoreData2.swift:87:22:87:32 | .bankAccountNo : | testCoreData2.swift:87:2:87:10 | [post] ...? [myValue] : | -| testCoreData2.swift:88:2:88:10 | [post] ...? [myValue] : | testCoreData2.swift:88:2:88:10 | [post] ...? | -| testCoreData2.swift:88:22:88:22 | bankAccountNo : | testCoreData2.swift:70:9:70:9 | self : | -| testCoreData2.swift:88:22:88:22 | bankAccountNo : | testCoreData2.swift:88:22:88:36 | .value : | -| testCoreData2.swift:88:22:88:36 | .value : | testCoreData2.swift:88:2:88:10 | [post] ...? [myValue] : | -| testCoreData2.swift:89:2:89:10 | [post] ...? [myValue] : | testCoreData2.swift:89:2:89:10 | [post] ...? | -| testCoreData2.swift:89:22:89:22 | ...! : | testCoreData2.swift:71:9:71:9 | self : | -| testCoreData2.swift:89:22:89:22 | ...! : | testCoreData2.swift:89:22:89:37 | .value2 : | -| testCoreData2.swift:89:22:89:22 | bankAccountNo2 : | testCoreData2.swift:89:22:89:22 | ...! : | -| testCoreData2.swift:89:22:89:22 | bankAccountNo2 : | testCoreData2.swift:89:22:89:37 | ...! : | -| testCoreData2.swift:89:22:89:37 | ...! : | testCoreData2.swift:89:2:89:10 | [post] ...? [myValue] : | -| testCoreData2.swift:89:22:89:37 | .value2 : | testCoreData2.swift:89:22:89:37 | ...! : | -| testCoreData2.swift:91:10:91:10 | bankAccountNo : | testCoreData2.swift:92:10:92:10 | a : | -| testCoreData2.swift:91:10:91:10 | bankAccountNo : | testCoreData2.swift:93:18:93:18 | b : | -| testCoreData2.swift:92:10:92:10 | a : | testCoreData2.swift:70:9:70:9 | self : | -| testCoreData2.swift:92:10:92:10 | a : | testCoreData2.swift:92:10:92:12 | .value : | -| testCoreData2.swift:92:10:92:12 | .value : | testCoreData2.swift:93:18:93:18 | b : | -| testCoreData2.swift:93:2:93:2 | [post] dbObj [myValue] : | testCoreData2.swift:93:2:93:2 | [post] dbObj | -| testCoreData2.swift:93:18:93:18 | b : | testCoreData2.swift:93:2:93:2 | [post] dbObj [myValue] : | -| testCoreData2.swift:95:10:95:10 | bankAccountNo : | testCoreData2.swift:97:12:97:12 | c : | -| testCoreData2.swift:95:10:95:10 | bankAccountNo : | testCoreData2.swift:97:12:97:14 | .value : | -| testCoreData2.swift:97:2:97:2 | [post] d [value] : | testCoreData2.swift:98:18:98:18 | d [value] : | -| testCoreData2.swift:97:12:97:12 | c : | testCoreData2.swift:70:9:70:9 | self : | -| testCoreData2.swift:97:12:97:12 | c : | testCoreData2.swift:97:12:97:14 | .value : | -| testCoreData2.swift:97:12:97:14 | .value : | testCoreData2.swift:70:9:70:9 | value : | -| testCoreData2.swift:97:12:97:14 | .value : | testCoreData2.swift:97:2:97:2 | [post] d [value] : | -| testCoreData2.swift:98:2:98:2 | [post] dbObj [myValue] : | testCoreData2.swift:98:2:98:2 | [post] dbObj | -| testCoreData2.swift:98:18:98:18 | d [value] : | testCoreData2.swift:70:9:70:9 | self [value] : | -| testCoreData2.swift:98:18:98:18 | d [value] : | testCoreData2.swift:98:18:98:20 | .value : | -| testCoreData2.swift:98:18:98:20 | .value : | testCoreData2.swift:98:2:98:2 | [post] dbObj [myValue] : | -| testCoreData2.swift:101:10:101:10 | bankAccountNo : | testCoreData2.swift:104:18:104:18 | e : | -| testCoreData2.swift:101:10:101:10 | bankAccountNo : | testCoreData2.swift:104:18:104:20 | .value : | -| testCoreData2.swift:101:10:101:10 | bankAccountNo : | testCoreData2.swift:105:18:105:18 | e : | -| testCoreData2.swift:101:10:101:10 | bankAccountNo : | testCoreData2.swift:105:18:105:20 | ...! : | -| testCoreData2.swift:104:2:104:2 | [post] dbObj [myValue] : | testCoreData2.swift:104:2:104:2 | [post] dbObj | -| testCoreData2.swift:104:18:104:18 | e : | testCoreData2.swift:70:9:70:9 | self : | -| testCoreData2.swift:104:18:104:18 | e : | testCoreData2.swift:104:18:104:20 | .value : | -| testCoreData2.swift:104:18:104:20 | .value : | testCoreData2.swift:104:2:104:2 | [post] dbObj [myValue] : | -| testCoreData2.swift:105:2:105:2 | [post] dbObj [myValue] : | testCoreData2.swift:105:2:105:2 | [post] dbObj | -| testCoreData2.swift:105:18:105:18 | e : | testCoreData2.swift:71:9:71:9 | self : | -| testCoreData2.swift:105:18:105:18 | e : | testCoreData2.swift:105:18:105:20 | .value2 : | -| testCoreData2.swift:105:18:105:20 | ...! : | testCoreData2.swift:105:2:105:2 | [post] dbObj [myValue] : | -| testCoreData2.swift:105:18:105:20 | .value2 : | testCoreData2.swift:105:18:105:20 | ...! : | -| testCoreData.swift:18:19:18:26 | value : | testCoreData.swift:19:12:19:12 | value | -| testCoreData.swift:31:3:31:3 | newValue : | testCoreData.swift:32:13:32:13 | newValue | -| testCoreData.swift:61:25:61:25 | password : | testCoreData.swift:18:19:18:26 | value : | -| testCoreData.swift:64:2:64:2 | [post] obj [myValue] : | testCoreData.swift:64:2:64:2 | [post] obj | -| testCoreData.swift:64:16:64:16 | password : | testCoreData.swift:31:3:31:3 | newValue : | -| testCoreData.swift:64:16:64:16 | password : | testCoreData.swift:64:2:64:2 | [post] obj [myValue] : | -| testCoreData.swift:77:24:77:24 | x : | testCoreData.swift:78:15:78:15 | x | -| testCoreData.swift:80:10:80:22 | call to getPassword() : | testCoreData.swift:81:15:81:15 | y | -| testCoreData.swift:91:10:91:10 | passwd : | testCoreData.swift:95:15:95:15 | x | -| testCoreData.swift:92:10:92:10 | passwd : | testCoreData.swift:96:15:96:15 | y | -| testCoreData.swift:93:10:93:10 | passwd : | testCoreData.swift:97:15:97:15 | z | -| testGRDB.swift:73:57:73:57 | password : | testGRDB.swift:73:56:73:65 | [...] | -| testGRDB.swift:76:43:76:43 | password : | testGRDB.swift:76:42:76:51 | [...] | -| testGRDB.swift:81:45:81:45 | password : | testGRDB.swift:81:44:81:53 | [...] | -| testGRDB.swift:83:45:83:45 | password : | testGRDB.swift:83:44:83:53 | [...] | -| testGRDB.swift:85:45:85:45 | password : | testGRDB.swift:85:44:85:53 | [...] | -| testGRDB.swift:87:45:87:45 | password : | testGRDB.swift:87:44:87:53 | [...] | -| testGRDB.swift:92:38:92:38 | password : | testGRDB.swift:92:37:92:46 | [...] | -| testGRDB.swift:95:37:95:37 | password : | testGRDB.swift:95:36:95:45 | [...] | -| testGRDB.swift:100:73:100:73 | password : | testGRDB.swift:100:72:100:81 | [...] | -| testGRDB.swift:101:73:101:73 | password : | testGRDB.swift:101:72:101:81 | [...] | -| testGRDB.swift:107:53:107:53 | password : | testGRDB.swift:107:52:107:61 | [...] | -| testGRDB.swift:109:53:109:53 | password : | testGRDB.swift:109:52:109:61 | [...] | -| testGRDB.swift:111:52:111:52 | password : | testGRDB.swift:111:51:111:60 | [...] | -| testGRDB.swift:116:48:116:48 | password : | testGRDB.swift:116:47:116:56 | [...] | -| testGRDB.swift:118:48:118:48 | password : | testGRDB.swift:118:47:118:56 | [...] | -| testGRDB.swift:121:45:121:45 | password : | testGRDB.swift:121:44:121:53 | [...] | -| testGRDB.swift:123:45:123:45 | password : | testGRDB.swift:123:44:123:53 | [...] | -| testGRDB.swift:126:45:126:45 | password : | testGRDB.swift:126:44:126:53 | [...] | -| testGRDB.swift:128:45:128:45 | password : | testGRDB.swift:128:44:128:53 | [...] | -| testGRDB.swift:131:45:131:45 | password : | testGRDB.swift:131:44:131:53 | [...] | -| testGRDB.swift:133:45:133:45 | password : | testGRDB.swift:133:44:133:53 | [...] | -| testGRDB.swift:138:69:138:69 | password : | testGRDB.swift:138:68:138:77 | [...] | -| testGRDB.swift:140:69:140:69 | password : | testGRDB.swift:140:68:140:77 | [...] | -| testGRDB.swift:143:66:143:66 | password : | testGRDB.swift:143:65:143:74 | [...] | -| testGRDB.swift:145:66:145:66 | password : | testGRDB.swift:145:65:145:74 | [...] | -| testGRDB.swift:148:66:148:66 | password : | testGRDB.swift:148:65:148:74 | [...] | -| testGRDB.swift:150:66:150:66 | password : | testGRDB.swift:150:65:150:74 | [...] | -| testGRDB.swift:153:66:153:66 | password : | testGRDB.swift:153:65:153:74 | [...] | -| testGRDB.swift:155:66:155:66 | password : | testGRDB.swift:155:65:155:74 | [...] | -| testGRDB.swift:160:60:160:60 | password : | testGRDB.swift:160:59:160:68 | [...] | -| testGRDB.swift:161:51:161:51 | password : | testGRDB.swift:161:50:161:59 | [...] | -| testGRDB.swift:164:60:164:60 | password : | testGRDB.swift:164:59:164:68 | [...] | -| testGRDB.swift:165:51:165:51 | password : | testGRDB.swift:165:50:165:59 | [...] | -| testGRDB.swift:169:57:169:57 | password : | testGRDB.swift:169:56:169:65 | [...] | -| testGRDB.swift:170:48:170:48 | password : | testGRDB.swift:170:47:170:56 | [...] | -| testGRDB.swift:173:57:173:57 | password : | testGRDB.swift:173:56:173:65 | [...] | -| testGRDB.swift:174:48:174:48 | password : | testGRDB.swift:174:47:174:56 | [...] | -| testGRDB.swift:178:57:178:57 | password : | testGRDB.swift:178:56:178:65 | [...] | -| testGRDB.swift:179:48:179:48 | password : | testGRDB.swift:179:47:179:56 | [...] | -| testGRDB.swift:182:57:182:57 | password : | testGRDB.swift:182:56:182:65 | [...] | -| testGRDB.swift:183:48:183:48 | password : | testGRDB.swift:183:47:183:56 | [...] | -| testGRDB.swift:187:57:187:57 | password : | testGRDB.swift:187:56:187:65 | [...] | -| testGRDB.swift:188:48:188:48 | password : | testGRDB.swift:188:47:188:56 | [...] | -| testGRDB.swift:191:57:191:57 | password : | testGRDB.swift:191:56:191:65 | [...] | -| testGRDB.swift:192:48:192:48 | password : | testGRDB.swift:192:47:192:56 | [...] | -| testGRDB.swift:198:30:198:30 | password : | testGRDB.swift:198:29:198:38 | [...] | -| testGRDB.swift:201:24:201:24 | password : | testGRDB.swift:201:23:201:32 | [...] | -| testGRDB.swift:206:67:206:67 | password : | testGRDB.swift:206:66:206:75 | [...] | -| testGRDB.swift:208:81:208:81 | password : | testGRDB.swift:208:80:208:89 | [...] | -| testGRDB.swift:210:85:210:85 | password : | testGRDB.swift:210:84:210:93 | [...] | -| testGRDB.swift:212:99:212:99 | password : | testGRDB.swift:212:98:212:107 | [...] | -| testRealm.swift:27:6:27:6 | value : | file://:0:0:0:0 | value : | -| testRealm.swift:34:6:34:6 | value : | file://:0:0:0:0 | value : | -| testRealm.swift:41:2:41:2 | [post] a [data] : | testRealm.swift:41:2:41:2 | [post] a | -| testRealm.swift:41:11:41:11 | myPassword : | testRealm.swift:27:6:27:6 | value : | -| testRealm.swift:41:11:41:11 | myPassword : | testRealm.swift:41:2:41:2 | [post] a [data] : | -| testRealm.swift:49:2:49:2 | [post] c [data] : | testRealm.swift:49:2:49:2 | [post] c | -| testRealm.swift:49:11:49:11 | myPassword : | testRealm.swift:27:6:27:6 | value : | -| testRealm.swift:49:11:49:11 | myPassword : | testRealm.swift:49:2:49:2 | [post] c [data] : | -| testRealm.swift:59:2:59:3 | [post] ...! [data] : | testRealm.swift:59:2:59:3 | [post] ...! | -| testRealm.swift:59:12:59:12 | myPassword : | testRealm.swift:27:6:27:6 | value : | -| testRealm.swift:59:12:59:12 | myPassword : | testRealm.swift:59:2:59:3 | [post] ...! [data] : | -| testRealm.swift:66:2:66:2 | [post] g [data] : | testRealm.swift:66:2:66:2 | [post] g | -| testRealm.swift:66:11:66:11 | myPassword : | testRealm.swift:27:6:27:6 | value : | -| testRealm.swift:66:11:66:11 | myPassword : | testRealm.swift:66:2:66:2 | [post] g [data] : | -| testRealm.swift:73:2:73:2 | [post] h [password] : | testRealm.swift:73:2:73:2 | [post] h | -| testRealm.swift:73:15:73:15 | myPassword : | testRealm.swift:34:6:34:6 | value : | -| testRealm.swift:73:15:73:15 | myPassword : | testRealm.swift:73:2:73:2 | [post] h [password] : | +| file://:0:0:0:0 | self [value] | file://:0:0:0:0 | .value | +| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [data] | +| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] | +| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [password] | +| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [value] | +| testCoreData2.swift:23:13:23:13 | value | file://:0:0:0:0 | value | +| testCoreData2.swift:37:2:37:2 | [post] obj [myValue] | testCoreData2.swift:37:2:37:2 | [post] obj | +| testCoreData2.swift:37:16:37:16 | bankAccountNo | testCoreData2.swift:37:2:37:2 | [post] obj [myValue] | +| testCoreData2.swift:39:2:39:2 | [post] obj [myBankAccountNumber] | testCoreData2.swift:39:2:39:2 | [post] obj | +| testCoreData2.swift:39:28:39:28 | bankAccountNo | testCoreData2.swift:39:2:39:2 | [post] obj [myBankAccountNumber] | +| testCoreData2.swift:41:2:41:2 | [post] obj [myBankAccountNumber2] | testCoreData2.swift:41:2:41:2 | [post] obj | +| testCoreData2.swift:41:29:41:29 | bankAccountNo | testCoreData2.swift:41:2:41:2 | [post] obj [myBankAccountNumber2] | +| testCoreData2.swift:43:2:43:2 | [post] obj [notStoredBankAccountNumber] | testCoreData2.swift:43:2:43:2 | [post] obj | +| testCoreData2.swift:43:35:43:35 | bankAccountNo | testCoreData2.swift:23:13:23:13 | value | +| testCoreData2.swift:43:35:43:35 | bankAccountNo | testCoreData2.swift:43:2:43:2 | [post] obj [notStoredBankAccountNumber] | +| testCoreData2.swift:46:2:46:10 | [post] ...? [myValue] | testCoreData2.swift:46:2:46:10 | [post] ...? | +| testCoreData2.swift:46:22:46:22 | bankAccountNo | testCoreData2.swift:46:2:46:10 | [post] ...? [myValue] | +| testCoreData2.swift:48:2:48:10 | [post] ...? [myBankAccountNumber] | testCoreData2.swift:48:2:48:10 | [post] ...? | +| testCoreData2.swift:48:34:48:34 | bankAccountNo | testCoreData2.swift:48:2:48:10 | [post] ...? [myBankAccountNumber] | +| testCoreData2.swift:50:2:50:10 | [post] ...? [myBankAccountNumber2] | testCoreData2.swift:50:2:50:10 | [post] ...? | +| testCoreData2.swift:50:35:50:35 | bankAccountNo | testCoreData2.swift:50:2:50:10 | [post] ...? [myBankAccountNumber2] | +| testCoreData2.swift:52:2:52:10 | [post] ...? [notStoredBankAccountNumber] | testCoreData2.swift:52:2:52:10 | [post] ...? | +| testCoreData2.swift:52:41:52:41 | bankAccountNo | testCoreData2.swift:23:13:23:13 | value | +| testCoreData2.swift:52:41:52:41 | bankAccountNo | testCoreData2.swift:52:2:52:10 | [post] ...? [notStoredBankAccountNumber] | +| testCoreData2.swift:57:3:57:3 | [post] obj [myBankAccountNumber] | testCoreData2.swift:57:3:57:3 | [post] obj | +| testCoreData2.swift:57:29:57:29 | bankAccountNo | testCoreData2.swift:57:3:57:3 | [post] obj [myBankAccountNumber] | +| testCoreData2.swift:60:4:60:4 | [post] obj [myBankAccountNumber] | testCoreData2.swift:60:4:60:4 | [post] obj | +| testCoreData2.swift:60:30:60:30 | bankAccountNo | testCoreData2.swift:60:4:60:4 | [post] obj [myBankAccountNumber] | +| testCoreData2.swift:62:4:62:4 | [post] obj [myBankAccountNumber] | testCoreData2.swift:62:4:62:4 | [post] obj | +| testCoreData2.swift:62:30:62:30 | bankAccountNo | testCoreData2.swift:62:4:62:4 | [post] obj [myBankAccountNumber] | +| testCoreData2.swift:65:3:65:3 | [post] obj [myBankAccountNumber] | testCoreData2.swift:65:3:65:3 | [post] obj | +| testCoreData2.swift:65:29:65:29 | bankAccountNo | testCoreData2.swift:65:3:65:3 | [post] obj [myBankAccountNumber] | +| testCoreData2.swift:70:9:70:9 | self | file://:0:0:0:0 | .value | +| testCoreData2.swift:70:9:70:9 | self [value] | file://:0:0:0:0 | self [value] | +| testCoreData2.swift:70:9:70:9 | value | file://:0:0:0:0 | value | +| testCoreData2.swift:71:9:71:9 | self | file://:0:0:0:0 | .value2 | +| testCoreData2.swift:79:2:79:2 | [post] dbObj [myValue] | testCoreData2.swift:79:2:79:2 | [post] dbObj | +| testCoreData2.swift:79:18:79:28 | .bankAccountNo | testCoreData2.swift:79:2:79:2 | [post] dbObj [myValue] | +| testCoreData2.swift:80:2:80:2 | [post] dbObj [myValue] | testCoreData2.swift:80:2:80:2 | [post] dbObj | +| testCoreData2.swift:80:18:80:28 | ...! | testCoreData2.swift:80:2:80:2 | [post] dbObj [myValue] | +| testCoreData2.swift:80:18:80:28 | .bankAccountNo2 | testCoreData2.swift:80:18:80:28 | ...! | +| testCoreData2.swift:82:2:82:2 | [post] dbObj [myValue] | testCoreData2.swift:82:2:82:2 | [post] dbObj | +| testCoreData2.swift:82:18:82:18 | bankAccountNo | testCoreData2.swift:70:9:70:9 | self | +| testCoreData2.swift:82:18:82:18 | bankAccountNo | testCoreData2.swift:82:18:82:32 | .value | +| testCoreData2.swift:82:18:82:32 | .value | testCoreData2.swift:82:2:82:2 | [post] dbObj [myValue] | +| testCoreData2.swift:83:2:83:2 | [post] dbObj [myValue] | testCoreData2.swift:83:2:83:2 | [post] dbObj | +| testCoreData2.swift:83:18:83:18 | bankAccountNo | testCoreData2.swift:71:9:71:9 | self | +| testCoreData2.swift:83:18:83:18 | bankAccountNo | testCoreData2.swift:83:18:83:32 | ...! | +| testCoreData2.swift:83:18:83:18 | bankAccountNo | testCoreData2.swift:83:18:83:32 | .value2 | +| testCoreData2.swift:83:18:83:32 | ...! | testCoreData2.swift:83:2:83:2 | [post] dbObj [myValue] | +| testCoreData2.swift:83:18:83:32 | .value2 | testCoreData2.swift:83:18:83:32 | ...! | +| testCoreData2.swift:84:2:84:2 | [post] dbObj [myValue] | testCoreData2.swift:84:2:84:2 | [post] dbObj | +| testCoreData2.swift:84:18:84:18 | ...! | testCoreData2.swift:70:9:70:9 | self | +| testCoreData2.swift:84:18:84:18 | ...! | testCoreData2.swift:84:18:84:33 | .value | +| testCoreData2.swift:84:18:84:18 | bankAccountNo2 | testCoreData2.swift:84:18:84:18 | ...! | +| testCoreData2.swift:84:18:84:18 | bankAccountNo2 | testCoreData2.swift:84:18:84:33 | .value | +| testCoreData2.swift:84:18:84:33 | .value | testCoreData2.swift:84:2:84:2 | [post] dbObj [myValue] | +| testCoreData2.swift:85:2:85:2 | [post] dbObj [myValue] | testCoreData2.swift:85:2:85:2 | [post] dbObj | +| testCoreData2.swift:85:18:85:18 | ...! | testCoreData2.swift:71:9:71:9 | self | +| testCoreData2.swift:85:18:85:18 | ...! | testCoreData2.swift:85:18:85:33 | .value2 | +| testCoreData2.swift:85:18:85:18 | bankAccountNo2 | testCoreData2.swift:85:18:85:18 | ...! | +| testCoreData2.swift:85:18:85:18 | bankAccountNo2 | testCoreData2.swift:85:18:85:33 | ...! | +| testCoreData2.swift:85:18:85:33 | ...! | testCoreData2.swift:85:2:85:2 | [post] dbObj [myValue] | +| testCoreData2.swift:85:18:85:33 | .value2 | testCoreData2.swift:85:18:85:33 | ...! | +| testCoreData2.swift:87:2:87:10 | [post] ...? [myValue] | testCoreData2.swift:87:2:87:10 | [post] ...? | +| testCoreData2.swift:87:22:87:32 | .bankAccountNo | testCoreData2.swift:87:2:87:10 | [post] ...? [myValue] | +| testCoreData2.swift:88:2:88:10 | [post] ...? [myValue] | testCoreData2.swift:88:2:88:10 | [post] ...? | +| testCoreData2.swift:88:22:88:22 | bankAccountNo | testCoreData2.swift:70:9:70:9 | self | +| testCoreData2.swift:88:22:88:22 | bankAccountNo | testCoreData2.swift:88:22:88:36 | .value | +| testCoreData2.swift:88:22:88:36 | .value | testCoreData2.swift:88:2:88:10 | [post] ...? [myValue] | +| testCoreData2.swift:89:2:89:10 | [post] ...? [myValue] | testCoreData2.swift:89:2:89:10 | [post] ...? | +| testCoreData2.swift:89:22:89:22 | ...! | testCoreData2.swift:71:9:71:9 | self | +| testCoreData2.swift:89:22:89:22 | ...! | testCoreData2.swift:89:22:89:37 | .value2 | +| testCoreData2.swift:89:22:89:22 | bankAccountNo2 | testCoreData2.swift:89:22:89:22 | ...! | +| testCoreData2.swift:89:22:89:22 | bankAccountNo2 | testCoreData2.swift:89:22:89:37 | ...! | +| testCoreData2.swift:89:22:89:37 | ...! | testCoreData2.swift:89:2:89:10 | [post] ...? [myValue] | +| testCoreData2.swift:89:22:89:37 | .value2 | testCoreData2.swift:89:22:89:37 | ...! | +| testCoreData2.swift:91:10:91:10 | bankAccountNo | testCoreData2.swift:92:10:92:10 | a | +| testCoreData2.swift:91:10:91:10 | bankAccountNo | testCoreData2.swift:93:18:93:18 | b | +| testCoreData2.swift:92:10:92:10 | a | testCoreData2.swift:70:9:70:9 | self | +| testCoreData2.swift:92:10:92:10 | a | testCoreData2.swift:92:10:92:12 | .value | +| testCoreData2.swift:92:10:92:12 | .value | testCoreData2.swift:93:18:93:18 | b | +| testCoreData2.swift:93:2:93:2 | [post] dbObj [myValue] | testCoreData2.swift:93:2:93:2 | [post] dbObj | +| testCoreData2.swift:93:18:93:18 | b | testCoreData2.swift:93:2:93:2 | [post] dbObj [myValue] | +| testCoreData2.swift:95:10:95:10 | bankAccountNo | testCoreData2.swift:97:12:97:12 | c | +| testCoreData2.swift:95:10:95:10 | bankAccountNo | testCoreData2.swift:97:12:97:14 | .value | +| testCoreData2.swift:97:2:97:2 | [post] d [value] | testCoreData2.swift:98:18:98:18 | d [value] | +| testCoreData2.swift:97:12:97:12 | c | testCoreData2.swift:70:9:70:9 | self | +| testCoreData2.swift:97:12:97:12 | c | testCoreData2.swift:97:12:97:14 | .value | +| testCoreData2.swift:97:12:97:14 | .value | testCoreData2.swift:70:9:70:9 | value | +| testCoreData2.swift:97:12:97:14 | .value | testCoreData2.swift:97:2:97:2 | [post] d [value] | +| testCoreData2.swift:98:2:98:2 | [post] dbObj [myValue] | testCoreData2.swift:98:2:98:2 | [post] dbObj | +| testCoreData2.swift:98:18:98:18 | d [value] | testCoreData2.swift:70:9:70:9 | self [value] | +| testCoreData2.swift:98:18:98:18 | d [value] | testCoreData2.swift:98:18:98:20 | .value | +| testCoreData2.swift:98:18:98:20 | .value | testCoreData2.swift:98:2:98:2 | [post] dbObj [myValue] | +| testCoreData2.swift:101:10:101:10 | bankAccountNo | testCoreData2.swift:104:18:104:18 | e | +| testCoreData2.swift:101:10:101:10 | bankAccountNo | testCoreData2.swift:104:18:104:20 | .value | +| testCoreData2.swift:101:10:101:10 | bankAccountNo | testCoreData2.swift:105:18:105:18 | e | +| testCoreData2.swift:101:10:101:10 | bankAccountNo | testCoreData2.swift:105:18:105:20 | ...! | +| testCoreData2.swift:104:2:104:2 | [post] dbObj [myValue] | testCoreData2.swift:104:2:104:2 | [post] dbObj | +| testCoreData2.swift:104:18:104:18 | e | testCoreData2.swift:70:9:70:9 | self | +| testCoreData2.swift:104:18:104:18 | e | testCoreData2.swift:104:18:104:20 | .value | +| testCoreData2.swift:104:18:104:20 | .value | testCoreData2.swift:104:2:104:2 | [post] dbObj [myValue] | +| testCoreData2.swift:105:2:105:2 | [post] dbObj [myValue] | testCoreData2.swift:105:2:105:2 | [post] dbObj | +| testCoreData2.swift:105:18:105:18 | e | testCoreData2.swift:71:9:71:9 | self | +| testCoreData2.swift:105:18:105:18 | e | testCoreData2.swift:105:18:105:20 | .value2 | +| testCoreData2.swift:105:18:105:20 | ...! | testCoreData2.swift:105:2:105:2 | [post] dbObj [myValue] | +| testCoreData2.swift:105:18:105:20 | .value2 | testCoreData2.swift:105:18:105:20 | ...! | +| testCoreData.swift:18:19:18:26 | value | testCoreData.swift:19:12:19:12 | value | +| testCoreData.swift:31:3:31:3 | newValue | testCoreData.swift:32:13:32:13 | newValue | +| testCoreData.swift:61:25:61:25 | password | testCoreData.swift:18:19:18:26 | value | +| testCoreData.swift:64:2:64:2 | [post] obj [myValue] | testCoreData.swift:64:2:64:2 | [post] obj | +| testCoreData.swift:64:16:64:16 | password | testCoreData.swift:31:3:31:3 | newValue | +| testCoreData.swift:64:16:64:16 | password | testCoreData.swift:64:2:64:2 | [post] obj [myValue] | +| testCoreData.swift:77:24:77:24 | x | testCoreData.swift:78:15:78:15 | x | +| testCoreData.swift:80:10:80:22 | call to getPassword() | testCoreData.swift:81:15:81:15 | y | +| testCoreData.swift:91:10:91:10 | passwd | testCoreData.swift:95:15:95:15 | x | +| testCoreData.swift:92:10:92:10 | passwd | testCoreData.swift:96:15:96:15 | y | +| testCoreData.swift:93:10:93:10 | passwd | testCoreData.swift:97:15:97:15 | z | +| testGRDB.swift:73:57:73:57 | password | testGRDB.swift:73:56:73:65 | [...] | +| testGRDB.swift:76:43:76:43 | password | testGRDB.swift:76:42:76:51 | [...] | +| testGRDB.swift:81:45:81:45 | password | testGRDB.swift:81:44:81:53 | [...] | +| testGRDB.swift:83:45:83:45 | password | testGRDB.swift:83:44:83:53 | [...] | +| testGRDB.swift:85:45:85:45 | password | testGRDB.swift:85:44:85:53 | [...] | +| testGRDB.swift:87:45:87:45 | password | testGRDB.swift:87:44:87:53 | [...] | +| testGRDB.swift:92:38:92:38 | password | testGRDB.swift:92:37:92:46 | [...] | +| testGRDB.swift:95:37:95:37 | password | testGRDB.swift:95:36:95:45 | [...] | +| testGRDB.swift:100:73:100:73 | password | testGRDB.swift:100:72:100:81 | [...] | +| testGRDB.swift:101:73:101:73 | password | testGRDB.swift:101:72:101:81 | [...] | +| testGRDB.swift:107:53:107:53 | password | testGRDB.swift:107:52:107:61 | [...] | +| testGRDB.swift:109:53:109:53 | password | testGRDB.swift:109:52:109:61 | [...] | +| testGRDB.swift:111:52:111:52 | password | testGRDB.swift:111:51:111:60 | [...] | +| testGRDB.swift:116:48:116:48 | password | testGRDB.swift:116:47:116:56 | [...] | +| testGRDB.swift:118:48:118:48 | password | testGRDB.swift:118:47:118:56 | [...] | +| testGRDB.swift:121:45:121:45 | password | testGRDB.swift:121:44:121:53 | [...] | +| testGRDB.swift:123:45:123:45 | password | testGRDB.swift:123:44:123:53 | [...] | +| testGRDB.swift:126:45:126:45 | password | testGRDB.swift:126:44:126:53 | [...] | +| testGRDB.swift:128:45:128:45 | password | testGRDB.swift:128:44:128:53 | [...] | +| testGRDB.swift:131:45:131:45 | password | testGRDB.swift:131:44:131:53 | [...] | +| testGRDB.swift:133:45:133:45 | password | testGRDB.swift:133:44:133:53 | [...] | +| testGRDB.swift:138:69:138:69 | password | testGRDB.swift:138:68:138:77 | [...] | +| testGRDB.swift:140:69:140:69 | password | testGRDB.swift:140:68:140:77 | [...] | +| testGRDB.swift:143:66:143:66 | password | testGRDB.swift:143:65:143:74 | [...] | +| testGRDB.swift:145:66:145:66 | password | testGRDB.swift:145:65:145:74 | [...] | +| testGRDB.swift:148:66:148:66 | password | testGRDB.swift:148:65:148:74 | [...] | +| testGRDB.swift:150:66:150:66 | password | testGRDB.swift:150:65:150:74 | [...] | +| testGRDB.swift:153:66:153:66 | password | testGRDB.swift:153:65:153:74 | [...] | +| testGRDB.swift:155:66:155:66 | password | testGRDB.swift:155:65:155:74 | [...] | +| testGRDB.swift:160:60:160:60 | password | testGRDB.swift:160:59:160:68 | [...] | +| testGRDB.swift:161:51:161:51 | password | testGRDB.swift:161:50:161:59 | [...] | +| testGRDB.swift:164:60:164:60 | password | testGRDB.swift:164:59:164:68 | [...] | +| testGRDB.swift:165:51:165:51 | password | testGRDB.swift:165:50:165:59 | [...] | +| testGRDB.swift:169:57:169:57 | password | testGRDB.swift:169:56:169:65 | [...] | +| testGRDB.swift:170:48:170:48 | password | testGRDB.swift:170:47:170:56 | [...] | +| testGRDB.swift:173:57:173:57 | password | testGRDB.swift:173:56:173:65 | [...] | +| testGRDB.swift:174:48:174:48 | password | testGRDB.swift:174:47:174:56 | [...] | +| testGRDB.swift:178:57:178:57 | password | testGRDB.swift:178:56:178:65 | [...] | +| testGRDB.swift:179:48:179:48 | password | testGRDB.swift:179:47:179:56 | [...] | +| testGRDB.swift:182:57:182:57 | password | testGRDB.swift:182:56:182:65 | [...] | +| testGRDB.swift:183:48:183:48 | password | testGRDB.swift:183:47:183:56 | [...] | +| testGRDB.swift:187:57:187:57 | password | testGRDB.swift:187:56:187:65 | [...] | +| testGRDB.swift:188:48:188:48 | password | testGRDB.swift:188:47:188:56 | [...] | +| testGRDB.swift:191:57:191:57 | password | testGRDB.swift:191:56:191:65 | [...] | +| testGRDB.swift:192:48:192:48 | password | testGRDB.swift:192:47:192:56 | [...] | +| testGRDB.swift:198:30:198:30 | password | testGRDB.swift:198:29:198:38 | [...] | +| testGRDB.swift:201:24:201:24 | password | testGRDB.swift:201:23:201:32 | [...] | +| testGRDB.swift:206:67:206:67 | password | testGRDB.swift:206:66:206:75 | [...] | +| testGRDB.swift:208:81:208:81 | password | testGRDB.swift:208:80:208:89 | [...] | +| testGRDB.swift:210:85:210:85 | password | testGRDB.swift:210:84:210:93 | [...] | +| testGRDB.swift:212:99:212:99 | password | testGRDB.swift:212:98:212:107 | [...] | +| testRealm.swift:27:6:27:6 | value | file://:0:0:0:0 | value | +| testRealm.swift:34:6:34:6 | value | file://:0:0:0:0 | value | +| testRealm.swift:41:2:41:2 | [post] a [data] | testRealm.swift:41:2:41:2 | [post] a | +| testRealm.swift:41:11:41:11 | myPassword | testRealm.swift:27:6:27:6 | value | +| testRealm.swift:41:11:41:11 | myPassword | testRealm.swift:41:2:41:2 | [post] a [data] | +| testRealm.swift:49:2:49:2 | [post] c [data] | testRealm.swift:49:2:49:2 | [post] c | +| testRealm.swift:49:11:49:11 | myPassword | testRealm.swift:27:6:27:6 | value | +| testRealm.swift:49:11:49:11 | myPassword | testRealm.swift:49:2:49:2 | [post] c [data] | +| testRealm.swift:59:2:59:3 | [post] ...! [data] | testRealm.swift:59:2:59:3 | [post] ...! | +| testRealm.swift:59:12:59:12 | myPassword | testRealm.swift:27:6:27:6 | value | +| testRealm.swift:59:12:59:12 | myPassword | testRealm.swift:59:2:59:3 | [post] ...! [data] | +| testRealm.swift:66:2:66:2 | [post] g [data] | testRealm.swift:66:2:66:2 | [post] g | +| testRealm.swift:66:11:66:11 | myPassword | testRealm.swift:27:6:27:6 | value | +| testRealm.swift:66:11:66:11 | myPassword | testRealm.swift:66:2:66:2 | [post] g [data] | +| testRealm.swift:73:2:73:2 | [post] h [password] | testRealm.swift:73:2:73:2 | [post] h | +| testRealm.swift:73:15:73:15 | myPassword | testRealm.swift:34:6:34:6 | value | +| testRealm.swift:73:15:73:15 | myPassword | testRealm.swift:73:2:73:2 | [post] h [password] | nodes -| file://:0:0:0:0 | .value2 : | semmle.label | .value2 : | -| file://:0:0:0:0 | .value : | semmle.label | .value : | -| file://:0:0:0:0 | .value : | semmle.label | .value : | -| file://:0:0:0:0 | [post] self [data] : | semmle.label | [post] self [data] : | -| file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] : | semmle.label | [post] self [notStoredBankAccountNumber] : | -| file://:0:0:0:0 | [post] self [password] : | semmle.label | [post] self [password] : | -| file://:0:0:0:0 | [post] self [value] : | semmle.label | [post] self [value] : | -| file://:0:0:0:0 | self [value] : | semmle.label | self [value] : | -| file://:0:0:0:0 | value : | semmle.label | value : | -| file://:0:0:0:0 | value : | semmle.label | value : | -| file://:0:0:0:0 | value : | semmle.label | value : | -| file://:0:0:0:0 | value : | semmle.label | value : | -| testCoreData2.swift:23:13:23:13 | value : | semmle.label | value : | +| file://:0:0:0:0 | .value | semmle.label | .value | +| file://:0:0:0:0 | .value | semmle.label | .value | +| file://:0:0:0:0 | .value2 | semmle.label | .value2 | +| file://:0:0:0:0 | [post] self [data] | semmle.label | [post] self [data] | +| file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] | semmle.label | [post] self [notStoredBankAccountNumber] | +| file://:0:0:0:0 | [post] self [password] | semmle.label | [post] self [password] | +| file://:0:0:0:0 | [post] self [value] | semmle.label | [post] self [value] | +| file://:0:0:0:0 | self [value] | semmle.label | self [value] | +| file://:0:0:0:0 | value | semmle.label | value | +| file://:0:0:0:0 | value | semmle.label | value | +| file://:0:0:0:0 | value | semmle.label | value | +| file://:0:0:0:0 | value | semmle.label | value | +| testCoreData2.swift:23:13:23:13 | value | semmle.label | value | | testCoreData2.swift:37:2:37:2 | [post] obj | semmle.label | [post] obj | -| testCoreData2.swift:37:2:37:2 | [post] obj [myValue] : | semmle.label | [post] obj [myValue] : | -| testCoreData2.swift:37:16:37:16 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:37:2:37:2 | [post] obj [myValue] | semmle.label | [post] obj [myValue] | +| testCoreData2.swift:37:16:37:16 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:39:2:39:2 | [post] obj | semmle.label | [post] obj | -| testCoreData2.swift:39:2:39:2 | [post] obj [myBankAccountNumber] : | semmle.label | [post] obj [myBankAccountNumber] : | -| testCoreData2.swift:39:28:39:28 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:39:2:39:2 | [post] obj [myBankAccountNumber] | semmle.label | [post] obj [myBankAccountNumber] | +| testCoreData2.swift:39:28:39:28 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:41:2:41:2 | [post] obj | semmle.label | [post] obj | -| testCoreData2.swift:41:2:41:2 | [post] obj [myBankAccountNumber2] : | semmle.label | [post] obj [myBankAccountNumber2] : | -| testCoreData2.swift:41:29:41:29 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:41:2:41:2 | [post] obj [myBankAccountNumber2] | semmle.label | [post] obj [myBankAccountNumber2] | +| testCoreData2.swift:41:29:41:29 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:43:2:43:2 | [post] obj | semmle.label | [post] obj | -| testCoreData2.swift:43:2:43:2 | [post] obj [notStoredBankAccountNumber] : | semmle.label | [post] obj [notStoredBankAccountNumber] : | -| testCoreData2.swift:43:35:43:35 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:43:2:43:2 | [post] obj [notStoredBankAccountNumber] | semmle.label | [post] obj [notStoredBankAccountNumber] | +| testCoreData2.swift:43:35:43:35 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:46:2:46:10 | [post] ...? | semmle.label | [post] ...? | -| testCoreData2.swift:46:2:46:10 | [post] ...? [myValue] : | semmle.label | [post] ...? [myValue] : | -| testCoreData2.swift:46:22:46:22 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:46:2:46:10 | [post] ...? [myValue] | semmle.label | [post] ...? [myValue] | +| testCoreData2.swift:46:22:46:22 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:48:2:48:10 | [post] ...? | semmle.label | [post] ...? | -| testCoreData2.swift:48:2:48:10 | [post] ...? [myBankAccountNumber] : | semmle.label | [post] ...? [myBankAccountNumber] : | -| testCoreData2.swift:48:34:48:34 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:48:2:48:10 | [post] ...? [myBankAccountNumber] | semmle.label | [post] ...? [myBankAccountNumber] | +| testCoreData2.swift:48:34:48:34 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:50:2:50:10 | [post] ...? | semmle.label | [post] ...? | -| testCoreData2.swift:50:2:50:10 | [post] ...? [myBankAccountNumber2] : | semmle.label | [post] ...? [myBankAccountNumber2] : | -| testCoreData2.swift:50:35:50:35 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:50:2:50:10 | [post] ...? [myBankAccountNumber2] | semmle.label | [post] ...? [myBankAccountNumber2] | +| testCoreData2.swift:50:35:50:35 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:52:2:52:10 | [post] ...? | semmle.label | [post] ...? | -| testCoreData2.swift:52:2:52:10 | [post] ...? [notStoredBankAccountNumber] : | semmle.label | [post] ...? [notStoredBankAccountNumber] : | -| testCoreData2.swift:52:41:52:41 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:52:2:52:10 | [post] ...? [notStoredBankAccountNumber] | semmle.label | [post] ...? [notStoredBankAccountNumber] | +| testCoreData2.swift:52:41:52:41 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:57:3:57:3 | [post] obj | semmle.label | [post] obj | -| testCoreData2.swift:57:3:57:3 | [post] obj [myBankAccountNumber] : | semmle.label | [post] obj [myBankAccountNumber] : | -| testCoreData2.swift:57:29:57:29 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:57:3:57:3 | [post] obj [myBankAccountNumber] | semmle.label | [post] obj [myBankAccountNumber] | +| testCoreData2.swift:57:29:57:29 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:60:4:60:4 | [post] obj | semmle.label | [post] obj | -| testCoreData2.swift:60:4:60:4 | [post] obj [myBankAccountNumber] : | semmle.label | [post] obj [myBankAccountNumber] : | -| testCoreData2.swift:60:30:60:30 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:60:4:60:4 | [post] obj [myBankAccountNumber] | semmle.label | [post] obj [myBankAccountNumber] | +| testCoreData2.swift:60:30:60:30 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:62:4:62:4 | [post] obj | semmle.label | [post] obj | -| testCoreData2.swift:62:4:62:4 | [post] obj [myBankAccountNumber] : | semmle.label | [post] obj [myBankAccountNumber] : | -| testCoreData2.swift:62:30:62:30 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:62:4:62:4 | [post] obj [myBankAccountNumber] | semmle.label | [post] obj [myBankAccountNumber] | +| testCoreData2.swift:62:30:62:30 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:65:3:65:3 | [post] obj | semmle.label | [post] obj | -| testCoreData2.swift:65:3:65:3 | [post] obj [myBankAccountNumber] : | semmle.label | [post] obj [myBankAccountNumber] : | -| testCoreData2.swift:65:29:65:29 | bankAccountNo : | semmle.label | bankAccountNo : | -| testCoreData2.swift:70:9:70:9 | self : | semmle.label | self : | -| testCoreData2.swift:70:9:70:9 | self [value] : | semmle.label | self [value] : | -| testCoreData2.swift:70:9:70:9 | value : | semmle.label | value : | -| testCoreData2.swift:71:9:71:9 | self : | semmle.label | self : | +| testCoreData2.swift:65:3:65:3 | [post] obj [myBankAccountNumber] | semmle.label | [post] obj [myBankAccountNumber] | +| testCoreData2.swift:65:29:65:29 | bankAccountNo | semmle.label | bankAccountNo | +| testCoreData2.swift:70:9:70:9 | self | semmle.label | self | +| testCoreData2.swift:70:9:70:9 | self [value] | semmle.label | self [value] | +| testCoreData2.swift:70:9:70:9 | value | semmle.label | value | +| testCoreData2.swift:71:9:71:9 | self | semmle.label | self | | testCoreData2.swift:79:2:79:2 | [post] dbObj | semmle.label | [post] dbObj | -| testCoreData2.swift:79:2:79:2 | [post] dbObj [myValue] : | semmle.label | [post] dbObj [myValue] : | -| testCoreData2.swift:79:18:79:28 | .bankAccountNo : | semmle.label | .bankAccountNo : | +| testCoreData2.swift:79:2:79:2 | [post] dbObj [myValue] | semmle.label | [post] dbObj [myValue] | +| testCoreData2.swift:79:18:79:28 | .bankAccountNo | semmle.label | .bankAccountNo | | testCoreData2.swift:80:2:80:2 | [post] dbObj | semmle.label | [post] dbObj | -| testCoreData2.swift:80:2:80:2 | [post] dbObj [myValue] : | semmle.label | [post] dbObj [myValue] : | -| testCoreData2.swift:80:18:80:28 | ...! : | semmle.label | ...! : | -| testCoreData2.swift:80:18:80:28 | .bankAccountNo2 : | semmle.label | .bankAccountNo2 : | +| testCoreData2.swift:80:2:80:2 | [post] dbObj [myValue] | semmle.label | [post] dbObj [myValue] | +| testCoreData2.swift:80:18:80:28 | ...! | semmle.label | ...! | +| testCoreData2.swift:80:18:80:28 | .bankAccountNo2 | semmle.label | .bankAccountNo2 | | testCoreData2.swift:82:2:82:2 | [post] dbObj | semmle.label | [post] dbObj | -| testCoreData2.swift:82:2:82:2 | [post] dbObj [myValue] : | semmle.label | [post] dbObj [myValue] : | -| testCoreData2.swift:82:18:82:18 | bankAccountNo : | semmle.label | bankAccountNo : | -| testCoreData2.swift:82:18:82:32 | .value : | semmle.label | .value : | +| testCoreData2.swift:82:2:82:2 | [post] dbObj [myValue] | semmle.label | [post] dbObj [myValue] | +| testCoreData2.swift:82:18:82:18 | bankAccountNo | semmle.label | bankAccountNo | +| testCoreData2.swift:82:18:82:32 | .value | semmle.label | .value | | testCoreData2.swift:83:2:83:2 | [post] dbObj | semmle.label | [post] dbObj | -| testCoreData2.swift:83:2:83:2 | [post] dbObj [myValue] : | semmle.label | [post] dbObj [myValue] : | -| testCoreData2.swift:83:18:83:18 | bankAccountNo : | semmle.label | bankAccountNo : | -| testCoreData2.swift:83:18:83:32 | ...! : | semmle.label | ...! : | -| testCoreData2.swift:83:18:83:32 | .value2 : | semmle.label | .value2 : | +| testCoreData2.swift:83:2:83:2 | [post] dbObj [myValue] | semmle.label | [post] dbObj [myValue] | +| testCoreData2.swift:83:18:83:18 | bankAccountNo | semmle.label | bankAccountNo | +| testCoreData2.swift:83:18:83:32 | ...! | semmle.label | ...! | +| testCoreData2.swift:83:18:83:32 | .value2 | semmle.label | .value2 | | testCoreData2.swift:84:2:84:2 | [post] dbObj | semmle.label | [post] dbObj | -| testCoreData2.swift:84:2:84:2 | [post] dbObj [myValue] : | semmle.label | [post] dbObj [myValue] : | -| testCoreData2.swift:84:18:84:18 | ...! : | semmle.label | ...! : | -| testCoreData2.swift:84:18:84:18 | bankAccountNo2 : | semmle.label | bankAccountNo2 : | -| testCoreData2.swift:84:18:84:33 | .value : | semmle.label | .value : | +| testCoreData2.swift:84:2:84:2 | [post] dbObj [myValue] | semmle.label | [post] dbObj [myValue] | +| testCoreData2.swift:84:18:84:18 | ...! | semmle.label | ...! | +| testCoreData2.swift:84:18:84:18 | bankAccountNo2 | semmle.label | bankAccountNo2 | +| testCoreData2.swift:84:18:84:33 | .value | semmle.label | .value | | testCoreData2.swift:85:2:85:2 | [post] dbObj | semmle.label | [post] dbObj | -| testCoreData2.swift:85:2:85:2 | [post] dbObj [myValue] : | semmle.label | [post] dbObj [myValue] : | -| testCoreData2.swift:85:18:85:18 | ...! : | semmle.label | ...! : | -| testCoreData2.swift:85:18:85:18 | bankAccountNo2 : | semmle.label | bankAccountNo2 : | -| testCoreData2.swift:85:18:85:33 | ...! : | semmle.label | ...! : | -| testCoreData2.swift:85:18:85:33 | .value2 : | semmle.label | .value2 : | +| testCoreData2.swift:85:2:85:2 | [post] dbObj [myValue] | semmle.label | [post] dbObj [myValue] | +| testCoreData2.swift:85:18:85:18 | ...! | semmle.label | ...! | +| testCoreData2.swift:85:18:85:18 | bankAccountNo2 | semmle.label | bankAccountNo2 | +| testCoreData2.swift:85:18:85:33 | ...! | semmle.label | ...! | +| testCoreData2.swift:85:18:85:33 | .value2 | semmle.label | .value2 | | testCoreData2.swift:87:2:87:10 | [post] ...? | semmle.label | [post] ...? | -| testCoreData2.swift:87:2:87:10 | [post] ...? [myValue] : | semmle.label | [post] ...? [myValue] : | -| testCoreData2.swift:87:22:87:32 | .bankAccountNo : | semmle.label | .bankAccountNo : | +| testCoreData2.swift:87:2:87:10 | [post] ...? [myValue] | semmle.label | [post] ...? [myValue] | +| testCoreData2.swift:87:22:87:32 | .bankAccountNo | semmle.label | .bankAccountNo | | testCoreData2.swift:88:2:88:10 | [post] ...? | semmle.label | [post] ...? | -| testCoreData2.swift:88:2:88:10 | [post] ...? [myValue] : | semmle.label | [post] ...? [myValue] : | -| testCoreData2.swift:88:22:88:22 | bankAccountNo : | semmle.label | bankAccountNo : | -| testCoreData2.swift:88:22:88:36 | .value : | semmle.label | .value : | +| testCoreData2.swift:88:2:88:10 | [post] ...? [myValue] | semmle.label | [post] ...? [myValue] | +| testCoreData2.swift:88:22:88:22 | bankAccountNo | semmle.label | bankAccountNo | +| testCoreData2.swift:88:22:88:36 | .value | semmle.label | .value | | testCoreData2.swift:89:2:89:10 | [post] ...? | semmle.label | [post] ...? | -| testCoreData2.swift:89:2:89:10 | [post] ...? [myValue] : | semmle.label | [post] ...? [myValue] : | -| testCoreData2.swift:89:22:89:22 | ...! : | semmle.label | ...! : | -| testCoreData2.swift:89:22:89:22 | bankAccountNo2 : | semmle.label | bankAccountNo2 : | -| testCoreData2.swift:89:22:89:37 | ...! : | semmle.label | ...! : | -| testCoreData2.swift:89:22:89:37 | .value2 : | semmle.label | .value2 : | -| testCoreData2.swift:91:10:91:10 | bankAccountNo : | semmle.label | bankAccountNo : | -| testCoreData2.swift:92:10:92:10 | a : | semmle.label | a : | -| testCoreData2.swift:92:10:92:12 | .value : | semmle.label | .value : | +| testCoreData2.swift:89:2:89:10 | [post] ...? [myValue] | semmle.label | [post] ...? [myValue] | +| testCoreData2.swift:89:22:89:22 | ...! | semmle.label | ...! | +| testCoreData2.swift:89:22:89:22 | bankAccountNo2 | semmle.label | bankAccountNo2 | +| testCoreData2.swift:89:22:89:37 | ...! | semmle.label | ...! | +| testCoreData2.swift:89:22:89:37 | .value2 | semmle.label | .value2 | +| testCoreData2.swift:91:10:91:10 | bankAccountNo | semmle.label | bankAccountNo | +| testCoreData2.swift:92:10:92:10 | a | semmle.label | a | +| testCoreData2.swift:92:10:92:12 | .value | semmle.label | .value | | testCoreData2.swift:93:2:93:2 | [post] dbObj | semmle.label | [post] dbObj | -| testCoreData2.swift:93:2:93:2 | [post] dbObj [myValue] : | semmle.label | [post] dbObj [myValue] : | -| testCoreData2.swift:93:18:93:18 | b : | semmle.label | b : | -| testCoreData2.swift:95:10:95:10 | bankAccountNo : | semmle.label | bankAccountNo : | -| testCoreData2.swift:97:2:97:2 | [post] d [value] : | semmle.label | [post] d [value] : | -| testCoreData2.swift:97:12:97:12 | c : | semmle.label | c : | -| testCoreData2.swift:97:12:97:14 | .value : | semmle.label | .value : | +| testCoreData2.swift:93:2:93:2 | [post] dbObj [myValue] | semmle.label | [post] dbObj [myValue] | +| testCoreData2.swift:93:18:93:18 | b | semmle.label | b | +| testCoreData2.swift:95:10:95:10 | bankAccountNo | semmle.label | bankAccountNo | +| testCoreData2.swift:97:2:97:2 | [post] d [value] | semmle.label | [post] d [value] | +| testCoreData2.swift:97:12:97:12 | c | semmle.label | c | +| testCoreData2.swift:97:12:97:14 | .value | semmle.label | .value | | testCoreData2.swift:98:2:98:2 | [post] dbObj | semmle.label | [post] dbObj | -| testCoreData2.swift:98:2:98:2 | [post] dbObj [myValue] : | semmle.label | [post] dbObj [myValue] : | -| testCoreData2.swift:98:18:98:18 | d [value] : | semmle.label | d [value] : | -| testCoreData2.swift:98:18:98:20 | .value : | semmle.label | .value : | -| testCoreData2.swift:101:10:101:10 | bankAccountNo : | semmle.label | bankAccountNo : | +| testCoreData2.swift:98:2:98:2 | [post] dbObj [myValue] | semmle.label | [post] dbObj [myValue] | +| testCoreData2.swift:98:18:98:18 | d [value] | semmle.label | d [value] | +| testCoreData2.swift:98:18:98:20 | .value | semmle.label | .value | +| testCoreData2.swift:101:10:101:10 | bankAccountNo | semmle.label | bankAccountNo | | testCoreData2.swift:104:2:104:2 | [post] dbObj | semmle.label | [post] dbObj | -| testCoreData2.swift:104:2:104:2 | [post] dbObj [myValue] : | semmle.label | [post] dbObj [myValue] : | -| testCoreData2.swift:104:18:104:18 | e : | semmle.label | e : | -| testCoreData2.swift:104:18:104:20 | .value : | semmle.label | .value : | +| testCoreData2.swift:104:2:104:2 | [post] dbObj [myValue] | semmle.label | [post] dbObj [myValue] | +| testCoreData2.swift:104:18:104:18 | e | semmle.label | e | +| testCoreData2.swift:104:18:104:20 | .value | semmle.label | .value | | testCoreData2.swift:105:2:105:2 | [post] dbObj | semmle.label | [post] dbObj | -| testCoreData2.swift:105:2:105:2 | [post] dbObj [myValue] : | semmle.label | [post] dbObj [myValue] : | -| testCoreData2.swift:105:18:105:18 | e : | semmle.label | e : | -| testCoreData2.swift:105:18:105:20 | ...! : | semmle.label | ...! : | -| testCoreData2.swift:105:18:105:20 | .value2 : | semmle.label | .value2 : | -| testCoreData.swift:18:19:18:26 | value : | semmle.label | value : | +| testCoreData2.swift:105:2:105:2 | [post] dbObj [myValue] | semmle.label | [post] dbObj [myValue] | +| testCoreData2.swift:105:18:105:18 | e | semmle.label | e | +| testCoreData2.swift:105:18:105:20 | ...! | semmle.label | ...! | +| testCoreData2.swift:105:18:105:20 | .value2 | semmle.label | .value2 | +| testCoreData.swift:18:19:18:26 | value | semmle.label | value | | testCoreData.swift:19:12:19:12 | value | semmle.label | value | -| testCoreData.swift:31:3:31:3 | newValue : | semmle.label | newValue : | +| testCoreData.swift:31:3:31:3 | newValue | semmle.label | newValue | | testCoreData.swift:32:13:32:13 | newValue | semmle.label | newValue | | testCoreData.swift:48:15:48:15 | password | semmle.label | password | | testCoreData.swift:51:24:51:24 | password | semmle.label | password | | testCoreData.swift:58:15:58:15 | password | semmle.label | password | -| testCoreData.swift:61:25:61:25 | password : | semmle.label | password : | +| testCoreData.swift:61:25:61:25 | password | semmle.label | password | | testCoreData.swift:64:2:64:2 | [post] obj | semmle.label | [post] obj | -| testCoreData.swift:64:2:64:2 | [post] obj [myValue] : | semmle.label | [post] obj [myValue] : | -| testCoreData.swift:64:16:64:16 | password : | semmle.label | password : | -| testCoreData.swift:77:24:77:24 | x : | semmle.label | x : | +| testCoreData.swift:64:2:64:2 | [post] obj [myValue] | semmle.label | [post] obj [myValue] | +| testCoreData.swift:64:16:64:16 | password | semmle.label | password | +| testCoreData.swift:77:24:77:24 | x | semmle.label | x | | testCoreData.swift:78:15:78:15 | x | semmle.label | x | -| testCoreData.swift:80:10:80:22 | call to getPassword() : | semmle.label | call to getPassword() : | +| testCoreData.swift:80:10:80:22 | call to getPassword() | semmle.label | call to getPassword() | | testCoreData.swift:81:15:81:15 | y | semmle.label | y | | testCoreData.swift:85:15:85:17 | .password | semmle.label | .password | -| testCoreData.swift:91:10:91:10 | passwd : | semmle.label | passwd : | -| testCoreData.swift:92:10:92:10 | passwd : | semmle.label | passwd : | -| testCoreData.swift:93:10:93:10 | passwd : | semmle.label | passwd : | +| testCoreData.swift:91:10:91:10 | passwd | semmle.label | passwd | +| testCoreData.swift:92:10:92:10 | passwd | semmle.label | passwd | +| testCoreData.swift:93:10:93:10 | passwd | semmle.label | passwd | | testCoreData.swift:95:15:95:15 | x | semmle.label | x | | testCoreData.swift:96:15:96:15 | y | semmle.label | y | | testCoreData.swift:97:15:97:15 | z | semmle.label | z | | testGRDB.swift:73:56:73:65 | [...] | semmle.label | [...] | -| testGRDB.swift:73:57:73:57 | password : | semmle.label | password : | +| testGRDB.swift:73:57:73:57 | password | semmle.label | password | | testGRDB.swift:76:42:76:51 | [...] | semmle.label | [...] | -| testGRDB.swift:76:43:76:43 | password : | semmle.label | password : | +| testGRDB.swift:76:43:76:43 | password | semmle.label | password | | testGRDB.swift:81:44:81:53 | [...] | semmle.label | [...] | -| testGRDB.swift:81:45:81:45 | password : | semmle.label | password : | +| testGRDB.swift:81:45:81:45 | password | semmle.label | password | | testGRDB.swift:83:44:83:53 | [...] | semmle.label | [...] | -| testGRDB.swift:83:45:83:45 | password : | semmle.label | password : | +| testGRDB.swift:83:45:83:45 | password | semmle.label | password | | testGRDB.swift:85:44:85:53 | [...] | semmle.label | [...] | -| testGRDB.swift:85:45:85:45 | password : | semmle.label | password : | +| testGRDB.swift:85:45:85:45 | password | semmle.label | password | | testGRDB.swift:87:44:87:53 | [...] | semmle.label | [...] | -| testGRDB.swift:87:45:87:45 | password : | semmle.label | password : | +| testGRDB.swift:87:45:87:45 | password | semmle.label | password | | testGRDB.swift:92:37:92:46 | [...] | semmle.label | [...] | -| testGRDB.swift:92:38:92:38 | password : | semmle.label | password : | +| testGRDB.swift:92:38:92:38 | password | semmle.label | password | | testGRDB.swift:95:36:95:45 | [...] | semmle.label | [...] | -| testGRDB.swift:95:37:95:37 | password : | semmle.label | password : | +| testGRDB.swift:95:37:95:37 | password | semmle.label | password | | testGRDB.swift:100:72:100:81 | [...] | semmle.label | [...] | -| testGRDB.swift:100:73:100:73 | password : | semmle.label | password : | +| testGRDB.swift:100:73:100:73 | password | semmle.label | password | | testGRDB.swift:101:72:101:81 | [...] | semmle.label | [...] | -| testGRDB.swift:101:73:101:73 | password : | semmle.label | password : | +| testGRDB.swift:101:73:101:73 | password | semmle.label | password | | testGRDB.swift:107:52:107:61 | [...] | semmle.label | [...] | -| testGRDB.swift:107:53:107:53 | password : | semmle.label | password : | +| testGRDB.swift:107:53:107:53 | password | semmle.label | password | | testGRDB.swift:109:52:109:61 | [...] | semmle.label | [...] | -| testGRDB.swift:109:53:109:53 | password : | semmle.label | password : | +| testGRDB.swift:109:53:109:53 | password | semmle.label | password | | testGRDB.swift:111:51:111:60 | [...] | semmle.label | [...] | -| testGRDB.swift:111:52:111:52 | password : | semmle.label | password : | +| testGRDB.swift:111:52:111:52 | password | semmle.label | password | | testGRDB.swift:116:47:116:56 | [...] | semmle.label | [...] | -| testGRDB.swift:116:48:116:48 | password : | semmle.label | password : | +| testGRDB.swift:116:48:116:48 | password | semmle.label | password | | testGRDB.swift:118:47:118:56 | [...] | semmle.label | [...] | -| testGRDB.swift:118:48:118:48 | password : | semmle.label | password : | +| testGRDB.swift:118:48:118:48 | password | semmle.label | password | | testGRDB.swift:121:44:121:53 | [...] | semmle.label | [...] | -| testGRDB.swift:121:45:121:45 | password : | semmle.label | password : | +| testGRDB.swift:121:45:121:45 | password | semmle.label | password | | testGRDB.swift:123:44:123:53 | [...] | semmle.label | [...] | -| testGRDB.swift:123:45:123:45 | password : | semmle.label | password : | +| testGRDB.swift:123:45:123:45 | password | semmle.label | password | | testGRDB.swift:126:44:126:53 | [...] | semmle.label | [...] | -| testGRDB.swift:126:45:126:45 | password : | semmle.label | password : | +| testGRDB.swift:126:45:126:45 | password | semmle.label | password | | testGRDB.swift:128:44:128:53 | [...] | semmle.label | [...] | -| testGRDB.swift:128:45:128:45 | password : | semmle.label | password : | +| testGRDB.swift:128:45:128:45 | password | semmle.label | password | | testGRDB.swift:131:44:131:53 | [...] | semmle.label | [...] | -| testGRDB.swift:131:45:131:45 | password : | semmle.label | password : | +| testGRDB.swift:131:45:131:45 | password | semmle.label | password | | testGRDB.swift:133:44:133:53 | [...] | semmle.label | [...] | -| testGRDB.swift:133:45:133:45 | password : | semmle.label | password : | +| testGRDB.swift:133:45:133:45 | password | semmle.label | password | | testGRDB.swift:138:68:138:77 | [...] | semmle.label | [...] | -| testGRDB.swift:138:69:138:69 | password : | semmle.label | password : | +| testGRDB.swift:138:69:138:69 | password | semmle.label | password | | testGRDB.swift:140:68:140:77 | [...] | semmle.label | [...] | -| testGRDB.swift:140:69:140:69 | password : | semmle.label | password : | +| testGRDB.swift:140:69:140:69 | password | semmle.label | password | | testGRDB.swift:143:65:143:74 | [...] | semmle.label | [...] | -| testGRDB.swift:143:66:143:66 | password : | semmle.label | password : | +| testGRDB.swift:143:66:143:66 | password | semmle.label | password | | testGRDB.swift:145:65:145:74 | [...] | semmle.label | [...] | -| testGRDB.swift:145:66:145:66 | password : | semmle.label | password : | +| testGRDB.swift:145:66:145:66 | password | semmle.label | password | | testGRDB.swift:148:65:148:74 | [...] | semmle.label | [...] | -| testGRDB.swift:148:66:148:66 | password : | semmle.label | password : | +| testGRDB.swift:148:66:148:66 | password | semmle.label | password | | testGRDB.swift:150:65:150:74 | [...] | semmle.label | [...] | -| testGRDB.swift:150:66:150:66 | password : | semmle.label | password : | +| testGRDB.swift:150:66:150:66 | password | semmle.label | password | | testGRDB.swift:153:65:153:74 | [...] | semmle.label | [...] | -| testGRDB.swift:153:66:153:66 | password : | semmle.label | password : | +| testGRDB.swift:153:66:153:66 | password | semmle.label | password | | testGRDB.swift:155:65:155:74 | [...] | semmle.label | [...] | -| testGRDB.swift:155:66:155:66 | password : | semmle.label | password : | +| testGRDB.swift:155:66:155:66 | password | semmle.label | password | | testGRDB.swift:160:59:160:68 | [...] | semmle.label | [...] | -| testGRDB.swift:160:60:160:60 | password : | semmle.label | password : | +| testGRDB.swift:160:60:160:60 | password | semmle.label | password | | testGRDB.swift:161:50:161:59 | [...] | semmle.label | [...] | -| testGRDB.swift:161:51:161:51 | password : | semmle.label | password : | +| testGRDB.swift:161:51:161:51 | password | semmle.label | password | | testGRDB.swift:164:59:164:68 | [...] | semmle.label | [...] | -| testGRDB.swift:164:60:164:60 | password : | semmle.label | password : | +| testGRDB.swift:164:60:164:60 | password | semmle.label | password | | testGRDB.swift:165:50:165:59 | [...] | semmle.label | [...] | -| testGRDB.swift:165:51:165:51 | password : | semmle.label | password : | +| testGRDB.swift:165:51:165:51 | password | semmle.label | password | | testGRDB.swift:169:56:169:65 | [...] | semmle.label | [...] | -| testGRDB.swift:169:57:169:57 | password : | semmle.label | password : | +| testGRDB.swift:169:57:169:57 | password | semmle.label | password | | testGRDB.swift:170:47:170:56 | [...] | semmle.label | [...] | -| testGRDB.swift:170:48:170:48 | password : | semmle.label | password : | +| testGRDB.swift:170:48:170:48 | password | semmle.label | password | | testGRDB.swift:173:56:173:65 | [...] | semmle.label | [...] | -| testGRDB.swift:173:57:173:57 | password : | semmle.label | password : | +| testGRDB.swift:173:57:173:57 | password | semmle.label | password | | testGRDB.swift:174:47:174:56 | [...] | semmle.label | [...] | -| testGRDB.swift:174:48:174:48 | password : | semmle.label | password : | +| testGRDB.swift:174:48:174:48 | password | semmle.label | password | | testGRDB.swift:178:56:178:65 | [...] | semmle.label | [...] | -| testGRDB.swift:178:57:178:57 | password : | semmle.label | password : | +| testGRDB.swift:178:57:178:57 | password | semmle.label | password | | testGRDB.swift:179:47:179:56 | [...] | semmle.label | [...] | -| testGRDB.swift:179:48:179:48 | password : | semmle.label | password : | +| testGRDB.swift:179:48:179:48 | password | semmle.label | password | | testGRDB.swift:182:56:182:65 | [...] | semmle.label | [...] | -| testGRDB.swift:182:57:182:57 | password : | semmle.label | password : | +| testGRDB.swift:182:57:182:57 | password | semmle.label | password | | testGRDB.swift:183:47:183:56 | [...] | semmle.label | [...] | -| testGRDB.swift:183:48:183:48 | password : | semmle.label | password : | +| testGRDB.swift:183:48:183:48 | password | semmle.label | password | | testGRDB.swift:187:56:187:65 | [...] | semmle.label | [...] | -| testGRDB.swift:187:57:187:57 | password : | semmle.label | password : | +| testGRDB.swift:187:57:187:57 | password | semmle.label | password | | testGRDB.swift:188:47:188:56 | [...] | semmle.label | [...] | -| testGRDB.swift:188:48:188:48 | password : | semmle.label | password : | +| testGRDB.swift:188:48:188:48 | password | semmle.label | password | | testGRDB.swift:191:56:191:65 | [...] | semmle.label | [...] | -| testGRDB.swift:191:57:191:57 | password : | semmle.label | password : | +| testGRDB.swift:191:57:191:57 | password | semmle.label | password | | testGRDB.swift:192:47:192:56 | [...] | semmle.label | [...] | -| testGRDB.swift:192:48:192:48 | password : | semmle.label | password : | +| testGRDB.swift:192:48:192:48 | password | semmle.label | password | | testGRDB.swift:198:29:198:38 | [...] | semmle.label | [...] | -| testGRDB.swift:198:30:198:30 | password : | semmle.label | password : | +| testGRDB.swift:198:30:198:30 | password | semmle.label | password | | testGRDB.swift:201:23:201:32 | [...] | semmle.label | [...] | -| testGRDB.swift:201:24:201:24 | password : | semmle.label | password : | +| testGRDB.swift:201:24:201:24 | password | semmle.label | password | | testGRDB.swift:206:66:206:75 | [...] | semmle.label | [...] | -| testGRDB.swift:206:67:206:67 | password : | semmle.label | password : | +| testGRDB.swift:206:67:206:67 | password | semmle.label | password | | testGRDB.swift:208:80:208:89 | [...] | semmle.label | [...] | -| testGRDB.swift:208:81:208:81 | password : | semmle.label | password : | +| testGRDB.swift:208:81:208:81 | password | semmle.label | password | | testGRDB.swift:210:84:210:93 | [...] | semmle.label | [...] | -| testGRDB.swift:210:85:210:85 | password : | semmle.label | password : | +| testGRDB.swift:210:85:210:85 | password | semmle.label | password | | testGRDB.swift:212:98:212:107 | [...] | semmle.label | [...] | -| testGRDB.swift:212:99:212:99 | password : | semmle.label | password : | -| testRealm.swift:27:6:27:6 | value : | semmle.label | value : | -| testRealm.swift:34:6:34:6 | value : | semmle.label | value : | +| testGRDB.swift:212:99:212:99 | password | semmle.label | password | +| testRealm.swift:27:6:27:6 | value | semmle.label | value | +| testRealm.swift:34:6:34:6 | value | semmle.label | value | | testRealm.swift:41:2:41:2 | [post] a | semmle.label | [post] a | -| testRealm.swift:41:2:41:2 | [post] a [data] : | semmle.label | [post] a [data] : | -| testRealm.swift:41:11:41:11 | myPassword : | semmle.label | myPassword : | +| testRealm.swift:41:2:41:2 | [post] a [data] | semmle.label | [post] a [data] | +| testRealm.swift:41:11:41:11 | myPassword | semmle.label | myPassword | | testRealm.swift:49:2:49:2 | [post] c | semmle.label | [post] c | -| testRealm.swift:49:2:49:2 | [post] c [data] : | semmle.label | [post] c [data] : | -| testRealm.swift:49:11:49:11 | myPassword : | semmle.label | myPassword : | +| testRealm.swift:49:2:49:2 | [post] c [data] | semmle.label | [post] c [data] | +| testRealm.swift:49:11:49:11 | myPassword | semmle.label | myPassword | | testRealm.swift:59:2:59:3 | [post] ...! | semmle.label | [post] ...! | -| testRealm.swift:59:2:59:3 | [post] ...! [data] : | semmle.label | [post] ...! [data] : | -| testRealm.swift:59:12:59:12 | myPassword : | semmle.label | myPassword : | +| testRealm.swift:59:2:59:3 | [post] ...! [data] | semmle.label | [post] ...! [data] | +| testRealm.swift:59:12:59:12 | myPassword | semmle.label | myPassword | | testRealm.swift:66:2:66:2 | [post] g | semmle.label | [post] g | -| testRealm.swift:66:2:66:2 | [post] g [data] : | semmle.label | [post] g [data] : | -| testRealm.swift:66:11:66:11 | myPassword : | semmle.label | myPassword : | +| testRealm.swift:66:2:66:2 | [post] g [data] | semmle.label | [post] g [data] | +| testRealm.swift:66:11:66:11 | myPassword | semmle.label | myPassword | | testRealm.swift:73:2:73:2 | [post] h | semmle.label | [post] h | -| testRealm.swift:73:2:73:2 | [post] h [password] : | semmle.label | [post] h [password] : | -| testRealm.swift:73:15:73:15 | myPassword : | semmle.label | myPassword : | +| testRealm.swift:73:2:73:2 | [post] h [password] | semmle.label | [post] h [password] | +| testRealm.swift:73:15:73:15 | myPassword | semmle.label | myPassword | subpaths -| testCoreData2.swift:43:35:43:35 | bankAccountNo : | testCoreData2.swift:23:13:23:13 | value : | file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] : | testCoreData2.swift:43:2:43:2 | [post] obj [notStoredBankAccountNumber] : | -| testCoreData2.swift:52:41:52:41 | bankAccountNo : | testCoreData2.swift:23:13:23:13 | value : | file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] : | testCoreData2.swift:52:2:52:10 | [post] ...? [notStoredBankAccountNumber] : | -| testCoreData2.swift:82:18:82:18 | bankAccountNo : | testCoreData2.swift:70:9:70:9 | self : | file://:0:0:0:0 | .value : | testCoreData2.swift:82:18:82:32 | .value : | -| testCoreData2.swift:83:18:83:18 | bankAccountNo : | testCoreData2.swift:71:9:71:9 | self : | file://:0:0:0:0 | .value2 : | testCoreData2.swift:83:18:83:32 | .value2 : | -| testCoreData2.swift:84:18:84:18 | ...! : | testCoreData2.swift:70:9:70:9 | self : | file://:0:0:0:0 | .value : | testCoreData2.swift:84:18:84:33 | .value : | -| testCoreData2.swift:85:18:85:18 | ...! : | testCoreData2.swift:71:9:71:9 | self : | file://:0:0:0:0 | .value2 : | testCoreData2.swift:85:18:85:33 | .value2 : | -| testCoreData2.swift:88:22:88:22 | bankAccountNo : | testCoreData2.swift:70:9:70:9 | self : | file://:0:0:0:0 | .value : | testCoreData2.swift:88:22:88:36 | .value : | -| testCoreData2.swift:89:22:89:22 | ...! : | testCoreData2.swift:71:9:71:9 | self : | file://:0:0:0:0 | .value2 : | testCoreData2.swift:89:22:89:37 | .value2 : | -| testCoreData2.swift:92:10:92:10 | a : | testCoreData2.swift:70:9:70:9 | self : | file://:0:0:0:0 | .value : | testCoreData2.swift:92:10:92:12 | .value : | -| testCoreData2.swift:97:12:97:12 | c : | testCoreData2.swift:70:9:70:9 | self : | file://:0:0:0:0 | .value : | testCoreData2.swift:97:12:97:14 | .value : | -| testCoreData2.swift:97:12:97:14 | .value : | testCoreData2.swift:70:9:70:9 | value : | file://:0:0:0:0 | [post] self [value] : | testCoreData2.swift:97:2:97:2 | [post] d [value] : | -| testCoreData2.swift:98:18:98:18 | d [value] : | testCoreData2.swift:70:9:70:9 | self [value] : | file://:0:0:0:0 | .value : | testCoreData2.swift:98:18:98:20 | .value : | -| testCoreData2.swift:104:18:104:18 | e : | testCoreData2.swift:70:9:70:9 | self : | file://:0:0:0:0 | .value : | testCoreData2.swift:104:18:104:20 | .value : | -| testCoreData2.swift:105:18:105:18 | e : | testCoreData2.swift:71:9:71:9 | self : | file://:0:0:0:0 | .value2 : | testCoreData2.swift:105:18:105:20 | .value2 : | -| testRealm.swift:41:11:41:11 | myPassword : | testRealm.swift:27:6:27:6 | value : | file://:0:0:0:0 | [post] self [data] : | testRealm.swift:41:2:41:2 | [post] a [data] : | -| testRealm.swift:49:11:49:11 | myPassword : | testRealm.swift:27:6:27:6 | value : | file://:0:0:0:0 | [post] self [data] : | testRealm.swift:49:2:49:2 | [post] c [data] : | -| testRealm.swift:59:12:59:12 | myPassword : | testRealm.swift:27:6:27:6 | value : | file://:0:0:0:0 | [post] self [data] : | testRealm.swift:59:2:59:3 | [post] ...! [data] : | -| testRealm.swift:66:11:66:11 | myPassword : | testRealm.swift:27:6:27:6 | value : | file://:0:0:0:0 | [post] self [data] : | testRealm.swift:66:2:66:2 | [post] g [data] : | -| testRealm.swift:73:15:73:15 | myPassword : | testRealm.swift:34:6:34:6 | value : | file://:0:0:0:0 | [post] self [password] : | testRealm.swift:73:2:73:2 | [post] h [password] : | +| testCoreData2.swift:43:35:43:35 | bankAccountNo | testCoreData2.swift:23:13:23:13 | value | file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] | testCoreData2.swift:43:2:43:2 | [post] obj [notStoredBankAccountNumber] | +| testCoreData2.swift:52:41:52:41 | bankAccountNo | testCoreData2.swift:23:13:23:13 | value | file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] | testCoreData2.swift:52:2:52:10 | [post] ...? [notStoredBankAccountNumber] | +| testCoreData2.swift:82:18:82:18 | bankAccountNo | testCoreData2.swift:70:9:70:9 | self | file://:0:0:0:0 | .value | testCoreData2.swift:82:18:82:32 | .value | +| testCoreData2.swift:83:18:83:18 | bankAccountNo | testCoreData2.swift:71:9:71:9 | self | file://:0:0:0:0 | .value2 | testCoreData2.swift:83:18:83:32 | .value2 | +| testCoreData2.swift:84:18:84:18 | ...! | testCoreData2.swift:70:9:70:9 | self | file://:0:0:0:0 | .value | testCoreData2.swift:84:18:84:33 | .value | +| testCoreData2.swift:85:18:85:18 | ...! | testCoreData2.swift:71:9:71:9 | self | file://:0:0:0:0 | .value2 | testCoreData2.swift:85:18:85:33 | .value2 | +| testCoreData2.swift:88:22:88:22 | bankAccountNo | testCoreData2.swift:70:9:70:9 | self | file://:0:0:0:0 | .value | testCoreData2.swift:88:22:88:36 | .value | +| testCoreData2.swift:89:22:89:22 | ...! | testCoreData2.swift:71:9:71:9 | self | file://:0:0:0:0 | .value2 | testCoreData2.swift:89:22:89:37 | .value2 | +| testCoreData2.swift:92:10:92:10 | a | testCoreData2.swift:70:9:70:9 | self | file://:0:0:0:0 | .value | testCoreData2.swift:92:10:92:12 | .value | +| testCoreData2.swift:97:12:97:12 | c | testCoreData2.swift:70:9:70:9 | self | file://:0:0:0:0 | .value | testCoreData2.swift:97:12:97:14 | .value | +| testCoreData2.swift:97:12:97:14 | .value | testCoreData2.swift:70:9:70:9 | value | file://:0:0:0:0 | [post] self [value] | testCoreData2.swift:97:2:97:2 | [post] d [value] | +| testCoreData2.swift:98:18:98:18 | d [value] | testCoreData2.swift:70:9:70:9 | self [value] | file://:0:0:0:0 | .value | testCoreData2.swift:98:18:98:20 | .value | +| testCoreData2.swift:104:18:104:18 | e | testCoreData2.swift:70:9:70:9 | self | file://:0:0:0:0 | .value | testCoreData2.swift:104:18:104:20 | .value | +| testCoreData2.swift:105:18:105:18 | e | testCoreData2.swift:71:9:71:9 | self | file://:0:0:0:0 | .value2 | testCoreData2.swift:105:18:105:20 | .value2 | +| testRealm.swift:41:11:41:11 | myPassword | testRealm.swift:27:6:27:6 | value | file://:0:0:0:0 | [post] self [data] | testRealm.swift:41:2:41:2 | [post] a [data] | +| testRealm.swift:49:11:49:11 | myPassword | testRealm.swift:27:6:27:6 | value | file://:0:0:0:0 | [post] self [data] | testRealm.swift:49:2:49:2 | [post] c [data] | +| testRealm.swift:59:12:59:12 | myPassword | testRealm.swift:27:6:27:6 | value | file://:0:0:0:0 | [post] self [data] | testRealm.swift:59:2:59:3 | [post] ...! [data] | +| testRealm.swift:66:11:66:11 | myPassword | testRealm.swift:27:6:27:6 | value | file://:0:0:0:0 | [post] self [data] | testRealm.swift:66:2:66:2 | [post] g [data] | +| testRealm.swift:73:15:73:15 | myPassword | testRealm.swift:34:6:34:6 | value | file://:0:0:0:0 | [post] self [password] | testRealm.swift:73:2:73:2 | [post] h [password] | #select -| testCoreData2.swift:37:2:37:2 | obj | testCoreData2.swift:37:16:37:16 | bankAccountNo : | testCoreData2.swift:37:2:37:2 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:37:16:37:16 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:39:2:39:2 | obj | testCoreData2.swift:39:28:39:28 | bankAccountNo : | testCoreData2.swift:39:2:39:2 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:39:28:39:28 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:41:2:41:2 | obj | testCoreData2.swift:41:29:41:29 | bankAccountNo : | testCoreData2.swift:41:2:41:2 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:41:29:41:29 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:43:2:43:2 | obj | testCoreData2.swift:43:35:43:35 | bankAccountNo : | testCoreData2.swift:43:2:43:2 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:43:35:43:35 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:46:2:46:10 | ...? | testCoreData2.swift:46:22:46:22 | bankAccountNo : | testCoreData2.swift:46:2:46:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:46:22:46:22 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:48:2:48:10 | ...? | testCoreData2.swift:48:34:48:34 | bankAccountNo : | testCoreData2.swift:48:2:48:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:48:34:48:34 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:50:2:50:10 | ...? | testCoreData2.swift:50:35:50:35 | bankAccountNo : | testCoreData2.swift:50:2:50:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:50:35:50:35 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:52:2:52:10 | ...? | testCoreData2.swift:52:41:52:41 | bankAccountNo : | testCoreData2.swift:52:2:52:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:52:41:52:41 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:57:3:57:3 | obj | testCoreData2.swift:57:29:57:29 | bankAccountNo : | testCoreData2.swift:57:3:57:3 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:57:29:57:29 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:60:4:60:4 | obj | testCoreData2.swift:60:30:60:30 | bankAccountNo : | testCoreData2.swift:60:4:60:4 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:60:30:60:30 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:62:4:62:4 | obj | testCoreData2.swift:62:30:62:30 | bankAccountNo : | testCoreData2.swift:62:4:62:4 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:62:30:62:30 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:65:3:65:3 | obj | testCoreData2.swift:65:29:65:29 | bankAccountNo : | testCoreData2.swift:65:3:65:3 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:65:29:65:29 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:79:2:79:2 | dbObj | testCoreData2.swift:79:18:79:28 | .bankAccountNo : | testCoreData2.swift:79:2:79:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:79:18:79:28 | .bankAccountNo : | .bankAccountNo | -| testCoreData2.swift:80:2:80:2 | dbObj | testCoreData2.swift:80:18:80:28 | .bankAccountNo2 : | testCoreData2.swift:80:2:80:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:80:18:80:28 | .bankAccountNo2 : | .bankAccountNo2 | -| testCoreData2.swift:82:2:82:2 | dbObj | testCoreData2.swift:82:18:82:18 | bankAccountNo : | testCoreData2.swift:82:2:82:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:82:18:82:18 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:83:2:83:2 | dbObj | testCoreData2.swift:83:18:83:18 | bankAccountNo : | testCoreData2.swift:83:2:83:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:83:18:83:18 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:84:2:84:2 | dbObj | testCoreData2.swift:84:18:84:18 | bankAccountNo2 : | testCoreData2.swift:84:2:84:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:84:18:84:18 | bankAccountNo2 : | bankAccountNo2 | -| testCoreData2.swift:85:2:85:2 | dbObj | testCoreData2.swift:85:18:85:18 | bankAccountNo2 : | testCoreData2.swift:85:2:85:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:85:18:85:18 | bankAccountNo2 : | bankAccountNo2 | -| testCoreData2.swift:87:2:87:10 | ...? | testCoreData2.swift:87:22:87:32 | .bankAccountNo : | testCoreData2.swift:87:2:87:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:87:22:87:32 | .bankAccountNo : | .bankAccountNo | -| testCoreData2.swift:88:2:88:10 | ...? | testCoreData2.swift:88:22:88:22 | bankAccountNo : | testCoreData2.swift:88:2:88:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:88:22:88:22 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:89:2:89:10 | ...? | testCoreData2.swift:89:22:89:22 | bankAccountNo2 : | testCoreData2.swift:89:2:89:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:89:22:89:22 | bankAccountNo2 : | bankAccountNo2 | -| testCoreData2.swift:93:2:93:2 | dbObj | testCoreData2.swift:91:10:91:10 | bankAccountNo : | testCoreData2.swift:93:2:93:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:91:10:91:10 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:98:2:98:2 | dbObj | testCoreData2.swift:95:10:95:10 | bankAccountNo : | testCoreData2.swift:98:2:98:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:95:10:95:10 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:104:2:104:2 | dbObj | testCoreData2.swift:101:10:101:10 | bankAccountNo : | testCoreData2.swift:104:2:104:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:101:10:101:10 | bankAccountNo : | bankAccountNo | -| testCoreData2.swift:105:2:105:2 | dbObj | testCoreData2.swift:101:10:101:10 | bankAccountNo : | testCoreData2.swift:105:2:105:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:101:10:101:10 | bankAccountNo : | bankAccountNo | -| testCoreData.swift:19:12:19:12 | value | testCoreData.swift:61:25:61:25 | password : | testCoreData.swift:19:12:19:12 | value | This operation stores 'value' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:61:25:61:25 | password : | password | -| testCoreData.swift:32:13:32:13 | newValue | testCoreData.swift:64:16:64:16 | password : | testCoreData.swift:32:13:32:13 | newValue | This operation stores 'newValue' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:64:16:64:16 | password : | password | +| testCoreData2.swift:37:2:37:2 | obj | testCoreData2.swift:37:16:37:16 | bankAccountNo | testCoreData2.swift:37:2:37:2 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:37:16:37:16 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:39:2:39:2 | obj | testCoreData2.swift:39:28:39:28 | bankAccountNo | testCoreData2.swift:39:2:39:2 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:39:28:39:28 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:41:2:41:2 | obj | testCoreData2.swift:41:29:41:29 | bankAccountNo | testCoreData2.swift:41:2:41:2 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:41:29:41:29 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:43:2:43:2 | obj | testCoreData2.swift:43:35:43:35 | bankAccountNo | testCoreData2.swift:43:2:43:2 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:43:35:43:35 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:46:2:46:10 | ...? | testCoreData2.swift:46:22:46:22 | bankAccountNo | testCoreData2.swift:46:2:46:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:46:22:46:22 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:48:2:48:10 | ...? | testCoreData2.swift:48:34:48:34 | bankAccountNo | testCoreData2.swift:48:2:48:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:48:34:48:34 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:50:2:50:10 | ...? | testCoreData2.swift:50:35:50:35 | bankAccountNo | testCoreData2.swift:50:2:50:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:50:35:50:35 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:52:2:52:10 | ...? | testCoreData2.swift:52:41:52:41 | bankAccountNo | testCoreData2.swift:52:2:52:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:52:41:52:41 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:57:3:57:3 | obj | testCoreData2.swift:57:29:57:29 | bankAccountNo | testCoreData2.swift:57:3:57:3 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:57:29:57:29 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:60:4:60:4 | obj | testCoreData2.swift:60:30:60:30 | bankAccountNo | testCoreData2.swift:60:4:60:4 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:60:30:60:30 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:62:4:62:4 | obj | testCoreData2.swift:62:30:62:30 | bankAccountNo | testCoreData2.swift:62:4:62:4 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:62:30:62:30 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:65:3:65:3 | obj | testCoreData2.swift:65:29:65:29 | bankAccountNo | testCoreData2.swift:65:3:65:3 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:65:29:65:29 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:79:2:79:2 | dbObj | testCoreData2.swift:79:18:79:28 | .bankAccountNo | testCoreData2.swift:79:2:79:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:79:18:79:28 | .bankAccountNo | .bankAccountNo | +| testCoreData2.swift:80:2:80:2 | dbObj | testCoreData2.swift:80:18:80:28 | .bankAccountNo2 | testCoreData2.swift:80:2:80:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:80:18:80:28 | .bankAccountNo2 | .bankAccountNo2 | +| testCoreData2.swift:82:2:82:2 | dbObj | testCoreData2.swift:82:18:82:18 | bankAccountNo | testCoreData2.swift:82:2:82:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:82:18:82:18 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:83:2:83:2 | dbObj | testCoreData2.swift:83:18:83:18 | bankAccountNo | testCoreData2.swift:83:2:83:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:83:18:83:18 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:84:2:84:2 | dbObj | testCoreData2.swift:84:18:84:18 | bankAccountNo2 | testCoreData2.swift:84:2:84:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:84:18:84:18 | bankAccountNo2 | bankAccountNo2 | +| testCoreData2.swift:85:2:85:2 | dbObj | testCoreData2.swift:85:18:85:18 | bankAccountNo2 | testCoreData2.swift:85:2:85:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:85:18:85:18 | bankAccountNo2 | bankAccountNo2 | +| testCoreData2.swift:87:2:87:10 | ...? | testCoreData2.swift:87:22:87:32 | .bankAccountNo | testCoreData2.swift:87:2:87:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:87:22:87:32 | .bankAccountNo | .bankAccountNo | +| testCoreData2.swift:88:2:88:10 | ...? | testCoreData2.swift:88:22:88:22 | bankAccountNo | testCoreData2.swift:88:2:88:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:88:22:88:22 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:89:2:89:10 | ...? | testCoreData2.swift:89:22:89:22 | bankAccountNo2 | testCoreData2.swift:89:2:89:10 | [post] ...? | This operation stores '...?' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:89:22:89:22 | bankAccountNo2 | bankAccountNo2 | +| testCoreData2.swift:93:2:93:2 | dbObj | testCoreData2.swift:91:10:91:10 | bankAccountNo | testCoreData2.swift:93:2:93:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:91:10:91:10 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:98:2:98:2 | dbObj | testCoreData2.swift:95:10:95:10 | bankAccountNo | testCoreData2.swift:98:2:98:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:95:10:95:10 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:104:2:104:2 | dbObj | testCoreData2.swift:101:10:101:10 | bankAccountNo | testCoreData2.swift:104:2:104:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:101:10:101:10 | bankAccountNo | bankAccountNo | +| testCoreData2.swift:105:2:105:2 | dbObj | testCoreData2.swift:101:10:101:10 | bankAccountNo | testCoreData2.swift:105:2:105:2 | [post] dbObj | This operation stores 'dbObj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData2.swift:101:10:101:10 | bankAccountNo | bankAccountNo | +| testCoreData.swift:19:12:19:12 | value | testCoreData.swift:61:25:61:25 | password | testCoreData.swift:19:12:19:12 | value | This operation stores 'value' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:61:25:61:25 | password | password | +| testCoreData.swift:32:13:32:13 | newValue | testCoreData.swift:64:16:64:16 | password | testCoreData.swift:32:13:32:13 | newValue | This operation stores 'newValue' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:64:16:64:16 | password | password | | testCoreData.swift:48:15:48:15 | password | testCoreData.swift:48:15:48:15 | password | testCoreData.swift:48:15:48:15 | password | This operation stores 'password' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:48:15:48:15 | password | password | | testCoreData.swift:51:24:51:24 | password | testCoreData.swift:51:24:51:24 | password | testCoreData.swift:51:24:51:24 | password | This operation stores 'password' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:51:24:51:24 | password | password | | testCoreData.swift:58:15:58:15 | password | testCoreData.swift:58:15:58:15 | password | testCoreData.swift:58:15:58:15 | password | This operation stores 'password' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:58:15:58:15 | password | password | -| testCoreData.swift:64:2:64:2 | obj | testCoreData.swift:64:16:64:16 | password : | testCoreData.swift:64:2:64:2 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:64:16:64:16 | password : | password | -| testCoreData.swift:78:15:78:15 | x | testCoreData.swift:77:24:77:24 | x : | testCoreData.swift:78:15:78:15 | x | This operation stores 'x' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:77:24:77:24 | x : | x | -| testCoreData.swift:81:15:81:15 | y | testCoreData.swift:80:10:80:22 | call to getPassword() : | testCoreData.swift:81:15:81:15 | y | This operation stores 'y' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:80:10:80:22 | call to getPassword() : | call to getPassword() | +| testCoreData.swift:64:2:64:2 | obj | testCoreData.swift:64:16:64:16 | password | testCoreData.swift:64:2:64:2 | [post] obj | This operation stores 'obj' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:64:16:64:16 | password | password | +| testCoreData.swift:78:15:78:15 | x | testCoreData.swift:77:24:77:24 | x | testCoreData.swift:78:15:78:15 | x | This operation stores 'x' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:77:24:77:24 | x | x | +| testCoreData.swift:81:15:81:15 | y | testCoreData.swift:80:10:80:22 | call to getPassword() | testCoreData.swift:81:15:81:15 | y | This operation stores 'y' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:80:10:80:22 | call to getPassword() | call to getPassword() | | testCoreData.swift:85:15:85:17 | .password | testCoreData.swift:85:15:85:17 | .password | testCoreData.swift:85:15:85:17 | .password | This operation stores '.password' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:85:15:85:17 | .password | .password | -| testCoreData.swift:95:15:95:15 | x | testCoreData.swift:91:10:91:10 | passwd : | testCoreData.swift:95:15:95:15 | x | This operation stores 'x' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:91:10:91:10 | passwd : | passwd | -| testCoreData.swift:96:15:96:15 | y | testCoreData.swift:92:10:92:10 | passwd : | testCoreData.swift:96:15:96:15 | y | This operation stores 'y' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:92:10:92:10 | passwd : | passwd | -| testCoreData.swift:97:15:97:15 | z | testCoreData.swift:93:10:93:10 | passwd : | testCoreData.swift:97:15:97:15 | z | This operation stores 'z' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:93:10:93:10 | passwd : | passwd | -| testGRDB.swift:73:56:73:65 | [...] | testGRDB.swift:73:57:73:57 | password : | testGRDB.swift:73:56:73:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:73:57:73:57 | password : | password | -| testGRDB.swift:76:42:76:51 | [...] | testGRDB.swift:76:43:76:43 | password : | testGRDB.swift:76:42:76:51 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:76:43:76:43 | password : | password | -| testGRDB.swift:81:44:81:53 | [...] | testGRDB.swift:81:45:81:45 | password : | testGRDB.swift:81:44:81:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:81:45:81:45 | password : | password | -| testGRDB.swift:83:44:83:53 | [...] | testGRDB.swift:83:45:83:45 | password : | testGRDB.swift:83:44:83:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:83:45:83:45 | password : | password | -| testGRDB.swift:85:44:85:53 | [...] | testGRDB.swift:85:45:85:45 | password : | testGRDB.swift:85:44:85:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:85:45:85:45 | password : | password | -| testGRDB.swift:87:44:87:53 | [...] | testGRDB.swift:87:45:87:45 | password : | testGRDB.swift:87:44:87:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:87:45:87:45 | password : | password | -| testGRDB.swift:92:37:92:46 | [...] | testGRDB.swift:92:38:92:38 | password : | testGRDB.swift:92:37:92:46 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:92:38:92:38 | password : | password | -| testGRDB.swift:95:36:95:45 | [...] | testGRDB.swift:95:37:95:37 | password : | testGRDB.swift:95:36:95:45 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:95:37:95:37 | password : | password | -| testGRDB.swift:100:72:100:81 | [...] | testGRDB.swift:100:73:100:73 | password : | testGRDB.swift:100:72:100:81 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:100:73:100:73 | password : | password | -| testGRDB.swift:101:72:101:81 | [...] | testGRDB.swift:101:73:101:73 | password : | testGRDB.swift:101:72:101:81 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:101:73:101:73 | password : | password | -| testGRDB.swift:107:52:107:61 | [...] | testGRDB.swift:107:53:107:53 | password : | testGRDB.swift:107:52:107:61 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:107:53:107:53 | password : | password | -| testGRDB.swift:109:52:109:61 | [...] | testGRDB.swift:109:53:109:53 | password : | testGRDB.swift:109:52:109:61 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:109:53:109:53 | password : | password | -| testGRDB.swift:111:51:111:60 | [...] | testGRDB.swift:111:52:111:52 | password : | testGRDB.swift:111:51:111:60 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:111:52:111:52 | password : | password | -| testGRDB.swift:116:47:116:56 | [...] | testGRDB.swift:116:48:116:48 | password : | testGRDB.swift:116:47:116:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:116:48:116:48 | password : | password | -| testGRDB.swift:118:47:118:56 | [...] | testGRDB.swift:118:48:118:48 | password : | testGRDB.swift:118:47:118:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:118:48:118:48 | password : | password | -| testGRDB.swift:121:44:121:53 | [...] | testGRDB.swift:121:45:121:45 | password : | testGRDB.swift:121:44:121:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:121:45:121:45 | password : | password | -| testGRDB.swift:123:44:123:53 | [...] | testGRDB.swift:123:45:123:45 | password : | testGRDB.swift:123:44:123:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:123:45:123:45 | password : | password | -| testGRDB.swift:126:44:126:53 | [...] | testGRDB.swift:126:45:126:45 | password : | testGRDB.swift:126:44:126:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:126:45:126:45 | password : | password | -| testGRDB.swift:128:44:128:53 | [...] | testGRDB.swift:128:45:128:45 | password : | testGRDB.swift:128:44:128:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:128:45:128:45 | password : | password | -| testGRDB.swift:131:44:131:53 | [...] | testGRDB.swift:131:45:131:45 | password : | testGRDB.swift:131:44:131:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:131:45:131:45 | password : | password | -| testGRDB.swift:133:44:133:53 | [...] | testGRDB.swift:133:45:133:45 | password : | testGRDB.swift:133:44:133:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:133:45:133:45 | password : | password | -| testGRDB.swift:138:68:138:77 | [...] | testGRDB.swift:138:69:138:69 | password : | testGRDB.swift:138:68:138:77 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:138:69:138:69 | password : | password | -| testGRDB.swift:140:68:140:77 | [...] | testGRDB.swift:140:69:140:69 | password : | testGRDB.swift:140:68:140:77 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:140:69:140:69 | password : | password | -| testGRDB.swift:143:65:143:74 | [...] | testGRDB.swift:143:66:143:66 | password : | testGRDB.swift:143:65:143:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:143:66:143:66 | password : | password | -| testGRDB.swift:145:65:145:74 | [...] | testGRDB.swift:145:66:145:66 | password : | testGRDB.swift:145:65:145:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:145:66:145:66 | password : | password | -| testGRDB.swift:148:65:148:74 | [...] | testGRDB.swift:148:66:148:66 | password : | testGRDB.swift:148:65:148:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:148:66:148:66 | password : | password | -| testGRDB.swift:150:65:150:74 | [...] | testGRDB.swift:150:66:150:66 | password : | testGRDB.swift:150:65:150:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:150:66:150:66 | password : | password | -| testGRDB.swift:153:65:153:74 | [...] | testGRDB.swift:153:66:153:66 | password : | testGRDB.swift:153:65:153:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:153:66:153:66 | password : | password | -| testGRDB.swift:155:65:155:74 | [...] | testGRDB.swift:155:66:155:66 | password : | testGRDB.swift:155:65:155:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:155:66:155:66 | password : | password | -| testGRDB.swift:160:59:160:68 | [...] | testGRDB.swift:160:60:160:60 | password : | testGRDB.swift:160:59:160:68 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:160:60:160:60 | password : | password | -| testGRDB.swift:161:50:161:59 | [...] | testGRDB.swift:161:51:161:51 | password : | testGRDB.swift:161:50:161:59 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:161:51:161:51 | password : | password | -| testGRDB.swift:164:59:164:68 | [...] | testGRDB.swift:164:60:164:60 | password : | testGRDB.swift:164:59:164:68 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:164:60:164:60 | password : | password | -| testGRDB.swift:165:50:165:59 | [...] | testGRDB.swift:165:51:165:51 | password : | testGRDB.swift:165:50:165:59 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:165:51:165:51 | password : | password | -| testGRDB.swift:169:56:169:65 | [...] | testGRDB.swift:169:57:169:57 | password : | testGRDB.swift:169:56:169:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:169:57:169:57 | password : | password | -| testGRDB.swift:170:47:170:56 | [...] | testGRDB.swift:170:48:170:48 | password : | testGRDB.swift:170:47:170:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:170:48:170:48 | password : | password | -| testGRDB.swift:173:56:173:65 | [...] | testGRDB.swift:173:57:173:57 | password : | testGRDB.swift:173:56:173:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:173:57:173:57 | password : | password | -| testGRDB.swift:174:47:174:56 | [...] | testGRDB.swift:174:48:174:48 | password : | testGRDB.swift:174:47:174:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:174:48:174:48 | password : | password | -| testGRDB.swift:178:56:178:65 | [...] | testGRDB.swift:178:57:178:57 | password : | testGRDB.swift:178:56:178:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:178:57:178:57 | password : | password | -| testGRDB.swift:179:47:179:56 | [...] | testGRDB.swift:179:48:179:48 | password : | testGRDB.swift:179:47:179:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:179:48:179:48 | password : | password | -| testGRDB.swift:182:56:182:65 | [...] | testGRDB.swift:182:57:182:57 | password : | testGRDB.swift:182:56:182:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:182:57:182:57 | password : | password | -| testGRDB.swift:183:47:183:56 | [...] | testGRDB.swift:183:48:183:48 | password : | testGRDB.swift:183:47:183:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:183:48:183:48 | password : | password | -| testGRDB.swift:187:56:187:65 | [...] | testGRDB.swift:187:57:187:57 | password : | testGRDB.swift:187:56:187:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:187:57:187:57 | password : | password | -| testGRDB.swift:188:47:188:56 | [...] | testGRDB.swift:188:48:188:48 | password : | testGRDB.swift:188:47:188:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:188:48:188:48 | password : | password | -| testGRDB.swift:191:56:191:65 | [...] | testGRDB.swift:191:57:191:57 | password : | testGRDB.swift:191:56:191:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:191:57:191:57 | password : | password | -| testGRDB.swift:192:47:192:56 | [...] | testGRDB.swift:192:48:192:48 | password : | testGRDB.swift:192:47:192:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:192:48:192:48 | password : | password | -| testGRDB.swift:198:29:198:38 | [...] | testGRDB.swift:198:30:198:30 | password : | testGRDB.swift:198:29:198:38 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:198:30:198:30 | password : | password | -| testGRDB.swift:201:23:201:32 | [...] | testGRDB.swift:201:24:201:24 | password : | testGRDB.swift:201:23:201:32 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:201:24:201:24 | password : | password | -| testGRDB.swift:206:66:206:75 | [...] | testGRDB.swift:206:67:206:67 | password : | testGRDB.swift:206:66:206:75 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:206:67:206:67 | password : | password | -| testGRDB.swift:208:80:208:89 | [...] | testGRDB.swift:208:81:208:81 | password : | testGRDB.swift:208:80:208:89 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:208:81:208:81 | password : | password | -| testGRDB.swift:210:84:210:93 | [...] | testGRDB.swift:210:85:210:85 | password : | testGRDB.swift:210:84:210:93 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:210:85:210:85 | password : | password | -| testGRDB.swift:212:98:212:107 | [...] | testGRDB.swift:212:99:212:99 | password : | testGRDB.swift:212:98:212:107 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:212:99:212:99 | password : | password | -| testRealm.swift:41:2:41:2 | a | testRealm.swift:41:11:41:11 | myPassword : | testRealm.swift:41:2:41:2 | [post] a | This operation stores 'a' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:41:11:41:11 | myPassword : | myPassword | -| testRealm.swift:49:2:49:2 | c | testRealm.swift:49:11:49:11 | myPassword : | testRealm.swift:49:2:49:2 | [post] c | This operation stores 'c' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:49:11:49:11 | myPassword : | myPassword | -| testRealm.swift:59:2:59:3 | ...! | testRealm.swift:59:12:59:12 | myPassword : | testRealm.swift:59:2:59:3 | [post] ...! | This operation stores '...!' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:59:12:59:12 | myPassword : | myPassword | -| testRealm.swift:66:2:66:2 | g | testRealm.swift:66:11:66:11 | myPassword : | testRealm.swift:66:2:66:2 | [post] g | This operation stores 'g' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:66:11:66:11 | myPassword : | myPassword | -| testRealm.swift:73:2:73:2 | h | testRealm.swift:73:15:73:15 | myPassword : | testRealm.swift:73:2:73:2 | [post] h | This operation stores 'h' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:73:15:73:15 | myPassword : | myPassword | +| testCoreData.swift:95:15:95:15 | x | testCoreData.swift:91:10:91:10 | passwd | testCoreData.swift:95:15:95:15 | x | This operation stores 'x' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:91:10:91:10 | passwd | passwd | +| testCoreData.swift:96:15:96:15 | y | testCoreData.swift:92:10:92:10 | passwd | testCoreData.swift:96:15:96:15 | y | This operation stores 'y' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:92:10:92:10 | passwd | passwd | +| testCoreData.swift:97:15:97:15 | z | testCoreData.swift:93:10:93:10 | passwd | testCoreData.swift:97:15:97:15 | z | This operation stores 'z' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:93:10:93:10 | passwd | passwd | +| testGRDB.swift:73:56:73:65 | [...] | testGRDB.swift:73:57:73:57 | password | testGRDB.swift:73:56:73:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:73:57:73:57 | password | password | +| testGRDB.swift:76:42:76:51 | [...] | testGRDB.swift:76:43:76:43 | password | testGRDB.swift:76:42:76:51 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:76:43:76:43 | password | password | +| testGRDB.swift:81:44:81:53 | [...] | testGRDB.swift:81:45:81:45 | password | testGRDB.swift:81:44:81:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:81:45:81:45 | password | password | +| testGRDB.swift:83:44:83:53 | [...] | testGRDB.swift:83:45:83:45 | password | testGRDB.swift:83:44:83:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:83:45:83:45 | password | password | +| testGRDB.swift:85:44:85:53 | [...] | testGRDB.swift:85:45:85:45 | password | testGRDB.swift:85:44:85:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:85:45:85:45 | password | password | +| testGRDB.swift:87:44:87:53 | [...] | testGRDB.swift:87:45:87:45 | password | testGRDB.swift:87:44:87:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:87:45:87:45 | password | password | +| testGRDB.swift:92:37:92:46 | [...] | testGRDB.swift:92:38:92:38 | password | testGRDB.swift:92:37:92:46 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:92:38:92:38 | password | password | +| testGRDB.swift:95:36:95:45 | [...] | testGRDB.swift:95:37:95:37 | password | testGRDB.swift:95:36:95:45 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:95:37:95:37 | password | password | +| testGRDB.swift:100:72:100:81 | [...] | testGRDB.swift:100:73:100:73 | password | testGRDB.swift:100:72:100:81 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:100:73:100:73 | password | password | +| testGRDB.swift:101:72:101:81 | [...] | testGRDB.swift:101:73:101:73 | password | testGRDB.swift:101:72:101:81 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:101:73:101:73 | password | password | +| testGRDB.swift:107:52:107:61 | [...] | testGRDB.swift:107:53:107:53 | password | testGRDB.swift:107:52:107:61 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:107:53:107:53 | password | password | +| testGRDB.swift:109:52:109:61 | [...] | testGRDB.swift:109:53:109:53 | password | testGRDB.swift:109:52:109:61 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:109:53:109:53 | password | password | +| testGRDB.swift:111:51:111:60 | [...] | testGRDB.swift:111:52:111:52 | password | testGRDB.swift:111:51:111:60 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:111:52:111:52 | password | password | +| testGRDB.swift:116:47:116:56 | [...] | testGRDB.swift:116:48:116:48 | password | testGRDB.swift:116:47:116:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:116:48:116:48 | password | password | +| testGRDB.swift:118:47:118:56 | [...] | testGRDB.swift:118:48:118:48 | password | testGRDB.swift:118:47:118:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:118:48:118:48 | password | password | +| testGRDB.swift:121:44:121:53 | [...] | testGRDB.swift:121:45:121:45 | password | testGRDB.swift:121:44:121:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:121:45:121:45 | password | password | +| testGRDB.swift:123:44:123:53 | [...] | testGRDB.swift:123:45:123:45 | password | testGRDB.swift:123:44:123:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:123:45:123:45 | password | password | +| testGRDB.swift:126:44:126:53 | [...] | testGRDB.swift:126:45:126:45 | password | testGRDB.swift:126:44:126:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:126:45:126:45 | password | password | +| testGRDB.swift:128:44:128:53 | [...] | testGRDB.swift:128:45:128:45 | password | testGRDB.swift:128:44:128:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:128:45:128:45 | password | password | +| testGRDB.swift:131:44:131:53 | [...] | testGRDB.swift:131:45:131:45 | password | testGRDB.swift:131:44:131:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:131:45:131:45 | password | password | +| testGRDB.swift:133:44:133:53 | [...] | testGRDB.swift:133:45:133:45 | password | testGRDB.swift:133:44:133:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:133:45:133:45 | password | password | +| testGRDB.swift:138:68:138:77 | [...] | testGRDB.swift:138:69:138:69 | password | testGRDB.swift:138:68:138:77 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:138:69:138:69 | password | password | +| testGRDB.swift:140:68:140:77 | [...] | testGRDB.swift:140:69:140:69 | password | testGRDB.swift:140:68:140:77 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:140:69:140:69 | password | password | +| testGRDB.swift:143:65:143:74 | [...] | testGRDB.swift:143:66:143:66 | password | testGRDB.swift:143:65:143:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:143:66:143:66 | password | password | +| testGRDB.swift:145:65:145:74 | [...] | testGRDB.swift:145:66:145:66 | password | testGRDB.swift:145:65:145:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:145:66:145:66 | password | password | +| testGRDB.swift:148:65:148:74 | [...] | testGRDB.swift:148:66:148:66 | password | testGRDB.swift:148:65:148:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:148:66:148:66 | password | password | +| testGRDB.swift:150:65:150:74 | [...] | testGRDB.swift:150:66:150:66 | password | testGRDB.swift:150:65:150:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:150:66:150:66 | password | password | +| testGRDB.swift:153:65:153:74 | [...] | testGRDB.swift:153:66:153:66 | password | testGRDB.swift:153:65:153:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:153:66:153:66 | password | password | +| testGRDB.swift:155:65:155:74 | [...] | testGRDB.swift:155:66:155:66 | password | testGRDB.swift:155:65:155:74 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:155:66:155:66 | password | password | +| testGRDB.swift:160:59:160:68 | [...] | testGRDB.swift:160:60:160:60 | password | testGRDB.swift:160:59:160:68 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:160:60:160:60 | password | password | +| testGRDB.swift:161:50:161:59 | [...] | testGRDB.swift:161:51:161:51 | password | testGRDB.swift:161:50:161:59 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:161:51:161:51 | password | password | +| testGRDB.swift:164:59:164:68 | [...] | testGRDB.swift:164:60:164:60 | password | testGRDB.swift:164:59:164:68 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:164:60:164:60 | password | password | +| testGRDB.swift:165:50:165:59 | [...] | testGRDB.swift:165:51:165:51 | password | testGRDB.swift:165:50:165:59 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:165:51:165:51 | password | password | +| testGRDB.swift:169:56:169:65 | [...] | testGRDB.swift:169:57:169:57 | password | testGRDB.swift:169:56:169:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:169:57:169:57 | password | password | +| testGRDB.swift:170:47:170:56 | [...] | testGRDB.swift:170:48:170:48 | password | testGRDB.swift:170:47:170:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:170:48:170:48 | password | password | +| testGRDB.swift:173:56:173:65 | [...] | testGRDB.swift:173:57:173:57 | password | testGRDB.swift:173:56:173:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:173:57:173:57 | password | password | +| testGRDB.swift:174:47:174:56 | [...] | testGRDB.swift:174:48:174:48 | password | testGRDB.swift:174:47:174:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:174:48:174:48 | password | password | +| testGRDB.swift:178:56:178:65 | [...] | testGRDB.swift:178:57:178:57 | password | testGRDB.swift:178:56:178:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:178:57:178:57 | password | password | +| testGRDB.swift:179:47:179:56 | [...] | testGRDB.swift:179:48:179:48 | password | testGRDB.swift:179:47:179:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:179:48:179:48 | password | password | +| testGRDB.swift:182:56:182:65 | [...] | testGRDB.swift:182:57:182:57 | password | testGRDB.swift:182:56:182:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:182:57:182:57 | password | password | +| testGRDB.swift:183:47:183:56 | [...] | testGRDB.swift:183:48:183:48 | password | testGRDB.swift:183:47:183:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:183:48:183:48 | password | password | +| testGRDB.swift:187:56:187:65 | [...] | testGRDB.swift:187:57:187:57 | password | testGRDB.swift:187:56:187:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:187:57:187:57 | password | password | +| testGRDB.swift:188:47:188:56 | [...] | testGRDB.swift:188:48:188:48 | password | testGRDB.swift:188:47:188:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:188:48:188:48 | password | password | +| testGRDB.swift:191:56:191:65 | [...] | testGRDB.swift:191:57:191:57 | password | testGRDB.swift:191:56:191:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:191:57:191:57 | password | password | +| testGRDB.swift:192:47:192:56 | [...] | testGRDB.swift:192:48:192:48 | password | testGRDB.swift:192:47:192:56 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:192:48:192:48 | password | password | +| testGRDB.swift:198:29:198:38 | [...] | testGRDB.swift:198:30:198:30 | password | testGRDB.swift:198:29:198:38 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:198:30:198:30 | password | password | +| testGRDB.swift:201:23:201:32 | [...] | testGRDB.swift:201:24:201:24 | password | testGRDB.swift:201:23:201:32 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:201:24:201:24 | password | password | +| testGRDB.swift:206:66:206:75 | [...] | testGRDB.swift:206:67:206:67 | password | testGRDB.swift:206:66:206:75 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:206:67:206:67 | password | password | +| testGRDB.swift:208:80:208:89 | [...] | testGRDB.swift:208:81:208:81 | password | testGRDB.swift:208:80:208:89 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:208:81:208:81 | password | password | +| testGRDB.swift:210:84:210:93 | [...] | testGRDB.swift:210:85:210:85 | password | testGRDB.swift:210:84:210:93 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:210:85:210:85 | password | password | +| testGRDB.swift:212:98:212:107 | [...] | testGRDB.swift:212:99:212:99 | password | testGRDB.swift:212:98:212:107 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:212:99:212:99 | password | password | +| testRealm.swift:41:2:41:2 | a | testRealm.swift:41:11:41:11 | myPassword | testRealm.swift:41:2:41:2 | [post] a | This operation stores 'a' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:41:11:41:11 | myPassword | myPassword | +| testRealm.swift:49:2:49:2 | c | testRealm.swift:49:11:49:11 | myPassword | testRealm.swift:49:2:49:2 | [post] c | This operation stores 'c' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:49:11:49:11 | myPassword | myPassword | +| testRealm.swift:59:2:59:3 | ...! | testRealm.swift:59:12:59:12 | myPassword | testRealm.swift:59:2:59:3 | [post] ...! | This operation stores '...!' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:59:12:59:12 | myPassword | myPassword | +| testRealm.swift:66:2:66:2 | g | testRealm.swift:66:11:66:11 | myPassword | testRealm.swift:66:2:66:2 | [post] g | This operation stores 'g' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:66:11:66:11 | myPassword | myPassword | +| testRealm.swift:73:2:73:2 | h | testRealm.swift:73:15:73:15 | myPassword | testRealm.swift:73:2:73:2 | [post] h | This operation stores 'h' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:73:15:73:15 | myPassword | myPassword | diff --git a/swift/ql/test/query-tests/Security/CWE-311/CleartextTransmission.expected b/swift/ql/test/query-tests/Security/CWE-311/CleartextTransmission.expected index c4bee3c7cdf..ed65adcc9b6 100644 --- a/swift/ql/test/query-tests/Security/CWE-311/CleartextTransmission.expected +++ b/swift/ql/test/query-tests/Security/CWE-311/CleartextTransmission.expected @@ -1,58 +1,58 @@ edges -| testAlamofire.swift:150:45:150:45 | password : | testAlamofire.swift:150:13:150:45 | ... .+(_:_:) ... | -| testAlamofire.swift:152:51:152:51 | password : | testAlamofire.swift:152:19:152:51 | ... .+(_:_:) ... | -| testAlamofire.swift:154:38:154:38 | email : | testAlamofire.swift:154:14:154:46 | ... .+(_:_:) ... | -| testSend.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | -| testSend.swift:33:14:33:32 | call to Data.init(_:) : | testSend.swift:37:19:37:19 | data2 | -| testSend.swift:33:19:33:19 | passwordPlain : | testSend.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | -| testSend.swift:33:19:33:19 | passwordPlain : | testSend.swift:33:14:33:32 | call to Data.init(_:) : | -| testSend.swift:41:10:41:18 | data : | testSend.swift:41:45:41:45 | data : | -| testSend.swift:45:13:45:13 | password : | testSend.swift:52:27:52:27 | str1 | -| testSend.swift:46:13:46:13 | password : | testSend.swift:53:27:53:27 | str2 | -| testSend.swift:47:13:47:25 | call to pad(_:) : | testSend.swift:54:27:54:27 | str3 | -| testSend.swift:47:17:47:17 | password : | testSend.swift:41:10:41:18 | data : | -| testSend.swift:47:17:47:17 | password : | testSend.swift:47:13:47:25 | call to pad(_:) : | -| testURL.swift:13:54:13:54 | passwd : | testURL.swift:13:22:13:54 | ... .+(_:_:) ... | -| testURL.swift:16:55:16:55 | credit_card_no : | testURL.swift:16:22:16:55 | ... .+(_:_:) ... | +| testAlamofire.swift:150:45:150:45 | password | testAlamofire.swift:150:13:150:45 | ... .+(_:_:) ... | +| testAlamofire.swift:152:51:152:51 | password | testAlamofire.swift:152:19:152:51 | ... .+(_:_:) ... | +| testAlamofire.swift:154:38:154:38 | email | testAlamofire.swift:154:14:154:46 | ... .+(_:_:) ... | +| testSend.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | +| testSend.swift:33:14:33:32 | call to Data.init(_:) | testSend.swift:37:19:37:19 | data2 | +| testSend.swift:33:19:33:19 | passwordPlain | testSend.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | +| testSend.swift:33:19:33:19 | passwordPlain | testSend.swift:33:14:33:32 | call to Data.init(_:) | +| testSend.swift:41:10:41:18 | data | testSend.swift:41:45:41:45 | data | +| testSend.swift:45:13:45:13 | password | testSend.swift:52:27:52:27 | str1 | +| testSend.swift:46:13:46:13 | password | testSend.swift:53:27:53:27 | str2 | +| testSend.swift:47:13:47:25 | call to pad(_:) | testSend.swift:54:27:54:27 | str3 | +| testSend.swift:47:17:47:17 | password | testSend.swift:41:10:41:18 | data | +| testSend.swift:47:17:47:17 | password | testSend.swift:47:13:47:25 | call to pad(_:) | +| testURL.swift:13:54:13:54 | passwd | testURL.swift:13:22:13:54 | ... .+(_:_:) ... | +| testURL.swift:16:55:16:55 | credit_card_no | testURL.swift:16:22:16:55 | ... .+(_:_:) ... | nodes -| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | semmle.label | [summary] to write: return (return) in Data.init(_:) : | +| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | semmle.label | [summary] to write: return (return) in Data.init(_:) | | testAlamofire.swift:150:13:150:45 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | -| testAlamofire.swift:150:45:150:45 | password : | semmle.label | password : | +| testAlamofire.swift:150:45:150:45 | password | semmle.label | password | | testAlamofire.swift:152:19:152:51 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | -| testAlamofire.swift:152:51:152:51 | password : | semmle.label | password : | +| testAlamofire.swift:152:51:152:51 | password | semmle.label | password | | testAlamofire.swift:154:14:154:46 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | -| testAlamofire.swift:154:38:154:38 | email : | semmle.label | email : | -| testSend.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | semmle.label | [summary param] 0 in Data.init(_:) : | +| testAlamofire.swift:154:38:154:38 | email | semmle.label | email | +| testSend.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | semmle.label | [summary param] 0 in Data.init(_:) | | testSend.swift:29:19:29:19 | passwordPlain | semmle.label | passwordPlain | -| testSend.swift:33:14:33:32 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| testSend.swift:33:19:33:19 | passwordPlain : | semmle.label | passwordPlain : | +| testSend.swift:33:14:33:32 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| testSend.swift:33:19:33:19 | passwordPlain | semmle.label | passwordPlain | | testSend.swift:37:19:37:19 | data2 | semmle.label | data2 | -| testSend.swift:41:10:41:18 | data : | semmle.label | data : | -| testSend.swift:41:45:41:45 | data : | semmle.label | data : | -| testSend.swift:45:13:45:13 | password : | semmle.label | password : | -| testSend.swift:46:13:46:13 | password : | semmle.label | password : | -| testSend.swift:47:13:47:25 | call to pad(_:) : | semmle.label | call to pad(_:) : | -| testSend.swift:47:17:47:17 | password : | semmle.label | password : | +| testSend.swift:41:10:41:18 | data | semmle.label | data | +| testSend.swift:41:45:41:45 | data | semmle.label | data | +| testSend.swift:45:13:45:13 | password | semmle.label | password | +| testSend.swift:46:13:46:13 | password | semmle.label | password | +| testSend.swift:47:13:47:25 | call to pad(_:) | semmle.label | call to pad(_:) | +| testSend.swift:47:17:47:17 | password | semmle.label | password | | testSend.swift:52:27:52:27 | str1 | semmle.label | str1 | | testSend.swift:53:27:53:27 | str2 | semmle.label | str2 | | testSend.swift:54:27:54:27 | str3 | semmle.label | str3 | | testURL.swift:13:22:13:54 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | -| testURL.swift:13:54:13:54 | passwd : | semmle.label | passwd : | +| testURL.swift:13:54:13:54 | passwd | semmle.label | passwd | | testURL.swift:16:22:16:55 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... | -| testURL.swift:16:55:16:55 | credit_card_no : | semmle.label | credit_card_no : | +| testURL.swift:16:55:16:55 | credit_card_no | semmle.label | credit_card_no | | testURL.swift:20:22:20:22 | passwd | semmle.label | passwd | subpaths -| testSend.swift:33:19:33:19 | passwordPlain : | testSend.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | testSend.swift:33:14:33:32 | call to Data.init(_:) : | -| testSend.swift:47:17:47:17 | password : | testSend.swift:41:10:41:18 | data : | testSend.swift:41:45:41:45 | data : | testSend.swift:47:13:47:25 | call to pad(_:) : | +| testSend.swift:33:19:33:19 | passwordPlain | testSend.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | testSend.swift:33:14:33:32 | call to Data.init(_:) | +| testSend.swift:47:17:47:17 | password | testSend.swift:41:10:41:18 | data | testSend.swift:41:45:41:45 | data | testSend.swift:47:13:47:25 | call to pad(_:) | #select -| testAlamofire.swift:150:13:150:45 | ... .+(_:_:) ... | testAlamofire.swift:150:45:150:45 | password : | testAlamofire.swift:150:13:150:45 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testAlamofire.swift:150:45:150:45 | password : | password | -| testAlamofire.swift:152:19:152:51 | ... .+(_:_:) ... | testAlamofire.swift:152:51:152:51 | password : | testAlamofire.swift:152:19:152:51 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testAlamofire.swift:152:51:152:51 | password : | password | -| testAlamofire.swift:154:14:154:46 | ... .+(_:_:) ... | testAlamofire.swift:154:38:154:38 | email : | testAlamofire.swift:154:14:154:46 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testAlamofire.swift:154:38:154:38 | email : | email | +| testAlamofire.swift:150:13:150:45 | ... .+(_:_:) ... | testAlamofire.swift:150:45:150:45 | password | testAlamofire.swift:150:13:150:45 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testAlamofire.swift:150:45:150:45 | password | password | +| testAlamofire.swift:152:19:152:51 | ... .+(_:_:) ... | testAlamofire.swift:152:51:152:51 | password | testAlamofire.swift:152:19:152:51 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testAlamofire.swift:152:51:152:51 | password | password | +| testAlamofire.swift:154:14:154:46 | ... .+(_:_:) ... | testAlamofire.swift:154:38:154:38 | email | testAlamofire.swift:154:14:154:46 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testAlamofire.swift:154:38:154:38 | email | email | | testSend.swift:29:19:29:19 | passwordPlain | testSend.swift:29:19:29:19 | passwordPlain | testSend.swift:29:19:29:19 | passwordPlain | This operation transmits 'passwordPlain', which may contain unencrypted sensitive data from $@. | testSend.swift:29:19:29:19 | passwordPlain | passwordPlain | -| testSend.swift:37:19:37:19 | data2 | testSend.swift:33:19:33:19 | passwordPlain : | testSend.swift:37:19:37:19 | data2 | This operation transmits 'data2', which may contain unencrypted sensitive data from $@. | testSend.swift:33:19:33:19 | passwordPlain : | passwordPlain | -| testSend.swift:52:27:52:27 | str1 | testSend.swift:45:13:45:13 | password : | testSend.swift:52:27:52:27 | str1 | This operation transmits 'str1', which may contain unencrypted sensitive data from $@. | testSend.swift:45:13:45:13 | password : | password | -| testSend.swift:53:27:53:27 | str2 | testSend.swift:46:13:46:13 | password : | testSend.swift:53:27:53:27 | str2 | This operation transmits 'str2', which may contain unencrypted sensitive data from $@. | testSend.swift:46:13:46:13 | password : | password | -| testSend.swift:54:27:54:27 | str3 | testSend.swift:47:17:47:17 | password : | testSend.swift:54:27:54:27 | str3 | This operation transmits 'str3', which may contain unencrypted sensitive data from $@. | testSend.swift:47:17:47:17 | password : | password | -| testURL.swift:13:22:13:54 | ... .+(_:_:) ... | testURL.swift:13:54:13:54 | passwd : | testURL.swift:13:22:13:54 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:13:54:13:54 | passwd : | passwd | -| testURL.swift:16:22:16:55 | ... .+(_:_:) ... | testURL.swift:16:55:16:55 | credit_card_no : | testURL.swift:16:22:16:55 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:16:55:16:55 | credit_card_no : | credit_card_no | +| testSend.swift:37:19:37:19 | data2 | testSend.swift:33:19:33:19 | passwordPlain | testSend.swift:37:19:37:19 | data2 | This operation transmits 'data2', which may contain unencrypted sensitive data from $@. | testSend.swift:33:19:33:19 | passwordPlain | passwordPlain | +| testSend.swift:52:27:52:27 | str1 | testSend.swift:45:13:45:13 | password | testSend.swift:52:27:52:27 | str1 | This operation transmits 'str1', which may contain unencrypted sensitive data from $@. | testSend.swift:45:13:45:13 | password | password | +| testSend.swift:53:27:53:27 | str2 | testSend.swift:46:13:46:13 | password | testSend.swift:53:27:53:27 | str2 | This operation transmits 'str2', which may contain unencrypted sensitive data from $@. | testSend.swift:46:13:46:13 | password | password | +| testSend.swift:54:27:54:27 | str3 | testSend.swift:47:17:47:17 | password | testSend.swift:54:27:54:27 | str3 | This operation transmits 'str3', which may contain unencrypted sensitive data from $@. | testSend.swift:47:17:47:17 | password | password | +| testURL.swift:13:22:13:54 | ... .+(_:_:) ... | testURL.swift:13:54:13:54 | passwd | testURL.swift:13:22:13:54 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:13:54:13:54 | passwd | passwd | +| testURL.swift:16:22:16:55 | ... .+(_:_:) ... | testURL.swift:16:55:16:55 | credit_card_no | testURL.swift:16:22:16:55 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:16:55:16:55 | credit_card_no | credit_card_no | | testURL.swift:20:22:20:22 | passwd | testURL.swift:20:22:20:22 | passwd | testURL.swift:20:22:20:22 | passwd | This operation transmits 'passwd', which may contain unencrypted sensitive data from $@. | testURL.swift:20:22:20:22 | passwd | passwd | diff --git a/swift/ql/test/query-tests/Security/CWE-312/CleartextStoragePreferences.expected b/swift/ql/test/query-tests/Security/CWE-312/CleartextStoragePreferences.expected index 035453270ae..823733bb3ab 100644 --- a/swift/ql/test/query-tests/Security/CWE-312/CleartextStoragePreferences.expected +++ b/swift/ql/test/query-tests/Security/CWE-312/CleartextStoragePreferences.expected @@ -1,52 +1,52 @@ edges -| testNSUbiquitousKeyValueStore.swift:41:24:41:24 | x : | testNSUbiquitousKeyValueStore.swift:42:40:42:40 | x | -| testNSUbiquitousKeyValueStore.swift:44:10:44:22 | call to getPassword() : | testNSUbiquitousKeyValueStore.swift:45:40:45:40 | y | -| testNSUbiquitousKeyValueStore.swift:55:10:55:10 | passwd : | testNSUbiquitousKeyValueStore.swift:59:40:59:40 | x | -| testNSUbiquitousKeyValueStore.swift:56:10:56:10 | passwd : | testNSUbiquitousKeyValueStore.swift:60:40:60:40 | y | -| testNSUbiquitousKeyValueStore.swift:57:10:57:10 | passwd : | testNSUbiquitousKeyValueStore.swift:61:40:61:40 | z | -| testUserDefaults.swift:41:24:41:24 | x : | testUserDefaults.swift:42:28:42:28 | x | -| testUserDefaults.swift:44:10:44:22 | call to getPassword() : | testUserDefaults.swift:45:28:45:28 | y | -| testUserDefaults.swift:55:10:55:10 | passwd : | testUserDefaults.swift:59:28:59:28 | x | -| testUserDefaults.swift:56:10:56:10 | passwd : | testUserDefaults.swift:60:28:60:28 | y | -| testUserDefaults.swift:57:10:57:10 | passwd : | testUserDefaults.swift:61:28:61:28 | z | +| testNSUbiquitousKeyValueStore.swift:41:24:41:24 | x | testNSUbiquitousKeyValueStore.swift:42:40:42:40 | x | +| testNSUbiquitousKeyValueStore.swift:44:10:44:22 | call to getPassword() | testNSUbiquitousKeyValueStore.swift:45:40:45:40 | y | +| testNSUbiquitousKeyValueStore.swift:55:10:55:10 | passwd | testNSUbiquitousKeyValueStore.swift:59:40:59:40 | x | +| testNSUbiquitousKeyValueStore.swift:56:10:56:10 | passwd | testNSUbiquitousKeyValueStore.swift:60:40:60:40 | y | +| testNSUbiquitousKeyValueStore.swift:57:10:57:10 | passwd | testNSUbiquitousKeyValueStore.swift:61:40:61:40 | z | +| testUserDefaults.swift:41:24:41:24 | x | testUserDefaults.swift:42:28:42:28 | x | +| testUserDefaults.swift:44:10:44:22 | call to getPassword() | testUserDefaults.swift:45:28:45:28 | y | +| testUserDefaults.swift:55:10:55:10 | passwd | testUserDefaults.swift:59:28:59:28 | x | +| testUserDefaults.swift:56:10:56:10 | passwd | testUserDefaults.swift:60:28:60:28 | y | +| testUserDefaults.swift:57:10:57:10 | passwd | testUserDefaults.swift:61:28:61:28 | z | nodes | testNSUbiquitousKeyValueStore.swift:28:12:28:12 | password | semmle.label | password | -| testNSUbiquitousKeyValueStore.swift:41:24:41:24 | x : | semmle.label | x : | +| testNSUbiquitousKeyValueStore.swift:41:24:41:24 | x | semmle.label | x | | testNSUbiquitousKeyValueStore.swift:42:40:42:40 | x | semmle.label | x | -| testNSUbiquitousKeyValueStore.swift:44:10:44:22 | call to getPassword() : | semmle.label | call to getPassword() : | +| testNSUbiquitousKeyValueStore.swift:44:10:44:22 | call to getPassword() | semmle.label | call to getPassword() | | testNSUbiquitousKeyValueStore.swift:45:40:45:40 | y | semmle.label | y | | testNSUbiquitousKeyValueStore.swift:49:40:49:42 | .password | semmle.label | .password | -| testNSUbiquitousKeyValueStore.swift:55:10:55:10 | passwd : | semmle.label | passwd : | -| testNSUbiquitousKeyValueStore.swift:56:10:56:10 | passwd : | semmle.label | passwd : | -| testNSUbiquitousKeyValueStore.swift:57:10:57:10 | passwd : | semmle.label | passwd : | +| testNSUbiquitousKeyValueStore.swift:55:10:55:10 | passwd | semmle.label | passwd | +| testNSUbiquitousKeyValueStore.swift:56:10:56:10 | passwd | semmle.label | passwd | +| testNSUbiquitousKeyValueStore.swift:57:10:57:10 | passwd | semmle.label | passwd | | testNSUbiquitousKeyValueStore.swift:59:40:59:40 | x | semmle.label | x | | testNSUbiquitousKeyValueStore.swift:60:40:60:40 | y | semmle.label | y | | testNSUbiquitousKeyValueStore.swift:61:40:61:40 | z | semmle.label | z | | testUserDefaults.swift:28:15:28:15 | password | semmle.label | password | -| testUserDefaults.swift:41:24:41:24 | x : | semmle.label | x : | +| testUserDefaults.swift:41:24:41:24 | x | semmle.label | x | | testUserDefaults.swift:42:28:42:28 | x | semmle.label | x | -| testUserDefaults.swift:44:10:44:22 | call to getPassword() : | semmle.label | call to getPassword() : | +| testUserDefaults.swift:44:10:44:22 | call to getPassword() | semmle.label | call to getPassword() | | testUserDefaults.swift:45:28:45:28 | y | semmle.label | y | | testUserDefaults.swift:49:28:49:30 | .password | semmle.label | .password | -| testUserDefaults.swift:55:10:55:10 | passwd : | semmle.label | passwd : | -| testUserDefaults.swift:56:10:56:10 | passwd : | semmle.label | passwd : | -| testUserDefaults.swift:57:10:57:10 | passwd : | semmle.label | passwd : | +| testUserDefaults.swift:55:10:55:10 | passwd | semmle.label | passwd | +| testUserDefaults.swift:56:10:56:10 | passwd | semmle.label | passwd | +| testUserDefaults.swift:57:10:57:10 | passwd | semmle.label | passwd | | testUserDefaults.swift:59:28:59:28 | x | semmle.label | x | | testUserDefaults.swift:60:28:60:28 | y | semmle.label | y | | testUserDefaults.swift:61:28:61:28 | z | semmle.label | z | subpaths #select | testNSUbiquitousKeyValueStore.swift:28:12:28:12 | password | testNSUbiquitousKeyValueStore.swift:28:12:28:12 | password | testNSUbiquitousKeyValueStore.swift:28:12:28:12 | password | This operation stores 'password' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:28:12:28:12 | password | password | -| testNSUbiquitousKeyValueStore.swift:42:40:42:40 | x | testNSUbiquitousKeyValueStore.swift:41:24:41:24 | x : | testNSUbiquitousKeyValueStore.swift:42:40:42:40 | x | This operation stores 'x' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:41:24:41:24 | x : | x | -| testNSUbiquitousKeyValueStore.swift:45:40:45:40 | y | testNSUbiquitousKeyValueStore.swift:44:10:44:22 | call to getPassword() : | testNSUbiquitousKeyValueStore.swift:45:40:45:40 | y | This operation stores 'y' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:44:10:44:22 | call to getPassword() : | call to getPassword() | +| testNSUbiquitousKeyValueStore.swift:42:40:42:40 | x | testNSUbiquitousKeyValueStore.swift:41:24:41:24 | x | testNSUbiquitousKeyValueStore.swift:42:40:42:40 | x | This operation stores 'x' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:41:24:41:24 | x | x | +| testNSUbiquitousKeyValueStore.swift:45:40:45:40 | y | testNSUbiquitousKeyValueStore.swift:44:10:44:22 | call to getPassword() | testNSUbiquitousKeyValueStore.swift:45:40:45:40 | y | This operation stores 'y' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:44:10:44:22 | call to getPassword() | call to getPassword() | | testNSUbiquitousKeyValueStore.swift:49:40:49:42 | .password | testNSUbiquitousKeyValueStore.swift:49:40:49:42 | .password | testNSUbiquitousKeyValueStore.swift:49:40:49:42 | .password | This operation stores '.password' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:49:40:49:42 | .password | .password | -| testNSUbiquitousKeyValueStore.swift:59:40:59:40 | x | testNSUbiquitousKeyValueStore.swift:55:10:55:10 | passwd : | testNSUbiquitousKeyValueStore.swift:59:40:59:40 | x | This operation stores 'x' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:55:10:55:10 | passwd : | passwd | -| testNSUbiquitousKeyValueStore.swift:60:40:60:40 | y | testNSUbiquitousKeyValueStore.swift:56:10:56:10 | passwd : | testNSUbiquitousKeyValueStore.swift:60:40:60:40 | y | This operation stores 'y' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:56:10:56:10 | passwd : | passwd | -| testNSUbiquitousKeyValueStore.swift:61:40:61:40 | z | testNSUbiquitousKeyValueStore.swift:57:10:57:10 | passwd : | testNSUbiquitousKeyValueStore.swift:61:40:61:40 | z | This operation stores 'z' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:57:10:57:10 | passwd : | passwd | +| testNSUbiquitousKeyValueStore.swift:59:40:59:40 | x | testNSUbiquitousKeyValueStore.swift:55:10:55:10 | passwd | testNSUbiquitousKeyValueStore.swift:59:40:59:40 | x | This operation stores 'x' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:55:10:55:10 | passwd | passwd | +| testNSUbiquitousKeyValueStore.swift:60:40:60:40 | y | testNSUbiquitousKeyValueStore.swift:56:10:56:10 | passwd | testNSUbiquitousKeyValueStore.swift:60:40:60:40 | y | This operation stores 'y' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:56:10:56:10 | passwd | passwd | +| testNSUbiquitousKeyValueStore.swift:61:40:61:40 | z | testNSUbiquitousKeyValueStore.swift:57:10:57:10 | passwd | testNSUbiquitousKeyValueStore.swift:61:40:61:40 | z | This operation stores 'z' in iCloud. It may contain unencrypted sensitive data from $@. | testNSUbiquitousKeyValueStore.swift:57:10:57:10 | passwd | passwd | | testUserDefaults.swift:28:15:28:15 | password | testUserDefaults.swift:28:15:28:15 | password | testUserDefaults.swift:28:15:28:15 | password | This operation stores 'password' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:28:15:28:15 | password | password | -| testUserDefaults.swift:42:28:42:28 | x | testUserDefaults.swift:41:24:41:24 | x : | testUserDefaults.swift:42:28:42:28 | x | This operation stores 'x' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:41:24:41:24 | x : | x | -| testUserDefaults.swift:45:28:45:28 | y | testUserDefaults.swift:44:10:44:22 | call to getPassword() : | testUserDefaults.swift:45:28:45:28 | y | This operation stores 'y' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:44:10:44:22 | call to getPassword() : | call to getPassword() | +| testUserDefaults.swift:42:28:42:28 | x | testUserDefaults.swift:41:24:41:24 | x | testUserDefaults.swift:42:28:42:28 | x | This operation stores 'x' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:41:24:41:24 | x | x | +| testUserDefaults.swift:45:28:45:28 | y | testUserDefaults.swift:44:10:44:22 | call to getPassword() | testUserDefaults.swift:45:28:45:28 | y | This operation stores 'y' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:44:10:44:22 | call to getPassword() | call to getPassword() | | testUserDefaults.swift:49:28:49:30 | .password | testUserDefaults.swift:49:28:49:30 | .password | testUserDefaults.swift:49:28:49:30 | .password | This operation stores '.password' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:49:28:49:30 | .password | .password | -| testUserDefaults.swift:59:28:59:28 | x | testUserDefaults.swift:55:10:55:10 | passwd : | testUserDefaults.swift:59:28:59:28 | x | This operation stores 'x' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:55:10:55:10 | passwd : | passwd | -| testUserDefaults.swift:60:28:60:28 | y | testUserDefaults.swift:56:10:56:10 | passwd : | testUserDefaults.swift:60:28:60:28 | y | This operation stores 'y' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:56:10:56:10 | passwd : | passwd | -| testUserDefaults.swift:61:28:61:28 | z | testUserDefaults.swift:57:10:57:10 | passwd : | testUserDefaults.swift:61:28:61:28 | z | This operation stores 'z' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:57:10:57:10 | passwd : | passwd | +| testUserDefaults.swift:59:28:59:28 | x | testUserDefaults.swift:55:10:55:10 | passwd | testUserDefaults.swift:59:28:59:28 | x | This operation stores 'x' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:55:10:55:10 | passwd | passwd | +| testUserDefaults.swift:60:28:60:28 | y | testUserDefaults.swift:56:10:56:10 | passwd | testUserDefaults.swift:60:28:60:28 | y | This operation stores 'y' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:56:10:56:10 | passwd | passwd | +| testUserDefaults.swift:61:28:61:28 | z | testUserDefaults.swift:57:10:57:10 | passwd | testUserDefaults.swift:61:28:61:28 | z | This operation stores 'z' in the user defaults database. It may contain unencrypted sensitive data from $@. | testUserDefaults.swift:57:10:57:10 | passwd | passwd | diff --git a/swift/ql/test/query-tests/Security/CWE-321/HardcodedEncryptionKey.expected b/swift/ql/test/query-tests/Security/CWE-321/HardcodedEncryptionKey.expected index a13717c68e6..fe6cd155c56 100644 --- a/swift/ql/test/query-tests/Security/CWE-321/HardcodedEncryptionKey.expected +++ b/swift/ql/test/query-tests/Security/CWE-321/HardcodedEncryptionKey.expected @@ -1,46 +1,78 @@ edges -| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:65:73:65:73 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:66:73:66:73 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:67:73:67:73 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:68:73:68:73 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:70:94:70:94 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:71:102:71:102 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:72:94:72:94 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:73:102:73:102 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:75:37:75:37 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:76:37:76:37 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:78:66:78:66 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:79:66:79:66 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:80:94:80:94 | myConstKey | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | rncryptor.swift:81:102:81:102 | myConstKey | -| rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | -| rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | -| test.swift:76:3:76:3 | this string is constant : | test.swift:92:18:92:36 | call to getConstantString() : | -| test.swift:90:26:90:121 | [...] : | test.swift:117:22:117:22 | key | -| test.swift:90:26:90:121 | [...] : | test.swift:118:22:118:22 | key | -| test.swift:90:26:90:121 | [...] : | test.swift:128:26:128:26 | key | -| test.swift:90:26:90:121 | [...] : | test.swift:135:25:135:25 | key | -| test.swift:90:26:90:121 | [...] : | test.swift:140:25:140:25 | key | -| test.swift:90:26:90:121 | [...] : | test.swift:145:26:145:26 | key | -| test.swift:90:26:90:121 | [...] : | test.swift:150:26:150:26 | key | -| test.swift:90:26:90:121 | [...] : | test.swift:151:26:151:26 | key | -| test.swift:90:26:90:121 | [...] : | test.swift:161:24:161:24 | key | -| test.swift:90:26:90:121 | [...] : | test.swift:163:24:163:24 | key | -| test.swift:92:18:92:36 | call to getConstantString() : | test.swift:108:21:108:21 | keyString | -| test.swift:92:18:92:36 | call to getConstantString() : | test.swift:109:21:109:21 | keyString | -| test.swift:92:18:92:36 | call to getConstantString() : | test.swift:119:22:119:22 | keyString | -| test.swift:92:18:92:36 | call to getConstantString() : | test.swift:120:22:120:22 | keyString | -| test.swift:92:18:92:36 | call to getConstantString() : | test.swift:129:26:129:26 | keyString | -| test.swift:92:18:92:36 | call to getConstantString() : | test.swift:152:26:152:26 | keyString | -| test.swift:92:18:92:36 | call to getConstantString() : | test.swift:153:26:153:26 | keyString | -| test.swift:92:18:92:36 | call to getConstantString() : | test.swift:162:24:162:24 | keyString | -| test.swift:92:18:92:36 | call to getConstantString() : | test.swift:164:24:164:24 | keyString | +| cryptoswift.swift:76:3:76:3 | this string is constant | cryptoswift.swift:92:18:92:36 | call to getConstantString() | +| cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:117:22:117:22 | key | +| cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:118:22:118:22 | key | +| cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:128:26:128:26 | key | +| cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:135:25:135:25 | key | +| cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:140:25:140:25 | key | +| cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:145:26:145:26 | key | +| cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:150:26:150:26 | key | +| cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:151:26:151:26 | key | +| cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:161:24:161:24 | key | +| cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:163:24:163:24 | key | +| cryptoswift.swift:92:18:92:36 | call to getConstantString() | cryptoswift.swift:108:21:108:21 | keyString | +| cryptoswift.swift:92:18:92:36 | call to getConstantString() | cryptoswift.swift:109:21:109:21 | keyString | +| cryptoswift.swift:92:18:92:36 | call to getConstantString() | cryptoswift.swift:119:22:119:22 | keyString | +| cryptoswift.swift:92:18:92:36 | call to getConstantString() | cryptoswift.swift:120:22:120:22 | keyString | +| cryptoswift.swift:92:18:92:36 | call to getConstantString() | cryptoswift.swift:129:26:129:26 | keyString | +| cryptoswift.swift:92:18:92:36 | call to getConstantString() | cryptoswift.swift:152:26:152:26 | keyString | +| cryptoswift.swift:92:18:92:36 | call to getConstantString() | cryptoswift.swift:153:26:153:26 | keyString | +| cryptoswift.swift:92:18:92:36 | call to getConstantString() | cryptoswift.swift:162:24:162:24 | keyString | +| cryptoswift.swift:92:18:92:36 | call to getConstantString() | cryptoswift.swift:164:24:164:24 | keyString | +| misc.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | +| misc.swift:38:19:38:38 | call to Data.init(_:) | misc.swift:41:41:41:41 | myConstKey | +| misc.swift:38:24:38:24 | abcdef123456 | misc.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | +| misc.swift:38:24:38:24 | abcdef123456 | misc.swift:38:19:38:38 | call to Data.init(_:) | +| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:65:73:65:73 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:66:73:66:73 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:67:73:67:73 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:68:73:68:73 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:70:94:70:94 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:71:102:71:102 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:72:94:72:94 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:73:102:73:102 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:75:37:75:37 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:76:37:76:37 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:78:66:78:66 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:79:66:79:66 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:80:94:80:94 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:81:102:81:102 | myConstKey | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | rncryptor.swift:83:92:83:92 | myConstKey | +| rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | +| rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:60:19:60:38 | call to Data.init(_:) | nodes -| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | semmle.label | [summary] to write: return (return) in Data.init(_:) : | -| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | semmle.label | [summary param] 0 in Data.init(_:) : | -| rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| rncryptor.swift:60:24:60:24 | abcdef123456 : | semmle.label | abcdef123456 : | +| cryptoswift.swift:76:3:76:3 | this string is constant | semmle.label | this string is constant | +| cryptoswift.swift:90:26:90:121 | [...] | semmle.label | [...] | +| cryptoswift.swift:92:18:92:36 | call to getConstantString() | semmle.label | call to getConstantString() | +| cryptoswift.swift:108:21:108:21 | keyString | semmle.label | keyString | +| cryptoswift.swift:109:21:109:21 | keyString | semmle.label | keyString | +| cryptoswift.swift:117:22:117:22 | key | semmle.label | key | +| cryptoswift.swift:118:22:118:22 | key | semmle.label | key | +| cryptoswift.swift:119:22:119:22 | keyString | semmle.label | keyString | +| cryptoswift.swift:120:22:120:22 | keyString | semmle.label | keyString | +| cryptoswift.swift:128:26:128:26 | key | semmle.label | key | +| cryptoswift.swift:129:26:129:26 | keyString | semmle.label | keyString | +| cryptoswift.swift:135:25:135:25 | key | semmle.label | key | +| cryptoswift.swift:140:25:140:25 | key | semmle.label | key | +| cryptoswift.swift:145:26:145:26 | key | semmle.label | key | +| cryptoswift.swift:150:26:150:26 | key | semmle.label | key | +| cryptoswift.swift:151:26:151:26 | key | semmle.label | key | +| cryptoswift.swift:152:26:152:26 | keyString | semmle.label | keyString | +| cryptoswift.swift:153:26:153:26 | keyString | semmle.label | keyString | +| cryptoswift.swift:161:24:161:24 | key | semmle.label | key | +| cryptoswift.swift:162:24:162:24 | keyString | semmle.label | keyString | +| cryptoswift.swift:163:24:163:24 | key | semmle.label | key | +| cryptoswift.swift:164:24:164:24 | keyString | semmle.label | keyString | +| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | semmle.label | [summary] to write: return (return) in Data.init(_:) | +| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | semmle.label | [summary] to write: return (return) in Data.init(_:) | +| misc.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | semmle.label | [summary param] 0 in Data.init(_:) | +| misc.swift:38:19:38:38 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| misc.swift:38:24:38:24 | abcdef123456 | semmle.label | abcdef123456 | +| misc.swift:41:41:41:41 | myConstKey | semmle.label | myConstKey | +| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | semmle.label | [summary param] 0 in Data.init(_:) | +| rncryptor.swift:60:19:60:38 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| rncryptor.swift:60:24:60:24 | abcdef123456 | semmle.label | abcdef123456 | | rncryptor.swift:65:73:65:73 | myConstKey | semmle.label | myConstKey | | rncryptor.swift:66:73:66:73 | myConstKey | semmle.label | myConstKey | | rncryptor.swift:67:73:67:73 | myConstKey | semmle.label | myConstKey | @@ -55,61 +87,43 @@ nodes | rncryptor.swift:79:66:79:66 | myConstKey | semmle.label | myConstKey | | rncryptor.swift:80:94:80:94 | myConstKey | semmle.label | myConstKey | | rncryptor.swift:81:102:81:102 | myConstKey | semmle.label | myConstKey | -| test.swift:76:3:76:3 | this string is constant : | semmle.label | this string is constant : | -| test.swift:90:26:90:121 | [...] : | semmle.label | [...] : | -| test.swift:92:18:92:36 | call to getConstantString() : | semmle.label | call to getConstantString() : | -| test.swift:108:21:108:21 | keyString | semmle.label | keyString | -| test.swift:109:21:109:21 | keyString | semmle.label | keyString | -| test.swift:117:22:117:22 | key | semmle.label | key | -| test.swift:118:22:118:22 | key | semmle.label | key | -| test.swift:119:22:119:22 | keyString | semmle.label | keyString | -| test.swift:120:22:120:22 | keyString | semmle.label | keyString | -| test.swift:128:26:128:26 | key | semmle.label | key | -| test.swift:129:26:129:26 | keyString | semmle.label | keyString | -| test.swift:135:25:135:25 | key | semmle.label | key | -| test.swift:140:25:140:25 | key | semmle.label | key | -| test.swift:145:26:145:26 | key | semmle.label | key | -| test.swift:150:26:150:26 | key | semmle.label | key | -| test.swift:151:26:151:26 | key | semmle.label | key | -| test.swift:152:26:152:26 | keyString | semmle.label | keyString | -| test.swift:153:26:153:26 | keyString | semmle.label | keyString | -| test.swift:161:24:161:24 | key | semmle.label | key | -| test.swift:162:24:162:24 | keyString | semmle.label | keyString | -| test.swift:163:24:163:24 | key | semmle.label | key | -| test.swift:164:24:164:24 | keyString | semmle.label | keyString | +| rncryptor.swift:83:92:83:92 | myConstKey | semmle.label | myConstKey | subpaths -| rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | rncryptor.swift:60:19:60:38 | call to Data.init(_:) : | +| misc.swift:38:24:38:24 | abcdef123456 | misc.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | misc.swift:38:19:38:38 | call to Data.init(_:) | +| rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | rncryptor.swift:60:19:60:38 | call to Data.init(_:) | #select -| rncryptor.swift:65:73:65:73 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:65:73:65:73 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:66:73:66:73 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:66:73:66:73 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:67:73:67:73 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:67:73:67:73 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:68:73:68:73 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:68:73:68:73 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:70:94:70:94 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:70:94:70:94 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:71:102:71:102 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:71:102:71:102 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:72:94:72:94 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:72:94:72:94 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:73:102:73:102 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:73:102:73:102 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:75:37:75:37 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:75:37:75:37 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:76:37:76:37 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:76:37:76:37 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:78:66:78:66 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:78:66:78:66 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:79:66:79:66 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:79:66:79:66 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:80:94:80:94 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:80:94:80:94 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| rncryptor.swift:81:102:81:102 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 : | rncryptor.swift:81:102:81:102 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 : | abcdef123456 | -| test.swift:108:21:108:21 | keyString | test.swift:76:3:76:3 | this string is constant : | test.swift:108:21:108:21 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | test.swift:76:3:76:3 | this string is constant : | this string is constant | -| test.swift:109:21:109:21 | keyString | test.swift:76:3:76:3 | this string is constant : | test.swift:109:21:109:21 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | test.swift:76:3:76:3 | this string is constant : | this string is constant | -| test.swift:117:22:117:22 | key | test.swift:90:26:90:121 | [...] : | test.swift:117:22:117:22 | key | The key 'key' has been initialized with hard-coded values from $@. | test.swift:90:26:90:121 | [...] : | [...] | -| test.swift:118:22:118:22 | key | test.swift:90:26:90:121 | [...] : | test.swift:118:22:118:22 | key | The key 'key' has been initialized with hard-coded values from $@. | test.swift:90:26:90:121 | [...] : | [...] | -| test.swift:119:22:119:22 | keyString | test.swift:76:3:76:3 | this string is constant : | test.swift:119:22:119:22 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | test.swift:76:3:76:3 | this string is constant : | this string is constant | -| test.swift:120:22:120:22 | keyString | test.swift:76:3:76:3 | this string is constant : | test.swift:120:22:120:22 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | test.swift:76:3:76:3 | this string is constant : | this string is constant | -| test.swift:128:26:128:26 | key | test.swift:90:26:90:121 | [...] : | test.swift:128:26:128:26 | key | The key 'key' has been initialized with hard-coded values from $@. | test.swift:90:26:90:121 | [...] : | [...] | -| test.swift:129:26:129:26 | keyString | test.swift:76:3:76:3 | this string is constant : | test.swift:129:26:129:26 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | test.swift:76:3:76:3 | this string is constant : | this string is constant | -| test.swift:135:25:135:25 | key | test.swift:90:26:90:121 | [...] : | test.swift:135:25:135:25 | key | The key 'key' has been initialized with hard-coded values from $@. | test.swift:90:26:90:121 | [...] : | [...] | -| test.swift:140:25:140:25 | key | test.swift:90:26:90:121 | [...] : | test.swift:140:25:140:25 | key | The key 'key' has been initialized with hard-coded values from $@. | test.swift:90:26:90:121 | [...] : | [...] | -| test.swift:145:26:145:26 | key | test.swift:90:26:90:121 | [...] : | test.swift:145:26:145:26 | key | The key 'key' has been initialized with hard-coded values from $@. | test.swift:90:26:90:121 | [...] : | [...] | -| test.swift:150:26:150:26 | key | test.swift:90:26:90:121 | [...] : | test.swift:150:26:150:26 | key | The key 'key' has been initialized with hard-coded values from $@. | test.swift:90:26:90:121 | [...] : | [...] | -| test.swift:151:26:151:26 | key | test.swift:90:26:90:121 | [...] : | test.swift:151:26:151:26 | key | The key 'key' has been initialized with hard-coded values from $@. | test.swift:90:26:90:121 | [...] : | [...] | -| test.swift:152:26:152:26 | keyString | test.swift:76:3:76:3 | this string is constant : | test.swift:152:26:152:26 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | test.swift:76:3:76:3 | this string is constant : | this string is constant | -| test.swift:153:26:153:26 | keyString | test.swift:76:3:76:3 | this string is constant : | test.swift:153:26:153:26 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | test.swift:76:3:76:3 | this string is constant : | this string is constant | -| test.swift:161:24:161:24 | key | test.swift:90:26:90:121 | [...] : | test.swift:161:24:161:24 | key | The key 'key' has been initialized with hard-coded values from $@. | test.swift:90:26:90:121 | [...] : | [...] | -| test.swift:162:24:162:24 | keyString | test.swift:76:3:76:3 | this string is constant : | test.swift:162:24:162:24 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | test.swift:76:3:76:3 | this string is constant : | this string is constant | -| test.swift:163:24:163:24 | key | test.swift:90:26:90:121 | [...] : | test.swift:163:24:163:24 | key | The key 'key' has been initialized with hard-coded values from $@. | test.swift:90:26:90:121 | [...] : | [...] | -| test.swift:164:24:164:24 | keyString | test.swift:76:3:76:3 | this string is constant : | test.swift:164:24:164:24 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | test.swift:76:3:76:3 | this string is constant : | this string is constant | +| cryptoswift.swift:108:21:108:21 | keyString | cryptoswift.swift:76:3:76:3 | this string is constant | cryptoswift.swift:108:21:108:21 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | cryptoswift.swift:76:3:76:3 | this string is constant | this string is constant | +| cryptoswift.swift:109:21:109:21 | keyString | cryptoswift.swift:76:3:76:3 | this string is constant | cryptoswift.swift:109:21:109:21 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | cryptoswift.swift:76:3:76:3 | this string is constant | this string is constant | +| cryptoswift.swift:117:22:117:22 | key | cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:117:22:117:22 | key | The key 'key' has been initialized with hard-coded values from $@. | cryptoswift.swift:90:26:90:121 | [...] | [...] | +| cryptoswift.swift:118:22:118:22 | key | cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:118:22:118:22 | key | The key 'key' has been initialized with hard-coded values from $@. | cryptoswift.swift:90:26:90:121 | [...] | [...] | +| cryptoswift.swift:119:22:119:22 | keyString | cryptoswift.swift:76:3:76:3 | this string is constant | cryptoswift.swift:119:22:119:22 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | cryptoswift.swift:76:3:76:3 | this string is constant | this string is constant | +| cryptoswift.swift:120:22:120:22 | keyString | cryptoswift.swift:76:3:76:3 | this string is constant | cryptoswift.swift:120:22:120:22 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | cryptoswift.swift:76:3:76:3 | this string is constant | this string is constant | +| cryptoswift.swift:128:26:128:26 | key | cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:128:26:128:26 | key | The key 'key' has been initialized with hard-coded values from $@. | cryptoswift.swift:90:26:90:121 | [...] | [...] | +| cryptoswift.swift:129:26:129:26 | keyString | cryptoswift.swift:76:3:76:3 | this string is constant | cryptoswift.swift:129:26:129:26 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | cryptoswift.swift:76:3:76:3 | this string is constant | this string is constant | +| cryptoswift.swift:135:25:135:25 | key | cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:135:25:135:25 | key | The key 'key' has been initialized with hard-coded values from $@. | cryptoswift.swift:90:26:90:121 | [...] | [...] | +| cryptoswift.swift:140:25:140:25 | key | cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:140:25:140:25 | key | The key 'key' has been initialized with hard-coded values from $@. | cryptoswift.swift:90:26:90:121 | [...] | [...] | +| cryptoswift.swift:145:26:145:26 | key | cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:145:26:145:26 | key | The key 'key' has been initialized with hard-coded values from $@. | cryptoswift.swift:90:26:90:121 | [...] | [...] | +| cryptoswift.swift:150:26:150:26 | key | cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:150:26:150:26 | key | The key 'key' has been initialized with hard-coded values from $@. | cryptoswift.swift:90:26:90:121 | [...] | [...] | +| cryptoswift.swift:151:26:151:26 | key | cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:151:26:151:26 | key | The key 'key' has been initialized with hard-coded values from $@. | cryptoswift.swift:90:26:90:121 | [...] | [...] | +| cryptoswift.swift:152:26:152:26 | keyString | cryptoswift.swift:76:3:76:3 | this string is constant | cryptoswift.swift:152:26:152:26 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | cryptoswift.swift:76:3:76:3 | this string is constant | this string is constant | +| cryptoswift.swift:153:26:153:26 | keyString | cryptoswift.swift:76:3:76:3 | this string is constant | cryptoswift.swift:153:26:153:26 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | cryptoswift.swift:76:3:76:3 | this string is constant | this string is constant | +| cryptoswift.swift:161:24:161:24 | key | cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:161:24:161:24 | key | The key 'key' has been initialized with hard-coded values from $@. | cryptoswift.swift:90:26:90:121 | [...] | [...] | +| cryptoswift.swift:162:24:162:24 | keyString | cryptoswift.swift:76:3:76:3 | this string is constant | cryptoswift.swift:162:24:162:24 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | cryptoswift.swift:76:3:76:3 | this string is constant | this string is constant | +| cryptoswift.swift:163:24:163:24 | key | cryptoswift.swift:90:26:90:121 | [...] | cryptoswift.swift:163:24:163:24 | key | The key 'key' has been initialized with hard-coded values from $@. | cryptoswift.swift:90:26:90:121 | [...] | [...] | +| cryptoswift.swift:164:24:164:24 | keyString | cryptoswift.swift:76:3:76:3 | this string is constant | cryptoswift.swift:164:24:164:24 | keyString | The key 'keyString' has been initialized with hard-coded values from $@. | cryptoswift.swift:76:3:76:3 | this string is constant | this string is constant | +| misc.swift:41:41:41:41 | myConstKey | misc.swift:38:24:38:24 | abcdef123456 | misc.swift:41:41:41:41 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | misc.swift:38:24:38:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:65:73:65:73 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:65:73:65:73 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:66:73:66:73 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:66:73:66:73 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:67:73:67:73 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:67:73:67:73 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:68:73:68:73 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:68:73:68:73 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:70:94:70:94 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:70:94:70:94 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:71:102:71:102 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:71:102:71:102 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:72:94:72:94 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:72:94:72:94 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:73:102:73:102 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:73:102:73:102 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:75:37:75:37 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:75:37:75:37 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:76:37:76:37 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:76:37:76:37 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:78:66:78:66 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:78:66:78:66 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:79:66:79:66 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:79:66:79:66 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:80:94:80:94 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:80:94:80:94 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:81:102:81:102 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:81:102:81:102 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | +| rncryptor.swift:83:92:83:92 | myConstKey | rncryptor.swift:60:24:60:24 | abcdef123456 | rncryptor.swift:83:92:83:92 | myConstKey | The key 'myConstKey' has been initialized with hard-coded values from $@. | rncryptor.swift:60:24:60:24 | abcdef123456 | abcdef123456 | diff --git a/swift/ql/test/query-tests/Security/CWE-321/test.swift b/swift/ql/test/query-tests/Security/CWE-321/cryptoswift.swift similarity index 100% rename from swift/ql/test/query-tests/Security/CWE-321/test.swift rename to swift/ql/test/query-tests/Security/CWE-321/cryptoswift.swift diff --git a/swift/ql/test/query-tests/Security/CWE-321/misc.swift b/swift/ql/test/query-tests/Security/CWE-321/misc.swift new file mode 100644 index 00000000000..b67020559b0 --- /dev/null +++ b/swift/ql/test/query-tests/Security/CWE-321/misc.swift @@ -0,0 +1,46 @@ + +// --- stubs --- + +class Data { + init(_ elements: S) {} +} + +struct URL { + init(fileURLWithPath path: String, isDirectory: Bool) {} +} + +class Realm { +} + +extension Realm { + struct Configuration { + init( + fileURL: URL? = URL(fileURLWithPath: "defaultFile", isDirectory: false), + inMemoryIdentifier: String? = nil, + syncConfiguration: Int = 0, + encryptionKey: Data? = nil, + readOnly: Bool = false, + schemaVersion: UInt64 = 0, + migrationBlock: Int = 0, + deleteRealmIfMigrationNeeded: Bool = false, + shouldCompactOnLaunch: Bool = false, + objectTypes: Int = 0, + seedFilePath: URL? = nil) { } + + var encryptionKey: Data? + } +} + +// --- tests --- + +func test(myVarStr: String) { + let myVarKey = Data(myVarStr) + let myConstKey = Data("abcdef123456") + + _ = Realm.Configuration(encryptionKey: myVarKey) // GOOD + _ = Realm.Configuration(encryptionKey: myConstKey) // BAD + + var config = Realm.Configuration() // GOOD + config.encryptionKey = myVarKey // GOOD + config.encryptionKey = myConstKey // BAD [NOT DETECTED] +} diff --git a/swift/ql/test/query-tests/Security/CWE-321/rncryptor.swift b/swift/ql/test/query-tests/Security/CWE-321/rncryptor.swift index 41d7f9d1498..bfb3b046ec3 100644 --- a/swift/ql/test/query-tests/Security/CWE-321/rncryptor.swift +++ b/swift/ql/test/query-tests/Security/CWE-321/rncryptor.swift @@ -52,16 +52,16 @@ class RNDecryptor : RNCryptor // --- tests --- -func test() { +func test(var myVarKey: Data, var myHMACKey: Data) { // RNCryptor let myEncryptor = RNEncryptor() let myDecryptor = RNDecryptor() let myData = Data(0) let myConstKey = Data("abcdef123456") - let myHMACKey = Data(0) let myHandler = {} let myIV = Data(0) + let _ = RNEncryptor(settings: kRNCryptorAES256Settings, encryptionKey: myVarKey, hmacKey: myHMACKey, handler: myHandler) // GOOD let _ = RNEncryptor(settings: kRNCryptorAES256Settings, encryptionKey: myConstKey, hmacKey: myHMACKey, handler: myHandler) // BAD let _ = RNEncryptor(settings: kRNCryptorAES256Settings, encryptionKey: myConstKey, HMACKey: myHMACKey, handler: myHandler) // BAD let _ = RNEncryptor(settings: kRNCryptorAES256Settings, encryptionKey: myConstKey, hmacKey: myHMACKey, iv: myIV, handler: myHandler) // BAD @@ -79,4 +79,6 @@ func test() { let _ = try? myDecryptor.decryptData(myData, withEncryptionKey: myConstKey, HMACKey: myHMACKey) // BAD let _ = try? myDecryptor.decryptData(myData, with: kRNCryptorAES256Settings, encryptionKey: myConstKey, hmacKey: myHMACKey) // BAD let _ = try? myDecryptor.decryptData(myData, withSettings: kRNCryptorAES256Settings, encryptionKey: myConstKey, HMACKey: myHMACKey) // BAD + + let _ = RNEncryptor(settings: kRNCryptorAES256Settings, encryptionKey: myVarKey, hmacKey: myConstKey, handler: myHandler) // BAD } diff --git a/swift/ql/test/query-tests/Security/CWE-327/ECBEncryption.expected b/swift/ql/test/query-tests/Security/CWE-327/ECBEncryption.expected index 5f23c342a81..38c377b3926 100644 --- a/swift/ql/test/query-tests/Security/CWE-327/ECBEncryption.expected +++ b/swift/ql/test/query-tests/Security/CWE-327/ECBEncryption.expected @@ -1,13 +1,13 @@ edges -| test.swift:34:9:34:13 | call to ECB.init() : | test.swift:54:37:54:53 | call to getECBBlockMode() | -| test.swift:34:9:34:13 | call to ECB.init() : | test.swift:55:37:55:53 | call to getECBBlockMode() | -| test.swift:34:9:34:13 | call to ECB.init() : | test.swift:67:42:67:58 | call to getECBBlockMode() | -| test.swift:45:12:45:16 | call to ECB.init() : | test.swift:50:37:50:37 | ecb | -| test.swift:45:12:45:16 | call to ECB.init() : | test.swift:51:37:51:37 | ecb | -| test.swift:45:12:45:16 | call to ECB.init() : | test.swift:65:42:65:42 | ecb | +| test.swift:34:9:34:13 | call to ECB.init() | test.swift:54:37:54:53 | call to getECBBlockMode() | +| test.swift:34:9:34:13 | call to ECB.init() | test.swift:55:37:55:53 | call to getECBBlockMode() | +| test.swift:34:9:34:13 | call to ECB.init() | test.swift:67:42:67:58 | call to getECBBlockMode() | +| test.swift:45:12:45:16 | call to ECB.init() | test.swift:50:37:50:37 | ecb | +| test.swift:45:12:45:16 | call to ECB.init() | test.swift:51:37:51:37 | ecb | +| test.swift:45:12:45:16 | call to ECB.init() | test.swift:65:42:65:42 | ecb | nodes -| test.swift:34:9:34:13 | call to ECB.init() : | semmle.label | call to ECB.init() : | -| test.swift:45:12:45:16 | call to ECB.init() : | semmle.label | call to ECB.init() : | +| test.swift:34:9:34:13 | call to ECB.init() | semmle.label | call to ECB.init() | +| test.swift:45:12:45:16 | call to ECB.init() | semmle.label | call to ECB.init() | | test.swift:50:37:50:37 | ecb | semmle.label | ecb | | test.swift:51:37:51:37 | ecb | semmle.label | ecb | | test.swift:52:37:52:41 | call to ECB.init() | semmle.label | call to ECB.init() | @@ -19,12 +19,12 @@ nodes | test.swift:67:42:67:58 | call to getECBBlockMode() | semmle.label | call to getECBBlockMode() | subpaths #select -| test.swift:50:37:50:37 | ecb | test.swift:45:12:45:16 | call to ECB.init() : | test.swift:50:37:50:37 | ecb | The initialization of the cipher 'ecb' uses the insecure ECB block mode from $@. | test.swift:45:12:45:16 | call to ECB.init() : | call to ECB.init() | -| test.swift:51:37:51:37 | ecb | test.swift:45:12:45:16 | call to ECB.init() : | test.swift:51:37:51:37 | ecb | The initialization of the cipher 'ecb' uses the insecure ECB block mode from $@. | test.swift:45:12:45:16 | call to ECB.init() : | call to ECB.init() | +| test.swift:50:37:50:37 | ecb | test.swift:45:12:45:16 | call to ECB.init() | test.swift:50:37:50:37 | ecb | The initialization of the cipher 'ecb' uses the insecure ECB block mode from $@. | test.swift:45:12:45:16 | call to ECB.init() | call to ECB.init() | +| test.swift:51:37:51:37 | ecb | test.swift:45:12:45:16 | call to ECB.init() | test.swift:51:37:51:37 | ecb | The initialization of the cipher 'ecb' uses the insecure ECB block mode from $@. | test.swift:45:12:45:16 | call to ECB.init() | call to ECB.init() | | test.swift:52:37:52:41 | call to ECB.init() | test.swift:52:37:52:41 | call to ECB.init() | test.swift:52:37:52:41 | call to ECB.init() | The initialization of the cipher 'call to ECB.init()' uses the insecure ECB block mode from $@. | test.swift:52:37:52:41 | call to ECB.init() | call to ECB.init() | | test.swift:53:37:53:41 | call to ECB.init() | test.swift:53:37:53:41 | call to ECB.init() | test.swift:53:37:53:41 | call to ECB.init() | The initialization of the cipher 'call to ECB.init()' uses the insecure ECB block mode from $@. | test.swift:53:37:53:41 | call to ECB.init() | call to ECB.init() | -| test.swift:54:37:54:53 | call to getECBBlockMode() | test.swift:34:9:34:13 | call to ECB.init() : | test.swift:54:37:54:53 | call to getECBBlockMode() | The initialization of the cipher 'call to getECBBlockMode()' uses the insecure ECB block mode from $@. | test.swift:34:9:34:13 | call to ECB.init() : | call to ECB.init() | -| test.swift:55:37:55:53 | call to getECBBlockMode() | test.swift:34:9:34:13 | call to ECB.init() : | test.swift:55:37:55:53 | call to getECBBlockMode() | The initialization of the cipher 'call to getECBBlockMode()' uses the insecure ECB block mode from $@. | test.swift:34:9:34:13 | call to ECB.init() : | call to ECB.init() | -| test.swift:65:42:65:42 | ecb | test.swift:45:12:45:16 | call to ECB.init() : | test.swift:65:42:65:42 | ecb | The initialization of the cipher 'ecb' uses the insecure ECB block mode from $@. | test.swift:45:12:45:16 | call to ECB.init() : | call to ECB.init() | +| test.swift:54:37:54:53 | call to getECBBlockMode() | test.swift:34:9:34:13 | call to ECB.init() | test.swift:54:37:54:53 | call to getECBBlockMode() | The initialization of the cipher 'call to getECBBlockMode()' uses the insecure ECB block mode from $@. | test.swift:34:9:34:13 | call to ECB.init() | call to ECB.init() | +| test.swift:55:37:55:53 | call to getECBBlockMode() | test.swift:34:9:34:13 | call to ECB.init() | test.swift:55:37:55:53 | call to getECBBlockMode() | The initialization of the cipher 'call to getECBBlockMode()' uses the insecure ECB block mode from $@. | test.swift:34:9:34:13 | call to ECB.init() | call to ECB.init() | +| test.swift:65:42:65:42 | ecb | test.swift:45:12:45:16 | call to ECB.init() | test.swift:65:42:65:42 | ecb | The initialization of the cipher 'ecb' uses the insecure ECB block mode from $@. | test.swift:45:12:45:16 | call to ECB.init() | call to ECB.init() | | test.swift:66:42:66:46 | call to ECB.init() | test.swift:66:42:66:46 | call to ECB.init() | test.swift:66:42:66:46 | call to ECB.init() | The initialization of the cipher 'call to ECB.init()' uses the insecure ECB block mode from $@. | test.swift:66:42:66:46 | call to ECB.init() | call to ECB.init() | -| test.swift:67:42:67:58 | call to getECBBlockMode() | test.swift:34:9:34:13 | call to ECB.init() : | test.swift:67:42:67:58 | call to getECBBlockMode() | The initialization of the cipher 'call to getECBBlockMode()' uses the insecure ECB block mode from $@. | test.swift:34:9:34:13 | call to ECB.init() : | call to ECB.init() | +| test.swift:67:42:67:58 | call to getECBBlockMode() | test.swift:34:9:34:13 | call to ECB.init() | test.swift:67:42:67:58 | call to getECBBlockMode() | The initialization of the cipher 'call to getECBBlockMode()' uses the insecure ECB block mode from $@. | test.swift:34:9:34:13 | call to ECB.init() | call to ECB.init() | diff --git a/swift/ql/test/query-tests/Security/CWE-328/WeakSensitiveDataHashing.expected b/swift/ql/test/query-tests/Security/CWE-328/WeakSensitiveDataHashing.expected index 06ee4968d01..1a3d8a15f8a 100644 --- a/swift/ql/test/query-tests/Security/CWE-328/WeakSensitiveDataHashing.expected +++ b/swift/ql/test/query-tests/Security/CWE-328/WeakSensitiveDataHashing.expected @@ -1,42 +1,50 @@ edges -| testCrypto.swift:56:47:56:47 | passwd : | testCrypto.swift:63:44:63:44 | passwd | -| testCrypto.swift:60:43:60:43 | credit_card_no : | testCrypto.swift:61:43:61:43 | credit_card_no | -| testCrypto.swift:60:43:60:43 | credit_card_no : | testCrypto.swift:61:43:61:43 | credit_card_no : | -| testCrypto.swift:60:43:60:43 | credit_card_no : | testCrypto.swift:67:44:67:44 | credit_card_no | -| testCrypto.swift:61:43:61:43 | credit_card_no : | testCrypto.swift:67:44:67:44 | credit_card_no | nodes -| testCrypto.swift:56:47:56:47 | passwd | semmle.label | passwd | -| testCrypto.swift:56:47:56:47 | passwd : | semmle.label | passwd : | -| testCrypto.swift:60:43:60:43 | credit_card_no | semmle.label | credit_card_no | -| testCrypto.swift:60:43:60:43 | credit_card_no : | semmle.label | credit_card_no : | -| testCrypto.swift:61:43:61:43 | credit_card_no | semmle.label | credit_card_no | -| testCrypto.swift:61:43:61:43 | credit_card_no : | semmle.label | credit_card_no : | -| testCrypto.swift:63:44:63:44 | passwd | semmle.label | passwd | -| testCrypto.swift:67:44:67:44 | credit_card_no | semmle.label | credit_card_no | -| testCrypto.swift:90:23:90:23 | passwd | semmle.label | passwd | -| testCrypto.swift:94:23:94:23 | credit_card_no | semmle.label | credit_card_no | -| testCrypto.swift:99:23:99:23 | passwd | semmle.label | passwd | -| testCrypto.swift:103:23:103:23 | credit_card_no | semmle.label | credit_card_no | -| testCrypto.swift:132:32:132:32 | passwd | semmle.label | passwd | -| testCrypto.swift:136:32:136:32 | credit_card_no | semmle.label | credit_card_no | -| testCrypto.swift:141:32:141:32 | passwd | semmle.label | passwd | -| testCrypto.swift:145:32:145:32 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:56:47:56:47 | passwd | semmle.label | passwd | +| testCryptoKit.swift:60:43:60:43 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:61:43:61:43 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:63:44:63:44 | passwd | semmle.label | passwd | +| testCryptoKit.swift:67:44:67:44 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:90:23:90:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:94:23:94:23 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:99:23:99:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:103:23:103:23 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:132:32:132:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:136:32:136:32 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:141:32:141:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:145:32:145:32 | credit_card_no | semmle.label | credit_card_no | +| testCryptoSwift.swift:113:30:113:30 | passwdArray | semmle.label | passwdArray | +| testCryptoSwift.swift:115:31:115:31 | passwdArray | semmle.label | passwdArray | +| testCryptoSwift.swift:120:20:120:20 | passwdArray | semmle.label | passwdArray | +| testCryptoSwift.swift:122:21:122:21 | passwdArray | semmle.label | passwdArray | +| testCryptoSwift.swift:127:9:127:9 | passwdArray | semmle.label | passwdArray | +| testCryptoSwift.swift:129:9:129:9 | passwdArray | semmle.label | passwdArray | +| testCryptoSwift.swift:136:9:136:9 | passwdData | semmle.label | passwdData | +| testCryptoSwift.swift:138:9:138:9 | passwdData | semmle.label | passwdData | +| testCryptoSwift.swift:145:9:145:9 | passwd | semmle.label | passwd | +| testCryptoSwift.swift:147:9:147:9 | passwd | semmle.label | passwd | subpaths #select -| testCrypto.swift:56:47:56:47 | passwd | testCrypto.swift:56:47:56:47 | passwd | testCrypto.swift:56:47:56:47 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCrypto.swift:56:47:56:47 | passwd | sensitive data (credential passwd) | -| testCrypto.swift:60:43:60:43 | credit_card_no | testCrypto.swift:60:43:60:43 | credit_card_no | testCrypto.swift:60:43:60:43 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCrypto.swift:60:43:60:43 | credit_card_no | sensitive data (private information credit_card_no) | -| testCrypto.swift:61:43:61:43 | credit_card_no | testCrypto.swift:60:43:60:43 | credit_card_no : | testCrypto.swift:61:43:61:43 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCrypto.swift:60:43:60:43 | credit_card_no | sensitive data (private information credit_card_no) | -| testCrypto.swift:61:43:61:43 | credit_card_no | testCrypto.swift:61:43:61:43 | credit_card_no | testCrypto.swift:61:43:61:43 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCrypto.swift:61:43:61:43 | credit_card_no | sensitive data (private information credit_card_no) | -| testCrypto.swift:63:44:63:44 | passwd | testCrypto.swift:56:47:56:47 | passwd : | testCrypto.swift:63:44:63:44 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCrypto.swift:56:47:56:47 | passwd | sensitive data (credential passwd) | -| testCrypto.swift:63:44:63:44 | passwd | testCrypto.swift:63:44:63:44 | passwd | testCrypto.swift:63:44:63:44 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCrypto.swift:63:44:63:44 | passwd | sensitive data (credential passwd) | -| testCrypto.swift:67:44:67:44 | credit_card_no | testCrypto.swift:60:43:60:43 | credit_card_no : | testCrypto.swift:67:44:67:44 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCrypto.swift:60:43:60:43 | credit_card_no | sensitive data (private information credit_card_no) | -| testCrypto.swift:67:44:67:44 | credit_card_no | testCrypto.swift:61:43:61:43 | credit_card_no : | testCrypto.swift:67:44:67:44 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCrypto.swift:61:43:61:43 | credit_card_no | sensitive data (private information credit_card_no) | -| testCrypto.swift:67:44:67:44 | credit_card_no | testCrypto.swift:67:44:67:44 | credit_card_no | testCrypto.swift:67:44:67:44 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCrypto.swift:67:44:67:44 | credit_card_no | sensitive data (private information credit_card_no) | -| testCrypto.swift:90:23:90:23 | passwd | testCrypto.swift:90:23:90:23 | passwd | testCrypto.swift:90:23:90:23 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCrypto.swift:90:23:90:23 | passwd | sensitive data (credential passwd) | -| testCrypto.swift:94:23:94:23 | credit_card_no | testCrypto.swift:94:23:94:23 | credit_card_no | testCrypto.swift:94:23:94:23 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCrypto.swift:94:23:94:23 | credit_card_no | sensitive data (private information credit_card_no) | -| testCrypto.swift:99:23:99:23 | passwd | testCrypto.swift:99:23:99:23 | passwd | testCrypto.swift:99:23:99:23 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCrypto.swift:99:23:99:23 | passwd | sensitive data (credential passwd) | -| testCrypto.swift:103:23:103:23 | credit_card_no | testCrypto.swift:103:23:103:23 | credit_card_no | testCrypto.swift:103:23:103:23 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCrypto.swift:103:23:103:23 | credit_card_no | sensitive data (private information credit_card_no) | -| testCrypto.swift:132:32:132:32 | passwd | testCrypto.swift:132:32:132:32 | passwd | testCrypto.swift:132:32:132:32 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCrypto.swift:132:32:132:32 | passwd | sensitive data (credential passwd) | -| testCrypto.swift:136:32:136:32 | credit_card_no | testCrypto.swift:136:32:136:32 | credit_card_no | testCrypto.swift:136:32:136:32 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCrypto.swift:136:32:136:32 | credit_card_no | sensitive data (private information credit_card_no) | -| testCrypto.swift:141:32:141:32 | passwd | testCrypto.swift:141:32:141:32 | passwd | testCrypto.swift:141:32:141:32 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCrypto.swift:141:32:141:32 | passwd | sensitive data (credential passwd) | -| testCrypto.swift:145:32:145:32 | credit_card_no | testCrypto.swift:145:32:145:32 | credit_card_no | testCrypto.swift:145:32:145:32 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCrypto.swift:145:32:145:32 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:56:47:56:47 | passwd | testCryptoKit.swift:56:47:56:47 | passwd | testCryptoKit.swift:56:47:56:47 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:56:47:56:47 | passwd | sensitive data (credential passwd) | +| testCryptoKit.swift:60:43:60:43 | credit_card_no | testCryptoKit.swift:60:43:60:43 | credit_card_no | testCryptoKit.swift:60:43:60:43 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:60:43:60:43 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:61:43:61:43 | credit_card_no | testCryptoKit.swift:61:43:61:43 | credit_card_no | testCryptoKit.swift:61:43:61:43 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:61:43:61:43 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:63:44:63:44 | passwd | testCryptoKit.swift:63:44:63:44 | passwd | testCryptoKit.swift:63:44:63:44 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:63:44:63:44 | passwd | sensitive data (credential passwd) | +| testCryptoKit.swift:67:44:67:44 | credit_card_no | testCryptoKit.swift:67:44:67:44 | credit_card_no | testCryptoKit.swift:67:44:67:44 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:67:44:67:44 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:90:23:90:23 | passwd | testCryptoKit.swift:90:23:90:23 | passwd | testCryptoKit.swift:90:23:90:23 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:90:23:90:23 | passwd | sensitive data (credential passwd) | +| testCryptoKit.swift:94:23:94:23 | credit_card_no | testCryptoKit.swift:94:23:94:23 | credit_card_no | testCryptoKit.swift:94:23:94:23 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:94:23:94:23 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:99:23:99:23 | passwd | testCryptoKit.swift:99:23:99:23 | passwd | testCryptoKit.swift:99:23:99:23 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:99:23:99:23 | passwd | sensitive data (credential passwd) | +| testCryptoKit.swift:103:23:103:23 | credit_card_no | testCryptoKit.swift:103:23:103:23 | credit_card_no | testCryptoKit.swift:103:23:103:23 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:103:23:103:23 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:132:32:132:32 | passwd | testCryptoKit.swift:132:32:132:32 | passwd | testCryptoKit.swift:132:32:132:32 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:132:32:132:32 | passwd | sensitive data (credential passwd) | +| testCryptoKit.swift:136:32:136:32 | credit_card_no | testCryptoKit.swift:136:32:136:32 | credit_card_no | testCryptoKit.swift:136:32:136:32 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:136:32:136:32 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:141:32:141:32 | passwd | testCryptoKit.swift:141:32:141:32 | passwd | testCryptoKit.swift:141:32:141:32 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:141:32:141:32 | passwd | sensitive data (credential passwd) | +| testCryptoKit.swift:145:32:145:32 | credit_card_no | testCryptoKit.swift:145:32:145:32 | credit_card_no | testCryptoKit.swift:145:32:145:32 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:145:32:145:32 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoSwift.swift:113:30:113:30 | passwdArray | testCryptoSwift.swift:113:30:113:30 | passwdArray | testCryptoSwift.swift:113:30:113:30 | passwdArray | Insecure hashing algorithm (MD5) depends on $@. | testCryptoSwift.swift:113:30:113:30 | passwdArray | sensitive data (credential passwdArray) | +| testCryptoSwift.swift:115:31:115:31 | passwdArray | testCryptoSwift.swift:115:31:115:31 | passwdArray | testCryptoSwift.swift:115:31:115:31 | passwdArray | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoSwift.swift:115:31:115:31 | passwdArray | sensitive data (credential passwdArray) | +| testCryptoSwift.swift:120:20:120:20 | passwdArray | testCryptoSwift.swift:120:20:120:20 | passwdArray | testCryptoSwift.swift:120:20:120:20 | passwdArray | Insecure hashing algorithm (MD5) depends on $@. | testCryptoSwift.swift:120:20:120:20 | passwdArray | sensitive data (credential passwdArray) | +| testCryptoSwift.swift:122:21:122:21 | passwdArray | testCryptoSwift.swift:122:21:122:21 | passwdArray | testCryptoSwift.swift:122:21:122:21 | passwdArray | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoSwift.swift:122:21:122:21 | passwdArray | sensitive data (credential passwdArray) | +| testCryptoSwift.swift:127:9:127:9 | passwdArray | testCryptoSwift.swift:127:9:127:9 | passwdArray | testCryptoSwift.swift:127:9:127:9 | passwdArray | Insecure hashing algorithm (MD5) depends on $@. | testCryptoSwift.swift:127:9:127:9 | passwdArray | sensitive data (credential passwdArray) | +| testCryptoSwift.swift:129:9:129:9 | passwdArray | testCryptoSwift.swift:129:9:129:9 | passwdArray | testCryptoSwift.swift:129:9:129:9 | passwdArray | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoSwift.swift:129:9:129:9 | passwdArray | sensitive data (credential passwdArray) | +| testCryptoSwift.swift:136:9:136:9 | passwdData | testCryptoSwift.swift:136:9:136:9 | passwdData | testCryptoSwift.swift:136:9:136:9 | passwdData | Insecure hashing algorithm (MD5) depends on $@. | testCryptoSwift.swift:136:9:136:9 | passwdData | sensitive data (credential passwdData) | +| testCryptoSwift.swift:138:9:138:9 | passwdData | testCryptoSwift.swift:138:9:138:9 | passwdData | testCryptoSwift.swift:138:9:138:9 | passwdData | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoSwift.swift:138:9:138:9 | passwdData | sensitive data (credential passwdData) | +| testCryptoSwift.swift:145:9:145:9 | passwd | testCryptoSwift.swift:145:9:145:9 | passwd | testCryptoSwift.swift:145:9:145:9 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoSwift.swift:145:9:145:9 | passwd | sensitive data (credential passwd) | +| testCryptoSwift.swift:147:9:147:9 | passwd | testCryptoSwift.swift:147:9:147:9 | passwd | testCryptoSwift.swift:147:9:147:9 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoSwift.swift:147:9:147:9 | passwd | sensitive data (credential passwd) | diff --git a/swift/ql/test/query-tests/Security/CWE-328/testCrypto.swift b/swift/ql/test/query-tests/Security/CWE-328/testCryptoKit.swift similarity index 100% rename from swift/ql/test/query-tests/Security/CWE-328/testCrypto.swift rename to swift/ql/test/query-tests/Security/CWE-328/testCryptoKit.swift diff --git a/swift/ql/test/query-tests/Security/CWE-328/testCryptoSwift.swift b/swift/ql/test/query-tests/Security/CWE-328/testCryptoSwift.swift new file mode 100644 index 00000000000..b281e83279a --- /dev/null +++ b/swift/ql/test/query-tests/Security/CWE-328/testCryptoSwift.swift @@ -0,0 +1,150 @@ + +// --- stubs --- + +class Data +{ + init(_ elements: S) {} +} + +protocol DigestType { + func calculate(for bytes: Array) -> Array +} + +class MD5 : DigestType { + public func calculate(for bytes: Array) -> Array { + return Array() + } +} + +class SHA1 : DigestType { + public func calculate(for bytes: Array) -> Array { + return Array() + } +} + +class SHA2 : DigestType { + public enum Variant { + case sha512 + } + + public init(variant: SHA2.Variant) {} + + public func calculate(for bytes: Array) -> Array { + return Array() + } +} + +struct Digest { + static func md5(_ bytes: Array) -> Array { + return MD5().calculate(for: bytes) + } + + static func sha1(_ bytes: Array) -> Array { + return SHA1().calculate(for: bytes) + } + + static func sha512(_ bytes: Array) -> Array { + return self.sha2(bytes, variant: .sha512) + } + + static func sha2(_ bytes: Array, variant: SHA2.Variant) -> Array { + return SHA2(variant: variant).calculate(for: bytes) + } +} + +extension Array where Element == UInt8 { + func toHexString() -> String { + return "" + } + + func md5() -> [Element] { + return Digest.md5(self) + } + + func sha1() -> [Element] { + return Digest.sha1(self) + } + + func sha512() -> [Element] { + return Digest.sha512(self) + } +} + +extension Data { + var bytes: Array { + return Array() + } + + func md5() -> Data { + return Data(Digest.md5(bytes)) + } + + func sha1() -> Data { + return Data(Digest.sha1(bytes)) + } + + func sha512() -> Data { + return Data(Digest.sha512(bytes)) + } +} + +extension String { + var bytes: Array { + return Array() + } + + func md5() -> String { + return self.bytes.md5().toHexString() + } + + func sha1() -> String { + return self.bytes.sha1().toHexString() + } + + func sha512() -> String { + return self.bytes.sha512().toHexString() + } +} + +// --- tests --- + +func testArrays(harmlessArray: Array, passwdArray: Array) { + _ = MD5().calculate(for: harmlessArray) // GOOD (not sensitive) + _ = MD5().calculate(for: passwdArray) // BAD + _ = SHA1().calculate(for: harmlessArray) // GOOD (not sensitive) + _ = SHA1().calculate(for: passwdArray) // BAD + _ = SHA2(variant: .sha512).calculate(for: harmlessArray) // GOOD + _ = SHA2(variant: .sha512).calculate(for: passwdArray) // GOOD + + _ = Digest.md5(harmlessArray) // GOOD (not sensitive) + _ = Digest.md5(passwdArray) // BAD + _ = Digest.sha1(harmlessArray) // GOOD (not sensitive) + _ = Digest.sha1(passwdArray) // BAD + _ = Digest.sha512(harmlessArray) // GOOD + _ = Digest.sha512(passwdArray) // GOOD + + _ = harmlessArray.md5() // GOOD (not sensitive) + _ = passwdArray.md5() // BAD + _ = harmlessArray.sha1() // GOOD (not sensitive) + _ = passwdArray.sha1() // BAD + _ = harmlessArray.sha512() // GOOD + _ = passwdArray.sha512() // GOOD +} + +func testData(harmlessData: Data, passwdData: Data) { + _ = harmlessData.md5() // GOOD (not sensitive) + _ = passwdData.md5() // BAD + _ = harmlessData.sha1() // GOOD (not sensitive) + _ = passwdData.sha1() // BAD + _ = harmlessData.sha512() // GOOD + _ = passwdData.sha512() // GOOD +} + +func testStrings(passwd: String) { + _ = "harmless".md5() // GOOD (not sensitive) + _ = passwd.md5() // BAD + _ = "harmless".sha1() // GOOD (not sensitive) + _ = passwd.sha1() // BAD + _ = "harmless".sha512() // GOOD + _ = passwd.sha512() // GOOD +} diff --git a/swift/ql/test/query-tests/Security/CWE-757/InsecureTLS.expected b/swift/ql/test/query-tests/Security/CWE-757/InsecureTLS.expected index c6d2599be5e..6708919722f 100644 --- a/swift/ql/test/query-tests/Security/CWE-757/InsecureTLS.expected +++ b/swift/ql/test/query-tests/Security/CWE-757/InsecureTLS.expected @@ -1,86 +1,86 @@ edges -| InsecureTLS.swift:19:7:19:7 | value : | file://:0:0:0:0 | value | -| InsecureTLS.swift:20:7:20:7 | value : | file://:0:0:0:0 | value | -| InsecureTLS.swift:22:7:22:7 | value : | file://:0:0:0:0 | value | -| InsecureTLS.swift:23:7:23:7 | value : | file://:0:0:0:0 | value | -| InsecureTLS.swift:40:47:40:70 | .TLSv10 : | InsecureTLS.swift:19:7:19:7 | value : | -| InsecureTLS.swift:45:47:45:70 | .TLSv11 : | InsecureTLS.swift:19:7:19:7 | value : | -| InsecureTLS.swift:57:47:57:70 | .TLSv10 : | InsecureTLS.swift:20:7:20:7 | value : | -| InsecureTLS.swift:64:40:64:52 | .tlsProtocol10 : | InsecureTLS.swift:22:7:22:7 | value : | -| InsecureTLS.swift:76:40:76:52 | .tlsProtocol10 : | InsecureTLS.swift:23:7:23:7 | value : | -| InsecureTLS.swift:102:10:102:33 | .TLSv10 : | InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() | -| InsecureTLS.swift:102:10:102:33 | .TLSv10 : | InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() : | -| InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() : | InsecureTLS.swift:19:7:19:7 | value : | -| InsecureTLS.swift:121:55:121:66 | version : | InsecureTLS.swift:122:47:122:47 | version | -| InsecureTLS.swift:121:55:121:66 | version : | InsecureTLS.swift:122:47:122:47 | version : | -| InsecureTLS.swift:122:47:122:47 | version : | InsecureTLS.swift:19:7:19:7 | value : | -| InsecureTLS.swift:127:25:127:48 | .TLSv11 : | InsecureTLS.swift:121:55:121:66 | version : | -| InsecureTLS.swift:158:7:158:7 | self [TLSVersion] : | file://:0:0:0:0 | self [TLSVersion] : | -| InsecureTLS.swift:158:7:158:7 | value : | file://:0:0:0:0 | value : | -| InsecureTLS.swift:163:3:163:3 | [post] def [TLSVersion] : | InsecureTLS.swift:165:47:165:47 | def [TLSVersion] : | -| InsecureTLS.swift:163:20:163:43 | .TLSv10 : | InsecureTLS.swift:158:7:158:7 | value : | -| InsecureTLS.swift:163:20:163:43 | .TLSv10 : | InsecureTLS.swift:163:3:163:3 | [post] def [TLSVersion] : | -| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] : | InsecureTLS.swift:158:7:158:7 | self [TLSVersion] : | -| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] : | InsecureTLS.swift:165:47:165:51 | .TLSVersion | -| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] : | InsecureTLS.swift:165:47:165:51 | .TLSVersion : | -| InsecureTLS.swift:165:47:165:51 | .TLSVersion : | InsecureTLS.swift:19:7:19:7 | value : | -| file://:0:0:0:0 | self [TLSVersion] : | file://:0:0:0:0 | .TLSVersion : | -| file://:0:0:0:0 | value : | file://:0:0:0:0 | [post] self [TLSVersion] : | +| InsecureTLS.swift:19:7:19:7 | value | file://:0:0:0:0 | value | +| InsecureTLS.swift:20:7:20:7 | value | file://:0:0:0:0 | value | +| InsecureTLS.swift:22:7:22:7 | value | file://:0:0:0:0 | value | +| InsecureTLS.swift:23:7:23:7 | value | file://:0:0:0:0 | value | +| InsecureTLS.swift:40:47:40:70 | .TLSv10 | InsecureTLS.swift:19:7:19:7 | value | +| InsecureTLS.swift:45:47:45:70 | .TLSv11 | InsecureTLS.swift:19:7:19:7 | value | +| InsecureTLS.swift:57:47:57:70 | .TLSv10 | InsecureTLS.swift:20:7:20:7 | value | +| InsecureTLS.swift:64:40:64:52 | .tlsProtocol10 | InsecureTLS.swift:22:7:22:7 | value | +| InsecureTLS.swift:76:40:76:52 | .tlsProtocol10 | InsecureTLS.swift:23:7:23:7 | value | +| InsecureTLS.swift:102:10:102:33 | .TLSv10 | InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() | +| InsecureTLS.swift:102:10:102:33 | .TLSv10 | InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() | +| InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() | InsecureTLS.swift:19:7:19:7 | value | +| InsecureTLS.swift:121:55:121:66 | version | InsecureTLS.swift:122:47:122:47 | version | +| InsecureTLS.swift:121:55:121:66 | version | InsecureTLS.swift:122:47:122:47 | version | +| InsecureTLS.swift:122:47:122:47 | version | InsecureTLS.swift:19:7:19:7 | value | +| InsecureTLS.swift:127:25:127:48 | .TLSv11 | InsecureTLS.swift:121:55:121:66 | version | +| InsecureTLS.swift:158:7:158:7 | self [TLSVersion] | file://:0:0:0:0 | self [TLSVersion] | +| InsecureTLS.swift:158:7:158:7 | value | file://:0:0:0:0 | value | +| InsecureTLS.swift:163:3:163:3 | [post] def [TLSVersion] | InsecureTLS.swift:165:47:165:47 | def [TLSVersion] | +| InsecureTLS.swift:163:20:163:43 | .TLSv10 | InsecureTLS.swift:158:7:158:7 | value | +| InsecureTLS.swift:163:20:163:43 | .TLSv10 | InsecureTLS.swift:163:3:163:3 | [post] def [TLSVersion] | +| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] | InsecureTLS.swift:158:7:158:7 | self [TLSVersion] | +| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] | InsecureTLS.swift:165:47:165:51 | .TLSVersion | +| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] | InsecureTLS.swift:165:47:165:51 | .TLSVersion | +| InsecureTLS.swift:165:47:165:51 | .TLSVersion | InsecureTLS.swift:19:7:19:7 | value | +| file://:0:0:0:0 | self [TLSVersion] | file://:0:0:0:0 | .TLSVersion | +| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [TLSVersion] | nodes -| InsecureTLS.swift:19:7:19:7 | value : | semmle.label | value : | -| InsecureTLS.swift:20:7:20:7 | value : | semmle.label | value : | -| InsecureTLS.swift:22:7:22:7 | value : | semmle.label | value : | -| InsecureTLS.swift:23:7:23:7 | value : | semmle.label | value : | +| InsecureTLS.swift:19:7:19:7 | value | semmle.label | value | +| InsecureTLS.swift:20:7:20:7 | value | semmle.label | value | +| InsecureTLS.swift:22:7:22:7 | value | semmle.label | value | +| InsecureTLS.swift:23:7:23:7 | value | semmle.label | value | +| InsecureTLS.swift:40:47:40:70 | .TLSv10 | semmle.label | .TLSv10 | | InsecureTLS.swift:40:47:40:70 | .TLSv10 | semmle.label | .TLSv10 | -| InsecureTLS.swift:40:47:40:70 | .TLSv10 : | semmle.label | .TLSv10 : | | InsecureTLS.swift:45:47:45:70 | .TLSv11 | semmle.label | .TLSv11 | -| InsecureTLS.swift:45:47:45:70 | .TLSv11 : | semmle.label | .TLSv11 : | +| InsecureTLS.swift:45:47:45:70 | .TLSv11 | semmle.label | .TLSv11 | +| InsecureTLS.swift:57:47:57:70 | .TLSv10 | semmle.label | .TLSv10 | | InsecureTLS.swift:57:47:57:70 | .TLSv10 | semmle.label | .TLSv10 | -| InsecureTLS.swift:57:47:57:70 | .TLSv10 : | semmle.label | .TLSv10 : | | InsecureTLS.swift:64:40:64:52 | .tlsProtocol10 | semmle.label | .tlsProtocol10 | -| InsecureTLS.swift:64:40:64:52 | .tlsProtocol10 : | semmle.label | .tlsProtocol10 : | +| InsecureTLS.swift:64:40:64:52 | .tlsProtocol10 | semmle.label | .tlsProtocol10 | | InsecureTLS.swift:76:40:76:52 | .tlsProtocol10 | semmle.label | .tlsProtocol10 | -| InsecureTLS.swift:76:40:76:52 | .tlsProtocol10 : | semmle.label | .tlsProtocol10 : | -| InsecureTLS.swift:102:10:102:33 | .TLSv10 : | semmle.label | .TLSv10 : | +| InsecureTLS.swift:76:40:76:52 | .tlsProtocol10 | semmle.label | .tlsProtocol10 | +| InsecureTLS.swift:102:10:102:33 | .TLSv10 | semmle.label | .TLSv10 | | InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() | semmle.label | call to getBadTLSVersion() | -| InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() : | semmle.label | call to getBadTLSVersion() : | -| InsecureTLS.swift:121:55:121:66 | version : | semmle.label | version : | +| InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() | semmle.label | call to getBadTLSVersion() | +| InsecureTLS.swift:121:55:121:66 | version | semmle.label | version | | InsecureTLS.swift:122:47:122:47 | version | semmle.label | version | -| InsecureTLS.swift:122:47:122:47 | version : | semmle.label | version : | -| InsecureTLS.swift:127:25:127:48 | .TLSv11 : | semmle.label | .TLSv11 : | -| InsecureTLS.swift:158:7:158:7 | self [TLSVersion] : | semmle.label | self [TLSVersion] : | -| InsecureTLS.swift:158:7:158:7 | value : | semmle.label | value : | -| InsecureTLS.swift:163:3:163:3 | [post] def [TLSVersion] : | semmle.label | [post] def [TLSVersion] : | -| InsecureTLS.swift:163:20:163:43 | .TLSv10 : | semmle.label | .TLSv10 : | -| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] : | semmle.label | def [TLSVersion] : | +| InsecureTLS.swift:122:47:122:47 | version | semmle.label | version | +| InsecureTLS.swift:127:25:127:48 | .TLSv11 | semmle.label | .TLSv11 | +| InsecureTLS.swift:158:7:158:7 | self [TLSVersion] | semmle.label | self [TLSVersion] | +| InsecureTLS.swift:158:7:158:7 | value | semmle.label | value | +| InsecureTLS.swift:163:3:163:3 | [post] def [TLSVersion] | semmle.label | [post] def [TLSVersion] | +| InsecureTLS.swift:163:20:163:43 | .TLSv10 | semmle.label | .TLSv10 | +| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] | semmle.label | def [TLSVersion] | | InsecureTLS.swift:165:47:165:51 | .TLSVersion | semmle.label | .TLSVersion | -| InsecureTLS.swift:165:47:165:51 | .TLSVersion : | semmle.label | .TLSVersion : | -| file://:0:0:0:0 | .TLSVersion : | semmle.label | .TLSVersion : | -| file://:0:0:0:0 | [post] self [TLSVersion] : | semmle.label | [post] self [TLSVersion] : | -| file://:0:0:0:0 | self [TLSVersion] : | semmle.label | self [TLSVersion] : | +| InsecureTLS.swift:165:47:165:51 | .TLSVersion | semmle.label | .TLSVersion | +| file://:0:0:0:0 | .TLSVersion | semmle.label | .TLSVersion | +| file://:0:0:0:0 | [post] self [TLSVersion] | semmle.label | [post] self [TLSVersion] | +| file://:0:0:0:0 | self [TLSVersion] | semmle.label | self [TLSVersion] | +| file://:0:0:0:0 | value | semmle.label | value | | file://:0:0:0:0 | value | semmle.label | value | | file://:0:0:0:0 | value | semmle.label | value | | file://:0:0:0:0 | value | semmle.label | value | | file://:0:0:0:0 | value | semmle.label | value | -| file://:0:0:0:0 | value : | semmle.label | value : | subpaths -| InsecureTLS.swift:163:20:163:43 | .TLSv10 : | InsecureTLS.swift:158:7:158:7 | value : | file://:0:0:0:0 | [post] self [TLSVersion] : | InsecureTLS.swift:163:3:163:3 | [post] def [TLSVersion] : | -| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] : | InsecureTLS.swift:158:7:158:7 | self [TLSVersion] : | file://:0:0:0:0 | .TLSVersion : | InsecureTLS.swift:165:47:165:51 | .TLSVersion | -| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] : | InsecureTLS.swift:158:7:158:7 | self [TLSVersion] : | file://:0:0:0:0 | .TLSVersion : | InsecureTLS.swift:165:47:165:51 | .TLSVersion : | +| InsecureTLS.swift:163:20:163:43 | .TLSv10 | InsecureTLS.swift:158:7:158:7 | value | file://:0:0:0:0 | [post] self [TLSVersion] | InsecureTLS.swift:163:3:163:3 | [post] def [TLSVersion] | +| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] | InsecureTLS.swift:158:7:158:7 | self [TLSVersion] | file://:0:0:0:0 | .TLSVersion | InsecureTLS.swift:165:47:165:51 | .TLSVersion | +| InsecureTLS.swift:165:47:165:47 | def [TLSVersion] | InsecureTLS.swift:158:7:158:7 | self [TLSVersion] | file://:0:0:0:0 | .TLSVersion | InsecureTLS.swift:165:47:165:51 | .TLSVersion | #select | InsecureTLS.swift:40:47:40:70 | .TLSv10 | InsecureTLS.swift:40:47:40:70 | .TLSv10 | InsecureTLS.swift:40:47:40:70 | .TLSv10 | This TLS configuration is insecure. | | InsecureTLS.swift:45:47:45:70 | .TLSv11 | InsecureTLS.swift:45:47:45:70 | .TLSv11 | InsecureTLS.swift:45:47:45:70 | .TLSv11 | This TLS configuration is insecure. | | InsecureTLS.swift:57:47:57:70 | .TLSv10 | InsecureTLS.swift:57:47:57:70 | .TLSv10 | InsecureTLS.swift:57:47:57:70 | .TLSv10 | This TLS configuration is insecure. | | InsecureTLS.swift:64:40:64:52 | .tlsProtocol10 | InsecureTLS.swift:64:40:64:52 | .tlsProtocol10 | InsecureTLS.swift:64:40:64:52 | .tlsProtocol10 | This TLS configuration is insecure. | | InsecureTLS.swift:76:40:76:52 | .tlsProtocol10 | InsecureTLS.swift:76:40:76:52 | .tlsProtocol10 | InsecureTLS.swift:76:40:76:52 | .tlsProtocol10 | This TLS configuration is insecure. | -| InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() | InsecureTLS.swift:102:10:102:33 | .TLSv10 : | InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() | This TLS configuration is insecure. | -| InsecureTLS.swift:122:47:122:47 | version | InsecureTLS.swift:127:25:127:48 | .TLSv11 : | InsecureTLS.swift:122:47:122:47 | version | This TLS configuration is insecure. | -| InsecureTLS.swift:165:47:165:51 | .TLSVersion | InsecureTLS.swift:163:20:163:43 | .TLSv10 : | InsecureTLS.swift:165:47:165:51 | .TLSVersion | This TLS configuration is insecure. | -| file://:0:0:0:0 | value | InsecureTLS.swift:40:47:40:70 | .TLSv10 : | file://:0:0:0:0 | value | This TLS configuration is insecure. | -| file://:0:0:0:0 | value | InsecureTLS.swift:45:47:45:70 | .TLSv11 : | file://:0:0:0:0 | value | This TLS configuration is insecure. | -| file://:0:0:0:0 | value | InsecureTLS.swift:57:47:57:70 | .TLSv10 : | file://:0:0:0:0 | value | This TLS configuration is insecure. | -| file://:0:0:0:0 | value | InsecureTLS.swift:64:40:64:52 | .tlsProtocol10 : | file://:0:0:0:0 | value | This TLS configuration is insecure. | -| file://:0:0:0:0 | value | InsecureTLS.swift:76:40:76:52 | .tlsProtocol10 : | file://:0:0:0:0 | value | This TLS configuration is insecure. | -| file://:0:0:0:0 | value | InsecureTLS.swift:102:10:102:33 | .TLSv10 : | file://:0:0:0:0 | value | This TLS configuration is insecure. | -| file://:0:0:0:0 | value | InsecureTLS.swift:127:25:127:48 | .TLSv11 : | file://:0:0:0:0 | value | This TLS configuration is insecure. | -| file://:0:0:0:0 | value | InsecureTLS.swift:163:20:163:43 | .TLSv10 : | file://:0:0:0:0 | value | This TLS configuration is insecure. | +| InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() | InsecureTLS.swift:102:10:102:33 | .TLSv10 | InsecureTLS.swift:111:47:111:64 | call to getBadTLSVersion() | This TLS configuration is insecure. | +| InsecureTLS.swift:122:47:122:47 | version | InsecureTLS.swift:127:25:127:48 | .TLSv11 | InsecureTLS.swift:122:47:122:47 | version | This TLS configuration is insecure. | +| InsecureTLS.swift:165:47:165:51 | .TLSVersion | InsecureTLS.swift:163:20:163:43 | .TLSv10 | InsecureTLS.swift:165:47:165:51 | .TLSVersion | This TLS configuration is insecure. | +| file://:0:0:0:0 | value | InsecureTLS.swift:40:47:40:70 | .TLSv10 | file://:0:0:0:0 | value | This TLS configuration is insecure. | +| file://:0:0:0:0 | value | InsecureTLS.swift:45:47:45:70 | .TLSv11 | file://:0:0:0:0 | value | This TLS configuration is insecure. | +| file://:0:0:0:0 | value | InsecureTLS.swift:57:47:57:70 | .TLSv10 | file://:0:0:0:0 | value | This TLS configuration is insecure. | +| file://:0:0:0:0 | value | InsecureTLS.swift:64:40:64:52 | .tlsProtocol10 | file://:0:0:0:0 | value | This TLS configuration is insecure. | +| file://:0:0:0:0 | value | InsecureTLS.swift:76:40:76:52 | .tlsProtocol10 | file://:0:0:0:0 | value | This TLS configuration is insecure. | +| file://:0:0:0:0 | value | InsecureTLS.swift:102:10:102:33 | .TLSv10 | file://:0:0:0:0 | value | This TLS configuration is insecure. | +| file://:0:0:0:0 | value | InsecureTLS.swift:127:25:127:48 | .TLSv11 | file://:0:0:0:0 | value | This TLS configuration is insecure. | +| file://:0:0:0:0 | value | InsecureTLS.swift:163:20:163:43 | .TLSv10 | file://:0:0:0:0 | value | This TLS configuration is insecure. | diff --git a/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected b/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected index 633e73c44e5..8311b02ece9 100644 --- a/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected +++ b/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected @@ -1,30 +1,30 @@ edges -| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | -| rncryptor.swift:59:24:59:43 | call to Data.init(_:) : | rncryptor.swift:63:57:63:57 | myConstantSalt1 | -| rncryptor.swift:59:24:59:43 | call to Data.init(_:) : | rncryptor.swift:68:106:68:106 | myConstantSalt1 | -| rncryptor.swift:59:24:59:43 | call to Data.init(_:) : | rncryptor.swift:71:106:71:106 | myConstantSalt1 | -| rncryptor.swift:59:24:59:43 | call to Data.init(_:) : | rncryptor.swift:75:127:75:127 | myConstantSalt1 | -| rncryptor.swift:59:24:59:43 | call to Data.init(_:) : | rncryptor.swift:78:135:78:135 | myConstantSalt1 | -| rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | -| rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:59:24:59:43 | call to Data.init(_:) : | -| rncryptor.swift:60:24:60:30 | call to Data.init(_:) : | rncryptor.swift:65:55:65:55 | myConstantSalt2 | -| rncryptor.swift:60:24:60:30 | call to Data.init(_:) : | rncryptor.swift:69:131:69:131 | myConstantSalt2 | -| rncryptor.swift:60:24:60:30 | call to Data.init(_:) : | rncryptor.swift:72:131:72:131 | myConstantSalt2 | -| rncryptor.swift:60:24:60:30 | call to Data.init(_:) : | rncryptor.swift:76:152:76:152 | myConstantSalt2 | -| rncryptor.swift:60:24:60:30 | call to Data.init(_:) : | rncryptor.swift:79:160:79:160 | myConstantSalt2 | -| rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | -| rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:60:24:60:30 | call to Data.init(_:) : | -| test.swift:43:35:43:130 | [...] : | test.swift:51:49:51:49 | constantSalt | -| test.swift:43:35:43:130 | [...] : | test.swift:56:59:56:59 | constantSalt | -| test.swift:43:35:43:130 | [...] : | test.swift:62:59:62:59 | constantSalt | -| test.swift:43:35:43:130 | [...] : | test.swift:67:53:67:53 | constantSalt | +| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | +| rncryptor.swift:59:24:59:43 | call to Data.init(_:) | rncryptor.swift:63:57:63:57 | myConstantSalt1 | +| rncryptor.swift:59:24:59:43 | call to Data.init(_:) | rncryptor.swift:68:106:68:106 | myConstantSalt1 | +| rncryptor.swift:59:24:59:43 | call to Data.init(_:) | rncryptor.swift:71:106:71:106 | myConstantSalt1 | +| rncryptor.swift:59:24:59:43 | call to Data.init(_:) | rncryptor.swift:75:127:75:127 | myConstantSalt1 | +| rncryptor.swift:59:24:59:43 | call to Data.init(_:) | rncryptor.swift:78:135:78:135 | myConstantSalt1 | +| rncryptor.swift:59:29:59:29 | abcdef123456 | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | +| rncryptor.swift:59:29:59:29 | abcdef123456 | rncryptor.swift:59:24:59:43 | call to Data.init(_:) | +| rncryptor.swift:60:24:60:30 | call to Data.init(_:) | rncryptor.swift:65:55:65:55 | myConstantSalt2 | +| rncryptor.swift:60:24:60:30 | call to Data.init(_:) | rncryptor.swift:69:131:69:131 | myConstantSalt2 | +| rncryptor.swift:60:24:60:30 | call to Data.init(_:) | rncryptor.swift:72:131:72:131 | myConstantSalt2 | +| rncryptor.swift:60:24:60:30 | call to Data.init(_:) | rncryptor.swift:76:152:76:152 | myConstantSalt2 | +| rncryptor.swift:60:24:60:30 | call to Data.init(_:) | rncryptor.swift:79:160:79:160 | myConstantSalt2 | +| rncryptor.swift:60:29:60:29 | 0 | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | +| rncryptor.swift:60:29:60:29 | 0 | rncryptor.swift:60:24:60:30 | call to Data.init(_:) | +| test.swift:43:35:43:130 | [...] | test.swift:51:49:51:49 | constantSalt | +| test.swift:43:35:43:130 | [...] | test.swift:56:59:56:59 | constantSalt | +| test.swift:43:35:43:130 | [...] | test.swift:62:59:62:59 | constantSalt | +| test.swift:43:35:43:130 | [...] | test.swift:67:53:67:53 | constantSalt | nodes -| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | semmle.label | [summary] to write: return (return) in Data.init(_:) : | -| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | semmle.label | [summary param] 0 in Data.init(_:) : | -| rncryptor.swift:59:24:59:43 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| rncryptor.swift:59:29:59:29 | abcdef123456 : | semmle.label | abcdef123456 : | -| rncryptor.swift:60:24:60:30 | call to Data.init(_:) : | semmle.label | call to Data.init(_:) : | -| rncryptor.swift:60:29:60:29 | 0 : | semmle.label | 0 : | +| file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | semmle.label | [summary] to write: return (return) in Data.init(_:) | +| rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | semmle.label | [summary param] 0 in Data.init(_:) | +| rncryptor.swift:59:24:59:43 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| rncryptor.swift:59:29:59:29 | abcdef123456 | semmle.label | abcdef123456 | +| rncryptor.swift:60:24:60:30 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| rncryptor.swift:60:29:60:29 | 0 | semmle.label | 0 | | rncryptor.swift:63:57:63:57 | myConstantSalt1 | semmle.label | myConstantSalt1 | | rncryptor.swift:65:55:65:55 | myConstantSalt2 | semmle.label | myConstantSalt2 | | rncryptor.swift:68:106:68:106 | myConstantSalt1 | semmle.label | myConstantSalt1 | @@ -35,26 +35,26 @@ nodes | rncryptor.swift:76:152:76:152 | myConstantSalt2 | semmle.label | myConstantSalt2 | | rncryptor.swift:78:135:78:135 | myConstantSalt1 | semmle.label | myConstantSalt1 | | rncryptor.swift:79:160:79:160 | myConstantSalt2 | semmle.label | myConstantSalt2 | -| test.swift:43:35:43:130 | [...] : | semmle.label | [...] : | +| test.swift:43:35:43:130 | [...] | semmle.label | [...] | | test.swift:51:49:51:49 | constantSalt | semmle.label | constantSalt | | test.swift:56:59:56:59 | constantSalt | semmle.label | constantSalt | | test.swift:62:59:62:59 | constantSalt | semmle.label | constantSalt | | test.swift:67:53:67:53 | constantSalt | semmle.label | constantSalt | subpaths -| rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | rncryptor.swift:59:24:59:43 | call to Data.init(_:) : | -| rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | rncryptor.swift:60:24:60:30 | call to Data.init(_:) : | +| rncryptor.swift:59:29:59:29 | abcdef123456 | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | rncryptor.swift:59:24:59:43 | call to Data.init(_:) | +| rncryptor.swift:60:29:60:29 | 0 | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) | rncryptor.swift:60:24:60:30 | call to Data.init(_:) | #select -| rncryptor.swift:63:57:63:57 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:63:57:63:57 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | -| rncryptor.swift:65:55:65:55 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:65:55:65:55 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | -| rncryptor.swift:68:106:68:106 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:68:106:68:106 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | -| rncryptor.swift:69:131:69:131 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:69:131:69:131 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | -| rncryptor.swift:71:106:71:106 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:71:106:71:106 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | -| rncryptor.swift:72:131:72:131 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:72:131:72:131 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | -| rncryptor.swift:75:127:75:127 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:75:127:75:127 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | -| rncryptor.swift:76:152:76:152 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:76:152:76:152 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | -| rncryptor.swift:78:135:78:135 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:78:135:78:135 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | -| rncryptor.swift:79:160:79:160 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:79:160:79:160 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | -| test.swift:51:49:51:49 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:51:49:51:49 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | -| test.swift:56:59:56:59 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:56:59:56:59 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | -| test.swift:62:59:62:59 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:62:59:62:59 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | -| test.swift:67:53:67:53 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:67:53:67:53 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | +| rncryptor.swift:63:57:63:57 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 | rncryptor.swift:63:57:63:57 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | +| rncryptor.swift:65:55:65:55 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 | rncryptor.swift:65:55:65:55 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | +| rncryptor.swift:68:106:68:106 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 | rncryptor.swift:68:106:68:106 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | +| rncryptor.swift:69:131:69:131 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 | rncryptor.swift:69:131:69:131 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | +| rncryptor.swift:71:106:71:106 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 | rncryptor.swift:71:106:71:106 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | +| rncryptor.swift:72:131:72:131 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 | rncryptor.swift:72:131:72:131 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | +| rncryptor.swift:75:127:75:127 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 | rncryptor.swift:75:127:75:127 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | +| rncryptor.swift:76:152:76:152 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 | rncryptor.swift:76:152:76:152 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | +| rncryptor.swift:78:135:78:135 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 | rncryptor.swift:78:135:78:135 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | +| rncryptor.swift:79:160:79:160 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 | rncryptor.swift:79:160:79:160 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | +| test.swift:51:49:51:49 | constantSalt | test.swift:43:35:43:130 | [...] | test.swift:51:49:51:49 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | +| test.swift:56:59:56:59 | constantSalt | test.swift:43:35:43:130 | [...] | test.swift:56:59:56:59 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | +| test.swift:62:59:62:59 | constantSalt | test.swift:43:35:43:130 | [...] | test.swift:62:59:62:59 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | +| test.swift:67:53:67:53 | constantSalt | test.swift:43:35:43:130 | [...] | test.swift:67:53:67:53 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | diff --git a/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected b/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected index 8f432710dc0..1cba5d58060 100644 --- a/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected +++ b/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected @@ -1,17 +1,17 @@ edges -| test.swift:20:45:20:45 | 99999 : | test.swift:33:22:33:43 | call to getLowIterationCount() : | -| test.swift:33:22:33:43 | call to getLowIterationCount() : | test.swift:37:84:37:84 | lowIterations | -| test.swift:33:22:33:43 | call to getLowIterationCount() : | test.swift:44:84:44:84 | lowIterations | +| test.swift:20:45:20:45 | 99999 | test.swift:33:22:33:43 | call to getLowIterationCount() | +| test.swift:33:22:33:43 | call to getLowIterationCount() | test.swift:37:84:37:84 | lowIterations | +| test.swift:33:22:33:43 | call to getLowIterationCount() | test.swift:44:84:44:84 | lowIterations | nodes -| test.swift:20:45:20:45 | 99999 : | semmle.label | 99999 : | -| test.swift:33:22:33:43 | call to getLowIterationCount() : | semmle.label | call to getLowIterationCount() : | +| test.swift:20:45:20:45 | 99999 | semmle.label | 99999 | +| test.swift:33:22:33:43 | call to getLowIterationCount() | semmle.label | call to getLowIterationCount() | | test.swift:37:84:37:84 | lowIterations | semmle.label | lowIterations | | test.swift:38:84:38:84 | 80000 | semmle.label | 80000 | | test.swift:44:84:44:84 | lowIterations | semmle.label | lowIterations | | test.swift:45:84:45:84 | 80000 | semmle.label | 80000 | subpaths #select -| test.swift:37:84:37:84 | lowIterations | test.swift:20:45:20:45 | 99999 : | test.swift:37:84:37:84 | lowIterations | The value '99999' is an insufficient number of iterations for secure password hashing. | +| test.swift:37:84:37:84 | lowIterations | test.swift:20:45:20:45 | 99999 | test.swift:37:84:37:84 | lowIterations | The value '99999' is an insufficient number of iterations for secure password hashing. | | test.swift:38:84:38:84 | 80000 | test.swift:38:84:38:84 | 80000 | test.swift:38:84:38:84 | 80000 | The value '80000' is an insufficient number of iterations for secure password hashing. | -| test.swift:44:84:44:84 | lowIterations | test.swift:20:45:20:45 | 99999 : | test.swift:44:84:44:84 | lowIterations | The value '99999' is an insufficient number of iterations for secure password hashing. | +| test.swift:44:84:44:84 | lowIterations | test.swift:20:45:20:45 | 99999 | test.swift:44:84:44:84 | lowIterations | The value '99999' is an insufficient number of iterations for secure password hashing. | | test.swift:45:84:45:84 | 80000 | test.swift:45:84:45:84 | 80000 | test.swift:45:84:45:84 | 80000 | The value '80000' is an insufficient number of iterations for secure password hashing. | diff --git a/swift/third_party/binlog/BUILD.bazel b/swift/third_party/binlog/BUILD.bazel new file mode 100644 index 00000000000..e69de29bb2d diff --git a/swift/third_party/binlog/BUILD.binlog.bazel b/swift/third_party/binlog/BUILD.binlog.bazel new file mode 100644 index 00000000000..71d42e45026 --- /dev/null +++ b/swift/third_party/binlog/BUILD.binlog.bazel @@ -0,0 +1,19 @@ +cc_library( + name = "binlog", + hdrs = glob(["include/**/*.hpp"]), + srcs = glob(["include/**/*.cpp"]), + includes = ["include"], + visibility = ["//visibility:public"], +) + +cc_binary( + name = "bread", + srcs = ["bin/bread.cpp", "bin/printers.hpp", "bin/printers.cpp", "bin/getopt.hpp"], + deps = [":binlog"], +) + +cc_binary( + name = "brecovery", + srcs = ["bin/brecovery.cpp", "bin/getopt.hpp"], + deps = [":binlog"], +) diff --git a/swift/third_party/load.bzl b/swift/third_party/load.bzl index 4e7de8e1b7c..643fad096db 100644 --- a/swift/third_party/load.bzl +++ b/swift/third_party/load.bzl @@ -12,16 +12,29 @@ _swift_arch_map = { "macOS-X64": "darwin_x86_64", } -def _get_label(repository_name, package, target): - return "@%s//swift/third_party/%s:%s" % (repository_name, package, target) +def _get_label(workspace_name, package, target): + return "@%s//swift/third_party/%s:%s" % (workspace_name, package, target) -def _get_build(repository_name, package): - return _get_label(repository_name, package, "BUILD.%s.bazel" % package) +def _get_build(workspace_name, package): + return _get_label(workspace_name, package, "BUILD.%s.bazel" % package) -def _get_patch(repository_name, package, patch): - return _get_label(repository_name, package, "patches/%s.patch" % patch) +def _get_patch(workspace_name, package, patch): + return _get_label(workspace_name, package, "patches/%s.patch" % patch) -def load_dependencies(repository_name): +def _github_archive(*, name, workspace_name, repository, commit, sha256 = None, patches = None): + github_name = repository[repository.index("/") + 1:] + patches = [_get_patch(workspace_name, name, p) for p in patches or []] + http_archive( + name = name, + url = "https://github.com/%s/archive/%s.zip" % (repository, commit), + strip_prefix = "%s-%s" % (github_name, commit), + build_file = _get_build(workspace_name, name), + sha256 = sha256, + patch_args = ["-p1"], + patches = patches, + ) + +def load_dependencies(workspace_name): for repo_arch, arch in _swift_arch_map.items(): sha256 = _swift_sha_map[repo_arch] @@ -31,16 +44,24 @@ def load_dependencies(repository_name): _swift_prebuilt_version, repo_arch, ), - build_file = _get_build(repository_name, "swift-llvm-support"), + build_file = _get_build(workspace_name, "swift-llvm-support"), sha256 = sha256, patch_args = ["-p1"], patches = [], ) - http_archive( + _github_archive( name = "picosha2", - url = "https://github.com/okdshin/PicoSHA2/archive/27fcf6979298949e8a462e16d09a0351c18fcaf2.zip", - strip_prefix = "PicoSHA2-27fcf6979298949e8a462e16d09a0351c18fcaf2", - build_file = _get_build(repository_name, "picosha2"), + workspace_name = workspace_name, + repository = "okdshin/PicoSHA2", + commit = "27fcf6979298949e8a462e16d09a0351c18fcaf2", sha256 = "d6647ca45a8b7bdaf027ecb68d041b22a899a0218b7206dee755c558a2725abb", ) + + _github_archive( + name = "binlog", + workspace_name = workspace_name, + repository = "morganstanley/binlog", + commit = "3fef8846f5ef98e64211e7982c2ead67e0b185a6", + sha256 = "f5c61d90a6eff341bf91771f2f465be391fd85397023e1b391c17214f9cbd045", + )